[DRE-commits] [ruby-numru-units] 01/02: Imported Upstream version 1.7

Youhei SASAKI uwabami-guest at moszumanska.debian.org
Fri Jan 31 16:38:40 UTC 2014


This is an automated email from the git hooks/post-receive script.

uwabami-guest pushed a commit to branch master
in repository ruby-numru-units.

commit ebab4c3172fc4650649a45ae15c342672712aa34
Author: Youhei SASAKI <uwabami at gfd-dennou.org>
Date:   Sat Feb 1 01:32:27 2014 +0900

    Imported Upstream version 1.7
---
 ChangeLog          |  111 ++
 LICENSE.txt        |   34 +
 Makefile           |   14 +
 doc/Makefile       |    5 +
 doc/units.html     |  241 ++++
 doc/units.rd       |  232 ++++
 install.rb         |  104 ++
 lib/numru/units.rb | 3505 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Makefile       |   35 +
 src/dcunits.txt    |  212 ++++
 src/lex.rb         |  434 +++++++
 src/makeutab.rb    |   87 ++
 src/mulnode.rb     |  150 +++
 src/namenode.rb    |   63 +
 src/node.rb        |  210 ++++
 src/numbernode.rb  |   53 +
 src/pownode.rb     |   98 ++
 src/rules.rb       |   65 +
 src/shiftnode.rb   |   63 +
 src/test.rb        |  122 ++
 src/timenode.rb    |  136 ++
 src/units.racc     | 2728 ++++++++++++++++++++++++++++++++++++++++
 src/units.rb       | 3505 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/units.rd       |  139 +++
 src/utab.rb        | 1456 ++++++++++++++++++++++
 25 files changed, 13802 insertions(+)

diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..5417509
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,111 @@
+Thu Aug  4  2011  T Horinouchi
+	* version 1.7 released ((cvs) tag: numru-units-1_7)
+	* LICENSE.txt: added (BSD 2-clause)
+	* doc/units.rd, doc/units.html: updated (added entry to dcunits.txt)
+Wed Aug  3  2011  T Horinouchi
+	* mulnode.rb: to_s changed to explicitly handle a Float
+	  whose value is an integer.
+	* Makefile: adopet to the change in the "tail" command
+	  (tail +2 --> tail -n +2).
+Mon Mar 15  2010  T Horinouchi
+	* version 1.6 released ((cvs) tag: numru-units-1_6)
+Fri May 23  2008  T Horinouchi
+	* dcunits.txt: added the following units: percent [S], % [S],
+	   permil [S], centigrade [P], millibar [P]
+	* rules.rb: changed not to accept empty unit_spec
+	* lex.rb: 
+	  * method do_parse2: to treat empty string units '' as '1'
+	    (to return NumberNode.new(1) instead of ErrorNode.new(''))
+Fri Feb  8  2008  T Koshiro
+	* lex.rb: next_token: at least one space or tab character is required
+	  before/after 'per', 'after', 'from', 'since', 'ref'
+Wed Aug 24  2005  T Horinouchi
+	* version 1.5 released ((cvs) tag: numru-units-1_5)
+Wed Jun  8  2005  T Horinouchi
+	* lex.rb:
+	  * debug in RE_SECOND
+	  * debug in time zone parser (many bugs)
+	  * improvement in time parser RE_TIME to support hhmm type
+	    in addition to [h]h:[m]m
+	* timenode.rb: 
+	  * TimeNode#utcsod : debug in time zone treatment 
+	    (IT WAS A FATAL BUG!!)
+	  * TimeNode#to_s : debug in the expression of seconds (not to 
+	    take the floor of seconds).
+Wed May 25  2005  T Horinouchi
+	* version 1.4 released ((cvs) tag: numru-units-1_4)
+	* lex.rb: debug in RE_HOUR. It did not handle hours after 20 properly.
+Mon Nov 29  2004  T Horinouchi
+	* timenode.rb: class XDate: added to_date (for intenal usage), and
+	  modified +(ohter) and -(ohter) methods to use it as long as possible.
+	  This is to widen the coverage of time -- up to now, only very
+	  recent years (such as AD19xx-20xx) are accpeted, since the
+	  Time intrincic class is always used.
+Tue Nov  9  2004  T Horinouchi
+	* lex.rb: Units#convert2: changed warning messaging to show backtrace
+Sun Aug 10  2004  T Horinouchi
+	* lex.rb: lex.rb Units#convert, Units#==: debug not to change
+	  (reduce5) self and input units.
+Sun Aug  8  2004  T Horinouchi
+	* version 1.3 released
+	* mulnode.rb: improved Multi#sort: to eliminate Number[1] if
+	  length >= 2. Then, Units.new('1m').reduce5.to_s gives 'm';
+	  it used to give '1 m'.
+	* numbernode.rb: defined == (to compare by values -- implicitly
+	  used in the new Multi#sort)
+	* dcunits.txt: added some units from udunits: Pascal, deg[KF],
+	  deg_[CFK], degree[CFK], [Cc]elcius, angular_(degree|minute|secont),
+	  [Ff]ahrenheit, farad, gravity, conventional_mercury, mercury,
+	  Hg, hg, Julian_year, common_year, tesla
+	* lex.rb: debug === (aliased to ==. The change on May 4 was enbug).
+                  debug =~: to handle other classes (return false)
+Tue May  4  2004  T Horinouchi
+	* pownode.rb: PowNode#to_s: if the expopnent is 1, omit it.
+	* lex.rb: debug === (to allow a difference of a factor and/or offset)
+Sun May  2  2004  T Horinouchi
+	* dcunits.txt: added degree_east/degrees_east etc.
+Sun Mar 21  2004  T Horinouchi
+	* version 1.2 released ((cvs) tag: numru-units-1_2)
+Fri Mar 19  2004  T Horinouchi
+	* mulnode.rb: MutiNode#value: to return 1 if @children.size == 0
+	* dcunits.txt: added degC
+	* lex.rb: convert2: warn if $VERBOSE --> warn regardress $VERBOSE
+Mon Mar  1  2004  T Horinouchi
+	* version 1.1 released ((cvs) tag: numru-units-1_1)
+Mon Mar  1  2004  E Toyoda
+	* test.rb: revised due to the change of reduce4; updated
+	* timenode.rb debugged (Unexpected generation of Float by Date#-
+	  is avoided using Date-like wrapper to Time.)
+	* node.rb: unalias (such as "kilometer" -> "10^3 m") will not
+	  occur at reduce4. (plurals still recognized in reduce4)
+	* namenode.rb,numbernode.rb: unused methods "nameable?" removed
+	* makeutab.rb: Bugfix: units like "second" or "metre" were not
+	  unaliased to its primary name (such as "s" or "m") due to
+	  improper parsing of dcunits.txt.
+Sun Feb 29  2004  E Toyoda (Commited by T Horinouchi)
+	* makeutab.rb: debug plural treatment (/y$/ -> /[^aeou]y$/)
+Fri Feb 27  2004  T Horinouchi
+	* src/lex.rb: added Units#convert2 (similar to Units#convert but
+	  more suitable for UNumeric constraction).
+	  debug in =~
+	* test.rb: added a test of =~
+Thu Feb 26  2004  T Horinouchi
+	* src/lex.rb: added Units#factor_and_offset
+	* doc/units.rd: updated
+Wed Feb 25  2004  T Horinouchi
+	* src/Makefile: add -l option to racc -- not to convert line #s
+	  for better readability of exception messages
+	* Makefile: (very minor) cp --> cp -p
+Tue Feb 24  2004  T Horinouchi
+	* version 1.0 released
+	* packaging for distribution
+	* put Units into the NumRu module ( --> class NumRu::Units )
+	* cvs version control started (CVSROOT=
+	  dennou-k.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/ruby/cvsroot
+	  project name: numru-units)
+Fri Feb  6  2004  TOYODA Eizi (log written by T Horinouchi 2004/03/24)
+	* revised
+Fri Nov  7  2003  TOYODA Eizi (log written by T Horinouchi 2004/03/24)
+	* revized
+Fri Oct 24  2003(or before) TOYODA Eizi(log written by T Horinouchi 2004/03/24)
+	* created
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..53f10ee
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,34 @@
+NumRu::Units is copyrighted free software by Takeshi Horinouchi and
+GFD Dennou Club (http://www.gfd-dennou.org/).
+
+Copyright 2011 (C) Takeshi Horinouchi and GFD Dennou Club
+(http://www.gfd-dennou.org/) All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+
+THIS SOFTWARE IS PROVIDED BY GFD DENNOU CLUB AND CONTRIBUTORS ``AS IS'' 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GFD DENNOU CLUB OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation
+are those of the authors and should not be interpreted as representing
+official policies, either expressed or implied, of Takeshi Horinouchi
+and GFD Dennou Club.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c703b4e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,14 @@
+all:
+	@(cd src && make && cp -p units.rb ../lib/numru/)
+	@(cd doc && make)
+
+install:
+	ruby install.rb
+
+test:
+	@(cd src && make test)
+
+distclean: clean
+
+clean:
+	@rm -f `find . -name "*~" -print`
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..f25d7cf
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,5 @@
+all: units.html
+
+units.html: units.rd
+	rd2 units.rd | sed -e 's/<dt>/<dt><h4>/' -e 's/<\/dt>/<\/h4><\/dt>/' \
+           > units.html
diff --git a/doc/units.html b/doc/units.html
new file mode 100644
index 0000000..33cb014
--- /dev/null
+++ b/doc/units.html
@@ -0,0 +1,241 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html 
+  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>units.rd</title>
+</head>
+<body>
+<h1><a name="label-0" id="label-0">class NumRu::Units</a></h1><!-- RDLabel: "class NumRu::Units" -->
+<ul>
+<li><a href="#label-1">Overview</a></li>
+<li><a href="#label-2">Installation</a></li>
+<li><a href="#label-3">Usage Examples</a></li>
+<li><a href="#label-4">Class Methods</a></li>
+<li><a href="#label-8">Instance Methods</a></li>
+<li><a href="http://ruby.gfd-dennou.org/products/numru-units/doc/dcunits.txt">Supported units</a>  (Plural form allowed if the second field is "P")</li>
+</ul>
+<h2><a name="label-1" id="label-1">Overview</a></h2><!-- RDLabel: "Overview" -->
+<p>A class of units of physical quantities.</p>
+<p>This class covers most functionality of UNIDATA's 
+<a href="http://www.unidata.ucar.edu/packages/udunits/">UDUNITS Library</a>, 
+however, with a more sophisticated handling of string expressions. </p>
+<p>UDUNITS always decomposes units into the four base units and discards
+the original string expressions. Therefore, 'hPa' always becomes
+'100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the other 
+hand, this library tries to keep the original expressions as much as
+possible by default, while allowing partial to complete decompositions
+if needed.</p>
+<h2><a name="label-2" id="label-2">Installation</a></h2><!-- RDLabel: "Installation" -->
+<p>Move to the top directly of this library (where you find
+the file install.rb). Then, type in the following:</p>
+<pre>% ruby install.rb</pre>
+<h2><a name="label-3" id="label-3">Usage Examples</a></h2><!-- RDLabel: "Usage Examples" -->
+<p>Here is an example using the "irb" interactive shell ("%" is the
+command prompt, and ">>" is the irb prompt -- Type in those after it
+to test.  "=>" shows the result.):</p>
+<pre>% irb --simple-prompt
+>> require "numru/units"
+=> true
+>> un1 = NumRu::Units.new('kg.m2/s')
+=> Units{kg.m2/s}
+>> un2 = NumRu::Units.new('g.m')
+=> Units{g.m}
+>> un3 = un1 / un2
+=> Units[Multi[Pow[Name[g], Number[-1]], Name[kg], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
+>> un1.to_s
+=> "kg.m2/s"
+>> un2.to_s
+=> "g.m"
+>> un3.to_s
+=> "g-1 kg.m1 s-1"
+>> un3.reduce5
+=> Units[Multi[Number[1000], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
+>> un3.to_s
+=> "1000 m1 s-1"</pre>
+<p>Note the difference between the results of un3.to_s 
+before and after un3.reduce5,
+where the former retains the literal expression
+of each atomic unit, while the latter does the maximum reduction.
+You can change the default behavior by using the class method 
+reduce_level=:</p>
+<pre>>> NumRu::Units.reduce_level = 5
+=> :reduce5
+>> un3.to_s
+=> "1000 m1 s-1"</pre>
+<p>Note that you can eliminate the prefix NumRu:: by "including"
+it:</p>
+<pre>>> require "numru/units"
+=> true
+>> include NumRu
+=> Object
+>> un1 = Units.new('kg.m2/s')
+=> Units{kg.m2/s}
+>> Units.reduce_level = 5
+=> :reduce5</pre>
+<h2><a name="label-4" id="label-4">Class Methods</a></h2><!-- RDLabel: "Class Methods" -->
+<p>In what follows, the prefix NumRu:: is omitted for conciseness.
+See <a href="#label-3">Usage Examples</a> on this issue.</p>
+<dl>
+<dt><h4><a name="label-5" id="label-5"><code>Units.new(<var>string</var>)</code></a></h4></dt><!-- RDLabel: "Units.new" -->
+<dd>
+<p>Constructor.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>string (String): string expression of the units. 
+      [factor] units; [factor] time units [since ...] (see EXAMPLES below)</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>a Units</li>
+</ul>
+<p>EXAMPLE</p>
+<pre>units = Units.new('kg.m2/s')
+units = Units.new('100 m')
+units = Units.new('g/kg')
+units = Units.new('hour since 2003-10-01 00:00:0 +0:00')
+units = Units.new('hour since 2003-10-01')   # same as above
+units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00')</pre></dd>
+<dt><h4><a name="label-6" id="label-6"><code>Units[string]</code></a></h4></dt><!-- RDLabel: "Units[string]" -->
+<dd>
+Same as <a href="#label-5">Units.new</a></dd>
+<dt><h4><a name="label-7" id="label-7"><code>Units.reduce_level=(<var>n</var>)</code></a></h4></dt><!-- RDLabel: "Units.reduce_level=" -->
+<dd>
+<p>Set the reduction level before <a href="#label-9">to_s</a> is applied.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>n (Integer): the reduction level. The default value is 4.
+      Use 5 if you want a full reduction. Levels lower than 4 
+      will not be needed.</li>
+</ul></dd>
+</dl>
+<h2><a name="label-8" id="label-8">Instance Methods</a></h2><!-- RDLabel: "Instance Methods" -->
+<dl>
+<dt><h4><a name="label-9" id="label-9"><code>to_s</code></a></h4></dt><!-- RDLabel: "to_s" -->
+<dd>
+Returns a string expression of the units.</dd>
+<dt><h4><a name="label-10" id="label-10"><code>*(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "*" -->
+<dd>
+<p>Multiplies self with another units. 
+Applies <a href="#label-16">reduce4</a> to format the string expression of the result.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>other [Units]: the other units</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>a Units</li>
+</ul></dd>
+<dt><h4><a name="label-11" id="label-11"><code>/(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "/" -->
+<dd>
+<p>Divides self with another units.
+Applies <a href="#label-16">reduce4</a> to format the string expression of the result.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>other [Units]: the other units</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>a Units</li>
+</ul></dd>
+<dt><h4><a name="label-12" id="label-12"><code>**(<var>pow</var>)</code></a></h4></dt><!-- RDLabel: "**" -->
+<dd>
+<p>Power.
+Applies <a href="#label-16">reduce4</a> to format the string expression of the result.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>pow [Numeric -- Integer, Rational, or Float]</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>a Units</li>
+</ul></dd>
+<dt><h4><a name="label-13" id="label-13"><code>==(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "==" -->
+<dd>
+Whether the two units are the same. 
+('m/s' and 'm.s-1' are the same, for instance.)</dd>
+<dt><h4><a name="label-14" id="label-14"><code>===(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "===" -->
+<dd>
+Same as <a href="#label-13">==</a>.</dd>
+<dt><h4><a name="label-15" id="label-15"><code>=~(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "=~" -->
+<dd>
+Whether the two units are compatible (i.e., with the same dimensionality).
+('m/s' and '10 m.s-1' are compatible, for instance.)</dd>
+<dt><h4><a name="label-16" id="label-16"><code>reduce4</code></a></h4></dt><!-- RDLabel: "reduce4" -->
+<dd>
+<p>Moderately reduces the string expression of the units (destructive method).
+This method preserves string expression of atomic units. 
+See also <a href="#label-17">reduce5</a>.</p>
+<p>RETURN VALUE</p>
+<ul>
+<li>self</li>
+</ul>
+<p>EXAMPLE</p>
+<pre>Untis.new('hour/hour').reduce4.to_s
+  # => "1"
+Units.new('mm/m').reduce4.to_s
+  # => "mm.m-1"</pre></dd>
+<dt><h4><a name="label-17" id="label-17"><code>reduce5</code></a></h4></dt><!-- RDLabel: "reduce5" -->
+<dd>
+<p>Aggressively reduces the string expression of the units (destructive method).
+See also <a href="#label-16">reduce4</a>.</p>
+<p>RETURN VALUE</p>
+<ul>
+<li>self</li>
+</ul>
+<p>EXAMPLE</p>
+<pre>Units.new('hour/hour').reduce4.to_s
+  # => "1"
+Units.new('mm/m').reduce5.to_s
+  # => "0.001"</pre></dd>
+<dt><h4><a name="label-18" id="label-18"><code>convert(<var>numeric</var>, <var>to_units</var>)</code></a></h4></dt><!-- RDLabel: "convert" -->
+<dd>
+<p>Converts a numeric of the current units (=self) to <var>to_units</var>.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>numeric [Numeric]: the numeric to convert</li>
+<li>to_units [Units]: the units converted into</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>a Numeric</li>
+</ul>
+<p>EXCEPTIONS</p>
+<ul>
+<li><var>self</var> and <var>to_units</var> are incompatible.</li>
+</ul></dd>
+<dt><h4><a name="label-19" id="label-19"><code>convert2(<var>val</var>, <var>to_units</var>)</code></a></h4></dt><!-- RDLabel: "convert2" -->
+<dd>
+<p>Like <a href="#label-18">convert</a>, but (1) accpets any Numeric-like objects, and (2)
+does not raise an exception even if the two units are incompatible -- 
+in this case, simply returns <var>val</var> (warned).</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>val [a Numeric-like class, for which * and + are defined]:
+      the value to convert</li>
+<li>to_units [Units]: the units converted into</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>an object with the same class as <var>val</var>.</li>
+</ul></dd>
+<dt><h4><a name="label-20" id="label-20"><code>factor_and_offset(<var>to_units</var>)</code></a></h4></dt><!-- RDLabel: "factor_and_offset" -->
+<dd>
+<p>Returns the factor and offset to convert from <var>self</var> to <var>to_units</var>.
+The conversion is done as  scale_factor * operand + add_offset.</p>
+<p>ARGUMENTS</p>
+<ul>
+<li>to_units [Units]: the units to be converted into</li>
+</ul>
+<p>RETURN VALUE</p>
+<ul>
+<li>[ scale_factor, add_offset ] (a 2-element Array, where both are Numeric)</li>
+</ul>
+<p>EXAMPLE</p>
+<pre>scale_factor, add_offset = from_units.factor_and_offset(to_units)
+to = scale_factor * from + add_offset</pre></dd>
+</dl>
+
+</body>
+</html>
diff --git a/doc/units.rd b/doc/units.rd
new file mode 100644
index 0000000..387a9b5
--- /dev/null
+++ b/doc/units.rd
@@ -0,0 +1,232 @@
+=begin
+=class NumRu::Units
+
+* ((<Overview>))
+* ((<Installation>))
+* ((<Usage Examples>))
+* ((<Class Methods>))
+* ((<Instance Methods>))
+* ((<Supported units|URL:http://ruby.gfd-dennou.org/products/numru-units/doc/dcunits.txt>))  (Plural form allowed if the second field is "P")
+
+==Overview
+
+A class of units of physical quantities.
+
+This class covers most functionality of UNIDATA's 
+((<UDUNITS Library|URL:http://www.unidata.ucar.edu/packages/udunits/>)), 
+however, with a more sophisticated handling of string expressions. 
+
+UDUNITS always decomposes units into the four base units and discards
+the original string expressions. Therefore, 'hPa' always becomes
+'100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the other 
+hand, this library tries to keep the original expressions as much as
+possible by default, while allowing partial to complete decompositions
+if needed.
+
+==Installation
+
+Move to the top directly of this library (where you find
+the file install.rb). Then, type in the following:
+
+  % ruby install.rb
+
+==Usage Examples
+
+Here is an example using the "irb" interactive shell ("(('%'))" is the
+command prompt, and "(('>>'))" is the irb prompt -- Type in those after it
+to test.  "(('=>'))" shows the result.):
+
+  % irb --simple-prompt
+  >> require "numru/units"
+  => true
+  >> un1 = NumRu::Units.new('kg.m2/s')
+  => Units{kg.m2/s}
+  >> un2 = NumRu::Units.new('g.m')
+  => Units{g.m}
+  >> un3 = un1 / un2
+  => Units[Multi[Pow[Name[g], Number[-1]], Name[kg], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
+  >> un1.to_s
+  => "kg.m2/s"
+  >> un2.to_s
+  => "g.m"
+  >> un3.to_s
+  => "g-1 kg.m1 s-1"
+  >> un3.reduce5
+  => Units[Multi[Number[1000], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
+  >> un3.to_s
+  => "1000 m1 s-1"
+
+Note the difference between the results of (('un3.to_s')) 
+before and after (('un3.reduce5')),
+where the former retains the literal expression
+of each atomic unit, while the latter does the maximum reduction.
+You can change the default behavior by using the class method 
+(('reduce_level=')):
+
+  >> NumRu::Units.reduce_level = 5
+  => :reduce5
+  >> un3.to_s
+  => "1000 m1 s-1"
+
+Note that you can eliminate the prefix (('NumRu::')) by "including"
+it:
+
+  >> require "numru/units"
+  => true
+  >> include NumRu
+  => Object
+  >> un1 = Units.new('kg.m2/s')
+  => Units{kg.m2/s}
+  >> Units.reduce_level = 5
+  => :reduce5
+
+==Class Methods
+
+In what follows, the prefix (('NumRu::')) is omitted for conciseness.
+See ((<Usage Examples>)) on this issue.
+
+---Units.new(string)
+    Constructor.
+
+    ARGUMENTS
+    * string (String): string expression of the units. 
+      [factor] units; [factor] time units [since ...] (see EXAMPLES below)
+
+    RETURN VALUE
+    * a Units
+
+    EXAMPLE
+
+      units = Units.new('kg.m2/s')
+      units = Units.new('100 m')
+      units = Units.new('g/kg')
+      units = Units.new('hour since 2003-10-01 00:00:0 +0:00')
+      units = Units.new('hour since 2003-10-01')   # same as above
+      units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00')
+
+---Units[string]
+
+    Same as ((<Units.new>))
+
+---Units.reduce_level=(n) 
+    Set the reduction level before ((<to_s>)) is applied.
+
+    ARGUMENTS
+    * n (Integer): the reduction level. The default value is 4.
+      Use 5 if you want a full reduction. Levels lower than 4 
+      will not be needed.
+
+==Instance Methods
+
+---to_s
+    Returns a string expression of the units.
+
+---*(other)
+    Multiplies self with another units. 
+    Applies ((<reduce4>)) to format the string expression of the result.
+
+    ARGUMENTS
+    * other [Units]: the other units
+
+    RETURN VALUE
+    * a Units
+
+---/(other)
+    Divides self with another units.
+    Applies ((<reduce4>)) to format the string expression of the result.
+
+    ARGUMENTS
+    * other [Units]: the other units
+
+    RETURN VALUE
+    * a Units
+
+---**(pow)
+    Power.
+    Applies ((<reduce4>)) to format the string expression of the result.
+
+    ARGUMENTS
+    * pow [Numeric -- Integer, Rational, or Float]
+
+    RETURN VALUE
+    * a Units
+
+---==(other)
+    Whether the two units are the same. 
+    ('m/s' and 'm.s-1' are the same, for instance.)
+
+---===(other)
+    Same as ((<==>)).
+
+---=~(other)
+    Whether the two units are compatible (i.e., with the same dimensionality).
+    ('m/s' and '10 m.s-1' are compatible, for instance.)
+
+---reduce4
+    Moderately reduces the string expression of the units (destructive method).
+    This method preserves string expression of atomic units. 
+    See also ((<reduce5>)).
+
+    RETURN VALUE
+    * self
+
+    EXAMPLE
+      Untis.new('hour/hour').reduce4.to_s
+        # => "1"
+      Units.new('mm/m').reduce4.to_s
+        # => "mm.m-1"
+
+---reduce5
+    Aggressively reduces the string expression of the units (destructive method).
+    See also ((<reduce4>)).
+
+    RETURN VALUE
+    * self
+
+    EXAMPLE
+      Units.new('hour/hour').reduce4.to_s
+        # => "1"
+      Units.new('mm/m').reduce5.to_s
+        # => "0.001"
+
+---convert(numeric, to_units)
+    Converts a numeric of the current units (=self) to ((|to_units|)).
+
+    ARGUMENTS
+    * numeric [Numeric]: the numeric to convert
+    * to_units [Units]: the units converted into
+
+    RETURN VALUE
+    * a Numeric
+
+    EXCEPTIONS
+    * ((|self|)) and ((|to_units|)) are incompatible.
+
+---convert2(val, to_units)
+    Like ((<convert>)), but (1) accpets any Numeric-like objects, and (2)
+    does not raise an exception even if the two units are incompatible -- 
+    in this case, simply returns ((|val|)) (warned).
+
+    ARGUMENTS
+    * val [a Numeric-like class, for which (('*')) and (('+')) are defined]:
+      the value to convert
+    * to_units [Units]: the units converted into
+
+    RETURN VALUE
+    * an object with the same class as ((|val|)).
+
+---factor_and_offset(to_units)
+    Returns the factor and offset to convert from ((|self|)) to ((|to_units|)).
+    The conversion is done as  (('scale_factor * operand + add_offset')).
+
+    ARGUMENTS
+    * to_units [Units]: the units to be converted into
+
+    RETURN VALUE
+    * [ scale_factor, add_offset ] (a 2-element Array, where both are Numeric)
+
+    EXAMPLE
+      scale_factor, add_offset = from_units.factor_and_offset(to_units)
+      to = scale_factor * from + add_offset
+
+=end
diff --git a/install.rb b/install.rb
new file mode 100644
index 0000000..2368541
--- /dev/null
+++ b/install.rb
@@ -0,0 +1,104 @@
+require 'rbconfig'
+require 'find'
+include Config
+
+if CONFIG["MINOR"].to_i > 6 then $rb_18 = true else $rb_18 = false end
+if $rb_18
+  require 'fileutils'
+else
+  require 'ftools'
+end
+
+=begin
+$version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
+$libdir = File.join(CONFIG["libdir"], "ruby", $version)
+# $archdir = File.join($libdir, CONFIG["arch"])
+$site_libdir = $:.find {|x| x =~ /site_ruby$/}
+if !$site_libdir
+  $site_libdir = File.join($libdir, "site_ruby")
+elsif Regexp.compile($site_libdir) !~ Regexp.quote($version)
+  $site_libdir = File.join($site_libdir, $version)
+end
+
+default_destdir = $site_libdir
+=end
+
+default_destdir = CONFIG["sitelibdir"]
+
+def install_rb(srcdir, destdir)
+  libdir = "lib"
+  libdir = File.join(srcdir, libdir) if srcdir
+  path = []
+  dir = []
+  Find.find(libdir) do |f|
+    next unless FileTest.file?(f)
+    next if (f = f[libdir.length+1..-1]) == nil
+    next if (/CVS$/ =~ File.dirname(f))
+    path.push f
+    dir |= [File.dirname(f)]
+  end
+  for f in dir
+    next if f == "."
+    next if f == "CVS"
+    if $rb_18
+      FileUtils.makedirs(File.join(destdir, f))
+    else
+      File::makedirs(File.join(destdir, f))
+    end
+  end
+  for f in path
+    next if (/\~$/ =~ f)
+    next if (/^\./ =~ File.basename(f))
+    if $rb_18
+      FileUtils.install(File.join("lib", f), File.join(destdir, f), {:mode => 0644, :verbose => true})
+    else
+      File::install(File.join("lib", f), File.join(destdir, f), 0644, true)
+    end
+  end
+end
+
+def ARGV.switch
+  return nil if self.empty?
+  arg = self.shift
+  return nil if arg == '--'
+  if arg =~ /^-(.)(.*)/
+    return arg if $1 == '-'
+    raise 'unknown switch "-"' if $2.index('-')
+    self.unshift "-#{$2}" if $2.size > 0
+    "-#{$1}"
+  else
+    self.unshift arg
+    nil
+  end
+end
+
+def ARGV.req_arg
+  self.shift || raise('missing argument')
+end
+
+destdir = default_destdir
+
+begin
+  while switch = ARGV.switch
+    case switch
+    when '-d', '--destdir'
+      destdir = ARGV.req_arg
+#    when '-u', '--uninstall'
+#      uninstall = true
+    else
+      raise "unknown switch #{switch.dump}"
+    end
+  end
+rescue
+  STDERR.puts $!.to_s
+  STDERR.puts File.basename($0) + 
+    " -d <destdir>"
+  exit 1
+end    
+
+#if( defined?(uninstall) && uninstall )
+#   uninstall_rb(nil, destdir)
+#else
+   install_rb(nil, destdir)
+#end
+
diff --git a/lib/numru/units.rb b/lib/numru/units.rb
new file mode 100644
index 0000000..9ca393b
--- /dev/null
+++ b/lib/numru/units.rb
@@ -0,0 +1,3505 @@
+#
+# DO NOT MODIFY!!!!
+# This file is automatically generated by racc 1.4.5
+# from racc grammer file "units.racc".
+#
+#
+# tmp.rb: generated by racc (runtime embedded)
+#
+###### racc/parser.rb begin
+unless $".index 'racc/parser.rb'
+$".push 'racc/parser.rb'
+
+#
+# $Id: units.rb,v 1.19 2011-08-03 09:16:07 horinout Exp $
+#
+# Copyright (c) 1999-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the same terms of ruby.
+#
+# As a special exception, when this code is copied by Racc
+# into a Racc output file, you may use that output file
+# without restriction.
+#
+
+unless defined?(NotImplementedError)
+  NotImplementedError = NotImplementError
+end
+
+module Racc
+  class ParseError < StandardError; end
+end
+unless defined?(::ParseError)
+  ParseError = Racc::ParseError
+end
+
+module Racc
+
+  unless defined?(Racc_No_Extentions)
+    Racc_No_Extentions = false
+  end
+
+  class Parser
+
+    Racc_Runtime_Version = '1.4.5'
+    Racc_Runtime_Revision = '$Revision: 1.19 $'.split[1]
+
+    Racc_Runtime_Core_Version_R = '1.4.5'
+    Racc_Runtime_Core_Revision_R = '$Revision: 1.19 $'.split[1]
+    begin
+      require 'racc/cparse'
+    # Racc_Runtime_Core_Version_C  = (defined in extention)
+      Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
+      unless new.respond_to?(:_racc_do_parse_c, true)
+        raise LoadError, 'old cparse.so'
+      end
+      if Racc_No_Extentions
+        raise LoadError, 'selecting ruby version of racc runtime core'
+      end
+
+      Racc_Main_Parsing_Routine    = :_racc_do_parse_c
+      Racc_YY_Parse_Method         = :_racc_yyparse_c
+      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_C
+      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_C
+      Racc_Runtime_Type            = 'c'
+    rescue LoadError
+      Racc_Main_Parsing_Routine    = :_racc_do_parse_rb
+      Racc_YY_Parse_Method         = :_racc_yyparse_rb
+      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_R
+      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_R
+      Racc_Runtime_Type            = 'ruby'
+    end
+
+    def Parser.racc_runtime_type
+      Racc_Runtime_Type
+    end
+
+    private
+
+    def _racc_setup
+      @yydebug = false unless self.class::Racc_debug_parser
+      @yydebug = false unless defined?(@yydebug)
+      if @yydebug
+        @racc_debug_out = $stderr unless defined?(@racc_debug_out)
+        @racc_debug_out ||= $stderr
+      end
+      arg = self.class::Racc_arg
+      arg[13] = true if arg.size < 14
+      arg
+    end
+
+    def _racc_init_sysvars
+      @racc_state  = [0]
+      @racc_tstack = []
+      @racc_vstack = []
+
+      @racc_t = nil
+      @racc_val = nil
+
+      @racc_read_next = true
+
+      @racc_user_yyerror = false
+      @racc_error_status = 0
+    end
+
+    ###
+    ### do_parse
+    ###
+
+    def do_parse
+      __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
+    end
+
+    def next_token
+      raise NotImplementedError, "#{self.class}\#next_token is not defined"
+    end
+
+    def _racc_do_parse_rb(arg, in_debug)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+
+      _racc_init_sysvars
+      tok = act = i = nil
+      nerr = 0
+
+      catch(:racc_end_parse) {
+        while true
+          if i = action_pointer[@racc_state[-1]]
+            if @racc_read_next
+              if @racc_t != 0   # not EOF
+                tok, @racc_val = next_token()
+                unless tok      # EOF
+                  @racc_t = 0
+                else
+                  @racc_t = (token_table[tok] or 1)   # error token
+                end
+                racc_read_token(@racc_t, tok, @racc_val) if @yydebug
+                @racc_read_next = false
+              end
+            end
+            i += @racc_t
+            unless i >= 0 and
+                   act = action_table[i] and
+                   action_check[i] == @racc_state[-1]
+              act = action_default[@racc_state[-1]]
+            end
+          else
+            act = action_default[@racc_state[-1]]
+          end
+          while act = _racc_evalact(act, arg)
+            ;
+          end
+        end
+      }
+    end
+
+    ###
+    ### yyparse
+    ###
+
+    def yyparse(recv, mid)
+      __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
+    end
+
+    def _racc_yyparse_rb(recv, mid, arg, c_debug)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+
+      _racc_init_sysvars
+      tok = nil
+      act = nil
+      i = nil
+      nerr = 0
+
+      catch(:racc_end_parse) {
+        until i = action_pointer[@racc_state[-1]]
+          while act = _racc_evalact(action_default[@racc_state[-1]], arg)
+            ;
+          end
+        end
+        recv.__send__(mid) do |tok, val|
+          unless tok
+            @racc_t = 0
+          else
+            @racc_t = (token_table[tok] or 1)   # error token
+          end
+          @racc_val = val
+          @racc_read_next = false
+
+          i += @racc_t
+          unless i >= 0 and
+                 act = action_table[i] and
+                 action_check[i] == @racc_state[-1]
+            act = action_default[@racc_state[-1]]
+          end
+          while act = _racc_evalact(act, arg)
+            ;
+          end
+
+          while not (i = action_pointer[@racc_state[-1]]) or
+                not @racc_read_next or
+                @racc_t == 0   # $
+            unless i and i += @racc_t and
+                   i >= 0 and
+                   act = action_table[i] and
+                   action_check[i] == @racc_state[-1]
+              act = action_default[@racc_state[-1]]
+            end
+            while act = _racc_evalact(act, arg)
+              ;
+            end
+          end
+        end
+      }
+    end
+
+    ###
+    ### common
+    ###
+
+    def _racc_evalact(act, arg)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+      nerr = 0   # tmp
+
+      if act > 0 and act < shift_n
+        #
+        # shift
+        #
+        if @racc_error_status > 0
+          @racc_error_status -= 1 unless @racc_t == 1   # error token
+        end
+        @racc_vstack.push @racc_val
+        @racc_state.push act
+        @racc_read_next = true
+        if @yydebug
+          @racc_tstack.push @racc_t
+          racc_shift @racc_t, @racc_tstack, @racc_vstack
+        end
+
+      elsif act < 0 and act > -reduce_n
+        #
+        # reduce
+        #
+        code = catch(:racc_jump) {
+          @racc_state.push _racc_do_reduce(arg, act)
+          false
+        }
+        if code
+          case code
+          when 1 # yyerror
+            @racc_user_yyerror = true   # user_yyerror
+            return -reduce_n
+          when 2 # yyaccept
+            return shift_n
+          else
+            raise '[Racc Bug] unknown jump code'
+          end
+        end
+
+      elsif act == shift_n
+        #
+        # accept
+        #
+        racc_accept if @yydebug
+        throw :racc_end_parse, @racc_vstack[0]
+
+      elsif act == -reduce_n
+        #
+        # error
+        #
+        case @racc_error_status
+        when 0
+          unless arg[21]    # user_yyerror
+            nerr += 1
+            on_error @racc_t, @racc_val, @racc_vstack
+          end
+        when 3
+          if @racc_t == 0   # is $
+            throw :racc_end_parse, nil
+          end
+          @racc_read_next = true
+        end
+        @racc_user_yyerror = false
+        @racc_error_status = 3
+        while true
+          if i = action_pointer[@racc_state[-1]]
+            i += 1   # error token
+            if  i >= 0 and
+                (act = action_table[i]) and
+                action_check[i] == @racc_state[-1]
+              break
+            end
+          end
+          throw :racc_end_parse, nil if @racc_state.size <= 1
+          @racc_state.pop
+          @racc_vstack.pop
+          if @yydebug
+            @racc_tstack.pop
+            racc_e_pop @racc_state, @racc_tstack, @racc_vstack
+          end
+        end
+        return act
+
+      else
+        raise "[Racc Bug] unknown action #{act.inspect}"
+      end
+
+      racc_next_state(@racc_state[-1], @racc_state) if @yydebug
+
+      nil
+    end
+
+    def _racc_do_reduce(arg, act)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+      state = @racc_state
+      vstack = @racc_vstack
+      tstack = @racc_tstack
+
+      i = act * -3
+      len       = reduce_table[i]
+      reduce_to = reduce_table[i+1]
+      method_id = reduce_table[i+2]
+      void_array = []
+
+      tmp_t = tstack[-len, len] if @yydebug
+      tmp_v = vstack[-len, len]
+      tstack[-len, len] = void_array if @yydebug
+      vstack[-len, len] = void_array
+      state[-len, len]  = void_array
+
+      # tstack must be updated AFTER method call
+      if use_result
+        vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
+      else
+        vstack.push __send__(method_id, tmp_v, vstack)
+      end
+      tstack.push reduce_to
+
+      racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
+
+      k1 = reduce_to - nt_base
+      if i = goto_pointer[k1]
+        i += state[-1]
+        if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
+          return curstate
+        end
+      end
+      goto_default[k1]
+    end
+
+    def on_error(t, val, vstack)
+      raise ParseError, sprintf("\nparse error on value %s (%s)",
+                                val.inspect, token_to_str(t) || '?')
+    end
+
+    def yyerror
+      throw :racc_jump, 1
+    end
+
+    def yyaccept
+      throw :racc_jump, 2
+    end
+
+    def yyerrok
+      @racc_error_status = 0
+    end
+
+    #
+    # for debugging output
+    #
+
+    def racc_read_token(t, tok, val)
+      @racc_debug_out.print 'read    '
+      @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
+      @racc_debug_out.puts val.inspect
+      @racc_debug_out.puts
+    end
+
+    def racc_shift(tok, tstack, vstack)
+      @racc_debug_out.puts "shift   #{racc_token2str tok}"
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_reduce(toks, sim, tstack, vstack)
+      out = @racc_debug_out
+      out.print 'reduce '
+      if toks.empty?
+        out.print ' <none>'
+      else
+        toks.each {|t| out.print ' ', racc_token2str(t) }
+      end
+      out.puts " --> #{racc_token2str(sim)}"
+          
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_accept
+      @racc_debug_out.puts 'accept'
+      @racc_debug_out.puts
+    end
+
+    def racc_e_pop(state, tstack, vstack)
+      @racc_debug_out.puts 'error recovering mode: pop token'
+      racc_print_states state
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_next_state(curstate, state)
+      @racc_debug_out.puts  "goto    #{curstate}"
+      racc_print_states state
+      @racc_debug_out.puts
+    end
+
+    def racc_print_stacks(t, v)
+      out = @racc_debug_out
+      out.print '        ['
+      t.each_index do |i|
+        out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
+      end
+      out.puts ' ]'
+    end
+
+    def racc_print_states(s)
+      out = @racc_debug_out
+      out.print '        ['
+      s.each {|st| out.print ' ', st }
+      out.puts ' ]'
+    end
+
+    def racc_token2str(tok)
+      self.class::Racc_token_to_s_table[tok] or
+          raise "[Racc Bug] can't convert token #{tok} to string"
+    end
+
+    def token_to_str(t)
+      self.class::Racc_token_to_s_table[t]
+    end
+
+  end
+
+end
+end
+###### racc/parser.rb end
+
+
+
+require 'date'
+
+
+module NumRu
+class Units < Racc::Parser
+
+
+=begin
+= class Node
+Node is a parent class for classes of parse tree node.
+This is not expected to be instanciated directly.
+=end
+
+class Node
+
+    def initialize(*args)
+	raise "#{self.class} is virtual."
+    end
+
+    def to_s(*args)
+	raise "#{self.class}#to_s is virtual."
+    end
+
+=begin
+--- pow other
+    simply constructs a PowNode object.
+    No reduction is performed.
+=end
+
+    def pow(other)
+	PowNode.new(self, other)
+    end
+
+=begin
+--- mul other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def mul(other)
+	other = NumberNode.new(other) if Numeric === other
+	MulNode.new(self, other)
+    end
+
+=begin
+--- divide other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def divide(other)
+	MulNode.new(self, PowNode.new(other, NumberNode.new(-1)))
+    end
+
+=begin
+--- shift other
+    simply constructs a ShiftNode object.
+    No reduction is performed.
+=end
+
+    def shift(other)
+	ShiftNode.new(self, other)
+    end
+
+=begin
+--- pow_eval other
+    similar to ((<pow other>)), but reduces PowNode[PowNode[...]] into
+    single PowNode[...], so overriden at PowNode class.
+=end
+
+    def pow_eval(other)
+	pow(other)
+    end
+
+=begin
+--- inspect
+=end
+
+    def inspect2;  "#{self.class}[#{to_s}]";  end
+
+    def inspect;  inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '[');  end
+
+=begin
+--- trim
+    in most subclasses, "trim" is redirected into "trim2".
+=end
+
+    def trim
+	trim2
+    end
+
+=begin
+--- flatten
+    in most subclasses, "flatten" is redirected into "flatten2".
+=end
+
+    def flatten
+	flatten2
+    end
+
+=begin
+--- sort
+=end
+
+    def sort
+	raise "#{self.class}#sort is virtual: call after flatten"
+    end
+
+=begin
+--- reduce1
+--- reduce2
+--- reduce3
+--- reduce4
+--- reduce5
+=end
+
+    def reduce1
+	self
+    end
+
+    def reduce2
+	trim
+    end
+
+    def reduce3
+	trim.flatten
+    end
+
+    def reduce4
+	# unalias(Hash.new).trim.flatten.sort
+	foldnumber(nil).trim.flatten.sort
+    end
+
+    def reduce5
+	expand(Hash.new).trim.flatten.sort
+    end
+
+=begin
+--- ref
+    to be overriden at ShiftNode
+--- deref
+    to be overriden at ShiftNode
+=end
+
+    def ref
+	NumberNode::ZERO
+    end
+
+    def deref
+	self
+    end
+
+end
+
+class ErrorNode < Node
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+end
+
+class ContainerNode < Node
+
+    def trim2
+	x = []
+	for child in self
+	    x.push child.trim2
+	end
+	self.class.new(*x)
+    end
+
+    def inspect2
+	a = []
+	for child in self
+	    a.push child.inspect2
+	end
+      	"#{self.class}[#{a.join(', ')}]"
+    end
+
+end
+
+module BinaryNode
+
+    def each
+	yield @lhs
+	yield @rhs
+    end
+
+    def expand(stopper)
+	self.class.new(@lhs.expand(stopper), @rhs.expand(stopper))
+    end
+
+    def unalias(stopper)
+	self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper))
+    end
+
+    def foldnumber(stopper)
+	self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper))
+    end
+
+end
+
+class TerminalNode < Node
+
+    def trim2;  self;  end
+    def flatten2;  self;  end
+
+    def expand(stopper);  self;  end
+    alias :unalias :expand
+    alias :foldnumber :expand
+
+    def sort;  self;  end
+
+end
+class NameNode < TerminalNode
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+    alias :name :to_s
+
+    def power;  NumberNode::UNITY;  end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	PowNode.new(self, self.power.add_eval(another.power))
+    end
+
+    def expand(stopper) 
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self if basic?
+	return CACHE[@a] if CACHE.include?(@a)
+	CACHE[@a] = expand2(stopper)
+    end
+
+    def expand2(stopper)
+	newstopper = stopper.dup
+	newstopper[@a] = true
+	if UDEFS.include?(@a) then
+	    Units.new(UDEFS[@a]).ptree.expand(newstopper)
+	else
+	    p, n = UALIASES[@a]
+	    u = Units.new(UDEFS[n] || n).ptree.expand(newstopper)
+	    MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p)))
+	end
+    end
+
+    def unalias(stopper)
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self unless UALIASES.include?(@a)
+	p, n = UALIASES[@a]
+	u = NameNode.new(n)
+	q = PowNode.new(NumberNode.new(10), NumberNode.new(p))
+	MulNode.new(u, q)
+    end
+
+    def foldnumber(stopper)
+	return self unless UPLURALS.include?(@a)
+	n = UPLURALS[@a]
+	NameNode.new(n)
+    end
+
+    def basic?
+	not (UDEFS.include?(@a) or UALIASES.include?(@a))
+    end
+
+    CACHE = {}
+
+    def factor
+	1
+    end
+
+end
+
+class NameNode
+UDEFS = {
+  "%" => "1e-2",  "Au" => "astronomical_unit",  "Bq" => "s-1",
+  "C" => "A.s",  "Celsius" => "K @ 273.15",  "F" => "C/V",
+  "Fahrenheit" => "degree_F",  "G" => "gauss",  "Gal" => "cm s-2",
+  "Gy" => "J.kg-1",  "H" => "Wb.A-1",  "Hg" => "mercury",
+  "Hz" => "1/s",  "J" => "N.m",  "Julian_year" => "365.25 day",
+  "L" => "litre",  "N" => "kg.m.s-2",  "P" => "poise",  "Pa" => "N.m-2",
+  "Pascal" => "Pa",  "S" => "A/V",  "St" => "stokes",  "Sv" => "J.kg-1",
+  "T" => "Wb.m-2",  "V" => "J/C",  "W" => "J/s",  "Wb" => "V.s",
+  "a" => "are",  "ac" => "acre",  "acre" => "10 chain2",
+  "ampere" => "A",  "angstrom" => "1.0e-10 m",
+  "angular_degree" => "degree",  "angular_minute" => "minute_angle",
+  "angular_second" => "second_angle",  "are" => "100 m2",
+  "astronomical_unit" => "1.49597870e11 m",
+  "astronomical_units" => "1.49597870e11 m",  "atm" => "atmosphere",
+  "atmosphere" => "101325 Pa",  "bar" => "1e6 dyn.cm-2",
+  "cal" => "calorie",  "calorie" => "4.18605 J",
+  "celsius" => "K @ 273.15",  "centigrade" => "K @ 273.15",
+  "century" => "100 year",  "chain" => "22 yard",
+  "common_year" => "365 day",
+  "conventional_mercury" => "gravity 13595.10 kg/m3",  "coulomb" => "C",
+  "d" => "24 hour",  "day" => "24 hour",  "degC" => "K @ 273.15",
+  "degF" => "degree_F",  "degK" => "K",  "deg_C" => "K @ 273.15",
+  "deg_F" => "degree_F",  "deg_K" => "K",  "degree" => "pi.rad/180",
+  "degreeC" => "K @ 273.15",  "degreeF" => "degree_F",
+  "degreeK" => "K",  "degree_C" => "K @ 273.15",
+  "degree_E" => "degree",  "degree_F" => "degree_R @ 459.67",
+  "degree_N" => "degree",  "degree_R" => "K / 1.8",
+  "degree_S" => "degree",  "degree_W" => "degree",
+  "degree_c" => "K @ 273.15",  "degree_east" => "degree_E",
+  "degree_f" => "degree_R @ 459.67",  "degree_north" => "degree_N",
+  "degree_south" => "degree_S",  "degree_west" => "degree_W",
+  "degrees_east" => "degree_E",  "degrees_north" => "degree_N",
+  "degrees_south" => "degree_S",  "degrees_west" => "degree_W",
+  "dyn" => "g.cm.s-2",  "dyne" => "g.cm.s-2",  "erg" => "dyn cm",
+  "fahrenheit" => "degree_F",  "farad" => "coulomb/volt",
+  "feet" => "foot",  "fermi" => "1.0e-15 m",  "foot" => "12 inch",
+  "force" => "9.80665 m.s-2",  "ft" => "foot",  "g" => "kg/1000",
+  "gal" => "cm s-2",  "gauss" => "T / 10000",  "gram" => "kg/1000",
+  "gravity" => "9.806650 meter/second2",  "h" => "60 min",
+  "hectare" => "100 are",  "hertz" => "Hz",  "hg" => "mercury",
+  "horse_power" => "75 m kilogram-force / s",  "hour" => "60 min",
+  "hr" => "60 min",  "in" => "inch",  "inch" => "2.54 cm",
+  "joule" => "J",  "kelvin" => "K",  "kgf" => "kilogram-force",
+  "kilogram" => "kg",  "knot" => "nautical_mile / hour",
+  "kph" => "km / hour",  "lb" => "pound",
+  "light_speed" => "299792458 m/s",  "light_year" => "9.46e15 m",
+  "light_years" => "9.46e15 m",  "litre" => "1.0e-3 m3",
+  "lm" => "cd.sr",  "lx" => "lm.m-2",  "ly" => "light_year",
+  "mb" => "bar / 1000",  "mercury" => "conventional_mercury",
+  "meter" => "metre",  "metre" => "m",  "mgal" => "cm s-2 / 1000",
+  "micron" => "1.0e-6 m",  "mile" => "1760 yard",
+  "millibar" => "bar / 1000",  "min" => "60 s",  "minute" => "60 s",
+  "minute_angle" => "pi.rad/180/60",  "mole" => "mol",
+  "mon" => "month",  "month" => "6 pentad",  "mph" => "mile / hour",
+  "nautical_mile" => "1852 m",  "nautical_miles" => "1852 m",
+  "newton" => "N",  "ohm" => "V/A",  "ounce" => "pound / 16",
+  "oz" => "ounce",  "parsec" => "3.0857e16 m",  "pascal" => "Pa",
+  "pc" => "parsec",  "percent" => "1e-2",  "permil" => "1e-3",
+  "pi" => "3.141592653589793238462",  "poise" => "dyn s / cm2",
+  "pound" => "453.6 g",  "psi" => "pound-force / inch2",
+  "radian" => "rad",  "second" => "s",
+  "second_angle" => "pi.rad/180/60/60",  "steradian" => "sr",
+  "stokes" => "cm2 / s",  "t" => "ton",  "tesla" => "Wb.m-2",
+  "ton" => "1000 kg",  "tonne" => "ton",  "torr" => "133.322 Pa",
+  "volt" => "V",  "watt" => "W",  "weber" => "Wb",  "yard" => "6 feet",
+  "yd" => "yard",  "year" => "12 month",  "yr" => "year",
+}
+UALIASES = {
+  "Celsiuses" => [0, "Celsius"],  "E%" => [18, "%"],  "EA" => [18, "A"],
+  "EAu" => [18, "Au"],  "EBq" => [18, "Bq"],  "EC" => [18, "C"],
+  "EF" => [18, "F"],  "EG" => [18, "G"],  "EGal" => [18, "Gal"],
+  "EGy" => [18, "Gy"],  "EH" => [18, "H"],  "EHg" => [18, "Hg"],
+  "EHz" => [18, "Hz"],  "EJ" => [18, "J"],  "EK" => [18, "K"],
+  "EL" => [18, "L"],  "EN" => [18, "N"],  "EP" => [18, "P"],
+  "EPa" => [18, "Pa"],  "ES" => [18, "S"],  "ESt" => [18, "St"],
+  "ESv" => [18, "Sv"],  "ET" => [18, "T"],  "EV" => [18, "V"],
+  "EW" => [18, "W"],  "EWb" => [18, "Wb"],  "Ea" => [18, "a"],
+  "Eac" => [18, "ac"],  "Eatm" => [18, "atm"],  "Ebar" => [18, "bar"],
+  "Ecal" => [18, "cal"],
+  "Econventional_mercury" => [18, "conventional_mercury"],
+  "Ed" => [18, "d"],  "EdegC" => [18, "degC"],  "EdegF" => [18, "degF"],
+  "Edeg_C" => [18, "deg_C"],  "Edeg_F" => [18, "deg_F"],
+  "EdegreeC" => [18, "degreeC"],  "EdegreeF" => [18, "degreeF"],
+  "Edegree_C" => [18, "degree_C"],  "Edegree_E" => [18, "degree_E"],
+  "Edegree_F" => [18, "degree_F"],  "Edegree_N" => [18, "degree_N"],
+  "Edegree_R" => [18, "degree_R"],  "Edegree_S" => [18, "degree_S"],
+  "Edegree_W" => [18, "degree_W"],  "Edegree_c" => [18, "degree_c"],
+  "Edegree_east" => [18, "degree_east"],
+  "Edegree_f" => [18, "degree_f"],
+  "Edegree_north" => [18, "degree_north"],
+  "Edegree_south" => [18, "degree_south"],
+  "Edegree_west" => [18, "degree_west"],
+  "Edegrees_east" => [18, "degrees_east"],
+  "Edegrees_north" => [18, "degrees_north"],
+  "Edegrees_south" => [18, "degrees_south"],
+  "Edegrees_west" => [18, "degrees_west"],  "Edyn" => [18, "dyn"],
+  "Eerg" => [18, "erg"],  "Eforce" => [18, "force"],  "Eg" => [18, "g"],
+  "Egravity" => [18, "gravity"],  "Eh" => [18, "h"],
+  "Ehg" => [18, "hg"],  "Ehr" => [18, "hr"],  "Ein" => [18, "in"],
+  "Ekg" => [18, "kg"],  "Ekgf" => [18, "kgf"],  "Ekph" => [18, "kph"],
+  "Elb" => [18, "lb"],  "Elm" => [18, "lm"],  "Elx" => [18, "lx"],
+  "Ely" => [18, "ly"],  "Em" => [18, "m"],  "Emb" => [18, "mb"],
+  "Emercury" => [18, "mercury"],  "Emgal" => [18, "mgal"],
+  "Emin" => [18, "min"],  "Emol" => [18, "mol"],  "Emon" => [18, "mon"],
+  "Emph" => [18, "mph"],  "Eohm" => [18, "ohm"],  "Eoz" => [18, "oz"],
+  "Epc" => [18, "pc"],  "Epercent" => [18, "percent"],
+  "Epermil" => [18, "permil"],  "Epsi" => [18, "psi"],
+  "Erad" => [18, "rad"],  "Es" => [18, "s"],  "Esr" => [18, "sr"],
+  "Et" => [18, "t"],  "Eyr" => [18, "yr"],
+  "Fahrenheits" => [0, "Fahrenheit"],  "G%" => [9, "%"],
+  "GA" => [9, "A"],  "GAu" => [9, "Au"],  "GBq" => [9, "Bq"],
+  "GC" => [9, "C"],  "GF" => [9, "F"],  "GG" => [9, "G"],
+  "GGal" => [9, "Gal"],  "GGy" => [9, "Gy"],  "GH" => [9, "H"],
+  "GHg" => [9, "Hg"],  "GHz" => [9, "Hz"],  "GJ" => [9, "J"],
+  "GK" => [9, "K"],  "GL" => [9, "L"],  "GN" => [9, "N"],
+  "GP" => [9, "P"],  "GPa" => [9, "Pa"],  "GS" => [9, "S"],
+  "GSt" => [9, "St"],  "GSv" => [9, "Sv"],  "GT" => [9, "T"],
+  "GV" => [9, "V"],  "GW" => [9, "W"],  "GWb" => [9, "Wb"],
+  "Ga" => [9, "a"],  "Gac" => [9, "ac"],  "Gatm" => [9, "atm"],
+  "Gbar" => [9, "bar"],  "Gcal" => [9, "cal"],
+  "Gconventional_mercury" => [9, "conventional_mercury"],
+  "Gd" => [9, "d"],  "GdegC" => [9, "degC"],  "GdegF" => [9, "degF"],
+  "Gdeg_C" => [9, "deg_C"],  "Gdeg_F" => [9, "deg_F"],
+  "GdegreeC" => [9, "degreeC"],  "GdegreeF" => [9, "degreeF"],
+  "Gdegree_C" => [9, "degree_C"],  "Gdegree_E" => [9, "degree_E"],
+  "Gdegree_F" => [9, "degree_F"],  "Gdegree_N" => [9, "degree_N"],
+  "Gdegree_R" => [9, "degree_R"],  "Gdegree_S" => [9, "degree_S"],
+  "Gdegree_W" => [9, "degree_W"],  "Gdegree_c" => [9, "degree_c"],
+  "Gdegree_east" => [9, "degree_east"],  "Gdegree_f" => [9, "degree_f"],
+  "Gdegree_north" => [9, "degree_north"],
+  "Gdegree_south" => [9, "degree_south"],
+  "Gdegree_west" => [9, "degree_west"],
+  "Gdegrees_east" => [9, "degrees_east"],
+  "Gdegrees_north" => [9, "degrees_north"],
+  "Gdegrees_south" => [9, "degrees_south"],
+  "Gdegrees_west" => [9, "degrees_west"],  "Gdyn" => [9, "dyn"],
+  "Gerg" => [9, "erg"],  "Gforce" => [9, "force"],  "Gg" => [9, "g"],
+  "Ggravity" => [9, "gravity"],  "Gh" => [9, "h"],  "Ghg" => [9, "hg"],
+  "Ghr" => [9, "hr"],  "Gin" => [9, "in"],  "Gkg" => [9, "kg"],
+  "Gkgf" => [9, "kgf"],  "Gkph" => [9, "kph"],  "Glb" => [9, "lb"],
+  "Glm" => [9, "lm"],  "Glx" => [9, "lx"],  "Gly" => [9, "ly"],
+  "Gm" => [9, "m"],  "Gmb" => [9, "mb"],  "Gmercury" => [9, "mercury"],
+  "Gmgal" => [9, "mgal"],  "Gmin" => [9, "min"],  "Gmol" => [9, "mol"],
+  "Gmon" => [9, "mon"],  "Gmph" => [9, "mph"],  "Gohm" => [9, "ohm"],
+  "Goz" => [9, "oz"],  "Gpc" => [9, "pc"],
+  "Gpercent" => [9, "percent"],  "Gpermil" => [9, "permil"],
+  "Gpsi" => [9, "psi"],  "Grad" => [9, "rad"],  "Gs" => [9, "s"],
+  "Gsr" => [9, "sr"],  "Gt" => [9, "t"],  "Gyr" => [9, "yr"],
+  "Julians_year" => [0, "Julian_year"],  "M%" => [6, "%"],
+  "MA" => [6, "A"],  "MAu" => [6, "Au"],  "MBq" => [6, "Bq"],
+  "MC" => [6, "C"],  "MF" => [6, "F"],  "MG" => [6, "G"],
+  "MGal" => [6, "Gal"],  "MGy" => [6, "Gy"],  "MH" => [6, "H"],
+  "MHg" => [6, "Hg"],  "MHz" => [6, "Hz"],  "MJ" => [6, "J"],
+  "MK" => [6, "K"],  "ML" => [6, "L"],  "MN" => [6, "N"],
+  "MP" => [6, "P"],  "MPa" => [6, "Pa"],  "MS" => [6, "S"],
+  "MSt" => [6, "St"],  "MSv" => [6, "Sv"],  "MT" => [6, "T"],
+  "MV" => [6, "V"],  "MW" => [6, "W"],  "MWb" => [6, "Wb"],
+  "Ma" => [6, "a"],  "Mac" => [6, "ac"],  "Matm" => [6, "atm"],
+  "Mbar" => [6, "bar"],  "Mcal" => [6, "cal"],
+  "Mconventional_mercury" => [6, "conventional_mercury"],
+  "Md" => [6, "d"],  "MdegC" => [6, "degC"],  "MdegF" => [6, "degF"],
+  "Mdeg_C" => [6, "deg_C"],  "Mdeg_F" => [6, "deg_F"],
+  "MdegreeC" => [6, "degreeC"],  "MdegreeF" => [6, "degreeF"],
+  "Mdegree_C" => [6, "degree_C"],  "Mdegree_E" => [6, "degree_E"],
+  "Mdegree_F" => [6, "degree_F"],  "Mdegree_N" => [6, "degree_N"],
+  "Mdegree_R" => [6, "degree_R"],  "Mdegree_S" => [6, "degree_S"],
+  "Mdegree_W" => [6, "degree_W"],  "Mdegree_c" => [6, "degree_c"],
+  "Mdegree_east" => [6, "degree_east"],  "Mdegree_f" => [6, "degree_f"],
+  "Mdegree_north" => [6, "degree_north"],
+  "Mdegree_south" => [6, "degree_south"],
+  "Mdegree_west" => [6, "degree_west"],
+  "Mdegrees_east" => [6, "degrees_east"],
+  "Mdegrees_north" => [6, "degrees_north"],
+  "Mdegrees_south" => [6, "degrees_south"],
+  "Mdegrees_west" => [6, "degrees_west"],  "Mdyn" => [6, "dyn"],
+  "Merg" => [6, "erg"],  "Mforce" => [6, "force"],  "Mg" => [6, "g"],
+  "Mgravity" => [6, "gravity"],  "Mh" => [6, "h"],  "Mhg" => [6, "hg"],
+  "Mhr" => [6, "hr"],  "Min" => [6, "in"],  "Mkg" => [6, "kg"],
+  "Mkgf" => [6, "kgf"],  "Mkph" => [6, "kph"],  "Mlb" => [6, "lb"],
+  "Mlm" => [6, "lm"],  "Mlx" => [6, "lx"],  "Mly" => [6, "ly"],
+  "Mm" => [6, "m"],  "Mmb" => [6, "mb"],  "Mmercury" => [6, "mercury"],
+  "Mmgal" => [6, "mgal"],  "Mmin" => [6, "min"],  "Mmol" => [6, "mol"],
+  "Mmon" => [6, "mon"],  "Mmph" => [6, "mph"],  "Mohm" => [6, "ohm"],
+  "Moz" => [6, "oz"],  "Mpc" => [6, "pc"],
+  "Mpercent" => [6, "percent"],  "Mpermil" => [6, "permil"],
+  "Mpsi" => [6, "psi"],  "Mrad" => [6, "rad"],  "Ms" => [6, "s"],
+  "Msr" => [6, "sr"],  "Mt" => [6, "t"],  "Myr" => [6, "yr"],
+  "P%" => [15, "%"],  "PA" => [15, "A"],  "PAu" => [15, "Au"],
+  "PBq" => [15, "Bq"],  "PC" => [15, "C"],  "PF" => [15, "F"],
+  "PG" => [15, "G"],  "PGal" => [15, "Gal"],  "PGy" => [15, "Gy"],
+  "PH" => [15, "H"],  "PHg" => [15, "Hg"],  "PHz" => [15, "Hz"],
+  "PJ" => [15, "J"],  "PK" => [15, "K"],  "PL" => [15, "L"],
+  "PN" => [15, "N"],  "PP" => [15, "P"],  "PPa" => [15, "Pa"],
+  "PS" => [15, "S"],  "PSt" => [15, "St"],  "PSv" => [15, "Sv"],
+  "PT" => [15, "T"],  "PV" => [15, "V"],  "PW" => [15, "W"],
+  "PWb" => [15, "Wb"],  "Pa" => [15, "a"],  "Pac" => [15, "ac"],
+  "Pascals" => [0, "Pascal"],  "Patm" => [15, "atm"],
+  "Pbar" => [15, "bar"],  "Pcal" => [15, "cal"],
+  "Pconventional_mercury" => [15, "conventional_mercury"],
+  "Pd" => [15, "d"],  "PdegC" => [15, "degC"],  "PdegF" => [15, "degF"],
+  "Pdeg_C" => [15, "deg_C"],  "Pdeg_F" => [15, "deg_F"],
+  "PdegreeC" => [15, "degreeC"],  "PdegreeF" => [15, "degreeF"],
+  "Pdegree_C" => [15, "degree_C"],  "Pdegree_E" => [15, "degree_E"],
+  "Pdegree_F" => [15, "degree_F"],  "Pdegree_N" => [15, "degree_N"],
+  "Pdegree_R" => [15, "degree_R"],  "Pdegree_S" => [15, "degree_S"],
+  "Pdegree_W" => [15, "degree_W"],  "Pdegree_c" => [15, "degree_c"],
+  "Pdegree_east" => [15, "degree_east"],
+  "Pdegree_f" => [15, "degree_f"],
+  "Pdegree_north" => [15, "degree_north"],
+  "Pdegree_south" => [15, "degree_south"],
+  "Pdegree_west" => [15, "degree_west"],
+  "Pdegrees_east" => [15, "degrees_east"],
+  "Pdegrees_north" => [15, "degrees_north"],
+  "Pdegrees_south" => [15, "degrees_south"],
+  "Pdegrees_west" => [15, "degrees_west"],  "Pdyn" => [15, "dyn"],
+  "Perg" => [15, "erg"],  "Pforce" => [15, "force"],  "Pg" => [15, "g"],
+  "Pgravity" => [15, "gravity"],  "Ph" => [15, "h"],
+  "Phg" => [15, "hg"],  "Phr" => [15, "hr"],  "Pin" => [15, "in"],
+  "Pkg" => [15, "kg"],  "Pkgf" => [15, "kgf"],  "Pkph" => [15, "kph"],
+  "Plb" => [15, "lb"],  "Plm" => [15, "lm"],  "Plx" => [15, "lx"],
+  "Ply" => [15, "ly"],  "Pm" => [15, "m"],  "Pmb" => [15, "mb"],
+  "Pmercury" => [15, "mercury"],  "Pmgal" => [15, "mgal"],
+  "Pmin" => [15, "min"],  "Pmol" => [15, "mol"],  "Pmon" => [15, "mon"],
+  "Pmph" => [15, "mph"],  "Pohm" => [15, "ohm"],  "Poz" => [15, "oz"],
+  "Ppc" => [15, "pc"],  "Ppercent" => [15, "percent"],
+  "Ppermil" => [15, "permil"],  "Ppsi" => [15, "psi"],
+  "Prad" => [15, "rad"],  "Ps" => [15, "s"],  "Psr" => [15, "sr"],
+  "Pt" => [15, "t"],  "Pyr" => [15, "yr"],  "T%" => [12, "%"],
+  "TA" => [12, "A"],  "TAu" => [12, "Au"],  "TBq" => [12, "Bq"],
+  "TC" => [12, "C"],  "TF" => [12, "F"],  "TG" => [12, "G"],
+  "TGal" => [12, "Gal"],  "TGy" => [12, "Gy"],  "TH" => [12, "H"],
+  "THg" => [12, "Hg"],  "THz" => [12, "Hz"],  "TJ" => [12, "J"],
+  "TK" => [12, "K"],  "TL" => [12, "L"],  "TN" => [12, "N"],
+  "TP" => [12, "P"],  "TPa" => [12, "Pa"],  "TS" => [12, "S"],
+  "TSt" => [12, "St"],  "TSv" => [12, "Sv"],  "TT" => [12, "T"],
+  "TV" => [12, "V"],  "TW" => [12, "W"],  "TWb" => [12, "Wb"],
+  "Ta" => [12, "a"],  "Tac" => [12, "ac"],  "Tatm" => [12, "atm"],
+  "Tbar" => [12, "bar"],  "Tcal" => [12, "cal"],
+  "Tconventional_mercury" => [12, "conventional_mercury"],
+  "Td" => [12, "d"],  "TdegC" => [12, "degC"],  "TdegF" => [12, "degF"],
+  "Tdeg_C" => [12, "deg_C"],  "Tdeg_F" => [12, "deg_F"],
+  "TdegreeC" => [12, "degreeC"],  "TdegreeF" => [12, "degreeF"],
+  "Tdegree_C" => [12, "degree_C"],  "Tdegree_E" => [12, "degree_E"],
+  "Tdegree_F" => [12, "degree_F"],  "Tdegree_N" => [12, "degree_N"],
+  "Tdegree_R" => [12, "degree_R"],  "Tdegree_S" => [12, "degree_S"],
+  "Tdegree_W" => [12, "degree_W"],  "Tdegree_c" => [12, "degree_c"],
+  "Tdegree_east" => [12, "degree_east"],
+  "Tdegree_f" => [12, "degree_f"],
+  "Tdegree_north" => [12, "degree_north"],
+  "Tdegree_south" => [12, "degree_south"],
+  "Tdegree_west" => [12, "degree_west"],
+  "Tdegrees_east" => [12, "degrees_east"],
+  "Tdegrees_north" => [12, "degrees_north"],
+  "Tdegrees_south" => [12, "degrees_south"],
+  "Tdegrees_west" => [12, "degrees_west"],  "Tdyn" => [12, "dyn"],
+  "Terg" => [12, "erg"],  "Tforce" => [12, "force"],  "Tg" => [12, "g"],
+  "Tgravity" => [12, "gravity"],  "Th" => [12, "h"],
+  "Thg" => [12, "hg"],  "Thr" => [12, "hr"],  "Tin" => [12, "in"],
+  "Tkg" => [12, "kg"],  "Tkgf" => [12, "kgf"],  "Tkph" => [12, "kph"],
+  "Tlb" => [12, "lb"],  "Tlm" => [12, "lm"],  "Tlx" => [12, "lx"],
+  "Tly" => [12, "ly"],  "Tm" => [12, "m"],  "Tmb" => [12, "mb"],
+  "Tmercury" => [12, "mercury"],  "Tmgal" => [12, "mgal"],
+  "Tmin" => [12, "min"],  "Tmol" => [12, "mol"],  "Tmon" => [12, "mon"],
+  "Tmph" => [12, "mph"],  "Tohm" => [12, "ohm"],  "Toz" => [12, "oz"],
+  "Tpc" => [12, "pc"],  "Tpercent" => [12, "percent"],
+  "Tpermil" => [12, "permil"],  "Tpsi" => [12, "psi"],
+  "Trad" => [12, "rad"],  "Ts" => [12, "s"],  "Tsr" => [12, "sr"],
+  "Tt" => [12, "t"],  "Tyr" => [12, "yr"],  "a%" => [-18, "%"],
+  "aA" => [-18, "A"],  "aAu" => [-18, "Au"],  "aBq" => [-18, "Bq"],
+  "aC" => [-18, "C"],  "aF" => [-18, "F"],  "aG" => [-18, "G"],
+  "aGal" => [-18, "Gal"],  "aGy" => [-18, "Gy"],  "aH" => [-18, "H"],
+  "aHg" => [-18, "Hg"],  "aHz" => [-18, "Hz"],  "aJ" => [-18, "J"],
+  "aK" => [-18, "K"],  "aL" => [-18, "L"],  "aN" => [-18, "N"],
+  "aP" => [-18, "P"],  "aPa" => [-18, "Pa"],  "aS" => [-18, "S"],
+  "aSt" => [-18, "St"],  "aSv" => [-18, "Sv"],  "aT" => [-18, "T"],
+  "aV" => [-18, "V"],  "aW" => [-18, "W"],  "aWb" => [-18, "Wb"],
+  "aa" => [-18, "a"],  "aac" => [-18, "ac"],  "aatm" => [-18, "atm"],
+  "abar" => [-18, "bar"],  "acal" => [-18, "cal"],
+  "aconventional_mercury" => [-18, "conventional_mercury"],
+  "acres" => [0, "acre"],  "ad" => [-18, "d"],
+  "adegC" => [-18, "degC"],  "adegF" => [-18, "degF"],
+  "adeg_C" => [-18, "deg_C"],  "adeg_F" => [-18, "deg_F"],
+  "adegreeC" => [-18, "degreeC"],  "adegreeF" => [-18, "degreeF"],
+  "adegree_C" => [-18, "degree_C"],  "adegree_E" => [-18, "degree_E"],
+  "adegree_F" => [-18, "degree_F"],  "adegree_N" => [-18, "degree_N"],
+  "adegree_R" => [-18, "degree_R"],  "adegree_S" => [-18, "degree_S"],
+  "adegree_W" => [-18, "degree_W"],  "adegree_c" => [-18, "degree_c"],
+  "adegree_east" => [-18, "degree_east"],
+  "adegree_f" => [-18, "degree_f"],
+  "adegree_north" => [-18, "degree_north"],
+  "adegree_south" => [-18, "degree_south"],
+  "adegree_west" => [-18, "degree_west"],
+  "adegrees_east" => [-18, "degrees_east"],
+  "adegrees_north" => [-18, "degrees_north"],
+  "adegrees_south" => [-18, "degrees_south"],
+  "adegrees_west" => [-18, "degrees_west"],  "adyn" => [-18, "dyn"],
+  "aerg" => [-18, "erg"],  "aforce" => [-18, "force"],
+  "ag" => [-18, "g"],  "agravity" => [-18, "gravity"],
+  "ah" => [-18, "h"],  "ahg" => [-18, "hg"],  "ahr" => [-18, "hr"],
+  "ain" => [-18, "in"],  "akg" => [-18, "kg"],  "akgf" => [-18, "kgf"],
+  "akph" => [-18, "kph"],  "alb" => [-18, "lb"],  "alm" => [-18, "lm"],
+  "alx" => [-18, "lx"],  "aly" => [-18, "ly"],  "am" => [-18, "m"],
+  "amb" => [-18, "mb"],  "amercury" => [-18, "mercury"],
+  "amgal" => [-18, "mgal"],  "amin" => [-18, "min"],
+  "amol" => [-18, "mol"],  "amon" => [-18, "mon"],
+  "amperes" => [0, "ampere"],  "amph" => [-18, "mph"],
+  "angstroms" => [0, "angstrom"],
+  "angulars_degree" => [0, "angular_degree"],
+  "angulars_minute" => [0, "angular_minute"],
+  "angulars_second" => [0, "angular_second"],  "aohm" => [-18, "ohm"],
+  "aoz" => [-18, "oz"],  "apc" => [-18, "pc"],
+  "apercent" => [-18, "percent"],  "apermil" => [-18, "permil"],
+  "apsi" => [-18, "psi"],  "arad" => [-18, "rad"],
+  "ares" => [0, "are"],  "as" => [-18, "s"],  "asr" => [-18, "sr"],
+  "at" => [-18, "t"],  "atmospheres" => [0, "atmosphere"],
+  "attoCelsius" => [-18, "Celsius"],
+  "attoFahrenheit" => [-18, "Fahrenheit"],
+  "attoJulian_year" => [-18, "Julian_year"],
+  "attoPascal" => [-18, "Pascal"],  "attoacre" => [-18, "acre"],
+  "attoampere" => [-18, "ampere"],  "attoangstrom" => [-18, "angstrom"],
+  "attoangular_degree" => [-18, "angular_degree"],
+  "attoangular_minute" => [-18, "angular_minute"],
+  "attoangular_second" => [-18, "angular_second"],
+  "attoare" => [-18, "are"],  "attoatmosphere" => [-18, "atmosphere"],
+  "attocalorie" => [-18, "calorie"],  "attocelsius" => [-18, "celsius"],
+  "attocentigrade" => [-18, "centigrade"],
+  "attocentury" => [-18, "century"],  "attochain" => [-18, "chain"],
+  "attocommon_year" => [-18, "common_year"],
+  "attocoulomb" => [-18, "coulomb"],  "attoday" => [-18, "day"],
+  "attodegK" => [-18, "degK"],  "attodeg_K" => [-18, "deg_K"],
+  "attodegree" => [-18, "degree"],  "attodegreeK" => [-18, "degreeK"],
+  "attodyne" => [-18, "dyne"],  "attoerg" => [-18, "erg"],
+  "attofahrenheit" => [-18, "fahrenheit"],
+  "attofarad" => [-18, "farad"],  "attofermi" => [-18, "fermi"],
+  "attogal" => [-18, "gal"],  "attogauss" => [-18, "gauss"],
+  "attogram" => [-18, "gram"],  "attohectare" => [-18, "hectare"],
+  "attohertz" => [-18, "hertz"],  "attohour" => [-18, "hour"],
+  "attoinch" => [-18, "inch"],  "attojoule" => [-18, "joule"],
+  "attokelvin" => [-18, "kelvin"],  "attokilogram" => [-18, "kilogram"],
+  "attoknot" => [-18, "knot"],  "attolitre" => [-18, "litre"],
+  "attometer" => [-18, "meter"],  "attometre" => [-18, "metre"],
+  "attomicron" => [-18, "micron"],  "attomile" => [-18, "mile"],
+  "attomillibar" => [-18, "millibar"],  "attominute" => [-18, "minute"],
+  "attominute_angle" => [-18, "minute_angle"],
+  "attomole" => [-18, "mole"],  "attomonth" => [-18, "month"],
+  "attonewton" => [-18, "newton"],  "attoounce" => [-18, "ounce"],
+  "attoparsec" => [-18, "parsec"],  "attopascal" => [-18, "pascal"],
+  "attopentad" => [-18, "pentad"],  "attopoise" => [-18, "poise"],
+  "attopound" => [-18, "pound"],  "attoradian" => [-18, "radian"],
+  "attosecond" => [-18, "second"],
+  "attosecond_angle" => [-18, "second_angle"],
+  "attosteradian" => [-18, "steradian"],
+  "attostokes" => [-18, "stokes"],  "attotesla" => [-18, "tesla"],
+  "attoton" => [-18, "ton"],  "attotonne" => [-18, "tonne"],
+  "attotorr" => [-18, "torr"],  "attovolt" => [-18, "volt"],
+  "attowatt" => [-18, "watt"],  "attoweber" => [-18, "weber"],
+  "attoyard" => [-18, "yard"],  "attoyd" => [-18, "yd"],
+  "attoyear" => [-18, "year"],  "ayr" => [-18, "yr"],
+  "c%" => [-2, "%"],  "cA" => [-2, "A"],  "cAu" => [-2, "Au"],
+  "cBq" => [-2, "Bq"],  "cC" => [-2, "C"],  "cF" => [-2, "F"],
+  "cG" => [-2, "G"],  "cGal" => [-2, "Gal"],  "cGy" => [-2, "Gy"],
+  "cH" => [-2, "H"],  "cHg" => [-2, "Hg"],  "cHz" => [-2, "Hz"],
+  "cJ" => [-2, "J"],  "cK" => [-2, "K"],  "cL" => [-2, "L"],
+  "cN" => [-2, "N"],  "cP" => [-2, "P"],  "cPa" => [-2, "Pa"],
+  "cS" => [-2, "S"],  "cSt" => [-2, "St"],  "cSv" => [-2, "Sv"],
+  "cT" => [-2, "T"],  "cV" => [-2, "V"],  "cW" => [-2, "W"],
+  "cWb" => [-2, "Wb"],  "ca" => [-2, "a"],  "cac" => [-2, "ac"],
+  "calories" => [0, "calorie"],  "catm" => [-2, "atm"],
+  "cbar" => [-2, "bar"],  "ccal" => [-2, "cal"],
+  "cconventional_mercury" => [-2, "conventional_mercury"],
+  "cd" => [-2, "d"],  "cdegC" => [-2, "degC"],  "cdegF" => [-2, "degF"],
+  "cdeg_C" => [-2, "deg_C"],  "cdeg_F" => [-2, "deg_F"],
+  "cdegreeC" => [-2, "degreeC"],  "cdegreeF" => [-2, "degreeF"],
+  "cdegree_C" => [-2, "degree_C"],  "cdegree_E" => [-2, "degree_E"],
+  "cdegree_F" => [-2, "degree_F"],  "cdegree_N" => [-2, "degree_N"],
+  "cdegree_R" => [-2, "degree_R"],  "cdegree_S" => [-2, "degree_S"],
+  "cdegree_W" => [-2, "degree_W"],  "cdegree_c" => [-2, "degree_c"],
+  "cdegree_east" => [-2, "degree_east"],
+  "cdegree_f" => [-2, "degree_f"],
+  "cdegree_north" => [-2, "degree_north"],
+  "cdegree_south" => [-2, "degree_south"],
+  "cdegree_west" => [-2, "degree_west"],
+  "cdegrees_east" => [-2, "degrees_east"],
+  "cdegrees_north" => [-2, "degrees_north"],
+  "cdegrees_south" => [-2, "degrees_south"],
+  "cdegrees_west" => [-2, "degrees_west"],  "cdyn" => [-2, "dyn"],
+  "celsiuses" => [0, "celsius"],  "centiCelsius" => [-2, "Celsius"],
+  "centiFahrenheit" => [-2, "Fahrenheit"],
+  "centiJulian_year" => [-2, "Julian_year"],
+  "centiPascal" => [-2, "Pascal"],  "centiacre" => [-2, "acre"],
+  "centiampere" => [-2, "ampere"],  "centiangstrom" => [-2, "angstrom"],
+  "centiangular_degree" => [-2, "angular_degree"],
+  "centiangular_minute" => [-2, "angular_minute"],
+  "centiangular_second" => [-2, "angular_second"],
+  "centiare" => [-2, "are"],  "centiatmosphere" => [-2, "atmosphere"],
+  "centicalorie" => [-2, "calorie"],  "centicelsius" => [-2, "celsius"],
+  "centicentigrade" => [-2, "centigrade"],
+  "centicentury" => [-2, "century"],  "centichain" => [-2, "chain"],
+  "centicommon_year" => [-2, "common_year"],
+  "centicoulomb" => [-2, "coulomb"],  "centiday" => [-2, "day"],
+  "centidegK" => [-2, "degK"],  "centideg_K" => [-2, "deg_K"],
+  "centidegree" => [-2, "degree"],  "centidegreeK" => [-2, "degreeK"],
+  "centidyne" => [-2, "dyne"],  "centierg" => [-2, "erg"],
+  "centifahrenheit" => [-2, "fahrenheit"],
+  "centifarad" => [-2, "farad"],  "centifermi" => [-2, "fermi"],
+  "centigal" => [-2, "gal"],  "centigauss" => [-2, "gauss"],
+  "centigrades" => [0, "centigrade"],  "centigram" => [-2, "gram"],
+  "centihectare" => [-2, "hectare"],  "centihertz" => [-2, "hertz"],
+  "centihour" => [-2, "hour"],  "centiinch" => [-2, "inch"],
+  "centijoule" => [-2, "joule"],  "centikelvin" => [-2, "kelvin"],
+  "centikilogram" => [-2, "kilogram"],  "centiknot" => [-2, "knot"],
+  "centilitre" => [-2, "litre"],  "centimeter" => [-2, "meter"],
+  "centimetre" => [-2, "metre"],  "centimicron" => [-2, "micron"],
+  "centimile" => [-2, "mile"],  "centimillibar" => [-2, "millibar"],
+  "centiminute" => [-2, "minute"],
+  "centiminute_angle" => [-2, "minute_angle"],
+  "centimole" => [-2, "mole"],  "centimonth" => [-2, "month"],
+  "centinewton" => [-2, "newton"],  "centiounce" => [-2, "ounce"],
+  "centiparsec" => [-2, "parsec"],  "centipascal" => [-2, "pascal"],
+  "centipentad" => [-2, "pentad"],  "centipoise" => [-2, "poise"],
+  "centipound" => [-2, "pound"],  "centiradian" => [-2, "radian"],
+  "centisecond" => [-2, "second"],
+  "centisecond_angle" => [-2, "second_angle"],
+  "centisteradian" => [-2, "steradian"],
+  "centistokes" => [-2, "stokes"],  "centitesla" => [-2, "tesla"],
+  "centiton" => [-2, "ton"],  "centitonne" => [-2, "tonne"],
+  "centitorr" => [-2, "torr"],  "centivolt" => [-2, "volt"],
+  "centiwatt" => [-2, "watt"],  "centiweber" => [-2, "weber"],
+  "centiyard" => [-2, "yard"],  "centiyd" => [-2, "yd"],
+  "centiyear" => [-2, "year"],  "centuries" => [0, "century"],
+  "cerg" => [-2, "erg"],  "cforce" => [-2, "force"],  "cg" => [-2, "g"],
+  "cgravity" => [-2, "gravity"],  "ch" => [-2, "h"],
+  "chains" => [0, "chain"],  "chg" => [-2, "hg"],  "chr" => [-2, "hr"],
+  "cin" => [-2, "in"],  "ckg" => [-2, "kg"],  "ckgf" => [-2, "kgf"],
+  "ckph" => [-2, "kph"],  "clb" => [-2, "lb"],  "clm" => [-2, "lm"],
+  "clx" => [-2, "lx"],  "cly" => [-2, "ly"],  "cm" => [-2, "m"],
+  "cmb" => [-2, "mb"],  "cmercury" => [-2, "mercury"],
+  "cmgal" => [-2, "mgal"],  "cmin" => [-2, "min"],
+  "cmol" => [-2, "mol"],  "cmon" => [-2, "mon"],  "cmph" => [-2, "mph"],
+  "cohm" => [-2, "ohm"],  "commons_year" => [0, "common_year"],
+  "coulombs" => [0, "coulomb"],  "coz" => [-2, "oz"],
+  "cpc" => [-2, "pc"],  "cpercent" => [-2, "percent"],
+  "cpermil" => [-2, "permil"],  "cpsi" => [-2, "psi"],
+  "crad" => [-2, "rad"],  "cs" => [-2, "s"],  "csr" => [-2, "sr"],
+  "ct" => [-2, "t"],  "cyr" => [-2, "yr"],  "d%" => [-1, "%"],
+  "dA" => [-1, "A"],  "dAu" => [-1, "Au"],  "dBq" => [-1, "Bq"],
+  "dC" => [-1, "C"],  "dF" => [-1, "F"],  "dG" => [-1, "G"],
+  "dGal" => [-1, "Gal"],  "dGy" => [-1, "Gy"],  "dH" => [-1, "H"],
+  "dHg" => [-1, "Hg"],  "dHz" => [-1, "Hz"],  "dJ" => [-1, "J"],
+  "dK" => [-1, "K"],  "dL" => [-1, "L"],  "dN" => [-1, "N"],
+  "dP" => [-1, "P"],  "dPa" => [-1, "Pa"],  "dS" => [-1, "S"],
+  "dSt" => [-1, "St"],  "dSv" => [-1, "Sv"],  "dT" => [-1, "T"],
+  "dV" => [-1, "V"],  "dW" => [-1, "W"],  "dWb" => [-1, "Wb"],
+  "da" => [-1, "a"],  "da%" => [1, "%"],  "daA" => [1, "A"],
+  "daAu" => [1, "Au"],  "daBq" => [1, "Bq"],  "daC" => [1, "C"],
+  "daF" => [1, "F"],  "daG" => [1, "G"],  "daGal" => [1, "Gal"],
+  "daGy" => [1, "Gy"],  "daH" => [1, "H"],  "daHg" => [1, "Hg"],
+  "daHz" => [1, "Hz"],  "daJ" => [1, "J"],  "daK" => [1, "K"],
+  "daL" => [1, "L"],  "daN" => [1, "N"],  "daP" => [1, "P"],
+  "daPa" => [1, "Pa"],  "daS" => [1, "S"],  "daSt" => [1, "St"],
+  "daSv" => [1, "Sv"],  "daT" => [1, "T"],  "daV" => [1, "V"],
+  "daW" => [1, "W"],  "daWb" => [1, "Wb"],  "daa" => [1, "a"],
+  "daac" => [1, "ac"],  "daatm" => [1, "atm"],  "dabar" => [1, "bar"],
+  "dac" => [-1, "ac"],  "dacal" => [1, "cal"],
+  "daconventional_mercury" => [1, "conventional_mercury"],
+  "dad" => [1, "d"],  "dadegC" => [1, "degC"],  "dadegF" => [1, "degF"],
+  "dadeg_C" => [1, "deg_C"],  "dadeg_F" => [1, "deg_F"],
+  "dadegreeC" => [1, "degreeC"],  "dadegreeF" => [1, "degreeF"],
+  "dadegree_C" => [1, "degree_C"],  "dadegree_E" => [1, "degree_E"],
+  "dadegree_F" => [1, "degree_F"],  "dadegree_N" => [1, "degree_N"],
+  "dadegree_R" => [1, "degree_R"],  "dadegree_S" => [1, "degree_S"],
+  "dadegree_W" => [1, "degree_W"],  "dadegree_c" => [1, "degree_c"],
+  "dadegree_east" => [1, "degree_east"],
+  "dadegree_f" => [1, "degree_f"],
+  "dadegree_north" => [1, "degree_north"],
+  "dadegree_south" => [1, "degree_south"],
+  "dadegree_west" => [1, "degree_west"],
+  "dadegrees_east" => [1, "degrees_east"],
+  "dadegrees_north" => [1, "degrees_north"],
+  "dadegrees_south" => [1, "degrees_south"],
+  "dadegrees_west" => [1, "degrees_west"],  "dadyn" => [1, "dyn"],
+  "daerg" => [1, "erg"],  "daforce" => [1, "force"],  "dag" => [1, "g"],
+  "dagravity" => [1, "gravity"],  "dah" => [1, "h"],
+  "dahg" => [1, "hg"],  "dahr" => [1, "hr"],  "dain" => [1, "in"],
+  "dakg" => [1, "kg"],  "dakgf" => [1, "kgf"],  "dakph" => [1, "kph"],
+  "dalb" => [1, "lb"],  "dalm" => [1, "lm"],  "dalx" => [1, "lx"],
+  "daly" => [1, "ly"],  "dam" => [1, "m"],  "damb" => [1, "mb"],
+  "damercury" => [1, "mercury"],  "damgal" => [1, "mgal"],
+  "damin" => [1, "min"],  "damol" => [1, "mol"],  "damon" => [1, "mon"],
+  "damph" => [1, "mph"],  "daohm" => [1, "ohm"],  "daoz" => [1, "oz"],
+  "dapc" => [1, "pc"],  "dapercent" => [1, "percent"],
+  "dapermil" => [1, "permil"],  "dapsi" => [1, "psi"],
+  "darad" => [1, "rad"],  "das" => [1, "s"],  "dasr" => [1, "sr"],
+  "dat" => [1, "t"],  "datm" => [-1, "atm"],  "dayr" => [1, "yr"],
+  "days" => [0, "day"],  "dbar" => [-1, "bar"],  "dcal" => [-1, "cal"],
+  "dconventional_mercury" => [-1, "conventional_mercury"],
+  "dd" => [-1, "d"],  "ddegC" => [-1, "degC"],  "ddegF" => [-1, "degF"],
+  "ddeg_C" => [-1, "deg_C"],  "ddeg_F" => [-1, "deg_F"],
+  "ddegreeC" => [-1, "degreeC"],  "ddegreeF" => [-1, "degreeF"],
+  "ddegree_C" => [-1, "degree_C"],  "ddegree_E" => [-1, "degree_E"],
+  "ddegree_F" => [-1, "degree_F"],  "ddegree_N" => [-1, "degree_N"],
+  "ddegree_R" => [-1, "degree_R"],  "ddegree_S" => [-1, "degree_S"],
+  "ddegree_W" => [-1, "degree_W"],  "ddegree_c" => [-1, "degree_c"],
+  "ddegree_east" => [-1, "degree_east"],
+  "ddegree_f" => [-1, "degree_f"],
+  "ddegree_north" => [-1, "degree_north"],
+  "ddegree_south" => [-1, "degree_south"],
+  "ddegree_west" => [-1, "degree_west"],
+  "ddegrees_east" => [-1, "degrees_east"],
+  "ddegrees_north" => [-1, "degrees_north"],
+  "ddegrees_south" => [-1, "degrees_south"],
+  "ddegrees_west" => [-1, "degrees_west"],  "ddyn" => [-1, "dyn"],
+  "decaCelsius" => [1, "Celsius"],
+  "decaFahrenheit" => [1, "Fahrenheit"],
+  "decaJulian_year" => [1, "Julian_year"],
+  "decaPascal" => [1, "Pascal"],  "decaacre" => [1, "acre"],
+  "decaampere" => [1, "ampere"],  "decaangstrom" => [1, "angstrom"],
+  "decaangular_degree" => [1, "angular_degree"],
+  "decaangular_minute" => [1, "angular_minute"],
+  "decaangular_second" => [1, "angular_second"],
+  "decaare" => [1, "are"],  "decaatmosphere" => [1, "atmosphere"],
+  "decacalorie" => [1, "calorie"],  "decacelsius" => [1, "celsius"],
+  "decacentigrade" => [1, "centigrade"],
+  "decacentury" => [1, "century"],  "decachain" => [1, "chain"],
+  "decacommon_year" => [1, "common_year"],
+  "decacoulomb" => [1, "coulomb"],  "decaday" => [1, "day"],
+  "decadegK" => [1, "degK"],  "decadeg_K" => [1, "deg_K"],
+  "decadegree" => [1, "degree"],  "decadegreeK" => [1, "degreeK"],
+  "decadyne" => [1, "dyne"],  "decaerg" => [1, "erg"],
+  "decafahrenheit" => [1, "fahrenheit"],  "decafarad" => [1, "farad"],
+  "decafermi" => [1, "fermi"],  "decagal" => [1, "gal"],
+  "decagauss" => [1, "gauss"],  "decagram" => [1, "gram"],
+  "decahectare" => [1, "hectare"],  "decahertz" => [1, "hertz"],
+  "decahour" => [1, "hour"],  "decainch" => [1, "inch"],
+  "decajoule" => [1, "joule"],  "decakelvin" => [1, "kelvin"],
+  "decakilogram" => [1, "kilogram"],  "decaknot" => [1, "knot"],
+  "decalitre" => [1, "litre"],  "decameter" => [1, "meter"],
+  "decametre" => [1, "metre"],  "decamicron" => [1, "micron"],
+  "decamile" => [1, "mile"],  "decamillibar" => [1, "millibar"],
+  "decaminute" => [1, "minute"],
+  "decaminute_angle" => [1, "minute_angle"],  "decamole" => [1, "mole"],
+  "decamonth" => [1, "month"],  "decanewton" => [1, "newton"],
+  "decaounce" => [1, "ounce"],  "decaparsec" => [1, "parsec"],
+  "decapascal" => [1, "pascal"],  "decapentad" => [1, "pentad"],
+  "decapoise" => [1, "poise"],  "decapound" => [1, "pound"],
+  "decaradian" => [1, "radian"],  "decasecond" => [1, "second"],
+  "decasecond_angle" => [1, "second_angle"],
+  "decasteradian" => [1, "steradian"],  "decastokes" => [1, "stokes"],
+  "decatesla" => [1, "tesla"],  "decaton" => [1, "ton"],
+  "decatonne" => [1, "tonne"],  "decatorr" => [1, "torr"],
+  "decavolt" => [1, "volt"],  "decawatt" => [1, "watt"],
+  "decaweber" => [1, "weber"],  "decayard" => [1, "yard"],
+  "decayd" => [1, "yd"],  "decayear" => [1, "year"],
+  "deciCelsius" => [-1, "Celsius"],
+  "deciFahrenheit" => [-1, "Fahrenheit"],
+  "deciJulian_year" => [-1, "Julian_year"],
+  "deciPascal" => [-1, "Pascal"],  "deciacre" => [-1, "acre"],
+  "deciampere" => [-1, "ampere"],  "deciangstrom" => [-1, "angstrom"],
+  "deciangular_degree" => [-1, "angular_degree"],
+  "deciangular_minute" => [-1, "angular_minute"],
+  "deciangular_second" => [-1, "angular_second"],
+  "deciare" => [-1, "are"],  "deciatmosphere" => [-1, "atmosphere"],
+  "decicalorie" => [-1, "calorie"],  "decicelsius" => [-1, "celsius"],
+  "decicentigrade" => [-1, "centigrade"],
+  "decicentury" => [-1, "century"],  "decichain" => [-1, "chain"],
+  "decicommon_year" => [-1, "common_year"],
+  "decicoulomb" => [-1, "coulomb"],  "deciday" => [-1, "day"],
+  "decidegK" => [-1, "degK"],  "decideg_K" => [-1, "deg_K"],
+  "decidegree" => [-1, "degree"],  "decidegreeK" => [-1, "degreeK"],
+  "decidyne" => [-1, "dyne"],  "decierg" => [-1, "erg"],
+  "decifahrenheit" => [-1, "fahrenheit"],  "decifarad" => [-1, "farad"],
+  "decifermi" => [-1, "fermi"],  "decigal" => [-1, "gal"],
+  "decigauss" => [-1, "gauss"],  "decigram" => [-1, "gram"],
+  "decihectare" => [-1, "hectare"],  "decihertz" => [-1, "hertz"],
+  "decihour" => [-1, "hour"],  "deciinch" => [-1, "inch"],
+  "decijoule" => [-1, "joule"],  "decikelvin" => [-1, "kelvin"],
+  "decikilogram" => [-1, "kilogram"],  "deciknot" => [-1, "knot"],
+  "decilitre" => [-1, "litre"],  "decimeter" => [-1, "meter"],
+  "decimetre" => [-1, "metre"],  "decimicron" => [-1, "micron"],
+  "decimile" => [-1, "mile"],  "decimillibar" => [-1, "millibar"],
+  "deciminute" => [-1, "minute"],
+  "deciminute_angle" => [-1, "minute_angle"],
+  "decimole" => [-1, "mole"],  "decimonth" => [-1, "month"],
+  "decinewton" => [-1, "newton"],  "deciounce" => [-1, "ounce"],
+  "deciparsec" => [-1, "parsec"],  "decipascal" => [-1, "pascal"],
+  "decipentad" => [-1, "pentad"],  "decipoise" => [-1, "poise"],
+  "decipound" => [-1, "pound"],  "deciradian" => [-1, "radian"],
+  "decisecond" => [-1, "second"],
+  "decisecond_angle" => [-1, "second_angle"],
+  "decisteradian" => [-1, "steradian"],  "decistokes" => [-1, "stokes"],
+  "decitesla" => [-1, "tesla"],  "deciton" => [-1, "ton"],
+  "decitonne" => [-1, "tonne"],  "decitorr" => [-1, "torr"],
+  "decivolt" => [-1, "volt"],  "deciwatt" => [-1, "watt"],
+  "deciweber" => [-1, "weber"],  "deciyard" => [-1, "yard"],
+  "deciyd" => [-1, "yd"],  "deciyear" => [-1, "year"],
+  "degKs" => [0, "degK"],  "degreeKs" => [0, "degreeK"],
+  "degrees" => [0, "degree"],  "degs_K" => [0, "deg_K"],
+  "derg" => [-1, "erg"],  "dforce" => [-1, "force"],  "dg" => [-1, "g"],
+  "dgravity" => [-1, "gravity"],  "dh" => [-1, "h"],
+  "dhg" => [-1, "hg"],  "dhr" => [-1, "hr"],  "din" => [-1, "in"],
+  "dkg" => [-1, "kg"],  "dkgf" => [-1, "kgf"],  "dkph" => [-1, "kph"],
+  "dlb" => [-1, "lb"],  "dlm" => [-1, "lm"],  "dlx" => [-1, "lx"],
+  "dly" => [-1, "ly"],  "dm" => [-1, "m"],  "dmb" => [-1, "mb"],
+  "dmercury" => [-1, "mercury"],  "dmgal" => [-1, "mgal"],
+  "dmin" => [-1, "min"],  "dmol" => [-1, "mol"],  "dmon" => [-1, "mon"],
+  "dmph" => [-1, "mph"],  "dohm" => [-1, "ohm"],  "doz" => [-1, "oz"],
+  "dpc" => [-1, "pc"],  "dpercent" => [-1, "percent"],
+  "dpermil" => [-1, "permil"],  "dpsi" => [-1, "psi"],
+  "drad" => [-1, "rad"],  "ds" => [-1, "s"],  "dsr" => [-1, "sr"],
+  "dt" => [-1, "t"],  "dynes" => [0, "dyne"],  "dyr" => [-1, "yr"],
+  "ergs" => [0, "erg"],  "exaCelsius" => [18, "Celsius"],
+  "exaFahrenheit" => [18, "Fahrenheit"],
+  "exaJulian_year" => [18, "Julian_year"],
+  "exaPascal" => [18, "Pascal"],  "exaacre" => [18, "acre"],
+  "exaampere" => [18, "ampere"],  "exaangstrom" => [18, "angstrom"],
+  "exaangular_degree" => [18, "angular_degree"],
+  "exaangular_minute" => [18, "angular_minute"],
+  "exaangular_second" => [18, "angular_second"],
+  "exaare" => [18, "are"],  "exaatmosphere" => [18, "atmosphere"],
+  "exacalorie" => [18, "calorie"],  "exacelsius" => [18, "celsius"],
+  "exacentigrade" => [18, "centigrade"],
+  "exacentury" => [18, "century"],  "exachain" => [18, "chain"],
+  "exacommon_year" => [18, "common_year"],
+  "exacoulomb" => [18, "coulomb"],  "exaday" => [18, "day"],
+  "exadegK" => [18, "degK"],  "exadeg_K" => [18, "deg_K"],
+  "exadegree" => [18, "degree"],  "exadegreeK" => [18, "degreeK"],
+  "exadyne" => [18, "dyne"],  "exaerg" => [18, "erg"],
+  "exafahrenheit" => [18, "fahrenheit"],  "exafarad" => [18, "farad"],
+  "exafermi" => [18, "fermi"],  "exagal" => [18, "gal"],
+  "exagauss" => [18, "gauss"],  "exagram" => [18, "gram"],
+  "exahectare" => [18, "hectare"],  "exahertz" => [18, "hertz"],
+  "exahour" => [18, "hour"],  "exainch" => [18, "inch"],
+  "exajoule" => [18, "joule"],  "exakelvin" => [18, "kelvin"],
+  "exakilogram" => [18, "kilogram"],  "exaknot" => [18, "knot"],
+  "exalitre" => [18, "litre"],  "exameter" => [18, "meter"],
+  "exametre" => [18, "metre"],  "examicron" => [18, "micron"],
+  "examile" => [18, "mile"],  "examillibar" => [18, "millibar"],
+  "examinute" => [18, "minute"],
+  "examinute_angle" => [18, "minute_angle"],  "examole" => [18, "mole"],
+  "examonth" => [18, "month"],  "exanewton" => [18, "newton"],
+  "exaounce" => [18, "ounce"],  "exaparsec" => [18, "parsec"],
+  "exapascal" => [18, "pascal"],  "exapentad" => [18, "pentad"],
+  "exapoise" => [18, "poise"],  "exapound" => [18, "pound"],
+  "exaradian" => [18, "radian"],  "exasecond" => [18, "second"],
+  "exasecond_angle" => [18, "second_angle"],
+  "exasteradian" => [18, "steradian"],  "exastokes" => [18, "stokes"],
+  "exatesla" => [18, "tesla"],  "exaton" => [18, "ton"],
+  "exatonne" => [18, "tonne"],  "exatorr" => [18, "torr"],
+  "exavolt" => [18, "volt"],  "exawatt" => [18, "watt"],
+  "exaweber" => [18, "weber"],  "exayard" => [18, "yard"],
+  "exayd" => [18, "yd"],  "exayear" => [18, "year"],
+  "f%" => [-15, "%"],  "fA" => [-15, "A"],  "fAu" => [-15, "Au"],
+  "fBq" => [-15, "Bq"],  "fC" => [-15, "C"],  "fF" => [-15, "F"],
+  "fG" => [-15, "G"],  "fGal" => [-15, "Gal"],  "fGy" => [-15, "Gy"],
+  "fH" => [-15, "H"],  "fHg" => [-15, "Hg"],  "fHz" => [-15, "Hz"],
+  "fJ" => [-15, "J"],  "fK" => [-15, "K"],  "fL" => [-15, "L"],
+  "fN" => [-15, "N"],  "fP" => [-15, "P"],  "fPa" => [-15, "Pa"],
+  "fS" => [-15, "S"],  "fSt" => [-15, "St"],  "fSv" => [-15, "Sv"],
+  "fT" => [-15, "T"],  "fV" => [-15, "V"],  "fW" => [-15, "W"],
+  "fWb" => [-15, "Wb"],  "fa" => [-15, "a"],  "fac" => [-15, "ac"],
+  "fahrenheits" => [0, "fahrenheit"],  "farads" => [0, "farad"],
+  "fatm" => [-15, "atm"],  "fbar" => [-15, "bar"],
+  "fcal" => [-15, "cal"],
+  "fconventional_mercury" => [-15, "conventional_mercury"],
+  "fd" => [-15, "d"],  "fdegC" => [-15, "degC"],
+  "fdegF" => [-15, "degF"],  "fdeg_C" => [-15, "deg_C"],
+  "fdeg_F" => [-15, "deg_F"],  "fdegreeC" => [-15, "degreeC"],
+  "fdegreeF" => [-15, "degreeF"],  "fdegree_C" => [-15, "degree_C"],
+  "fdegree_E" => [-15, "degree_E"],  "fdegree_F" => [-15, "degree_F"],
+  "fdegree_N" => [-15, "degree_N"],  "fdegree_R" => [-15, "degree_R"],
+  "fdegree_S" => [-15, "degree_S"],  "fdegree_W" => [-15, "degree_W"],
+  "fdegree_c" => [-15, "degree_c"],
+  "fdegree_east" => [-15, "degree_east"],
+  "fdegree_f" => [-15, "degree_f"],
+  "fdegree_north" => [-15, "degree_north"],
+  "fdegree_south" => [-15, "degree_south"],
+  "fdegree_west" => [-15, "degree_west"],
+  "fdegrees_east" => [-15, "degrees_east"],
+  "fdegrees_north" => [-15, "degrees_north"],
+  "fdegrees_south" => [-15, "degrees_south"],
+  "fdegrees_west" => [-15, "degrees_west"],  "fdyn" => [-15, "dyn"],
+  "femtoCelsius" => [-15, "Celsius"],
+  "femtoFahrenheit" => [-15, "Fahrenheit"],
+  "femtoJulian_year" => [-15, "Julian_year"],
+  "femtoPascal" => [-15, "Pascal"],  "femtoacre" => [-15, "acre"],
+  "femtoampere" => [-15, "ampere"],
+  "femtoangstrom" => [-15, "angstrom"],
+  "femtoangular_degree" => [-15, "angular_degree"],
+  "femtoangular_minute" => [-15, "angular_minute"],
+  "femtoangular_second" => [-15, "angular_second"],
+  "femtoare" => [-15, "are"],  "femtoatmosphere" => [-15, "atmosphere"],
+  "femtocalorie" => [-15, "calorie"],
+  "femtocelsius" => [-15, "celsius"],
+  "femtocentigrade" => [-15, "centigrade"],
+  "femtocentury" => [-15, "century"],  "femtochain" => [-15, "chain"],
+  "femtocommon_year" => [-15, "common_year"],
+  "femtocoulomb" => [-15, "coulomb"],  "femtoday" => [-15, "day"],
+  "femtodegK" => [-15, "degK"],  "femtodeg_K" => [-15, "deg_K"],
+  "femtodegree" => [-15, "degree"],  "femtodegreeK" => [-15, "degreeK"],
+  "femtodyne" => [-15, "dyne"],  "femtoerg" => [-15, "erg"],
+  "femtofahrenheit" => [-15, "fahrenheit"],
+  "femtofarad" => [-15, "farad"],  "femtofermi" => [-15, "fermi"],
+  "femtogal" => [-15, "gal"],  "femtogauss" => [-15, "gauss"],
+  "femtogram" => [-15, "gram"],  "femtohectare" => [-15, "hectare"],
+  "femtohertz" => [-15, "hertz"],  "femtohour" => [-15, "hour"],
+  "femtoinch" => [-15, "inch"],  "femtojoule" => [-15, "joule"],
+  "femtokelvin" => [-15, "kelvin"],
+  "femtokilogram" => [-15, "kilogram"],  "femtoknot" => [-15, "knot"],
+  "femtolitre" => [-15, "litre"],  "femtometer" => [-15, "meter"],
+  "femtometre" => [-15, "metre"],  "femtomicron" => [-15, "micron"],
+  "femtomile" => [-15, "mile"],  "femtomillibar" => [-15, "millibar"],
+  "femtominute" => [-15, "minute"],
+  "femtominute_angle" => [-15, "minute_angle"],
+  "femtomole" => [-15, "mole"],  "femtomonth" => [-15, "month"],
+  "femtonewton" => [-15, "newton"],  "femtoounce" => [-15, "ounce"],
+  "femtoparsec" => [-15, "parsec"],  "femtopascal" => [-15, "pascal"],
+  "femtopentad" => [-15, "pentad"],  "femtopoise" => [-15, "poise"],
+  "femtopound" => [-15, "pound"],  "femtoradian" => [-15, "radian"],
+  "femtosecond" => [-15, "second"],
+  "femtosecond_angle" => [-15, "second_angle"],
+  "femtosteradian" => [-15, "steradian"],
+  "femtostokes" => [-15, "stokes"],  "femtotesla" => [-15, "tesla"],
+  "femtoton" => [-15, "ton"],  "femtotonne" => [-15, "tonne"],
+  "femtotorr" => [-15, "torr"],  "femtovolt" => [-15, "volt"],
+  "femtowatt" => [-15, "watt"],  "femtoweber" => [-15, "weber"],
+  "femtoyard" => [-15, "yard"],  "femtoyd" => [-15, "yd"],
+  "femtoyear" => [-15, "year"],  "ferg" => [-15, "erg"],
+  "fermis" => [0, "fermi"],  "fforce" => [-15, "force"],
+  "fg" => [-15, "g"],  "fgravity" => [-15, "gravity"],
+  "fh" => [-15, "h"],  "fhg" => [-15, "hg"],  "fhr" => [-15, "hr"],
+  "fin" => [-15, "in"],  "fkg" => [-15, "kg"],  "fkgf" => [-15, "kgf"],
+  "fkph" => [-15, "kph"],  "flb" => [-15, "lb"],  "flm" => [-15, "lm"],
+  "flx" => [-15, "lx"],  "fly" => [-15, "ly"],  "fm" => [-15, "m"],
+  "fmb" => [-15, "mb"],  "fmercury" => [-15, "mercury"],
+  "fmgal" => [-15, "mgal"],  "fmin" => [-15, "min"],
+  "fmol" => [-15, "mol"],  "fmon" => [-15, "mon"],
+  "fmph" => [-15, "mph"],  "fohm" => [-15, "ohm"],
+  "foz" => [-15, "oz"],  "fpc" => [-15, "pc"],
+  "fpercent" => [-15, "percent"],  "fpermil" => [-15, "permil"],
+  "fpsi" => [-15, "psi"],  "frad" => [-15, "rad"],  "fs" => [-15, "s"],
+  "fsr" => [-15, "sr"],  "ft" => [-15, "t"],  "fyr" => [-15, "yr"],
+  "gals" => [0, "gal"],  "gausses" => [0, "gauss"],
+  "gigaCelsius" => [9, "Celsius"],
+  "gigaFahrenheit" => [9, "Fahrenheit"],
+  "gigaJulian_year" => [9, "Julian_year"],
+  "gigaPascal" => [9, "Pascal"],  "gigaacre" => [9, "acre"],
+  "gigaampere" => [9, "ampere"],  "gigaangstrom" => [9, "angstrom"],
+  "gigaangular_degree" => [9, "angular_degree"],
+  "gigaangular_minute" => [9, "angular_minute"],
+  "gigaangular_second" => [9, "angular_second"],
+  "gigaare" => [9, "are"],  "gigaatmosphere" => [9, "atmosphere"],
+  "gigacalorie" => [9, "calorie"],  "gigacelsius" => [9, "celsius"],
+  "gigacentigrade" => [9, "centigrade"],
+  "gigacentury" => [9, "century"],  "gigachain" => [9, "chain"],
+  "gigacommon_year" => [9, "common_year"],
+  "gigacoulomb" => [9, "coulomb"],  "gigaday" => [9, "day"],
+  "gigadegK" => [9, "degK"],  "gigadeg_K" => [9, "deg_K"],
+  "gigadegree" => [9, "degree"],  "gigadegreeK" => [9, "degreeK"],
+  "gigadyne" => [9, "dyne"],  "gigaerg" => [9, "erg"],
+  "gigafahrenheit" => [9, "fahrenheit"],  "gigafarad" => [9, "farad"],
+  "gigafermi" => [9, "fermi"],  "gigagal" => [9, "gal"],
+  "gigagauss" => [9, "gauss"],  "gigagram" => [9, "gram"],
+  "gigahectare" => [9, "hectare"],  "gigahertz" => [9, "hertz"],
+  "gigahour" => [9, "hour"],  "gigainch" => [9, "inch"],
+  "gigajoule" => [9, "joule"],  "gigakelvin" => [9, "kelvin"],
+  "gigakilogram" => [9, "kilogram"],  "gigaknot" => [9, "knot"],
+  "gigalitre" => [9, "litre"],  "gigameter" => [9, "meter"],
+  "gigametre" => [9, "metre"],  "gigamicron" => [9, "micron"],
+  "gigamile" => [9, "mile"],  "gigamillibar" => [9, "millibar"],
+  "gigaminute" => [9, "minute"],
+  "gigaminute_angle" => [9, "minute_angle"],  "gigamole" => [9, "mole"],
+  "gigamonth" => [9, "month"],  "giganewton" => [9, "newton"],
+  "gigaounce" => [9, "ounce"],  "gigaparsec" => [9, "parsec"],
+  "gigapascal" => [9, "pascal"],  "gigapentad" => [9, "pentad"],
+  "gigapoise" => [9, "poise"],  "gigapound" => [9, "pound"],
+  "gigaradian" => [9, "radian"],  "gigasecond" => [9, "second"],
+  "gigasecond_angle" => [9, "second_angle"],
+  "gigasteradian" => [9, "steradian"],  "gigastokes" => [9, "stokes"],
+  "gigatesla" => [9, "tesla"],  "gigaton" => [9, "ton"],
+  "gigatonne" => [9, "tonne"],  "gigatorr" => [9, "torr"],
+  "gigavolt" => [9, "volt"],  "gigawatt" => [9, "watt"],
+  "gigaweber" => [9, "weber"],  "gigayard" => [9, "yard"],
+  "gigayd" => [9, "yd"],  "gigayear" => [9, "year"],
+  "grams" => [0, "gram"],  "h%" => [2, "%"],  "hA" => [2, "A"],
+  "hAu" => [2, "Au"],  "hBq" => [2, "Bq"],  "hC" => [2, "C"],
+  "hF" => [2, "F"],  "hG" => [2, "G"],  "hGal" => [2, "Gal"],
+  "hGy" => [2, "Gy"],  "hH" => [2, "H"],  "hHg" => [2, "Hg"],
+  "hHz" => [2, "Hz"],  "hJ" => [2, "J"],  "hK" => [2, "K"],
+  "hL" => [2, "L"],  "hN" => [2, "N"],  "hP" => [2, "P"],
+  "hPa" => [2, "Pa"],  "hS" => [2, "S"],  "hSt" => [2, "St"],
+  "hSv" => [2, "Sv"],  "hT" => [2, "T"],  "hV" => [2, "V"],
+  "hW" => [2, "W"],  "hWb" => [2, "Wb"],  "ha" => [2, "a"],
+  "hac" => [2, "ac"],  "hatm" => [2, "atm"],  "hbar" => [2, "bar"],
+  "hcal" => [2, "cal"],
+  "hconventional_mercury" => [2, "conventional_mercury"],
+  "hd" => [2, "d"],  "hdegC" => [2, "degC"],  "hdegF" => [2, "degF"],
+  "hdeg_C" => [2, "deg_C"],  "hdeg_F" => [2, "deg_F"],
+  "hdegreeC" => [2, "degreeC"],  "hdegreeF" => [2, "degreeF"],
+  "hdegree_C" => [2, "degree_C"],  "hdegree_E" => [2, "degree_E"],
+  "hdegree_F" => [2, "degree_F"],  "hdegree_N" => [2, "degree_N"],
+  "hdegree_R" => [2, "degree_R"],  "hdegree_S" => [2, "degree_S"],
+  "hdegree_W" => [2, "degree_W"],  "hdegree_c" => [2, "degree_c"],
+  "hdegree_east" => [2, "degree_east"],  "hdegree_f" => [2, "degree_f"],
+  "hdegree_north" => [2, "degree_north"],
+  "hdegree_south" => [2, "degree_south"],
+  "hdegree_west" => [2, "degree_west"],
+  "hdegrees_east" => [2, "degrees_east"],
+  "hdegrees_north" => [2, "degrees_north"],
+  "hdegrees_south" => [2, "degrees_south"],
+  "hdegrees_west" => [2, "degrees_west"],  "hdyn" => [2, "dyn"],
+  "hectares" => [0, "hectare"],  "hectoCelsius" => [2, "Celsius"],
+  "hectoFahrenheit" => [2, "Fahrenheit"],
+  "hectoJulian_year" => [2, "Julian_year"],
+  "hectoPascal" => [2, "Pascal"],  "hectoacre" => [2, "acre"],
+  "hectoampere" => [2, "ampere"],  "hectoangstrom" => [2, "angstrom"],
+  "hectoangular_degree" => [2, "angular_degree"],
+  "hectoangular_minute" => [2, "angular_minute"],
+  "hectoangular_second" => [2, "angular_second"],
+  "hectoare" => [2, "are"],  "hectoatmosphere" => [2, "atmosphere"],
+  "hectocalorie" => [2, "calorie"],  "hectocelsius" => [2, "celsius"],
+  "hectocentigrade" => [2, "centigrade"],
+  "hectocentury" => [2, "century"],  "hectochain" => [2, "chain"],
+  "hectocommon_year" => [2, "common_year"],
+  "hectocoulomb" => [2, "coulomb"],  "hectoday" => [2, "day"],
+  "hectodegK" => [2, "degK"],  "hectodeg_K" => [2, "deg_K"],
+  "hectodegree" => [2, "degree"],  "hectodegreeK" => [2, "degreeK"],
+  "hectodyne" => [2, "dyne"],  "hectoerg" => [2, "erg"],
+  "hectofahrenheit" => [2, "fahrenheit"],  "hectofarad" => [2, "farad"],
+  "hectofermi" => [2, "fermi"],  "hectogal" => [2, "gal"],
+  "hectogauss" => [2, "gauss"],  "hectogram" => [2, "gram"],
+  "hectohectare" => [2, "hectare"],  "hectohertz" => [2, "hertz"],
+  "hectohour" => [2, "hour"],  "hectoinch" => [2, "inch"],
+  "hectojoule" => [2, "joule"],  "hectokelvin" => [2, "kelvin"],
+  "hectokilogram" => [2, "kilogram"],  "hectoknot" => [2, "knot"],
+  "hectolitre" => [2, "litre"],  "hectometer" => [2, "meter"],
+  "hectometre" => [2, "metre"],  "hectomicron" => [2, "micron"],
+  "hectomile" => [2, "mile"],  "hectomillibar" => [2, "millibar"],
+  "hectominute" => [2, "minute"],
+  "hectominute_angle" => [2, "minute_angle"],
+  "hectomole" => [2, "mole"],  "hectomonth" => [2, "month"],
+  "hectonewton" => [2, "newton"],  "hectoounce" => [2, "ounce"],
+  "hectoparsec" => [2, "parsec"],  "hectopascal" => [2, "pascal"],
+  "hectopentad" => [2, "pentad"],  "hectopoise" => [2, "poise"],
+  "hectopound" => [2, "pound"],  "hectoradian" => [2, "radian"],
+  "hectosecond" => [2, "second"],
+  "hectosecond_angle" => [2, "second_angle"],
+  "hectosteradian" => [2, "steradian"],  "hectostokes" => [2, "stokes"],
+  "hectotesla" => [2, "tesla"],  "hectoton" => [2, "ton"],
+  "hectotonne" => [2, "tonne"],  "hectotorr" => [2, "torr"],
+  "hectovolt" => [2, "volt"],  "hectowatt" => [2, "watt"],
+  "hectoweber" => [2, "weber"],  "hectoyard" => [2, "yard"],
+  "hectoyd" => [2, "yd"],  "hectoyear" => [2, "year"],
+  "herg" => [2, "erg"],  "hertzes" => [0, "hertz"],
+  "hforce" => [2, "force"],  "hg" => [2, "g"],
+  "hgravity" => [2, "gravity"],  "hh" => [2, "h"],  "hhg" => [2, "hg"],
+  "hhr" => [2, "hr"],  "hin" => [2, "in"],  "hkg" => [2, "kg"],
+  "hkgf" => [2, "kgf"],  "hkph" => [2, "kph"],  "hlb" => [2, "lb"],
+  "hlm" => [2, "lm"],  "hlx" => [2, "lx"],  "hly" => [2, "ly"],
+  "hm" => [2, "m"],  "hmb" => [2, "mb"],  "hmercury" => [2, "mercury"],
+  "hmgal" => [2, "mgal"],  "hmin" => [2, "min"],  "hmol" => [2, "mol"],
+  "hmon" => [2, "mon"],  "hmph" => [2, "mph"],  "hohm" => [2, "ohm"],
+  "hours" => [0, "hour"],  "hoz" => [2, "oz"],  "hpc" => [2, "pc"],
+  "hpercent" => [2, "percent"],  "hpermil" => [2, "permil"],
+  "hpsi" => [2, "psi"],  "hrad" => [2, "rad"],  "hs" => [2, "s"],
+  "hsr" => [2, "sr"],  "ht" => [2, "t"],  "hyr" => [2, "yr"],
+  "inchs" => [0, "inch"],  "joules" => [0, "joule"],  "k%" => [3, "%"],
+  "kA" => [3, "A"],  "kAu" => [3, "Au"],  "kBq" => [3, "Bq"],
+  "kC" => [3, "C"],  "kF" => [3, "F"],  "kG" => [3, "G"],
+  "kGal" => [3, "Gal"],  "kGy" => [3, "Gy"],  "kH" => [3, "H"],
+  "kHg" => [3, "Hg"],  "kHz" => [3, "Hz"],  "kJ" => [3, "J"],
+  "kK" => [3, "K"],  "kL" => [3, "L"],  "kN" => [3, "N"],
+  "kP" => [3, "P"],  "kPa" => [3, "Pa"],  "kS" => [3, "S"],
+  "kSt" => [3, "St"],  "kSv" => [3, "Sv"],  "kT" => [3, "T"],
+  "kV" => [3, "V"],  "kW" => [3, "W"],  "kWb" => [3, "Wb"],
+  "ka" => [3, "a"],  "kac" => [3, "ac"],  "katm" => [3, "atm"],
+  "kbar" => [3, "bar"],  "kcal" => [3, "cal"],
+  "kconventional_mercury" => [3, "conventional_mercury"],
+  "kd" => [3, "d"],  "kdegC" => [3, "degC"],  "kdegF" => [3, "degF"],
+  "kdeg_C" => [3, "deg_C"],  "kdeg_F" => [3, "deg_F"],
+  "kdegreeC" => [3, "degreeC"],  "kdegreeF" => [3, "degreeF"],
+  "kdegree_C" => [3, "degree_C"],  "kdegree_E" => [3, "degree_E"],
+  "kdegree_F" => [3, "degree_F"],  "kdegree_N" => [3, "degree_N"],
+  "kdegree_R" => [3, "degree_R"],  "kdegree_S" => [3, "degree_S"],
+  "kdegree_W" => [3, "degree_W"],  "kdegree_c" => [3, "degree_c"],
+  "kdegree_east" => [3, "degree_east"],  "kdegree_f" => [3, "degree_f"],
+  "kdegree_north" => [3, "degree_north"],
+  "kdegree_south" => [3, "degree_south"],
+  "kdegree_west" => [3, "degree_west"],
+  "kdegrees_east" => [3, "degrees_east"],
+  "kdegrees_north" => [3, "degrees_north"],
+  "kdegrees_south" => [3, "degrees_south"],
+  "kdegrees_west" => [3, "degrees_west"],  "kdyn" => [3, "dyn"],
+  "kelvins" => [0, "kelvin"],  "kerg" => [3, "erg"],
+  "kforce" => [3, "force"],  "kgravity" => [3, "gravity"],
+  "kh" => [3, "h"],  "khg" => [3, "hg"],  "khr" => [3, "hr"],
+  "kiloCelsius" => [3, "Celsius"],
+  "kiloFahrenheit" => [3, "Fahrenheit"],
+  "kiloJulian_year" => [3, "Julian_year"],
+  "kiloPascal" => [3, "Pascal"],  "kiloacre" => [3, "acre"],
+  "kiloampere" => [3, "ampere"],  "kiloangstrom" => [3, "angstrom"],
+  "kiloangular_degree" => [3, "angular_degree"],
+  "kiloangular_minute" => [3, "angular_minute"],
+  "kiloangular_second" => [3, "angular_second"],
+  "kiloare" => [3, "are"],  "kiloatmosphere" => [3, "atmosphere"],
+  "kilocalorie" => [3, "calorie"],  "kilocelsius" => [3, "celsius"],
+  "kilocentigrade" => [3, "centigrade"],
+  "kilocentury" => [3, "century"],  "kilochain" => [3, "chain"],
+  "kilocommon_year" => [3, "common_year"],
+  "kilocoulomb" => [3, "coulomb"],  "kiloday" => [3, "day"],
+  "kilodegK" => [3, "degK"],  "kilodeg_K" => [3, "deg_K"],
+  "kilodegree" => [3, "degree"],  "kilodegreeK" => [3, "degreeK"],
+  "kilodyne" => [3, "dyne"],  "kiloerg" => [3, "erg"],
+  "kilofahrenheit" => [3, "fahrenheit"],  "kilofarad" => [3, "farad"],
+  "kilofermi" => [3, "fermi"],  "kilogal" => [3, "gal"],
+  "kilogauss" => [3, "gauss"],  "kilogram" => [3, "gram"],
+  "kilograms" => [0, "kilogram"],  "kilohectare" => [3, "hectare"],
+  "kilohertz" => [3, "hertz"],  "kilohour" => [3, "hour"],
+  "kiloinch" => [3, "inch"],  "kilojoule" => [3, "joule"],
+  "kilokelvin" => [3, "kelvin"],  "kilokilogram" => [3, "kilogram"],
+  "kiloknot" => [3, "knot"],  "kilolitre" => [3, "litre"],
+  "kilometer" => [3, "meter"],  "kilometre" => [3, "metre"],
+  "kilomicron" => [3, "micron"],  "kilomile" => [3, "mile"],
+  "kilomillibar" => [3, "millibar"],  "kilominute" => [3, "minute"],
+  "kilominute_angle" => [3, "minute_angle"],  "kilomole" => [3, "mole"],
+  "kilomonth" => [3, "month"],  "kilonewton" => [3, "newton"],
+  "kiloounce" => [3, "ounce"],  "kiloparsec" => [3, "parsec"],
+  "kilopascal" => [3, "pascal"],  "kilopentad" => [3, "pentad"],
+  "kilopoise" => [3, "poise"],  "kilopound" => [3, "pound"],
+  "kiloradian" => [3, "radian"],  "kilosecond" => [3, "second"],
+  "kilosecond_angle" => [3, "second_angle"],
+  "kilosteradian" => [3, "steradian"],  "kilostokes" => [3, "stokes"],
+  "kilotesla" => [3, "tesla"],  "kiloton" => [3, "ton"],
+  "kilotonne" => [3, "tonne"],  "kilotorr" => [3, "torr"],
+  "kilovolt" => [3, "volt"],  "kilowatt" => [3, "watt"],
+  "kiloweber" => [3, "weber"],  "kiloyard" => [3, "yard"],
+  "kiloyd" => [3, "yd"],  "kiloyear" => [3, "year"],
+  "kin" => [3, "in"],  "kkg" => [3, "kg"],  "kkgf" => [3, "kgf"],
+  "kkph" => [3, "kph"],  "klb" => [3, "lb"],  "klm" => [3, "lm"],
+  "klx" => [3, "lx"],  "kly" => [3, "ly"],  "km" => [3, "m"],
+  "kmb" => [3, "mb"],  "kmercury" => [3, "mercury"],
+  "kmgal" => [3, "mgal"],  "kmin" => [3, "min"],  "kmol" => [3, "mol"],
+  "kmon" => [3, "mon"],  "kmph" => [3, "mph"],  "knots" => [0, "knot"],
+  "kohm" => [3, "ohm"],  "koz" => [3, "oz"],  "kpc" => [3, "pc"],
+  "kpercent" => [3, "percent"],  "kpermil" => [3, "permil"],
+  "kpsi" => [3, "psi"],  "krad" => [3, "rad"],  "ks" => [3, "s"],
+  "ksr" => [3, "sr"],  "kt" => [3, "t"],  "kyr" => [3, "yr"],
+  "litres" => [0, "litre"],  "m%" => [-3, "%"],  "mA" => [-3, "A"],
+  "mAu" => [-3, "Au"],  "mBq" => [-3, "Bq"],  "mC" => [-3, "C"],
+  "mF" => [-3, "F"],  "mG" => [-3, "G"],  "mGal" => [-3, "Gal"],
+  "mGy" => [-3, "Gy"],  "mH" => [-3, "H"],  "mHg" => [-3, "Hg"],
+  "mHz" => [-3, "Hz"],  "mJ" => [-3, "J"],  "mK" => [-3, "K"],
+  "mL" => [-3, "L"],  "mN" => [-3, "N"],  "mP" => [-3, "P"],
+  "mPa" => [-3, "Pa"],  "mS" => [-3, "S"],  "mSt" => [-3, "St"],
+  "mSv" => [-3, "Sv"],  "mT" => [-3, "T"],  "mV" => [-3, "V"],
+  "mW" => [-3, "W"],  "mWb" => [-3, "Wb"],  "ma" => [-3, "a"],
+  "mac" => [-3, "ac"],  "matm" => [-3, "atm"],  "mbar" => [-3, "bar"],
+  "mcal" => [-3, "cal"],
+  "mconventional_mercury" => [-3, "conventional_mercury"],
+  "md" => [-3, "d"],  "mdegC" => [-3, "degC"],  "mdegF" => [-3, "degF"],
+  "mdeg_C" => [-3, "deg_C"],  "mdeg_F" => [-3, "deg_F"],
+  "mdegreeC" => [-3, "degreeC"],  "mdegreeF" => [-3, "degreeF"],
+  "mdegree_C" => [-3, "degree_C"],  "mdegree_E" => [-3, "degree_E"],
+  "mdegree_F" => [-3, "degree_F"],  "mdegree_N" => [-3, "degree_N"],
+  "mdegree_R" => [-3, "degree_R"],  "mdegree_S" => [-3, "degree_S"],
+  "mdegree_W" => [-3, "degree_W"],  "mdegree_c" => [-3, "degree_c"],
+  "mdegree_east" => [-3, "degree_east"],
+  "mdegree_f" => [-3, "degree_f"],
+  "mdegree_north" => [-3, "degree_north"],
+  "mdegree_south" => [-3, "degree_south"],
+  "mdegree_west" => [-3, "degree_west"],
+  "mdegrees_east" => [-3, "degrees_east"],
+  "mdegrees_north" => [-3, "degrees_north"],
+  "mdegrees_south" => [-3, "degrees_south"],
+  "mdegrees_west" => [-3, "degrees_west"],  "mdyn" => [-3, "dyn"],
+  "megaCelsius" => [6, "Celsius"],
+  "megaFahrenheit" => [6, "Fahrenheit"],
+  "megaJulian_year" => [6, "Julian_year"],
+  "megaPascal" => [6, "Pascal"],  "megaacre" => [6, "acre"],
+  "megaampere" => [6, "ampere"],  "megaangstrom" => [6, "angstrom"],
+  "megaangular_degree" => [6, "angular_degree"],
+  "megaangular_minute" => [6, "angular_minute"],
+  "megaangular_second" => [6, "angular_second"],
+  "megaare" => [6, "are"],  "megaatmosphere" => [6, "atmosphere"],
+  "megacalorie" => [6, "calorie"],  "megacelsius" => [6, "celsius"],
+  "megacentigrade" => [6, "centigrade"],
+  "megacentury" => [6, "century"],  "megachain" => [6, "chain"],
+  "megacommon_year" => [6, "common_year"],
+  "megacoulomb" => [6, "coulomb"],  "megaday" => [6, "day"],
+  "megadegK" => [6, "degK"],  "megadeg_K" => [6, "deg_K"],
+  "megadegree" => [6, "degree"],  "megadegreeK" => [6, "degreeK"],
+  "megadyne" => [6, "dyne"],  "megaerg" => [6, "erg"],
+  "megafahrenheit" => [6, "fahrenheit"],  "megafarad" => [6, "farad"],
+  "megafermi" => [6, "fermi"],  "megagal" => [6, "gal"],
+  "megagauss" => [6, "gauss"],  "megagram" => [6, "gram"],
+  "megahectare" => [6, "hectare"],  "megahertz" => [6, "hertz"],
+  "megahour" => [6, "hour"],  "megainch" => [6, "inch"],
+  "megajoule" => [6, "joule"],  "megakelvin" => [6, "kelvin"],
+  "megakilogram" => [6, "kilogram"],  "megaknot" => [6, "knot"],
+  "megalitre" => [6, "litre"],  "megameter" => [6, "meter"],
+  "megametre" => [6, "metre"],  "megamicron" => [6, "micron"],
+  "megamile" => [6, "mile"],  "megamillibar" => [6, "millibar"],
+  "megaminute" => [6, "minute"],
+  "megaminute_angle" => [6, "minute_angle"],  "megamole" => [6, "mole"],
+  "megamonth" => [6, "month"],  "meganewton" => [6, "newton"],
+  "megaounce" => [6, "ounce"],  "megaparsec" => [6, "parsec"],
+  "megapascal" => [6, "pascal"],  "megapentad" => [6, "pentad"],
+  "megapoise" => [6, "poise"],  "megapound" => [6, "pound"],
+  "megaradian" => [6, "radian"],  "megasecond" => [6, "second"],
+  "megasecond_angle" => [6, "second_angle"],
+  "megasteradian" => [6, "steradian"],  "megastokes" => [6, "stokes"],
+  "megatesla" => [6, "tesla"],  "megaton" => [6, "ton"],
+  "megatonne" => [6, "tonne"],  "megatorr" => [6, "torr"],
+  "megavolt" => [6, "volt"],  "megawatt" => [6, "watt"],
+  "megaweber" => [6, "weber"],  "megayard" => [6, "yard"],
+  "megayd" => [6, "yd"],  "megayear" => [6, "year"],
+  "merg" => [-3, "erg"],  "meters" => [0, "meter"],
+  "metres" => [0, "metre"],  "mforce" => [-3, "force"],
+  "mg" => [-3, "g"],  "mgravity" => [-3, "gravity"],  "mh" => [-3, "h"],
+  "mhg" => [-3, "hg"],  "mhr" => [-3, "hr"],
+  "microCelsius" => [-6, "Celsius"],
+  "microFahrenheit" => [-6, "Fahrenheit"],
+  "microJulian_year" => [-6, "Julian_year"],
+  "microPascal" => [-6, "Pascal"],  "microacre" => [-6, "acre"],
+  "microampere" => [-6, "ampere"],  "microangstrom" => [-6, "angstrom"],
+  "microangular_degree" => [-6, "angular_degree"],
+  "microangular_minute" => [-6, "angular_minute"],
+  "microangular_second" => [-6, "angular_second"],
+  "microare" => [-6, "are"],  "microatmosphere" => [-6, "atmosphere"],
+  "microcalorie" => [-6, "calorie"],  "microcelsius" => [-6, "celsius"],
+  "microcentigrade" => [-6, "centigrade"],
+  "microcentury" => [-6, "century"],  "microchain" => [-6, "chain"],
+  "microcommon_year" => [-6, "common_year"],
+  "microcoulomb" => [-6, "coulomb"],  "microday" => [-6, "day"],
+  "microdegK" => [-6, "degK"],  "microdeg_K" => [-6, "deg_K"],
+  "microdegree" => [-6, "degree"],  "microdegreeK" => [-6, "degreeK"],
+  "microdyne" => [-6, "dyne"],  "microerg" => [-6, "erg"],
+  "microfahrenheit" => [-6, "fahrenheit"],
+  "microfarad" => [-6, "farad"],  "microfermi" => [-6, "fermi"],
+  "microgal" => [-6, "gal"],  "microgauss" => [-6, "gauss"],
+  "microgram" => [-6, "gram"],  "microhectare" => [-6, "hectare"],
+  "microhertz" => [-6, "hertz"],  "microhour" => [-6, "hour"],
+  "microinch" => [-6, "inch"],  "microjoule" => [-6, "joule"],
+  "microkelvin" => [-6, "kelvin"],  "microkilogram" => [-6, "kilogram"],
+  "microknot" => [-6, "knot"],  "microlitre" => [-6, "litre"],
+  "micrometer" => [-6, "meter"],  "micrometre" => [-6, "metre"],
+  "micromicron" => [-6, "micron"],  "micromile" => [-6, "mile"],
+  "micromillibar" => [-6, "millibar"],  "microminute" => [-6, "minute"],
+  "microminute_angle" => [-6, "minute_angle"],
+  "micromole" => [-6, "mole"],  "micromonth" => [-6, "month"],
+  "micronewton" => [-6, "newton"],  "microns" => [0, "micron"],
+  "microounce" => [-6, "ounce"],  "microparsec" => [-6, "parsec"],
+  "micropascal" => [-6, "pascal"],  "micropentad" => [-6, "pentad"],
+  "micropoise" => [-6, "poise"],  "micropound" => [-6, "pound"],
+  "microradian" => [-6, "radian"],  "microsecond" => [-6, "second"],
+  "microsecond_angle" => [-6, "second_angle"],
+  "microsteradian" => [-6, "steradian"],
+  "microstokes" => [-6, "stokes"],  "microtesla" => [-6, "tesla"],
+  "microton" => [-6, "ton"],  "microtonne" => [-6, "tonne"],
+  "microtorr" => [-6, "torr"],  "microvolt" => [-6, "volt"],
+  "microwatt" => [-6, "watt"],  "microweber" => [-6, "weber"],
+  "microyard" => [-6, "yard"],  "microyd" => [-6, "yd"],
+  "microyear" => [-6, "year"],  "miles" => [0, "mile"],
+  "milliCelsius" => [-3, "Celsius"],
+  "milliFahrenheit" => [-3, "Fahrenheit"],
+  "milliJulian_year" => [-3, "Julian_year"],
+  "milliPascal" => [-3, "Pascal"],  "milliacre" => [-3, "acre"],
+  "milliampere" => [-3, "ampere"],  "milliangstrom" => [-3, "angstrom"],
+  "milliangular_degree" => [-3, "angular_degree"],
+  "milliangular_minute" => [-3, "angular_minute"],
+  "milliangular_second" => [-3, "angular_second"],
+  "milliare" => [-3, "are"],  "milliatmosphere" => [-3, "atmosphere"],
+  "millibars" => [0, "millibar"],  "millicalorie" => [-3, "calorie"],
+  "millicelsius" => [-3, "celsius"],
+  "millicentigrade" => [-3, "centigrade"],
+  "millicentury" => [-3, "century"],  "millichain" => [-3, "chain"],
+  "millicommon_year" => [-3, "common_year"],
+  "millicoulomb" => [-3, "coulomb"],  "milliday" => [-3, "day"],
+  "millidegK" => [-3, "degK"],  "millideg_K" => [-3, "deg_K"],
+  "millidegree" => [-3, "degree"],  "millidegreeK" => [-3, "degreeK"],
+  "millidyne" => [-3, "dyne"],  "millierg" => [-3, "erg"],
+  "millifahrenheit" => [-3, "fahrenheit"],
+  "millifarad" => [-3, "farad"],  "millifermi" => [-3, "fermi"],
+  "milligal" => [-3, "gal"],  "milligauss" => [-3, "gauss"],
+  "milligram" => [-3, "gram"],  "millihectare" => [-3, "hectare"],
+  "millihertz" => [-3, "hertz"],  "millihour" => [-3, "hour"],
+  "milliinch" => [-3, "inch"],  "millijoule" => [-3, "joule"],
+  "millikelvin" => [-3, "kelvin"],  "millikilogram" => [-3, "kilogram"],
+  "milliknot" => [-3, "knot"],  "millilitre" => [-3, "litre"],
+  "millimeter" => [-3, "meter"],  "millimetre" => [-3, "metre"],
+  "millimicron" => [-3, "micron"],  "millimile" => [-3, "mile"],
+  "millimillibar" => [-3, "millibar"],  "milliminute" => [-3, "minute"],
+  "milliminute_angle" => [-3, "minute_angle"],
+  "millimole" => [-3, "mole"],  "millimonth" => [-3, "month"],
+  "millinewton" => [-3, "newton"],  "milliounce" => [-3, "ounce"],
+  "milliparsec" => [-3, "parsec"],  "millipascal" => [-3, "pascal"],
+  "millipentad" => [-3, "pentad"],  "millipoise" => [-3, "poise"],
+  "millipound" => [-3, "pound"],  "milliradian" => [-3, "radian"],
+  "millisecond" => [-3, "second"],
+  "millisecond_angle" => [-3, "second_angle"],
+  "millisteradian" => [-3, "steradian"],
+  "millistokes" => [-3, "stokes"],  "millitesla" => [-3, "tesla"],
+  "milliton" => [-3, "ton"],  "millitonne" => [-3, "tonne"],
+  "millitorr" => [-3, "torr"],  "millivolt" => [-3, "volt"],
+  "milliwatt" => [-3, "watt"],  "milliweber" => [-3, "weber"],
+  "milliyard" => [-3, "yard"],  "milliyd" => [-3, "yd"],
+  "milliyear" => [-3, "year"],  "min" => [-3, "in"],
+  "minutes" => [0, "minute"],  "minutes_angle" => [0, "minute_angle"],
+  "mkg" => [-3, "kg"],  "mkgf" => [-3, "kgf"],  "mkph" => [-3, "kph"],
+  "mlb" => [-3, "lb"],  "mlm" => [-3, "lm"],  "mlx" => [-3, "lx"],
+  "mly" => [-3, "ly"],  "mm" => [-3, "m"],  "mmb" => [-3, "mb"],
+  "mmercury" => [-3, "mercury"],  "mmgal" => [-3, "mgal"],
+  "mmin" => [-3, "min"],  "mmol" => [-3, "mol"],  "mmon" => [-3, "mon"],
+  "mmph" => [-3, "mph"],  "mohm" => [-3, "ohm"],
+  "moles" => [0, "mole"],  "months" => [0, "month"],
+  "moz" => [-3, "oz"],  "mpc" => [-3, "pc"],
+  "mpercent" => [-3, "percent"],  "mpermil" => [-3, "permil"],
+  "mpsi" => [-3, "psi"],  "mrad" => [-3, "rad"],  "ms" => [-3, "s"],
+  "msr" => [-3, "sr"],  "mt" => [-3, "t"],  "myr" => [-3, "yr"],
+  "n%" => [-9, "%"],  "nA" => [-9, "A"],  "nAu" => [-9, "Au"],
+  "nBq" => [-9, "Bq"],  "nC" => [-9, "C"],  "nF" => [-9, "F"],
+  "nG" => [-9, "G"],  "nGal" => [-9, "Gal"],  "nGy" => [-9, "Gy"],
+  "nH" => [-9, "H"],  "nHg" => [-9, "Hg"],  "nHz" => [-9, "Hz"],
+  "nJ" => [-9, "J"],  "nK" => [-9, "K"],  "nL" => [-9, "L"],
+  "nN" => [-9, "N"],  "nP" => [-9, "P"],  "nPa" => [-9, "Pa"],
+  "nS" => [-9, "S"],  "nSt" => [-9, "St"],  "nSv" => [-9, "Sv"],
+  "nT" => [-9, "T"],  "nV" => [-9, "V"],  "nW" => [-9, "W"],
+  "nWb" => [-9, "Wb"],  "na" => [-9, "a"],  "nac" => [-9, "ac"],
+  "nanoCelsius" => [-9, "Celsius"],
+  "nanoFahrenheit" => [-9, "Fahrenheit"],
+  "nanoJulian_year" => [-9, "Julian_year"],
+  "nanoPascal" => [-9, "Pascal"],  "nanoacre" => [-9, "acre"],
+  "nanoampere" => [-9, "ampere"],  "nanoangstrom" => [-9, "angstrom"],
+  "nanoangular_degree" => [-9, "angular_degree"],
+  "nanoangular_minute" => [-9, "angular_minute"],
+  "nanoangular_second" => [-9, "angular_second"],
+  "nanoare" => [-9, "are"],  "nanoatmosphere" => [-9, "atmosphere"],
+  "nanocalorie" => [-9, "calorie"],  "nanocelsius" => [-9, "celsius"],
+  "nanocentigrade" => [-9, "centigrade"],
+  "nanocentury" => [-9, "century"],  "nanochain" => [-9, "chain"],
+  "nanocommon_year" => [-9, "common_year"],
+  "nanocoulomb" => [-9, "coulomb"],  "nanoday" => [-9, "day"],
+  "nanodegK" => [-9, "degK"],  "nanodeg_K" => [-9, "deg_K"],
+  "nanodegree" => [-9, "degree"],  "nanodegreeK" => [-9, "degreeK"],
+  "nanodyne" => [-9, "dyne"],  "nanoerg" => [-9, "erg"],
+  "nanofahrenheit" => [-9, "fahrenheit"],  "nanofarad" => [-9, "farad"],
+  "nanofermi" => [-9, "fermi"],  "nanogal" => [-9, "gal"],
+  "nanogauss" => [-9, "gauss"],  "nanogram" => [-9, "gram"],
+  "nanohectare" => [-9, "hectare"],  "nanohertz" => [-9, "hertz"],
+  "nanohour" => [-9, "hour"],  "nanoinch" => [-9, "inch"],
+  "nanojoule" => [-9, "joule"],  "nanokelvin" => [-9, "kelvin"],
+  "nanokilogram" => [-9, "kilogram"],  "nanoknot" => [-9, "knot"],
+  "nanolitre" => [-9, "litre"],  "nanometer" => [-9, "meter"],
+  "nanometre" => [-9, "metre"],  "nanomicron" => [-9, "micron"],
+  "nanomile" => [-9, "mile"],  "nanomillibar" => [-9, "millibar"],
+  "nanominute" => [-9, "minute"],
+  "nanominute_angle" => [-9, "minute_angle"],
+  "nanomole" => [-9, "mole"],  "nanomonth" => [-9, "month"],
+  "nanonewton" => [-9, "newton"],  "nanoounce" => [-9, "ounce"],
+  "nanoparsec" => [-9, "parsec"],  "nanopascal" => [-9, "pascal"],
+  "nanopentad" => [-9, "pentad"],  "nanopoise" => [-9, "poise"],
+  "nanopound" => [-9, "pound"],  "nanoradian" => [-9, "radian"],
+  "nanosecond" => [-9, "second"],
+  "nanosecond_angle" => [-9, "second_angle"],
+  "nanosteradian" => [-9, "steradian"],  "nanostokes" => [-9, "stokes"],
+  "nanotesla" => [-9, "tesla"],  "nanoton" => [-9, "ton"],
+  "nanotonne" => [-9, "tonne"],  "nanotorr" => [-9, "torr"],
+  "nanovolt" => [-9, "volt"],  "nanowatt" => [-9, "watt"],
+  "nanoweber" => [-9, "weber"],  "nanoyard" => [-9, "yard"],
+  "nanoyd" => [-9, "yd"],  "nanoyear" => [-9, "year"],
+  "natm" => [-9, "atm"],  "nbar" => [-9, "bar"],  "ncal" => [-9, "cal"],
+  "nconventional_mercury" => [-9, "conventional_mercury"],
+  "nd" => [-9, "d"],  "ndegC" => [-9, "degC"],  "ndegF" => [-9, "degF"],
+  "ndeg_C" => [-9, "deg_C"],  "ndeg_F" => [-9, "deg_F"],
+  "ndegreeC" => [-9, "degreeC"],  "ndegreeF" => [-9, "degreeF"],
+  "ndegree_C" => [-9, "degree_C"],  "ndegree_E" => [-9, "degree_E"],
+  "ndegree_F" => [-9, "degree_F"],  "ndegree_N" => [-9, "degree_N"],
+  "ndegree_R" => [-9, "degree_R"],  "ndegree_S" => [-9, "degree_S"],
+  "ndegree_W" => [-9, "degree_W"],  "ndegree_c" => [-9, "degree_c"],
+  "ndegree_east" => [-9, "degree_east"],
+  "ndegree_f" => [-9, "degree_f"],
+  "ndegree_north" => [-9, "degree_north"],
+  "ndegree_south" => [-9, "degree_south"],
+  "ndegree_west" => [-9, "degree_west"],
+  "ndegrees_east" => [-9, "degrees_east"],
+  "ndegrees_north" => [-9, "degrees_north"],
+  "ndegrees_south" => [-9, "degrees_south"],
+  "ndegrees_west" => [-9, "degrees_west"],  "ndyn" => [-9, "dyn"],
+  "nerg" => [-9, "erg"],  "newtons" => [0, "newton"],
+  "nforce" => [-9, "force"],  "ng" => [-9, "g"],
+  "ngravity" => [-9, "gravity"],  "nh" => [-9, "h"],
+  "nhg" => [-9, "hg"],  "nhr" => [-9, "hr"],  "nin" => [-9, "in"],
+  "nkg" => [-9, "kg"],  "nkgf" => [-9, "kgf"],  "nkph" => [-9, "kph"],
+  "nlb" => [-9, "lb"],  "nlm" => [-9, "lm"],  "nlx" => [-9, "lx"],
+  "nly" => [-9, "ly"],  "nm" => [-9, "m"],  "nmb" => [-9, "mb"],
+  "nmercury" => [-9, "mercury"],  "nmgal" => [-9, "mgal"],
+  "nmin" => [-9, "min"],  "nmol" => [-9, "mol"],  "nmon" => [-9, "mon"],
+  "nmph" => [-9, "mph"],  "nohm" => [-9, "ohm"],  "noz" => [-9, "oz"],
+  "npc" => [-9, "pc"],  "npercent" => [-9, "percent"],
+  "npermil" => [-9, "permil"],  "npsi" => [-9, "psi"],
+  "nrad" => [-9, "rad"],  "ns" => [-9, "s"],  "nsr" => [-9, "sr"],
+  "nt" => [-9, "t"],  "nyr" => [-9, "yr"],  "ounces" => [0, "ounce"],
+  "p%" => [-12, "%"],  "pA" => [-12, "A"],  "pAu" => [-12, "Au"],
+  "pBq" => [-12, "Bq"],  "pC" => [-12, "C"],  "pF" => [-12, "F"],
+  "pG" => [-12, "G"],  "pGal" => [-12, "Gal"],  "pGy" => [-12, "Gy"],
+  "pH" => [-12, "H"],  "pHg" => [-12, "Hg"],  "pHz" => [-12, "Hz"],
+  "pJ" => [-12, "J"],  "pK" => [-12, "K"],  "pL" => [-12, "L"],
+  "pN" => [-12, "N"],  "pP" => [-12, "P"],  "pPa" => [-12, "Pa"],
+  "pS" => [-12, "S"],  "pSt" => [-12, "St"],  "pSv" => [-12, "Sv"],
+  "pT" => [-12, "T"],  "pV" => [-12, "V"],  "pW" => [-12, "W"],
+  "pWb" => [-12, "Wb"],  "pa" => [-12, "a"],  "pac" => [-12, "ac"],
+  "parsecs" => [0, "parsec"],  "pascals" => [0, "pascal"],
+  "patm" => [-12, "atm"],  "pbar" => [-12, "bar"],
+  "pcal" => [-12, "cal"],
+  "pconventional_mercury" => [-12, "conventional_mercury"],
+  "pd" => [-12, "d"],  "pdegC" => [-12, "degC"],
+  "pdegF" => [-12, "degF"],  "pdeg_C" => [-12, "deg_C"],
+  "pdeg_F" => [-12, "deg_F"],  "pdegreeC" => [-12, "degreeC"],
+  "pdegreeF" => [-12, "degreeF"],  "pdegree_C" => [-12, "degree_C"],
+  "pdegree_E" => [-12, "degree_E"],  "pdegree_F" => [-12, "degree_F"],
+  "pdegree_N" => [-12, "degree_N"],  "pdegree_R" => [-12, "degree_R"],
+  "pdegree_S" => [-12, "degree_S"],  "pdegree_W" => [-12, "degree_W"],
+  "pdegree_c" => [-12, "degree_c"],
+  "pdegree_east" => [-12, "degree_east"],
+  "pdegree_f" => [-12, "degree_f"],
+  "pdegree_north" => [-12, "degree_north"],
+  "pdegree_south" => [-12, "degree_south"],
+  "pdegree_west" => [-12, "degree_west"],
+  "pdegrees_east" => [-12, "degrees_east"],
+  "pdegrees_north" => [-12, "degrees_north"],
+  "pdegrees_south" => [-12, "degrees_south"],
+  "pdegrees_west" => [-12, "degrees_west"],  "pdyn" => [-12, "dyn"],
+  "pentads" => [0, "pentad"],  "perg" => [-12, "erg"],
+  "petaCelsius" => [15, "Celsius"],
+  "petaFahrenheit" => [15, "Fahrenheit"],
+  "petaJulian_year" => [15, "Julian_year"],
+  "petaPascal" => [15, "Pascal"],  "petaacre" => [15, "acre"],
+  "petaampere" => [15, "ampere"],  "petaangstrom" => [15, "angstrom"],
+  "petaangular_degree" => [15, "angular_degree"],
+  "petaangular_minute" => [15, "angular_minute"],
+  "petaangular_second" => [15, "angular_second"],
+  "petaare" => [15, "are"],  "petaatmosphere" => [15, "atmosphere"],
+  "petacalorie" => [15, "calorie"],  "petacelsius" => [15, "celsius"],
+  "petacentigrade" => [15, "centigrade"],
+  "petacentury" => [15, "century"],  "petachain" => [15, "chain"],
+  "petacommon_year" => [15, "common_year"],
+  "petacoulomb" => [15, "coulomb"],  "petaday" => [15, "day"],
+  "petadegK" => [15, "degK"],  "petadeg_K" => [15, "deg_K"],
+  "petadegree" => [15, "degree"],  "petadegreeK" => [15, "degreeK"],
+  "petadyne" => [15, "dyne"],  "petaerg" => [15, "erg"],
+  "petafahrenheit" => [15, "fahrenheit"],  "petafarad" => [15, "farad"],
+  "petafermi" => [15, "fermi"],  "petagal" => [15, "gal"],
+  "petagauss" => [15, "gauss"],  "petagram" => [15, "gram"],
+  "petahectare" => [15, "hectare"],  "petahertz" => [15, "hertz"],
+  "petahour" => [15, "hour"],  "petainch" => [15, "inch"],
+  "petajoule" => [15, "joule"],  "petakelvin" => [15, "kelvin"],
+  "petakilogram" => [15, "kilogram"],  "petaknot" => [15, "knot"],
+  "petalitre" => [15, "litre"],  "petameter" => [15, "meter"],
+  "petametre" => [15, "metre"],  "petamicron" => [15, "micron"],
+  "petamile" => [15, "mile"],  "petamillibar" => [15, "millibar"],
+  "petaminute" => [15, "minute"],
+  "petaminute_angle" => [15, "minute_angle"],
+  "petamole" => [15, "mole"],  "petamonth" => [15, "month"],
+  "petanewton" => [15, "newton"],  "petaounce" => [15, "ounce"],
+  "petaparsec" => [15, "parsec"],  "petapascal" => [15, "pascal"],
+  "petapentad" => [15, "pentad"],  "petapoise" => [15, "poise"],
+  "petapound" => [15, "pound"],  "petaradian" => [15, "radian"],
+  "petasecond" => [15, "second"],
+  "petasecond_angle" => [15, "second_angle"],
+  "petasteradian" => [15, "steradian"],  "petastokes" => [15, "stokes"],
+  "petatesla" => [15, "tesla"],  "petaton" => [15, "ton"],
+  "petatonne" => [15, "tonne"],  "petatorr" => [15, "torr"],
+  "petavolt" => [15, "volt"],  "petawatt" => [15, "watt"],
+  "petaweber" => [15, "weber"],  "petayard" => [15, "yard"],
+  "petayd" => [15, "yd"],  "petayear" => [15, "year"],
+  "pforce" => [-12, "force"],  "pg" => [-12, "g"],
+  "pgravity" => [-12, "gravity"],  "ph" => [-12, "h"],
+  "phg" => [-12, "hg"],  "phr" => [-12, "hr"],
+  "picoCelsius" => [-12, "Celsius"],
+  "picoFahrenheit" => [-12, "Fahrenheit"],
+  "picoJulian_year" => [-12, "Julian_year"],
+  "picoPascal" => [-12, "Pascal"],  "picoacre" => [-12, "acre"],
+  "picoampere" => [-12, "ampere"],  "picoangstrom" => [-12, "angstrom"],
+  "picoangular_degree" => [-12, "angular_degree"],
+  "picoangular_minute" => [-12, "angular_minute"],
+  "picoangular_second" => [-12, "angular_second"],
+  "picoare" => [-12, "are"],  "picoatmosphere" => [-12, "atmosphere"],
+  "picocalorie" => [-12, "calorie"],  "picocelsius" => [-12, "celsius"],
+  "picocentigrade" => [-12, "centigrade"],
+  "picocentury" => [-12, "century"],  "picochain" => [-12, "chain"],
+  "picocommon_year" => [-12, "common_year"],
+  "picocoulomb" => [-12, "coulomb"],  "picoday" => [-12, "day"],
+  "picodegK" => [-12, "degK"],  "picodeg_K" => [-12, "deg_K"],
+  "picodegree" => [-12, "degree"],  "picodegreeK" => [-12, "degreeK"],
+  "picodyne" => [-12, "dyne"],  "picoerg" => [-12, "erg"],
+  "picofahrenheit" => [-12, "fahrenheit"],
+  "picofarad" => [-12, "farad"],  "picofermi" => [-12, "fermi"],
+  "picogal" => [-12, "gal"],  "picogauss" => [-12, "gauss"],
+  "picogram" => [-12, "gram"],  "picohectare" => [-12, "hectare"],
+  "picohertz" => [-12, "hertz"],  "picohour" => [-12, "hour"],
+  "picoinch" => [-12, "inch"],  "picojoule" => [-12, "joule"],
+  "picokelvin" => [-12, "kelvin"],  "picokilogram" => [-12, "kilogram"],
+  "picoknot" => [-12, "knot"],  "picolitre" => [-12, "litre"],
+  "picometer" => [-12, "meter"],  "picometre" => [-12, "metre"],
+  "picomicron" => [-12, "micron"],  "picomile" => [-12, "mile"],
+  "picomillibar" => [-12, "millibar"],  "picominute" => [-12, "minute"],
+  "picominute_angle" => [-12, "minute_angle"],
+  "picomole" => [-12, "mole"],  "picomonth" => [-12, "month"],
+  "piconewton" => [-12, "newton"],  "picoounce" => [-12, "ounce"],
+  "picoparsec" => [-12, "parsec"],  "picopascal" => [-12, "pascal"],
+  "picopentad" => [-12, "pentad"],  "picopoise" => [-12, "poise"],
+  "picopound" => [-12, "pound"],  "picoradian" => [-12, "radian"],
+  "picosecond" => [-12, "second"],
+  "picosecond_angle" => [-12, "second_angle"],
+  "picosteradian" => [-12, "steradian"],
+  "picostokes" => [-12, "stokes"],  "picotesla" => [-12, "tesla"],
+  "picoton" => [-12, "ton"],  "picotonne" => [-12, "tonne"],
+  "picotorr" => [-12, "torr"],  "picovolt" => [-12, "volt"],
+  "picowatt" => [-12, "watt"],  "picoweber" => [-12, "weber"],
+  "picoyard" => [-12, "yard"],  "picoyd" => [-12, "yd"],
+  "picoyear" => [-12, "year"],  "pin" => [-12, "in"],
+  "pkg" => [-12, "kg"],  "pkgf" => [-12, "kgf"],
+  "pkph" => [-12, "kph"],  "plb" => [-12, "lb"],  "plm" => [-12, "lm"],
+  "plx" => [-12, "lx"],  "ply" => [-12, "ly"],  "pm" => [-12, "m"],
+  "pmb" => [-12, "mb"],  "pmercury" => [-12, "mercury"],
+  "pmgal" => [-12, "mgal"],  "pmin" => [-12, "min"],
+  "pmol" => [-12, "mol"],  "pmon" => [-12, "mon"],
+  "pmph" => [-12, "mph"],  "pohm" => [-12, "ohm"],
+  "poises" => [0, "poise"],  "pounds" => [0, "pound"],
+  "poz" => [-12, "oz"],  "ppc" => [-12, "pc"],
+  "ppercent" => [-12, "percent"],  "ppermil" => [-12, "permil"],
+  "ppsi" => [-12, "psi"],  "prad" => [-12, "rad"],  "ps" => [-12, "s"],
+  "psr" => [-12, "sr"],  "pt" => [-12, "t"],  "pyr" => [-12, "yr"],
+  "radians" => [0, "radian"],  "seconds" => [0, "second"],
+  "seconds_angle" => [0, "second_angle"],
+  "steradians" => [0, "steradian"],  "stokeses" => [0, "stokes"],
+  "telaCelsius" => [12, "Celsius"],
+  "telaFahrenheit" => [12, "Fahrenheit"],
+  "telaJulian_year" => [12, "Julian_year"],
+  "telaPascal" => [12, "Pascal"],  "telaacre" => [12, "acre"],
+  "telaampere" => [12, "ampere"],  "telaangstrom" => [12, "angstrom"],
+  "telaangular_degree" => [12, "angular_degree"],
+  "telaangular_minute" => [12, "angular_minute"],
+  "telaangular_second" => [12, "angular_second"],
+  "telaare" => [12, "are"],  "telaatmosphere" => [12, "atmosphere"],
+  "telacalorie" => [12, "calorie"],  "telacelsius" => [12, "celsius"],
+  "telacentigrade" => [12, "centigrade"],
+  "telacentury" => [12, "century"],  "telachain" => [12, "chain"],
+  "telacommon_year" => [12, "common_year"],
+  "telacoulomb" => [12, "coulomb"],  "teladay" => [12, "day"],
+  "teladegK" => [12, "degK"],  "teladeg_K" => [12, "deg_K"],
+  "teladegree" => [12, "degree"],  "teladegreeK" => [12, "degreeK"],
+  "teladyne" => [12, "dyne"],  "telaerg" => [12, "erg"],
+  "telafahrenheit" => [12, "fahrenheit"],  "telafarad" => [12, "farad"],
+  "telafermi" => [12, "fermi"],  "telagal" => [12, "gal"],
+  "telagauss" => [12, "gauss"],  "telagram" => [12, "gram"],
+  "telahectare" => [12, "hectare"],  "telahertz" => [12, "hertz"],
+  "telahour" => [12, "hour"],  "telainch" => [12, "inch"],
+  "telajoule" => [12, "joule"],  "telakelvin" => [12, "kelvin"],
+  "telakilogram" => [12, "kilogram"],  "telaknot" => [12, "knot"],
+  "telalitre" => [12, "litre"],  "telameter" => [12, "meter"],
+  "telametre" => [12, "metre"],  "telamicron" => [12, "micron"],
+  "telamile" => [12, "mile"],  "telamillibar" => [12, "millibar"],
+  "telaminute" => [12, "minute"],
+  "telaminute_angle" => [12, "minute_angle"],
+  "telamole" => [12, "mole"],  "telamonth" => [12, "month"],
+  "telanewton" => [12, "newton"],  "telaounce" => [12, "ounce"],
+  "telaparsec" => [12, "parsec"],  "telapascal" => [12, "pascal"],
+  "telapentad" => [12, "pentad"],  "telapoise" => [12, "poise"],
+  "telapound" => [12, "pound"],  "telaradian" => [12, "radian"],
+  "telasecond" => [12, "second"],
+  "telasecond_angle" => [12, "second_angle"],
+  "telasteradian" => [12, "steradian"],  "telastokes" => [12, "stokes"],
+  "telatesla" => [12, "tesla"],  "telaton" => [12, "ton"],
+  "telatonne" => [12, "tonne"],  "telatorr" => [12, "torr"],
+  "telavolt" => [12, "volt"],  "telawatt" => [12, "watt"],
+  "telaweber" => [12, "weber"],  "telayard" => [12, "yard"],
+  "telayd" => [12, "yd"],  "telayear" => [12, "year"],
+  "teslas" => [0, "tesla"],  "tonnes" => [0, "tonne"],
+  "tons" => [0, "ton"],  "torrs" => [0, "torr"],  "u%" => [-6, "%"],
+  "uA" => [-6, "A"],  "uAu" => [-6, "Au"],  "uBq" => [-6, "Bq"],
+  "uC" => [-6, "C"],  "uF" => [-6, "F"],  "uG" => [-6, "G"],
+  "uGal" => [-6, "Gal"],  "uGy" => [-6, "Gy"],  "uH" => [-6, "H"],
+  "uHg" => [-6, "Hg"],  "uHz" => [-6, "Hz"],  "uJ" => [-6, "J"],
+  "uK" => [-6, "K"],  "uL" => [-6, "L"],  "uN" => [-6, "N"],
+  "uP" => [-6, "P"],  "uPa" => [-6, "Pa"],  "uS" => [-6, "S"],
+  "uSt" => [-6, "St"],  "uSv" => [-6, "Sv"],  "uT" => [-6, "T"],
+  "uV" => [-6, "V"],  "uW" => [-6, "W"],  "uWb" => [-6, "Wb"],
+  "ua" => [-6, "a"],  "uac" => [-6, "ac"],  "uatm" => [-6, "atm"],
+  "ubar" => [-6, "bar"],  "ucal" => [-6, "cal"],
+  "uconventional_mercury" => [-6, "conventional_mercury"],
+  "ud" => [-6, "d"],  "udegC" => [-6, "degC"],  "udegF" => [-6, "degF"],
+  "udeg_C" => [-6, "deg_C"],  "udeg_F" => [-6, "deg_F"],
+  "udegreeC" => [-6, "degreeC"],  "udegreeF" => [-6, "degreeF"],
+  "udegree_C" => [-6, "degree_C"],  "udegree_E" => [-6, "degree_E"],
+  "udegree_F" => [-6, "degree_F"],  "udegree_N" => [-6, "degree_N"],
+  "udegree_R" => [-6, "degree_R"],  "udegree_S" => [-6, "degree_S"],
+  "udegree_W" => [-6, "degree_W"],  "udegree_c" => [-6, "degree_c"],
+  "udegree_east" => [-6, "degree_east"],
+  "udegree_f" => [-6, "degree_f"],
+  "udegree_north" => [-6, "degree_north"],
+  "udegree_south" => [-6, "degree_south"],
+  "udegree_west" => [-6, "degree_west"],
+  "udegrees_east" => [-6, "degrees_east"],
+  "udegrees_north" => [-6, "degrees_north"],
+  "udegrees_south" => [-6, "degrees_south"],
+  "udegrees_west" => [-6, "degrees_west"],  "udyn" => [-6, "dyn"],
+  "uerg" => [-6, "erg"],  "uforce" => [-6, "force"],  "ug" => [-6, "g"],
+  "ugravity" => [-6, "gravity"],  "uh" => [-6, "h"],
+  "uhg" => [-6, "hg"],  "uhr" => [-6, "hr"],  "uin" => [-6, "in"],
+  "ukg" => [-6, "kg"],  "ukgf" => [-6, "kgf"],  "ukph" => [-6, "kph"],
+  "ulb" => [-6, "lb"],  "ulm" => [-6, "lm"],  "ulx" => [-6, "lx"],
+  "uly" => [-6, "ly"],  "um" => [-6, "m"],  "umb" => [-6, "mb"],
+  "umercury" => [-6, "mercury"],  "umgal" => [-6, "mgal"],
+  "umin" => [-6, "min"],  "umol" => [-6, "mol"],  "umon" => [-6, "mon"],
+  "umph" => [-6, "mph"],  "uohm" => [-6, "ohm"],  "uoz" => [-6, "oz"],
+  "upc" => [-6, "pc"],  "upercent" => [-6, "percent"],
+  "upermil" => [-6, "permil"],  "upsi" => [-6, "psi"],
+  "urad" => [-6, "rad"],  "us" => [-6, "s"],  "usr" => [-6, "sr"],
+  "ut" => [-6, "t"],  "uyr" => [-6, "yr"],  "volts" => [0, "volt"],
+  "watts" => [0, "watt"],  "webers" => [0, "weber"],
+  "yards" => [0, "yard"],  "yds" => [0, "yd"],  "years" => [0, "year"],
+}
+UPLURALS = {
+  "Celsiuses" => "Celsius",  "Fahrenheits" => "Fahrenheit",
+  "Julians_year" => "Julian_year",  "Pascals" => "Pascal",
+  "acres" => "acre",  "amperes" => "ampere",  "angstroms" => "angstrom",
+  "angulars_degree" => "angular_degree",
+  "angulars_minute" => "angular_minute",
+  "angulars_second" => "angular_second",  "ares" => "are",
+  "atmospheres" => "atmosphere",  "calories" => "calorie",
+  "celsiuses" => "celsius",  "centigrades" => "centigrade",
+  "centuries" => "century",  "chains" => "chain",
+  "commons_year" => "common_year",  "coulombs" => "coulomb",
+  "days" => "day",  "degKs" => "degK",  "degreeKs" => "degreeK",
+  "degrees" => "degree",  "degs_K" => "deg_K",  "dynes" => "dyne",
+  "ergs" => "erg",  "fahrenheits" => "fahrenheit",  "farads" => "farad",
+  "fermis" => "fermi",  "gals" => "gal",  "gausses" => "gauss",
+  "grams" => "gram",  "hectares" => "hectare",  "hertzes" => "hertz",
+  "hours" => "hour",  "inchs" => "inch",  "joules" => "joule",
+  "kelvins" => "kelvin",  "kilograms" => "kilogram",  "knots" => "knot",
+  "litres" => "litre",  "meters" => "meter",  "metres" => "metre",
+  "microns" => "micron",  "miles" => "mile",  "millibars" => "millibar",
+  "minutes" => "minute",  "minutes_angle" => "minute_angle",
+  "moles" => "mole",  "months" => "month",  "newtons" => "newton",
+  "ounces" => "ounce",  "parsecs" => "parsec",  "pascals" => "pascal",
+  "pentads" => "pentad",  "poises" => "poise",  "pounds" => "pound",
+  "radians" => "radian",  "seconds" => "second",
+  "seconds_angle" => "second_angle",  "steradians" => "steradian",
+  "stokeses" => "stokes",  "teslas" => "tesla",  "tonnes" => "tonne",
+  "tons" => "ton",  "torrs" => "torr",  "volts" => "volt",
+  "watts" => "watt",  "webers" => "weber",  "yards" => "yard",
+  "yds" => "yd",  "years" => "year",
+}
+end
+class NumberNode < TerminalNode
+
+    def initialize(arg)
+	raise TypeError unless Numeric === arg
+	@a = arg
+    end
+
+    UNITY = NumberNode.new(1)
+    ZERO = NumberNode.new(0)
+
+    def to_s
+      if @a == @a.to_i
+        sprintf("%d", at a)
+      else
+        String(@a)
+      end
+    end
+
+    attr_reader :a
+
+    alias :value :a
+    alias :factor :a
+
+    def == (other)
+      case other
+      when NumberNode
+	@a == other.a
+      else
+	false
+      end
+    end
+
+    def add_eval(another)
+	raise TypeError unless NumberNode === another
+	NumberNode.new(@a + another.value)
+    end
+
+    def mul_eval(another)
+	case another
+	when NumberNode then NumberNode.new(@a * another.a)
+	when PowNode
+	    raise TypeError unless NumberNode === another.lhs
+	    raise TypeError unless NumberNode === another.rhs
+	    NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value))
+	else raise TypeError
+	end
+    end
+
+    def name; "1"; end
+
+    def power;  UNITY;  end
+
+end
+class XDate
+
+    def initialize(year, month, day)
+	@year, @month, @day = year.to_i, month.to_i, day.to_i
+    end
+
+    attr_reader :year, :month, :day
+
+    def to_s
+	format('%04d-%02d-%02d', @year, @month, @day)
+    end
+
+    alias :inspect :to_s
+
+    def to_time
+	Time.gm(@year, @month, @day)
+    end
+
+    def to_date
+	Date.new(@year, @month, @day)
+    end
+
+    def -(other)
+	case other
+	when XDate
+	    (to_date - other.to_date)
+	when Time
+	    to_time - other
+	when Date
+            (to_date - other.to_date)
+	else
+	    to_date - other
+	end
+    end
+
+    def +(other)
+	t = to_date + other
+	self.class.new(t.year, t.month, t.mday)
+    end
+
+end
+
+class TimeNode < TerminalNode
+
+    def initialize(date, time, zone)
+	@date, @time, @zone = date, time, zone
+	if :now === @date then
+	    now = Time.now.utc
+	    @date = XDate.new(now.year, now.month, now.day)
+	    @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec))
+	else
+	    qdays = (@time / 86400).floor
+	    if not qdays.zero?
+	        @date += qdays
+	        @time -= (qdays * 86400)
+	    end
+	end
+	raise TypeError unless XDate === @date
+	@time = 0.0 unless @time
+	raise TypeError unless Float === @time
+	@zone = 0 unless @zone
+	raise TypeError unless Integer === @zone
+    end
+
+    attr_reader :date, :time, :zone
+
+    def to_s
+	hr = @time.floor / 3600
+	mi = (@time.floor / 60) % 60
+	sc = @time % 60
+	tzm = @zone.abs
+	tzh = tzm / 60
+	tzm %= 60
+	tzh = -tzh if @zone < 0
+	format("%sT%02d:%02d:%05.2f %+03d:%02d", \
+	    @date.to_s, hr, mi, sc, tzh, tzm)
+    end
+
+    def self::pentad(d)
+	(d > 25) ? 5 : ((d - 1) / 5)
+    end
+
+    def add_time(increment)
+	inc = increment.reduce5
+	case inc.name
+	when 's'
+	    t2 = @time + inc.factor
+	    d2 = @date + (t2 / 86400)
+	    t2 = t2 % 86400
+	    self.class.new(d2, t2, @zone)
+	when 'pentad'
+	    ifac = Integer(inc.factor)
+	    ipen = ifac % 6
+	    imon = ifac / 6
+	    spen = self.class.pentad(@date.day)
+	    smon = @date.month + imon + spen / 6
+	    spen = spen % 6
+	    sday = spen * 5 + (@date.day - 1) % 5 + 1
+	    syear = @date.year + (smon - 1) / 12
+	    smon = (smon - 1) % 12 + 1
+	    sdate = XDate.new(syear, smon, sday)
+	    self.class.new(sdate, @time, @zone)
+	else
+	    raise "bad time unit '#{inc.name}'"
+	end
+    end
+
+    def utcsod
+	@time - @zone * 60
+    end
+
+    def div_time(units)
+	base = units.ref
+	inc = units.deref.reduce5
+	begin
+	    incname = inc.name
+	rescue Exception
+	    incname = "(undefined)"
+	end
+	case incname
+	when 's'
+	    dif = (@date - base.date) * 86400 + (utcsod - base.utcsod)
+	    dif / inc.factor
+	when 'pentad'
+	    dif = (@date.year - base.date.year) * 72
+	    dif += (@date.month - base.date.month) * 6
+	    dif += self.class.pentad(@date.day)
+	    dif -= self.class.pentad(base.date.day)
+	    dif = Float(dif) if dif % inc.factor != 0
+	    dif / inc.factor
+	else
+	    raise "bad time unit '#{incname}'"
+	end
+    end
+
+end
+class PowNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+	raise TypeError unless NumberNode === @rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	case lhs
+	when /\d$/, /[\d\.]/
+	    lhs = "(#{lhs})"
+	end
+	rhs = @rhs.to_s
+        if rhs == '1'
+	    lhs
+	else
+	    rhs = "^(#{rhs})" if (/\./ =~ rhs)
+	    lhs + rhs
+	end
+    end
+
+    attr_reader :lhs, :rhs
+    alias :power :rhs
+
+    def pow_eval(other)
+	case other
+	when NumberNode
+	    PowNode.new(@lhs, @rhs.mul_eval(other))
+	else
+	    super(other)
+	end
+    end
+
+    def flatten2
+	x = @lhs.flatten2
+	case x
+	when NumberNode
+	    a = @lhs.pow_eval(@rhs)
+	when TerminalNode
+	    a = self
+	when PowNode
+	    a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs))
+	when MulNode, MultiNode
+	    a = MultiNode.new()
+	    for gc in x
+		a.append(gc.pow_eval(@rhs))
+	    end
+	else
+	    raise "internal error"
+	end
+	return a
+    end
+
+    def name
+	case @lhs
+	when NumberNode, NameNode
+	    @lhs.name
+	else
+	    raise "internal error"
+	end
+    end
+
+    def value
+	case @lhs
+	when NumberNode
+	    Units::pow_f(@lhs.value, @rhs.value)
+	else
+	    raise(format('%s#value: internal error', self.class.to_s))
+	end
+    end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value)
+	else
+	    self.class.new(@lhs, @rhs.add_eval(another.power))
+	end
+    end
+
+    def sort
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value))
+	else
+	    self
+	end
+    end
+
+    def factor
+	Units::pow_f(@lhs.factor, @rhs.value)
+    end
+
+end
+
+module Kakezan
+
+    def flatten2
+	r = MultiNode.new()
+	each do |child|
+	    case child
+	    when MultiNode
+		r.append child
+	    when MulNode
+		r.append child.flatten2
+	    when ContainerNode
+		r.append child.flatten2
+	    else
+		r.append child
+	    end 
+	end
+	r
+    end
+
+    def name
+	n = nil
+	for c in @children
+	    next if NumberNode === c
+	    na = c.name
+	    if n.nil?
+		n = na
+	    else
+		raise "multiple names found" if na != n
+	    end
+	end
+	n = "1" if n.nil?
+	n
+    end
+
+    def factor
+	f = 1
+	for c in @children
+	    f *= c.factor
+	end
+	f
+    end
+
+end
+
+class MulNode < ContainerNode
+
+    include BinaryNode
+    include Kakezan
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	rhs = @rhs.to_s
+	if (/\d$/ =~ lhs && /^\w/ =~ rhs) then
+	    "#{lhs} #{rhs}"
+	else
+	    "#{lhs}.#{rhs}"
+	end
+    end
+
+end
+
+class MultiNode < ContainerNode
+
+    include Kakezan
+
+    def initialize(*children)
+	@children = children
+	for c in @children
+	    raise "# MultiNode.new(#{children.inspect})" unless Node === c
+	end
+    end
+
+    def to_s
+	s = @children.join(';')
+	s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.')
+    end
+
+    def each
+	@children.each {|child| yield child }
+    end
+
+    attr_reader :children
+    
+    def append(other)
+	case other
+	when MultiNode
+	    @children += other.children
+	else
+	    @children.push other
+	end
+    end
+
+    def sort
+	table = {}
+	for child in self
+	    name = child.name
+	    if (table.include?(name)) then
+		table[name] = table[name].mul_eval(child)
+	    else
+		table[name] = child
+	    end
+	end
+	list = []
+	for name in table.keys.sort
+	    candi = table[name]
+	    if PowNode === candi and NumberNode === candi.lhs then
+		v = candi.value
+		list.push NumberNode.new(v) unless v == 1
+		next
+	    end
+	    next if candi.power.value == 0
+	    list.push candi
+	end
+        if list.length > 1
+	  list.delete(NumberNode::UNITY)
+	end
+	self.class.new(*list)
+    end
+
+    def collect_hash(stopper, op)
+	list = []
+	for child in self
+	    list.push(child.send(op, stopper))
+	end
+	self.class.new(*list).flatten2
+    end
+
+    def expand(stopper)
+	collect_hash(stopper, :expand)
+    end
+
+    def unalias(stopper)
+	collect_hash(stopper, :unalias)
+    end
+
+    def foldnumber(stopper)
+	collect_hash(stopper, :foldnumber)
+    end
+
+    def value
+	raise "this is dimensional units" if (@children.size > 1)
+	@children.first ? @children.first.value : NumberNode::UNITY.value
+    end
+
+end
+class ShiftNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    attr_reader :lhs, :rhs
+    alias :ref :rhs
+
+    def to_s
+	"(#{@lhs.to_s} @ #{@rhs.to_s})"
+    end
+
+    def trim2;  @lhs;  end
+    def trim
+      	self.class.new(@lhs.trim, @rhs.trim2)
+    end
+
+    def flatten2;  @lhs;  end
+    def flatten
+	lf = @lhs.flatten
+	case lf
+	when ShiftNode
+	    rf = lf.rhs.add_eval(@rhs)
+	    self.class.new(lf.lhs, rf)
+	else
+	    self.class.new(lf, @rhs.flatten)
+	end
+    end
+
+    def sort
+	self.class.new(@lhs.sort, @rhs.sort)
+    end
+
+    def ref
+	case @lhs
+	when ShiftNode
+	    @lhs.ref.add_eval(@rhs)
+	else
+	    @rhs
+	end
+    end
+
+    def deref
+	case @lhs
+	when ShiftNode
+	    @lhs.deref
+	else
+	    @lhs
+	end
+    end
+
+    def name
+	@lhs.name
+    end
+
+    def factor
+	@lhs.factor
+    end
+
+end
+def initialize string
+    case string
+    when String
+        @string, @ptree = string, nil
+    when Node
+        @string, @ptree = nil, string
+    else
+        @string, @ptree = String(string), nil
+    end
+    @copy = @lexstat = nil
+end
+
+#
+# === LEXICAL ANALYZER ===
+#
+
+def rewind
+    @copy = @string.dup.strip
+    @lexstat = nil
+end
+
+RE_SPACE	= '([ \t])'
+RE_INTEGER	= '([-+]?\d+)'
+RE_EXP		= '([eE][-+]?[0-9]+)'
+RE_REAL		= "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))"
+RE_YEAR		= "([-+]?[0-9]{1,4})"
+RE_MONTH	= "(0?[1-9]|1[0-2])"
+RE_DAY		= "([12][0-9]|30|31|0?[1-9])"
+RE_HOUR		= "(2[0-3]|[0-1]?[0-9])"
+RE_MINUTE	= "([0-5]?[0-9])"
+RE_SECOND	= "((#{RE_MINUTE}|60)(\\.[0-9]*)?)"
+RE_NAME		= "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)"
+
+RE_DATE		= "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}"
+RE_TIME		= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?"
+RE_HandM	= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?"
+
+def next_token
+
+    # decomment
+    @copy.sub!(/^#.*/, '');
+
+    if @copy.sub!(%r{^\s*(\))}, '') then
+	@lexstat = nil
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^\s*(\()\s*}, '') then
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then
+	@lexstat = :SHIFT_SEEN
+	return [:SHIFT, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then
+	@lexstat = nil
+	return [:DIVIDE, $1]
+    end
+
+    if @copy.sub!(%r{^(\^|\*\*)}, '') then
+	@lexstat = nil
+	return [:EXPONENT, $1]
+    end
+
+    if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then
+	y, m, d = $1, $2, $3
+	@lexstat = :DATE_SEEN
+	return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^now[ \t]*}, '') then
+	@lexstat = nil
+	return [:DATE, :now]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then
+	h, m, s = $1, $3, $5
+        m = m.sub(/:/,'') if m
+	s = 0 if s.nil?
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^UTC[ \t]*}, '') then
+	@lexstat = nil
+	return [:ZONE, 0]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then
+	sgn, h, m = $1, $2, $4
+        m = m.sub(/:/,'') if m
+	@lexstat = nil
+	h = h.to_i
+	h = -h if sgn == "-"
+	m = m.to_i
+	m = -m if sgn == "-"
+	return [:ZONE, ((h * 60) + m)]
+    end
+
+    if @copy.sub!(%r{^#{RE_NAME}}, '') then
+	@lexstat = nil
+	return [:NAME, $1]
+    end
+
+    if @copy.sub!(%r{^#{RE_REAL}}, '') then
+	@lexstat = nil
+	return [:REAL, $1.to_f]
+    end
+
+    if @copy.sub!(%r{^#{RE_INTEGER}}, '') then
+	@lexstat = nil
+	return [:INT, $1.to_i]
+    end
+
+    if @copy.sub!(%r{^(-)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if @copy.sub!(%r{^(.)}, '') then
+	return [$1, $1]
+    end
+
+    return [false, false]
+
+end
+
+#
+# === USER LEVEL METHODS ===
+#
+
+def tokens
+    rewind
+    x = []
+    while (t = next_token).first
+	x.push t
+    end
+    x
+end
+
+def do_parse2
+    rewind
+    return NumberNode.new(1) if @string.nil? or @string.empty?
+    pa = do_parse
+    pa ? pa : ErrorNode.new(@string)
+end
+
+def ptree
+    @ptree = do_parse2 if not @ptree
+    @ptree
+end
+
+def dup
+    @string ? self.class.new(@string) : self.class.new(@ptree)
+end
+
+def parse
+    dup.parse!
+end
+
+def parse!
+    @ptree = do_parse2 if not @ptree
+    self
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+=begin
+--- reduce0
+    just do nothing.
+=end
+
+def reduce0
+    self
+end
+
+=begin
+--- reduce1
+    removes unnecessary parentheses.
+=end
+
+def reduce1
+    @string = ptree.to_s
+    self
+end
+
+=begin
+--- reduce2
+    removes shift operator within multiplication/division/exponent
+=end
+
+def reduce2
+    @ptree = ptree.reduce2
+    @string = nil
+    self
+end
+
+=begin
+--- reduce3
+    flattens expression and collects all factors
+=end
+
+def reduce3
+    @ptree = ptree.reduce3
+    @string = nil
+    self
+end
+
+=begin
+--- reduce4
+    collects terms with the same name
+=end
+
+def reduce4
+    @ptree = ptree.reduce4
+    @string = nil
+    self
+end
+
+=begin
+--- reduce5
+    expands all terms recursively
+=end
+
+def reduce5
+    @ptree = ptree.reduce5
+    @string = nil
+    self
+end
+
+attr_reader :string
+
+def to_s
+    @string = @ptree.to_s if @string.nil?
+    @string
+end
+
+def inspect
+    if @ptree.nil? then
+	"Units{#{@string}}"
+    else
+	"Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[')
+    end
+end
+
+def self::[](string)
+    new(string)
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+def eval(x = 0)
+    r5 = ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add(x, r5.name)
+    else
+	fac = NumberNode.new(x + r.value)
+	self.class.new(MulNode.new(fac, r5.deref))
+    end
+end
+
+def convert(numeric, to_units)
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    r5 = dup.ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree)
+    else
+	shift1 = r.value
+	numeric = shift1 + numeric if shift1 != 0
+	fact = r5.divide(tp = to_units.dup.ptree).reduce5.value
+	numeric *= fact if fact != 1
+	shift2 = tp.reduce5.ref.value
+	numeric = numeric - shift2 if shift2 != 0
+	numeric
+    end
+end
+
+def factor_and_offset(to_units)
+    # To convert a numeric from self to to_units: 
+    # scale_factor * numeric + add_offset
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    add_offset = convert(0, to_units)
+    scale_factor = convert(1, to_units) - add_offset
+    [ scale_factor, add_offset ]
+end
+
+def convert2(val, to_units)
+    # Like Units#convert, but applicable to any Numeric-like objects.
+    # Returns the original value if the units are incompatible.
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    if ( self == to_units )
+        val
+    elsif ( self =~ to_units )
+        if Numeric===val
+            convert( val, to_units )
+        else
+            factor, offset = factor_and_offset( to_units )
+            val*factor + offset
+        end
+    else
+      unless $VERBOSE.nil?
+	$stderr.print( "*WARNING*: " +
+                 "incompatible units: #{self.to_s} and #{to_units.to_s}\n")
+        caller(0).each{|c| $stderr.print "\t* ",c,"\n"}
+      end        
+      val
+    end
+end
+
+@@reduce = :reduce4
+
+def self::reduce_level
+    @@reduce.to_s[-1]
+end
+
+def self::reduce_level=(n)
+    @@reduce = case n
+    when 1 then :reduce1
+    when 2 then :reduce2
+    when 3 then :reduce3
+    when 4 then :reduce4
+    else :reduce5
+    end
+end
+
+def binop(op, other)
+    case other
+    when Numeric
+	other = NumberNode.new(other)
+    when Units
+	other = other.ptree
+    end
+    q = self.ptree.send(op, other).send(@@reduce)
+    Units.new(q)
+end
+
+def *(other)
+    binop(:mul, other)
+end
+
+def **(other)
+    binop(:pow, other)
+end
+
+def /(other)
+    binop(:divide, other)
+end
+
+def ^(other)
+    binop(:shift, other)
+end
+
+def ==(other)
+    case other
+    when self.class
+	dup.reduce5.to_s == other.dup.reduce5.to_s
+    else
+	false
+    end
+end
+
+#def === (other)
+#    reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s
+#end
+
+alias === ==
+
+#def === (other)
+#  # returns true if other is within a factor and/or offset of difference.
+#  case other
+#  when self.class
+#    (self/other).reduce5.ptree.children.each do |child|
+#      return false if !( NumberNode === child )
+#    end
+#    true
+#  else
+#    false
+#  end
+#end
+
+
+def =~(other)
+  case other
+  when self.class
+    (self/other).reduce5.ptree.children.each{ |node|
+      return false unless NumberNode === node
+    }
+    true
+  else
+    false
+  end
+end
+
+def self::pow_f(a, b)
+    if Integer === b and b < 0 then
+	a ** b.to_f
+    else
+	a ** b
+    end
+end
+
+##### racc 1.4.5 generates ###
+
+racc_reduce_table = [
+ 0, 0, :racc_error,
+ 0, 17, :_reduce_none,
+ 1, 17, :_reduce_2,
+ 1, 17, :_reduce_3,
+ 1, 18, :_reduce_none,
+ 3, 18, :_reduce_5,
+ 3, 18, :_reduce_6,
+ 1, 19, :_reduce_none,
+ 1, 19, :_reduce_none,
+ 2, 19, :_reduce_9,
+ 3, 19, :_reduce_10,
+ 3, 19, :_reduce_11,
+ 3, 19, :_reduce_12,
+ 3, 19, :_reduce_13,
+ 1, 22, :_reduce_14,
+ 2, 22, :_reduce_15,
+ 3, 22, :_reduce_16,
+ 3, 22, :_reduce_17,
+ 1, 20, :_reduce_none,
+ 3, 20, :_reduce_19,
+ 1, 23, :_reduce_20,
+ 1, 23, :_reduce_21,
+ 1, 21, :_reduce_none,
+ 3, 21, :_reduce_23,
+ 1, 24, :_reduce_24,
+ 2, 24, :_reduce_25,
+ 3, 24, :_reduce_26 ]
+
+racc_reduce_n = 27
+
+racc_shift_n = 39
+
+racc_action_table = [
+     3,     4,    34,     4,    14,    22,    23,    36,     9,    10,
+     9,     4,    24,     5,     4,    26,    37,     4,     9,    10,
+     4,     9,    38,     5,     9,    10,    20,     9,     4,     5,
+   nil,     4,    20,   nil,   nil,     9,   nil,    24,     9,    10,
+    26,   nil,    16,     5,    17,    18,   nil,     4,    10,     4,
+   nil,     4,     5,    12,     9,    12,     9,    12,     9,     4,
+   nil,   nil,   nil,   nil,   nil,    12,     9 ]
+
+racc_action_check = [
+     0,     0,    24,    26,     6,    13,    14,    33,     0,     0,
+    26,     5,    26,     0,    20,    26,    34,    18,     5,     5,
+    12,    20,    35,     5,    18,    18,    20,    12,    16,    18,
+   nil,    17,    12,   nil,   nil,    16,   nil,    16,    17,    17,
+    16,   nil,     8,    17,     8,     8,   nil,    29,     8,    31,
+   nil,    15,     8,    29,    29,    31,    31,    15,    15,     1,
+   nil,   nil,   nil,   nil,   nil,     1,     1 ]
+
+racc_action_pointer = [
+    -1,    57,   nil,   nil,   nil,     9,     4,   nil,    38,   nil,
+   nil,   nil,    18,   -10,     6,    49,    26,    29,    15,   nil,
+    12,   nil,   nil,   nil,   -10,   nil,     1,   nil,   nil,    45,
+   nil,    47,   nil,    -8,     3,     7,   nil,   nil,   nil ]
+
+racc_action_default = [
+    -1,    -7,    -8,    -3,   -20,   -27,   -27,    -2,    -4,   -21,
+   -14,   -15,   -27,   -27,   -27,    -9,   -27,   -27,   -27,   -18,
+   -27,   -16,   -17,    39,   -24,   -22,   -27,    -5,    -6,   -10,
+   -12,   -11,   -13,   -27,   -25,   -27,   -19,   -26,   -23 ]
+
+racc_goto_table = [
+     2,    15,     7,    28,    21,     2,     6,    13,    27,   nil,
+    29,    31,    19,    35,   nil,   nil,    19,    30,    32,   nil,
+    19,   nil,   nil,   nil,   nil,   nil,    19 ]
+
+racc_goto_check = [
+     7,     6,     2,     5,     4,     7,     1,     2,     4,   nil,
+     6,     6,     7,     5,   nil,   nil,     7,     7,     7,   nil,
+     7,   nil,   nil,   nil,   nil,   nil,     7 ]
+
+racc_goto_pointer = [
+   nil,     6,     2,   nil,    -8,   -13,    -7,     0,   nil ]
+
+racc_goto_default = [
+   nil,   nil,   nil,     8,    33,   nil,     1,    11,    25 ]
+
+racc_token_table = {
+ false => 0,
+ Object.new => 1,
+ :INT => 2,
+ :ERR => 3,
+ :SHIFT => 4,
+ :SPACE => 5,
+ :MULTIPLY => 6,
+ :DIVIDE => 7,
+ :EXPONENT => 8,
+ :REAL => 9,
+ :NAME => 10,
+ :DATE => 11,
+ :TIME => 12,
+ :ZONE => 13,
+ "(" => 14,
+ ")" => 15 }
+
+racc_use_result_var = false
+
+racc_nt_base = 16
+
+Racc_arg = [
+ racc_action_table,
+ racc_action_check,
+ racc_action_default,
+ racc_action_pointer,
+ racc_goto_table,
+ racc_goto_check,
+ racc_goto_default,
+ racc_goto_pointer,
+ racc_nt_base,
+ racc_reduce_table,
+ racc_token_table,
+ racc_shift_n,
+ racc_reduce_n,
+ racc_use_result_var ]
+
+Racc_token_to_s_table = [
+'$end',
+'error',
+'INT',
+'ERR',
+'SHIFT',
+'SPACE',
+'MULTIPLY',
+'DIVIDE',
+'EXPONENT',
+'REAL',
+'NAME',
+'DATE',
+'TIME',
+'ZONE',
+'"("',
+'")"',
+'$start',
+'unit_spec',
+'origin_exp',
+'unit_exp',
+'value_exp',
+'timestamp',
+'power_exp',
+'number_exp',
+'time_exp']
+
+Racc_debug_parser = false
+
+##### racc system variables end #####
+
+ # reduce 0 omitted
+
+ # reduce 1 omitted
+
+  def _reduce_2( val, _values)
+ yyaccept;
+  end
+
+  def _reduce_3( val, _values)
+ yyerrok
+  end
+
+ # reduce 4 omitted
+
+  def _reduce_5( val, _values)
+ val[0].shift(val[2])
+  end
+
+  def _reduce_6( val, _values)
+ val[0].shift(val[2])
+  end
+
+ # reduce 7 omitted
+
+ # reduce 8 omitted
+
+  def _reduce_9( val, _values)
+ val[0].mul(val[1])
+  end
+
+  def _reduce_10( val, _values)
+ val[0].mul(val[2])
+  end
+
+  def _reduce_11( val, _values)
+ val[0].divide(val[2])
+  end
+
+  def _reduce_12( val, _values)
+ val[0].mul(val[2])
+  end
+
+  def _reduce_13( val, _values)
+ val[0].divide(val[2])
+  end
+
+  def _reduce_14( val, _values)
+ NameNode.new(val[0])
+  end
+
+  def _reduce_15( val, _values)
+ val[0].pow(val[1])
+  end
+
+  def _reduce_16( val, _values)
+ val[0].pow(val[2])
+  end
+
+  def _reduce_17( val, _values)
+ val[1]
+  end
+
+ # reduce 18 omitted
+
+  def _reduce_19( val, _values)
+ val[1]
+  end
+
+  def _reduce_20( val, _values)
+ NumberNode.new(val[0])
+  end
+
+  def _reduce_21( val, _values)
+ NumberNode.new(val[0])
+  end
+
+ # reduce 22 omitted
+
+  def _reduce_23( val, _values)
+ val[1]
+  end
+
+  def _reduce_24( val, _values)
+ TimeNode.new(val[0], 0.0, 0)
+  end
+
+  def _reduce_25( val, _values)
+ TimeNode.new(val[0], val[1], 0)
+  end
+
+  def _reduce_26( val, _values)
+ TimeNode.new(val[0], val[1], val[2])
+  end
+
+ def _reduce_none( val, _values)
+  val[0]
+ end
+
+end   # class Units
+end   # module NumRu
+
+####################
+if $0 == __FILE__
+  include NumRu
+  
+  def assert(test, seikai)
+  	raise "#{test.inspect} != #{seikai.inspect}" if test != seikai
+  	puts "ok #{seikai.inspect}"
+  end
+  
+  puts "=== reduce1 ==="
+  
+  assert Units.new('').reduce1.to_s, ""
+  assert Units.new('m').reduce1.to_s, "m"
+  assert Units.new('3').reduce1.to_s, "3"
+  assert Units.new('3.14').reduce1.to_s, "3.14"
+  assert Units.new('m2').reduce1.to_s, "m2"
+  assert Units.new('m.s').reduce1.to_s, "m.s"
+  assert Units.new('m/s').reduce1.to_s, "m.s-1"
+  assert Units.new('kg.m/s2').reduce1.to_s, "kg.m.(s2)-1"
+  assert Units.new('s @ 2003-11-29').reduce1.to_s,
+  	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+  assert Units.new('s @ 2003-11-29T11:24').reduce1.to_s,
+  	"(s @ 2003-11-29T11:24:00.00 +00:00)"
+  assert Units.new('s @ 2003-11-29T11:24:11 -09:00').reduce1.to_s,
+  	"(s @ 2003-11-29T11:24:11.00 -09:00)"
+  
+  assert Units.new('100').reduce1.to_s, "100"
+  assert Units.new('(10)^2').reduce1.to_s, "(10)2"
+  assert Units.new('(10)^2/100').reduce1.to_s, "(10)2.(100)-1"
+  
+  puts "=== reduce2 ==="
+  
+  assert Units.new('s @ 2003-11-29').reduce2.to_s,
+  	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+  assert Units.new('m/(s @ 2003-11-29)').reduce2.to_s, "m.s-1"
+  assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce2.to_s, "m.(K.s)-1"
+  
+  assert Units.new('(10)^2/100').reduce2.to_s, "(10)2.(100)-1"
+  
+  puts "=== reduce3 ==="
+  
+  assert Units::MultiNode.new(Units::NameNode.new('a'),  \
+  	Units::NumberNode.new(1), \
+  	Units::NameNode.new('b')).to_s, 'a.1 b'
+  
+  assert Units.new('kg').reduce3.inspect, "Units[Name[kg]]"
+  assert Units.new('kg.m').reduce3.inspect, "Units[Multi[Name[kg], Name[m]]]"
+  assert Units.new('kg.m.s').reduce3.inspect,
+  	"Units[Multi[Name[kg], Name[m], Name[s]]]"
+  
+  assert Units.new('(m.s)^2').reduce3.inspect,
+  	"Units[Multi[Pow[Name[m], Number[2]], Pow[Name[s], Number[2]]]]"
+  assert Units.new('K @ 273.15').reduce3.inspect,
+  	"Units[Shift[Name[K], Number[273.15]]]"
+  assert Units.new('((a.b)^2)^2').reduce3.inspect,
+  	"Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]]]]"
+  assert Units.new('((a.b)^2 c4 d)^2').reduce3.inspect,
+  	"Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]], Pow[Name[c], Number[8]], Pow[Name[d], Number[2]]]]"
+  assert Units.new('((a.b)^2 c4 d)^2').reduce3.to_s,
+  	"a4 b4 c8 d2"
+  assert Units.new('((a.b)^2 a4 b)^2').reduce3.to_s,
+  	"a4 b4 a8 b2"
+  
+  assert Units.new('s @ 2003-11-29').reduce3.to_s,
+  	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+  assert Units.new('m/(s @ 2003-11-29)').reduce3.to_s, "m.s-1"
+  assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce3.to_s, "m.K-1 s-1"
+  
+  assert Units.new('(10)^2/100').reduce3.to_s, "(10)2.(100)-1"
+  
+  puts "=== reduce4 ==="
+  
+  assert Units.new('((a.b)^2 a4 b @ now)^2 @ 273.15').reduce4.to_s,
+  	"(a12 b6 @ 273.15)"
+  
+  assert Units.new('km2').reduce4.to_s, "km2"
+  assert Units.new('hours.hour').reduce4.to_s, "hour2"
+  assert Units.new('(10)^2').reduce4.to_s, "100"
+  assert Units.new('100/10').reduce4.to_s, "10.0"
+  assert Units.new('(10)^2/100').reduce4.to_s, "1.0"
+  
+  puts "=== reduce5 ==="
+  
+  assert Units.new('km2').reduce5.to_s, "1000000 m2"
+  assert Units.new('(10)^2/100').reduce5.to_s, "1.0"
+  
+  assert Units.new('hPa').reduce5.to_s, "100 kg.m-1 s-2"
+  assert Units.new('mb').reduce5.to_s, "100.0 kg.m-1 s-2"
+  
+  assert Units.new('hPa/mb').reduce5.to_s, "1.0"
+  
+  assert Units.new('(K @ 273.15)@ 10').reduce5.to_s, "(K @ 283.15)"
+  
+  puts "=== APPLICATIONS ==="
+  
+  assert Units.new('km @ 2').convert(3, Units.new('m @ 100')), 4900
+  assert Units.new('degree_F').convert(32, Units.new('K')).to_s, "273.15"
+  
+  u1 = Units.new('m/s')
+  u2 = Units.new('mm/s')
+  assert((u1/u2).to_s, "m.mm-1")
+  assert((u1*u2).to_s, "m.mm.s-2")
+  
+  u1 = Units.new('years since 1999-01-01 00:00').reduce4
+  u2 = Units.new('hours since 2001-01-01 00:00').reduce4
+  assert u1.convert(3, u2), 24 * 365
+  u3 = Units.new('months since 2001-01-01 00:00').reduce4
+  assert u1.convert(3, u3), 12.0
+  
+  Units.reduce_level = 3
+  assert((Units.new('hours') ** 2).to_s, "hours2")
+  Units.reduce_level = 4
+  assert((Units.new('hours') ** 2).to_s, "hour2")
+  Units.reduce_level = 5
+  assert((Units.new('hours') ** 2).to_s, "12960000 s2")
+  
+  assert(Units.new('day') =~ Units.new('s since 2002-01-01'), true)
+  assert(Units.new('m') =~ Units.new('1'), false)
+  
+  un1  = Units['day since 2000-01-01']
+  un2 = Units['s since 2000-01-01']
+  assert(un1.convert(0, un2), 0.0)
+  assert(un1.convert(1, un2), 86400.0)
+end
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..476a959
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,35 @@
+all: units.rb
+
+units.rb: units.racc
+	racc -E -l units.racc -o tmp.rb
+	(ruby -n -e 'if /^class Units/; print("module NumRu\n",$$_); elsif /end\s*#\s*class\s*Units/; print($$_,"end   # module NumRu\n"); else print $$_; end' tmp.rb > units.rb)
+	(( echo ; echo '####################' ; echo 'if $$0 == __FILE__' ; tail -n +2 test.rb | ruby -p -e 'print "  "' ; echo 'end' )  >> units.rb)
+	@rm tmp.rb
+
+test: units.rb
+	ruby test.rb
+
+backup: units.shar
+	scp units.shar toyoda at www.gfd-dennou.org:tmp/
+	scp units.shar toyoda at pandora0.sytes.net:tmp/
+
+RSRCS = rules.rb node.rb namenode.rb utab.rb numbernode.rb timenode.rb \
+    pownode.rb mulnode.rb shiftnode.rb lex.rb
+
+utab.rb: makeutab.rb dcunits.txt
+	ruby makeutab.rb dcunits.txt > $@.tmp
+	mv $@.tmp $@
+
+units.racc: $(RSRCS)
+	cat $(RSRCS) > $@.tmp
+	mv $@.tmp $@
+
+edit:
+	$${EDITOR:-vi} $(RSRCS)
+
+SRCS = Makefile units.rb dcunits.txt makeutab.rb $(RSRCS) test.rb units.rd
+
+shar: units.shar
+
+units.shar: $(SRCS)
+	shar $(SRCS) > units.shar
diff --git a/src/dcunits.txt b/src/dcunits.txt
new file mode 100644
index 0000000..c03c9cb
--- /dev/null
+++ b/src/dcunits.txt
@@ -0,0 +1,212 @@
+s		S
+second		P  s
+m		S
+metre		P  m
+meter		P  metre
+kg		S
+kilogram	P  kg
+A		S
+ampere		P  A
+K		S
+kelvin		P  K
+degK		P  K
+deg_K		P  K
+degreeK		P  K
+mol		S
+mole		P  mol
+rad		S
+radian		P  rad
+sr		S
+steradian	P  sr
+#
+# --- standard named units ---
+#
+Hz		S  1/s
+hertz		P  Hz
+N		S  kg.m.s-2
+newton		P  N
+Pa		S  N.m-2
+pascal		P  Pa
+Pascal		P  Pa
+J		S  N.m
+joule		P  J
+W		S  J/s
+watt		P  W
+C		S  A.s
+coulomb		P  C
+V		S  J/C
+volt		P  V
+F		S  C/V
+ohm		S  V/A
+S		S  A/V
+Wb		S  V.s
+weber		P  Wb
+farad		P coulomb/volt
+T		S  Wb.m-2
+tesla		P  Wb.m-2
+H		S  Wb.A-1
+degC		S  K @ 273.15
+deg_C		S  K @ 273.15
+degree_C	S  K @ 273.15
+degree_c	S  K @ 273.15
+degreeC		S  K @ 273.15
+Celsius		P  K @ 273.15
+celsius		P  K @ 273.15
+centigrade	P  K @ 273.15
+degree_R	S  K / 1.8
+degree_f	S  degree_R @ 459.67
+degree_F	S  degree_R @ 459.67
+Fahrenheit	P degree_F
+fahrenheit	P degree_F
+degF		S  degree_F
+deg_F		S  degree_F
+degreeF		S  degree_F
+lm		S  cd.sr
+lx		S  lm.m-2
+Bq		S  s-1
+Gy		S  J.kg-1
+Sv		S  J.kg-1
+#
+# === non-SI units ===
+#
+# --- basic numbers ---
+#
+pi		N  3.141592653589793238462
+#
+# --- nondimensional units ---
+#
+percent		S  1e-2
+%		S  1e-2
+permil		S  1e-3
+#
+# --- length ---
+#
+fermi		P  1.0e-15 m
+angstrom	P  1.0e-10 m
+micron		P  1.0e-6 m
+astronomical_unit N  1.49597870e11 m
+astronomical_units N  1.49597870e11 m
+Au		S  astronomical_unit
+parsec		P  3.0857e16 m
+pc		S  parsec
+light_year	N  9.46e15 m
+light_years	N  9.46e15 m
+ly		S  light_year
+nautical_mile	N  1852 m
+nautical_miles	N  1852 m
+#
+inch		P  2.54 cm
+in		S  inch
+foot		N  12 inch
+feet		N  foot
+ft		N  foot
+yard		P  6 feet
+yd		P  yard
+chain		P  22 yard
+mile		P  1760 yard
+#
+# --- time ---
+#
+minute		P  60 s
+min		S  60 s
+hour		P  60 min
+hr		S  60 min
+h		S  60 min
+day		P  24 hour
+d		S  24 hour
+Julian_year	P 365.25 day
+common_year	P 365 day
+#
+# --- date ---
+#
+# date is NOT time intentionally
+#
+pentad		P 
+month		P  6 pentad
+mon		S  month
+year		P  12 month
+yr		S  year
+century		P  100 year
+#
+# --- area ---
+#
+are		P  100 m2
+a		S  are
+hectare		P  100 are
+litre		P  1.0e-3 m3
+L		S  litre
+acre		P  10 chain2
+ac		S  acre
+#
+# --- angle ---
+#
+degree		P  pi.rad/180
+angular_degree	P  degree
+minute_angle	P  pi.rad/180/60
+angular_minute	P  minute_angle
+second_angle	P  pi.rad/180/60/60
+angular_second	P  second_angle
+degree_N	S  degree
+degree_E	S  degree
+degree_W	S  degree
+degree_S	S  degree
+degree_north	S  degree_N
+degree_east	S  degree_E
+degree_west	S  degree_W
+degree_south	S  degree_S
+degrees_north	S  degree_N
+degrees_east	S  degree_E
+degrees_west	S  degree_W
+degrees_south	S  degree_S
+#
+# --- mass ---
+#
+ton		P  1000 kg
+tonne		P  ton
+t		S  ton
+gram		P  kg/1000
+g		S  kg/1000
+pound		P  453.6 g
+lb		S  pound
+ounce		P  pound / 16
+oz		S  ounce
+#
+# --- CGS ---
+#
+dyne		P  g.cm.s-2
+dyn		S  g.cm.s-2
+bar		S  1e6 dyn.cm-2
+mb		S  bar / 1000
+millibar	P  bar / 1000
+gal		P  cm s-2
+Gal		S  cm s-2
+mgal		S  cm s-2 / 1000
+erg		S  dyn cm
+erg		P  dyn cm
+poise		P  dyn s / cm2
+P		S  poise
+stokes		P  cm2 / s 
+St		S  stokes
+gauss		P  T / 10000
+G		S  gauss
+#
+# --- conventional ---
+#
+calorie		P  4.18605 J
+cal		S  calorie
+kgf		S  kilogram-force
+force		S  9.80665 m.s-2
+knot		P  nautical_mile / hour
+horse_power	N  75 m kilogram-force / s
+atmosphere	P  101325 Pa
+atm		S  atmosphere
+light_speed	N  299792458 m/s
+mph		S  mile / hour
+kph		S  km / hour
+torr		P  133.322 Pa
+psi		S  pound-force / inch2
+gravity		S 9.806650 meter/second2
+conventional_mercury	S gravity 13595.10 kg/m3
+mercury		S conventional_mercury
+Hg		S mercury
+hg		S mercury
diff --git a/src/lex.rb b/src/lex.rb
new file mode 100644
index 0000000..f5d8c1a
--- /dev/null
+++ b/src/lex.rb
@@ -0,0 +1,434 @@
+def initialize string
+    case string
+    when String
+        @string, @ptree = string, nil
+    when Node
+        @string, @ptree = nil, string
+    else
+        @string, @ptree = String(string), nil
+    end
+    @copy = @lexstat = nil
+end
+
+#
+# === LEXICAL ANALYZER ===
+#
+
+def rewind
+    @copy = @string.dup.strip
+    @lexstat = nil
+end
+
+RE_SPACE	= '([ \t])'
+RE_INTEGER	= '([-+]?\d+)'
+RE_EXP		= '([eE][-+]?[0-9]+)'
+RE_REAL		= "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))"
+RE_YEAR		= "([-+]?[0-9]{1,4})"
+RE_MONTH	= "(0?[1-9]|1[0-2])"
+RE_DAY		= "([12][0-9]|30|31|0?[1-9])"
+RE_HOUR		= "(2[0-3]|[0-1]?[0-9])"
+RE_MINUTE	= "([0-5]?[0-9])"
+RE_SECOND	= "((#{RE_MINUTE}|60)(\\.[0-9]*)?)"
+RE_NAME		= "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)"
+
+RE_DATE		= "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}"
+RE_TIME		= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?"
+RE_HandM	= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?"
+
+def next_token
+
+    # decomment
+    @copy.sub!(/^#.*/, '');
+
+    if @copy.sub!(%r{^\s*(\))}, '') then
+	@lexstat = nil
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^\s*(\()\s*}, '') then
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then
+	@lexstat = :SHIFT_SEEN
+	return [:SHIFT, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then
+	@lexstat = nil
+	return [:DIVIDE, $1]
+    end
+
+    if @copy.sub!(%r{^(\^|\*\*)}, '') then
+	@lexstat = nil
+	return [:EXPONENT, $1]
+    end
+
+    if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then
+	y, m, d = $1, $2, $3
+	@lexstat = :DATE_SEEN
+	return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^now[ \t]*}, '') then
+	@lexstat = nil
+	return [:DATE, :now]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then
+	h, m, s = $1, $3, $5
+        m = m.sub(/:/,'') if m
+	s = 0 if s.nil?
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^UTC[ \t]*}, '') then
+	@lexstat = nil
+	return [:ZONE, 0]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then
+	sgn, h, m = $1, $2, $4
+        m = m.sub(/:/,'') if m
+	@lexstat = nil
+	h = h.to_i
+	h = -h if sgn == "-"
+	m = m.to_i
+	m = -m if sgn == "-"
+	return [:ZONE, ((h * 60) + m)]
+    end
+
+    if @copy.sub!(%r{^#{RE_NAME}}, '') then
+	@lexstat = nil
+	return [:NAME, $1]
+    end
+
+    if @copy.sub!(%r{^#{RE_REAL}}, '') then
+	@lexstat = nil
+	return [:REAL, $1.to_f]
+    end
+
+    if @copy.sub!(%r{^#{RE_INTEGER}}, '') then
+	@lexstat = nil
+	return [:INT, $1.to_i]
+    end
+
+    if @copy.sub!(%r{^(-)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if @copy.sub!(%r{^(.)}, '') then
+	return [$1, $1]
+    end
+
+    return [false, false]
+
+end
+
+#
+# === USER LEVEL METHODS ===
+#
+
+def tokens
+    rewind
+    x = []
+    while (t = next_token).first
+	x.push t
+    end
+    x
+end
+
+def do_parse2
+    rewind
+    return NumberNode.new(1) if @string.nil? or @string.empty?
+    pa = do_parse
+    pa ? pa : ErrorNode.new(@string)
+end
+
+def ptree
+    @ptree = do_parse2 if not @ptree
+    @ptree
+end
+
+def dup
+    @string ? self.class.new(@string) : self.class.new(@ptree)
+end
+
+def parse
+    dup.parse!
+end
+
+def parse!
+    @ptree = do_parse2 if not @ptree
+    self
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+=begin
+--- reduce0
+    just do nothing.
+=end
+
+def reduce0
+    self
+end
+
+=begin
+--- reduce1
+    removes unnecessary parentheses.
+=end
+
+def reduce1
+    @string = ptree.to_s
+    self
+end
+
+=begin
+--- reduce2
+    removes shift operator within multiplication/division/exponent
+=end
+
+def reduce2
+    @ptree = ptree.reduce2
+    @string = nil
+    self
+end
+
+=begin
+--- reduce3
+    flattens expression and collects all factors
+=end
+
+def reduce3
+    @ptree = ptree.reduce3
+    @string = nil
+    self
+end
+
+=begin
+--- reduce4
+    collects terms with the same name
+=end
+
+def reduce4
+    @ptree = ptree.reduce4
+    @string = nil
+    self
+end
+
+=begin
+--- reduce5
+    expands all terms recursively
+=end
+
+def reduce5
+    @ptree = ptree.reduce5
+    @string = nil
+    self
+end
+
+attr_reader :string
+
+def to_s
+    @string = @ptree.to_s if @string.nil?
+    @string
+end
+
+def inspect
+    if @ptree.nil? then
+	"Units{#{@string}}"
+    else
+	"Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[')
+    end
+end
+
+def self::[](string)
+    new(string)
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+def eval(x = 0)
+    r5 = ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add(x, r5.name)
+    else
+	fac = NumberNode.new(x + r.value)
+	self.class.new(MulNode.new(fac, r5.deref))
+    end
+end
+
+def convert(numeric, to_units)
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    r5 = dup.ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree)
+    else
+	shift1 = r.value
+	numeric = shift1 + numeric if shift1 != 0
+	fact = r5.divide(tp = to_units.dup.ptree).reduce5.value
+	numeric *= fact if fact != 1
+	shift2 = tp.reduce5.ref.value
+	numeric = numeric - shift2 if shift2 != 0
+	numeric
+    end
+end
+
+def factor_and_offset(to_units)
+    # To convert a numeric from self to to_units: 
+    # scale_factor * numeric + add_offset
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    add_offset = convert(0, to_units)
+    scale_factor = convert(1, to_units) - add_offset
+    [ scale_factor, add_offset ]
+end
+
+def convert2(val, to_units)
+    # Like Units#convert, but applicable to any Numeric-like objects.
+    # Returns the original value if the units are incompatible.
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    if ( self == to_units )
+        val
+    elsif ( self =~ to_units )
+        if Numeric===val
+            convert( val, to_units )
+        else
+            factor, offset = factor_and_offset( to_units )
+            val*factor + offset
+        end
+    else
+      unless $VERBOSE.nil?
+	$stderr.print( "*WARNING*: " +
+                 "incompatible units: #{self.to_s} and #{to_units.to_s}\n")
+        caller(0).each{|c| $stderr.print "\t* ",c,"\n"}
+      end        
+      val
+    end
+end
+
+@@reduce = :reduce4
+
+def self::reduce_level
+    @@reduce.to_s[-1]
+end
+
+def self::reduce_level=(n)
+    @@reduce = case n
+    when 1 then :reduce1
+    when 2 then :reduce2
+    when 3 then :reduce3
+    when 4 then :reduce4
+    else :reduce5
+    end
+end
+
+def binop(op, other)
+    case other
+    when Numeric
+	other = NumberNode.new(other)
+    when Units
+	other = other.ptree
+    end
+    q = self.ptree.send(op, other).send(@@reduce)
+    Units.new(q)
+end
+
+def *(other)
+    binop(:mul, other)
+end
+
+def **(other)
+    binop(:pow, other)
+end
+
+def /(other)
+    binop(:divide, other)
+end
+
+def ^(other)
+    binop(:shift, other)
+end
+
+def ==(other)
+    case other
+    when self.class
+	dup.reduce5.to_s == other.dup.reduce5.to_s
+    else
+	false
+    end
+end
+
+#def === (other)
+#    reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s
+#end
+
+alias === ==
+
+#def === (other)
+#  # returns true if other is within a factor and/or offset of difference.
+#  case other
+#  when self.class
+#    (self/other).reduce5.ptree.children.each do |child|
+#      return false if !( NumberNode === child )
+#    end
+#    true
+#  else
+#    false
+#  end
+#end
+
+
+def =~(other)
+  case other
+  when self.class
+    (self/other).reduce5.ptree.children.each{ |node|
+      return false unless NumberNode === node
+    }
+    true
+  else
+    false
+  end
+end
+
+def self::pow_f(a, b)
+    if Integer === b and b < 0 then
+	a ** b.to_f
+    else
+	a ** b
+    end
+end
diff --git a/src/makeutab.rb b/src/makeutab.rb
new file mode 100644
index 0000000..2350e23
--- /dev/null
+++ b/src/makeutab.rb
@@ -0,0 +1,87 @@
+
+SI_ABBREV = {
+    'E' => 18,		'P' => 15,		'T' => 12,
+    'G' => 9,		'M' => 6,		'k' => 3,
+    'h' => 2,		'da' => 1,
+    'd' => -1,		'c' => -2,
+    'm' => -3,		'u' => -6,		'n' => -9,
+    'p' => -12,		'f' => -15,		'a' => -18,
+}
+
+SI_PREFIX = {
+    'exa' => 18,	'peta' => 15,		'tela' => 12,
+    'giga' => 9,	'mega' => 6,		'kilo' => 3,
+    'hecto' => 2,	'deca' => 1,
+    'deci' => -1,	'centi' => -2,
+    'milli' => -3,	'micro' => -6,		'nano' => -9,
+    'pico' => -12,	'femto' => -15,		'atto' => -18,
+}
+
+def plural(string)
+    case string
+    when /^([^_]+)(_.*)/
+	pre, post = $1, $2
+	plural(pre) + post
+    when /[szoj]$/
+	string.sub(/$/, "es")
+    when /[^aeou]y$/
+	string.sub(/y$/, "ies")
+    else
+	string.sub(/$/, "s")
+    end
+end
+
+udefs = {}
+ualiases = {}
+uplurals = {}
+
+while (line = gets)
+    next if /^#/ =~ line
+    case line.strip
+    when /(\S+)\s+(\S)\s+(\S.*)/
+	name, mode, definition = $1, $2, $3
+	udefs[name] = definition
+    when /(\S+)\s+(\S)/
+	name, mode = $1, $2
+    else
+	next
+    end
+    case mode
+    when /^S/
+	for prefix, power in SI_ABBREV
+	    next if prefix + name == 'kg'
+	    ualiases[prefix + name] = [power, name]
+	end
+    when /^P/
+	pname = plural(name)
+	ualiases[pname] = [0, name]
+	uplurals[pname] = name
+	for prefix, power in SI_PREFIX
+	    ualiases[prefix + name] = [power, name]
+	end
+    end
+end
+
+def dumphash(hname, h)
+    puts "#{hname} = {"
+    s = ""
+    for name in h.keys.sort
+	a = "  #{name.dump} => #{h[name].inspect},"
+	if s.length + a.length > 72
+	    puts s
+	    s = ""
+	end
+	s += a
+    end
+    if s.length > 0
+	puts s
+	s = ""
+    end
+    puts "}"
+end
+
+puts "class NameNode"
+dumphash('UDEFS', udefs)
+dumphash('UALIASES', ualiases)
+dumphash('UPLURALS', uplurals)
+puts "end"
diff --git a/src/mulnode.rb b/src/mulnode.rb
new file mode 100644
index 0000000..b48e01b
--- /dev/null
+++ b/src/mulnode.rb
@@ -0,0 +1,150 @@
+
+module Kakezan
+
+    def flatten2
+	r = MultiNode.new()
+	each do |child|
+	    case child
+	    when MultiNode
+		r.append child
+	    when MulNode
+		r.append child.flatten2
+	    when ContainerNode
+		r.append child.flatten2
+	    else
+		r.append child
+	    end 
+	end
+	r
+    end
+
+    def name
+	n = nil
+	for c in @children
+	    next if NumberNode === c
+	    na = c.name
+	    if n.nil?
+		n = na
+	    else
+		raise "multiple names found" if na != n
+	    end
+	end
+	n = "1" if n.nil?
+	n
+    end
+
+    def factor
+	f = 1
+	for c in @children
+	    f *= c.factor
+	end
+	f
+    end
+
+end
+
+class MulNode < ContainerNode
+
+    include BinaryNode
+    include Kakezan
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	rhs = @rhs.to_s
+	if (/\d$/ =~ lhs && /^\w/ =~ rhs) then
+	    "#{lhs} #{rhs}"
+	else
+	    "#{lhs}.#{rhs}"
+	end
+    end
+
+end
+
+class MultiNode < ContainerNode
+
+    include Kakezan
+
+    def initialize(*children)
+	@children = children
+	for c in @children
+	    raise "# MultiNode.new(#{children.inspect})" unless Node === c
+	end
+    end
+
+    def to_s
+	s = @children.join(';')
+	s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.')
+    end
+
+    def each
+	@children.each {|child| yield child }
+    end
+
+    attr_reader :children
+    
+    def append(other)
+	case other
+	when MultiNode
+	    @children += other.children
+	else
+	    @children.push other
+	end
+    end
+
+    def sort
+	table = {}
+	for child in self
+	    name = child.name
+	    if (table.include?(name)) then
+		table[name] = table[name].mul_eval(child)
+	    else
+		table[name] = child
+	    end
+	end
+	list = []
+	for name in table.keys.sort
+	    candi = table[name]
+	    if PowNode === candi and NumberNode === candi.lhs then
+		v = candi.value
+		list.push NumberNode.new(v) unless v == 1
+		next
+	    end
+	    next if candi.power.value == 0
+	    list.push candi
+	end
+        if list.length > 1
+	  list.delete(NumberNode::UNITY)
+	end
+	self.class.new(*list)
+    end
+
+    def collect_hash(stopper, op)
+	list = []
+	for child in self
+	    list.push(child.send(op, stopper))
+	end
+	self.class.new(*list).flatten2
+    end
+
+    def expand(stopper)
+	collect_hash(stopper, :expand)
+    end
+
+    def unalias(stopper)
+	collect_hash(stopper, :unalias)
+    end
+
+    def foldnumber(stopper)
+	collect_hash(stopper, :foldnumber)
+    end
+
+    def value
+	raise "this is dimensional units" if (@children.size > 1)
+	@children.first ? @children.first.value : NumberNode::UNITY.value
+    end
+
+end
diff --git a/src/namenode.rb b/src/namenode.rb
new file mode 100644
index 0000000..8a6afaa
--- /dev/null
+++ b/src/namenode.rb
@@ -0,0 +1,63 @@
+class NameNode < TerminalNode
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+    alias :name :to_s
+
+    def power;  NumberNode::UNITY;  end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	PowNode.new(self, self.power.add_eval(another.power))
+    end
+
+    def expand(stopper) 
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self if basic?
+	return CACHE[@a] if CACHE.include?(@a)
+	CACHE[@a] = expand2(stopper)
+    end
+
+    def expand2(stopper)
+	newstopper = stopper.dup
+	newstopper[@a] = true
+	if UDEFS.include?(@a) then
+	    Units.new(UDEFS[@a]).ptree.expand(newstopper)
+	else
+	    p, n = UALIASES[@a]
+	    u = Units.new(UDEFS[n] || n).ptree.expand(newstopper)
+	    MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p)))
+	end
+    end
+
+    def unalias(stopper)
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self unless UALIASES.include?(@a)
+	p, n = UALIASES[@a]
+	u = NameNode.new(n)
+	q = PowNode.new(NumberNode.new(10), NumberNode.new(p))
+	MulNode.new(u, q)
+    end
+
+    def foldnumber(stopper)
+	return self unless UPLURALS.include?(@a)
+	n = UPLURALS[@a]
+	NameNode.new(n)
+    end
+
+    def basic?
+	not (UDEFS.include?(@a) or UALIASES.include?(@a))
+    end
+
+    CACHE = {}
+
+    def factor
+	1
+    end
+
+end
+
diff --git a/src/node.rb b/src/node.rb
new file mode 100644
index 0000000..d253a46
--- /dev/null
+++ b/src/node.rb
@@ -0,0 +1,210 @@
+=begin
+= class Node
+Node is a parent class for classes of parse tree node.
+This is not expected to be instanciated directly.
+=end
+
+class Node
+
+    def initialize(*args)
+	raise "#{self.class} is virtual."
+    end
+
+    def to_s(*args)
+	raise "#{self.class}#to_s is virtual."
+    end
+
+=begin
+--- pow other
+    simply constructs a PowNode object.
+    No reduction is performed.
+=end
+
+    def pow(other)
+	PowNode.new(self, other)
+    end
+
+=begin
+--- mul other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def mul(other)
+	other = NumberNode.new(other) if Numeric === other
+	MulNode.new(self, other)
+    end
+
+=begin
+--- divide other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def divide(other)
+	MulNode.new(self, PowNode.new(other, NumberNode.new(-1)))
+    end
+
+=begin
+--- shift other
+    simply constructs a ShiftNode object.
+    No reduction is performed.
+=end
+
+    def shift(other)
+	ShiftNode.new(self, other)
+    end
+
+=begin
+--- pow_eval other
+    similar to ((<pow other>)), but reduces PowNode[PowNode[...]] into
+    single PowNode[...], so overriden at PowNode class.
+=end
+
+    def pow_eval(other)
+	pow(other)
+    end
+
+=begin
+--- inspect
+=end
+
+    def inspect2;  "#{self.class}[#{to_s}]";  end
+
+    def inspect;  inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '[');  end
+
+=begin
+--- trim
+    in most subclasses, "trim" is redirected into "trim2".
+=end
+
+    def trim
+	trim2
+    end
+
+=begin
+--- flatten
+    in most subclasses, "flatten" is redirected into "flatten2".
+=end
+
+    def flatten
+	flatten2
+    end
+
+=begin
+--- sort
+=end
+
+    def sort
+	raise "#{self.class}#sort is virtual: call after flatten"
+    end
+
+=begin
+--- reduce1
+--- reduce2
+--- reduce3
+--- reduce4
+--- reduce5
+=end
+
+    def reduce1
+	self
+    end
+
+    def reduce2
+	trim
+    end
+
+    def reduce3
+	trim.flatten
+    end
+
+    def reduce4
+	# unalias(Hash.new).trim.flatten.sort
+	foldnumber(nil).trim.flatten.sort
+    end
+
+    def reduce5
+	expand(Hash.new).trim.flatten.sort
+    end
+
+=begin
+--- ref
+    to be overriden at ShiftNode
+--- deref
+    to be overriden at ShiftNode
+=end
+
+    def ref
+	NumberNode::ZERO
+    end
+
+    def deref
+	self
+    end
+
+end
+
+class ErrorNode < Node
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+end
+
+class ContainerNode < Node
+
+    def trim2
+	x = []
+	for child in self
+	    x.push child.trim2
+	end
+	self.class.new(*x)
+    end
+
+    def inspect2
+	a = []
+	for child in self
+	    a.push child.inspect2
+	end
+      	"#{self.class}[#{a.join(', ')}]"
+    end
+
+end
+
+module BinaryNode
+
+    def each
+	yield @lhs
+	yield @rhs
+    end
+
+    def expand(stopper)
+	self.class.new(@lhs.expand(stopper), @rhs.expand(stopper))
+    end
+
+    def unalias(stopper)
+	self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper))
+    end
+
+    def foldnumber(stopper)
+	self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper))
+    end
+
+end
+
+class TerminalNode < Node
+
+    def trim2;  self;  end
+    def flatten2;  self;  end
+
+    def expand(stopper);  self;  end
+    alias :unalias :expand
+    alias :foldnumber :expand
+
+    def sort;  self;  end
+
+end
diff --git a/src/numbernode.rb b/src/numbernode.rb
new file mode 100644
index 0000000..1b7ee2a
--- /dev/null
+++ b/src/numbernode.rb
@@ -0,0 +1,53 @@
+class NumberNode < TerminalNode
+
+    def initialize(arg)
+	raise TypeError unless Numeric === arg
+	@a = arg
+    end
+
+    UNITY = NumberNode.new(1)
+    ZERO = NumberNode.new(0)
+
+    def to_s
+      if @a == @a.to_i
+        sprintf("%d", at a)
+      else
+        String(@a)
+      end
+    end
+
+    attr_reader :a
+
+    alias :value :a
+    alias :factor :a
+
+    def == (other)
+      case other
+      when NumberNode
+	@a == other.a
+      else
+	false
+      end
+    end
+
+    def add_eval(another)
+	raise TypeError unless NumberNode === another
+	NumberNode.new(@a + another.value)
+    end
+
+    def mul_eval(another)
+	case another
+	when NumberNode then NumberNode.new(@a * another.a)
+	when PowNode
+	    raise TypeError unless NumberNode === another.lhs
+	    raise TypeError unless NumberNode === another.rhs
+	    NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value))
+	else raise TypeError
+	end
+    end
+
+    def name; "1"; end
+
+    def power;  UNITY;  end
+
+end
diff --git a/src/pownode.rb b/src/pownode.rb
new file mode 100644
index 0000000..07b5642
--- /dev/null
+++ b/src/pownode.rb
@@ -0,0 +1,98 @@
+class PowNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+	raise TypeError unless NumberNode === @rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	case lhs
+	when /\d$/, /[\d\.]/
+	    lhs = "(#{lhs})"
+	end
+	rhs = @rhs.to_s
+        if rhs == '1'
+	    lhs
+	else
+	    rhs = "^(#{rhs})" if (/\./ =~ rhs)
+	    lhs + rhs
+	end
+    end
+
+    attr_reader :lhs, :rhs
+    alias :power :rhs
+
+    def pow_eval(other)
+	case other
+	when NumberNode
+	    PowNode.new(@lhs, @rhs.mul_eval(other))
+	else
+	    super(other)
+	end
+    end
+
+    def flatten2
+	x = @lhs.flatten2
+	case x
+	when NumberNode
+	    a = @lhs.pow_eval(@rhs)
+	when TerminalNode
+	    a = self
+	when PowNode
+	    a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs))
+	when MulNode, MultiNode
+	    a = MultiNode.new()
+	    for gc in x
+		a.append(gc.pow_eval(@rhs))
+	    end
+	else
+	    raise "internal error"
+	end
+	return a
+    end
+
+    def name
+	case @lhs
+	when NumberNode, NameNode
+	    @lhs.name
+	else
+	    raise "internal error"
+	end
+    end
+
+    def value
+	case @lhs
+	when NumberNode
+	    Units::pow_f(@lhs.value, @rhs.value)
+	else
+	    raise(format('%s#value: internal error', self.class.to_s))
+	end
+    end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value)
+	else
+	    self.class.new(@lhs, @rhs.add_eval(another.power))
+	end
+    end
+
+    def sort
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value))
+	else
+	    self
+	end
+    end
+
+    def factor
+	Units::pow_f(@lhs.factor, @rhs.value)
+    end
+
+end
diff --git a/src/rules.rb b/src/rules.rb
new file mode 100644
index 0000000..4fc5872
--- /dev/null
+++ b/src/rules.rb
@@ -0,0 +1,65 @@
+class Units
+
+  token INT ERR SHIFT SPACE MULTIPLY DIVIDE EXPONENT REAL NAME DATE TIME ZONE
+  options no_result_var
+
+rule
+
+unit_spec:
+	/* { yyaccept; }  */  /* <-- to acccept empty unit_spec */
+	| origin_exp { yyaccept; }
+	| error { yyerrok }
+	;
+
+origin_exp:	 
+	unit_exp
+	| unit_exp SHIFT value_exp { val[0].shift(val[2]) }
+	| unit_exp SHIFT timestamp { val[0].shift(val[2]) }
+	;
+
+unit_exp: 
+	power_exp
+	| number_exp
+	| unit_exp power_exp		{ val[0].mul(val[1]) }
+	| unit_exp MULTIPLY power_exp	{ val[0].mul(val[2]) }
+	| unit_exp DIVIDE power_exp	{ val[0].divide(val[2]) }
+	| unit_exp MULTIPLY number_exp	{ val[0].mul(val[2]) }
+	| unit_exp DIVIDE number_exp	{ val[0].divide(val[2]) }
+	;
+
+power_exp:
+	NAME { NameNode.new(val[0]) }
+	| power_exp number_exp { val[0].pow(val[1]) }
+	| power_exp EXPONENT value_exp { val[0].pow(val[2]) }
+	| '(' origin_exp ')' { val[1] }
+	;
+
+value_exp:
+	number_exp
+	| '(' value_exp ')' { val[1] }
+	;
+
+number_exp:	 
+	INT { NumberNode.new(val[0]) }
+	| REAL { NumberNode.new(val[0]) }
+	;
+
+timestamp:	 
+	time_exp
+	| '(' timestamp ')' { val[1] }
+	;
+
+time_exp:
+	DATE { TimeNode.new(val[0], 0.0, 0) }
+	| DATE TIME { TimeNode.new(val[0], val[1], 0) }
+	| DATE TIME ZONE { TimeNode.new(val[0], val[1], val[2]) }
+	;
+
+end
+
+---- header
+
+require 'date'
+
+---- inner
+
diff --git a/src/shiftnode.rb b/src/shiftnode.rb
new file mode 100644
index 0000000..541e3b8
--- /dev/null
+++ b/src/shiftnode.rb
@@ -0,0 +1,63 @@
+class ShiftNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    attr_reader :lhs, :rhs
+    alias :ref :rhs
+
+    def to_s
+	"(#{@lhs.to_s} @ #{@rhs.to_s})"
+    end
+
+    def trim2;  @lhs;  end
+    def trim
+      	self.class.new(@lhs.trim, @rhs.trim2)
+    end
+
+    def flatten2;  @lhs;  end
+    def flatten
+	lf = @lhs.flatten
+	case lf
+	when ShiftNode
+	    rf = lf.rhs.add_eval(@rhs)
+	    self.class.new(lf.lhs, rf)
+	else
+	    self.class.new(lf, @rhs.flatten)
+	end
+    end
+
+    def sort
+	self.class.new(@lhs.sort, @rhs.sort)
+    end
+
+    def ref
+	case @lhs
+	when ShiftNode
+	    @lhs.ref.add_eval(@rhs)
+	else
+	    @rhs
+	end
+    end
+
+    def deref
+	case @lhs
+	when ShiftNode
+	    @lhs.deref
+	else
+	    @lhs
+	end
+    end
+
+    def name
+	@lhs.name
+    end
+
+    def factor
+	@lhs.factor
+    end
+
+end
diff --git a/src/test.rb b/src/test.rb
new file mode 100644
index 0000000..901b3f0
--- /dev/null
+++ b/src/test.rb
@@ -0,0 +1,122 @@
+require 'units'    # Use require "numru/units" after installation.
+include NumRu
+
+def assert(test, seikai)
+	raise "#{test.inspect} != #{seikai.inspect}" if test != seikai
+	puts "ok #{seikai.inspect}"
+end
+
+puts "=== reduce1 ==="
+
+assert Units.new('').reduce1.to_s, ""
+assert Units.new('m').reduce1.to_s, "m"
+assert Units.new('3').reduce1.to_s, "3"
+assert Units.new('3.14').reduce1.to_s, "3.14"
+assert Units.new('m2').reduce1.to_s, "m2"
+assert Units.new('m.s').reduce1.to_s, "m.s"
+assert Units.new('m/s').reduce1.to_s, "m.s-1"
+assert Units.new('kg.m/s2').reduce1.to_s, "kg.m.(s2)-1"
+assert Units.new('s @ 2003-11-29').reduce1.to_s,
+	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+assert Units.new('s @ 2003-11-29T11:24').reduce1.to_s,
+	"(s @ 2003-11-29T11:24:00.00 +00:00)"
+assert Units.new('s @ 2003-11-29T11:24:11 -09:00').reduce1.to_s,
+	"(s @ 2003-11-29T11:24:11.00 -09:00)"
+
+assert Units.new('100').reduce1.to_s, "100"
+assert Units.new('(10)^2').reduce1.to_s, "(10)2"
+assert Units.new('(10)^2/100').reduce1.to_s, "(10)2.(100)-1"
+
+puts "=== reduce2 ==="
+
+assert Units.new('s @ 2003-11-29').reduce2.to_s,
+	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+assert Units.new('m/(s @ 2003-11-29)').reduce2.to_s, "m.s-1"
+assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce2.to_s, "m.(K.s)-1"
+
+assert Units.new('(10)^2/100').reduce2.to_s, "(10)2.(100)-1"
+
+puts "=== reduce3 ==="
+
+assert Units::MultiNode.new(Units::NameNode.new('a'),  \
+	Units::NumberNode.new(1), \
+	Units::NameNode.new('b')).to_s, 'a.1 b'
+
+assert Units.new('kg').reduce3.inspect, "Units[Name[kg]]"
+assert Units.new('kg.m').reduce3.inspect, "Units[Multi[Name[kg], Name[m]]]"
+assert Units.new('kg.m.s').reduce3.inspect,
+	"Units[Multi[Name[kg], Name[m], Name[s]]]"
+
+assert Units.new('(m.s)^2').reduce3.inspect,
+	"Units[Multi[Pow[Name[m], Number[2]], Pow[Name[s], Number[2]]]]"
+assert Units.new('K @ 273.15').reduce3.inspect,
+	"Units[Shift[Name[K], Number[273.15]]]"
+assert Units.new('((a.b)^2)^2').reduce3.inspect,
+	"Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]]]]"
+assert Units.new('((a.b)^2 c4 d)^2').reduce3.inspect,
+	"Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]], Pow[Name[c], Number[8]], Pow[Name[d], Number[2]]]]"
+assert Units.new('((a.b)^2 c4 d)^2').reduce3.to_s,
+	"a4 b4 c8 d2"
+assert Units.new('((a.b)^2 a4 b)^2').reduce3.to_s,
+	"a4 b4 a8 b2"
+
+assert Units.new('s @ 2003-11-29').reduce3.to_s,
+	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+assert Units.new('m/(s @ 2003-11-29)').reduce3.to_s, "m.s-1"
+assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce3.to_s, "m.K-1 s-1"
+
+assert Units.new('(10)^2/100').reduce3.to_s, "(10)2.(100)-1"
+
+puts "=== reduce4 ==="
+
+assert Units.new('((a.b)^2 a4 b @ now)^2 @ 273.15').reduce4.to_s,
+	"(a12 b6 @ 273.15)"
+
+assert Units.new('km2').reduce4.to_s, "km2"
+assert Units.new('hours.hour').reduce4.to_s, "hour2"
+assert Units.new('(10)^2').reduce4.to_s, "100"
+assert Units.new('100/10').reduce4.to_s, "10.0"
+assert Units.new('(10)^2/100').reduce4.to_s, "1.0"
+
+puts "=== reduce5 ==="
+
+assert Units.new('km2').reduce5.to_s, "1000000 m2"
+assert Units.new('(10)^2/100').reduce5.to_s, "1.0"
+
+assert Units.new('hPa').reduce5.to_s, "100 kg.m-1 s-2"
+assert Units.new('mb').reduce5.to_s, "100.0 kg.m-1 s-2"
+
+assert Units.new('hPa/mb').reduce5.to_s, "1.0"
+
+assert Units.new('(K @ 273.15)@ 10').reduce5.to_s, "(K @ 283.15)"
+
+puts "=== APPLICATIONS ==="
+
+assert Units.new('km @ 2').convert(3, Units.new('m @ 100')), 4900
+assert Units.new('degree_F').convert(32, Units.new('K')).to_s, "273.15"
+
+u1 = Units.new('m/s')
+u2 = Units.new('mm/s')
+assert((u1/u2).to_s, "m.mm-1")
+assert((u1*u2).to_s, "m.mm.s-2")
+
+u1 = Units.new('years since 1999-01-01 00:00').reduce4
+u2 = Units.new('hours since 2001-01-01 00:00').reduce4
+assert u1.convert(3, u2), 24 * 365
+u3 = Units.new('months since 2001-01-01 00:00').reduce4
+assert u1.convert(3, u3), 12.0
+
+Units.reduce_level = 3
+assert((Units.new('hours') ** 2).to_s, "hours2")
+Units.reduce_level = 4
+assert((Units.new('hours') ** 2).to_s, "hour2")
+Units.reduce_level = 5
+assert((Units.new('hours') ** 2).to_s, "12960000 s2")
+
+assert(Units.new('day') =~ Units.new('s since 2002-01-01'), true)
+assert(Units.new('m') =~ Units.new('1'), false)
+
+un1  = Units['day since 2000-01-01']
+un2 = Units['s since 2000-01-01']
+assert(un1.convert(0, un2), 0.0)
+assert(un1.convert(1, un2), 86400.0)
diff --git a/src/timenode.rb b/src/timenode.rb
new file mode 100644
index 0000000..fa90414
--- /dev/null
+++ b/src/timenode.rb
@@ -0,0 +1,136 @@
+class XDate
+
+    def initialize(year, month, day)
+	@year, @month, @day = year.to_i, month.to_i, day.to_i
+    end
+
+    attr_reader :year, :month, :day
+
+    def to_s
+	format('%04d-%02d-%02d', @year, @month, @day)
+    end
+
+    alias :inspect :to_s
+
+    def to_time
+	Time.gm(@year, @month, @day)
+    end
+
+    def to_date
+	Date.new(@year, @month, @day)
+    end
+
+    def -(other)
+	case other
+	when XDate
+	    (to_date - other.to_date)
+	when Time
+	    to_time - other
+	when Date
+            (to_date - other.to_date)
+	else
+	    to_date - other
+	end
+    end
+
+    def +(other)
+	t = to_date + other
+	self.class.new(t.year, t.month, t.mday)
+    end
+
+end
+
+class TimeNode < TerminalNode
+
+    def initialize(date, time, zone)
+	@date, @time, @zone = date, time, zone
+	if :now === @date then
+	    now = Time.now.utc
+	    @date = XDate.new(now.year, now.month, now.day)
+	    @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec))
+	else
+	    qdays = (@time / 86400).floor
+	    if not qdays.zero?
+	        @date += qdays
+	        @time -= (qdays * 86400)
+	    end
+	end
+	raise TypeError unless XDate === @date
+	@time = 0.0 unless @time
+	raise TypeError unless Float === @time
+	@zone = 0 unless @zone
+	raise TypeError unless Integer === @zone
+    end
+
+    attr_reader :date, :time, :zone
+
+    def to_s
+	hr = @time.floor / 3600
+	mi = (@time.floor / 60) % 60
+	sc = @time % 60
+	tzm = @zone.abs
+	tzh = tzm / 60
+	tzm %= 60
+	tzh = -tzh if @zone < 0
+	format("%sT%02d:%02d:%05.2f %+03d:%02d", \
+	    @date.to_s, hr, mi, sc, tzh, tzm)
+    end
+
+    def self::pentad(d)
+	(d > 25) ? 5 : ((d - 1) / 5)
+    end
+
+    def add_time(increment)
+	inc = increment.reduce5
+	case inc.name
+	when 's'
+	    t2 = @time + inc.factor
+	    d2 = @date + (t2 / 86400)
+	    t2 = t2 % 86400
+	    self.class.new(d2, t2, @zone)
+	when 'pentad'
+	    ifac = Integer(inc.factor)
+	    ipen = ifac % 6
+	    imon = ifac / 6
+	    spen = self.class.pentad(@date.day)
+	    smon = @date.month + imon + spen / 6
+	    spen = spen % 6
+	    sday = spen * 5 + (@date.day - 1) % 5 + 1
+	    syear = @date.year + (smon - 1) / 12
+	    smon = (smon - 1) % 12 + 1
+	    sdate = XDate.new(syear, smon, sday)
+	    self.class.new(sdate, @time, @zone)
+	else
+	    raise "bad time unit '#{inc.name}'"
+	end
+    end
+
+    def utcsod
+	@time - @zone * 60
+    end
+
+    def div_time(units)
+	base = units.ref
+	inc = units.deref.reduce5
+	begin
+	    incname = inc.name
+	rescue Exception
+	    incname = "(undefined)"
+	end
+	case incname
+	when 's'
+	    dif = (@date - base.date) * 86400 + (utcsod - base.utcsod)
+	    dif / inc.factor
+	when 'pentad'
+	    dif = (@date.year - base.date.year) * 72
+	    dif += (@date.month - base.date.month) * 6
+	    dif += self.class.pentad(@date.day)
+	    dif -= self.class.pentad(base.date.day)
+	    dif = Float(dif) if dif % inc.factor != 0
+	    dif / inc.factor
+	else
+	    raise "bad time unit '#{incname}'"
+	end
+    end
+
+end
diff --git a/src/units.racc b/src/units.racc
new file mode 100644
index 0000000..2c576c3
--- /dev/null
+++ b/src/units.racc
@@ -0,0 +1,2728 @@
+class Units
+
+  token INT ERR SHIFT SPACE MULTIPLY DIVIDE EXPONENT REAL NAME DATE TIME ZONE
+  options no_result_var
+
+rule
+
+unit_spec:
+	/* { yyaccept; }  */  /* <-- to acccept empty unit_spec */
+	| origin_exp { yyaccept; }
+	| error { yyerrok }
+	;
+
+origin_exp:	 
+	unit_exp
+	| unit_exp SHIFT value_exp { val[0].shift(val[2]) }
+	| unit_exp SHIFT timestamp { val[0].shift(val[2]) }
+	;
+
+unit_exp: 
+	power_exp
+	| number_exp
+	| unit_exp power_exp		{ val[0].mul(val[1]) }
+	| unit_exp MULTIPLY power_exp	{ val[0].mul(val[2]) }
+	| unit_exp DIVIDE power_exp	{ val[0].divide(val[2]) }
+	| unit_exp MULTIPLY number_exp	{ val[0].mul(val[2]) }
+	| unit_exp DIVIDE number_exp	{ val[0].divide(val[2]) }
+	;
+
+power_exp:
+	NAME { NameNode.new(val[0]) }
+	| power_exp number_exp { val[0].pow(val[1]) }
+	| power_exp EXPONENT value_exp { val[0].pow(val[2]) }
+	| '(' origin_exp ')' { val[1] }
+	;
+
+value_exp:
+	number_exp
+	| '(' value_exp ')' { val[1] }
+	;
+
+number_exp:	 
+	INT { NumberNode.new(val[0]) }
+	| REAL { NumberNode.new(val[0]) }
+	;
+
+timestamp:	 
+	time_exp
+	| '(' timestamp ')' { val[1] }
+	;
+
+time_exp:
+	DATE { TimeNode.new(val[0], 0.0, 0) }
+	| DATE TIME { TimeNode.new(val[0], val[1], 0) }
+	| DATE TIME ZONE { TimeNode.new(val[0], val[1], val[2]) }
+	;
+
+end
+
+---- header
+
+require 'date'
+
+---- inner
+
+=begin
+= class Node
+Node is a parent class for classes of parse tree node.
+This is not expected to be instanciated directly.
+=end
+
+class Node
+
+    def initialize(*args)
+	raise "#{self.class} is virtual."
+    end
+
+    def to_s(*args)
+	raise "#{self.class}#to_s is virtual."
+    end
+
+=begin
+--- pow other
+    simply constructs a PowNode object.
+    No reduction is performed.
+=end
+
+    def pow(other)
+	PowNode.new(self, other)
+    end
+
+=begin
+--- mul other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def mul(other)
+	other = NumberNode.new(other) if Numeric === other
+	MulNode.new(self, other)
+    end
+
+=begin
+--- divide other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def divide(other)
+	MulNode.new(self, PowNode.new(other, NumberNode.new(-1)))
+    end
+
+=begin
+--- shift other
+    simply constructs a ShiftNode object.
+    No reduction is performed.
+=end
+
+    def shift(other)
+	ShiftNode.new(self, other)
+    end
+
+=begin
+--- pow_eval other
+    similar to ((<pow other>)), but reduces PowNode[PowNode[...]] into
+    single PowNode[...], so overriden at PowNode class.
+=end
+
+    def pow_eval(other)
+	pow(other)
+    end
+
+=begin
+--- inspect
+=end
+
+    def inspect2;  "#{self.class}[#{to_s}]";  end
+
+    def inspect;  inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '[');  end
+
+=begin
+--- trim
+    in most subclasses, "trim" is redirected into "trim2".
+=end
+
+    def trim
+	trim2
+    end
+
+=begin
+--- flatten
+    in most subclasses, "flatten" is redirected into "flatten2".
+=end
+
+    def flatten
+	flatten2
+    end
+
+=begin
+--- sort
+=end
+
+    def sort
+	raise "#{self.class}#sort is virtual: call after flatten"
+    end
+
+=begin
+--- reduce1
+--- reduce2
+--- reduce3
+--- reduce4
+--- reduce5
+=end
+
+    def reduce1
+	self
+    end
+
+    def reduce2
+	trim
+    end
+
+    def reduce3
+	trim.flatten
+    end
+
+    def reduce4
+	# unalias(Hash.new).trim.flatten.sort
+	foldnumber(nil).trim.flatten.sort
+    end
+
+    def reduce5
+	expand(Hash.new).trim.flatten.sort
+    end
+
+=begin
+--- ref
+    to be overriden at ShiftNode
+--- deref
+    to be overriden at ShiftNode
+=end
+
+    def ref
+	NumberNode::ZERO
+    end
+
+    def deref
+	self
+    end
+
+end
+
+class ErrorNode < Node
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+end
+
+class ContainerNode < Node
+
+    def trim2
+	x = []
+	for child in self
+	    x.push child.trim2
+	end
+	self.class.new(*x)
+    end
+
+    def inspect2
+	a = []
+	for child in self
+	    a.push child.inspect2
+	end
+      	"#{self.class}[#{a.join(', ')}]"
+    end
+
+end
+
+module BinaryNode
+
+    def each
+	yield @lhs
+	yield @rhs
+    end
+
+    def expand(stopper)
+	self.class.new(@lhs.expand(stopper), @rhs.expand(stopper))
+    end
+
+    def unalias(stopper)
+	self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper))
+    end
+
+    def foldnumber(stopper)
+	self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper))
+    end
+
+end
+
+class TerminalNode < Node
+
+    def trim2;  self;  end
+    def flatten2;  self;  end
+
+    def expand(stopper);  self;  end
+    alias :unalias :expand
+    alias :foldnumber :expand
+
+    def sort;  self;  end
+
+end
+class NameNode < TerminalNode
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+    alias :name :to_s
+
+    def power;  NumberNode::UNITY;  end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	PowNode.new(self, self.power.add_eval(another.power))
+    end
+
+    def expand(stopper) 
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self if basic?
+	return CACHE[@a] if CACHE.include?(@a)
+	CACHE[@a] = expand2(stopper)
+    end
+
+    def expand2(stopper)
+	newstopper = stopper.dup
+	newstopper[@a] = true
+	if UDEFS.include?(@a) then
+	    Units.new(UDEFS[@a]).ptree.expand(newstopper)
+	else
+	    p, n = UALIASES[@a]
+	    u = Units.new(UDEFS[n] || n).ptree.expand(newstopper)
+	    MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p)))
+	end
+    end
+
+    def unalias(stopper)
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self unless UALIASES.include?(@a)
+	p, n = UALIASES[@a]
+	u = NameNode.new(n)
+	q = PowNode.new(NumberNode.new(10), NumberNode.new(p))
+	MulNode.new(u, q)
+    end
+
+    def foldnumber(stopper)
+	return self unless UPLURALS.include?(@a)
+	n = UPLURALS[@a]
+	NameNode.new(n)
+    end
+
+    def basic?
+	not (UDEFS.include?(@a) or UALIASES.include?(@a))
+    end
+
+    CACHE = {}
+
+    def factor
+	1
+    end
+
+end
+
+class NameNode
+UDEFS = {
+  "%" => "1e-2",  "Au" => "astronomical_unit",  "Bq" => "s-1",
+  "C" => "A.s",  "Celsius" => "K @ 273.15",  "F" => "C/V",
+  "Fahrenheit" => "degree_F",  "G" => "gauss",  "Gal" => "cm s-2",
+  "Gy" => "J.kg-1",  "H" => "Wb.A-1",  "Hg" => "mercury",
+  "Hz" => "1/s",  "J" => "N.m",  "Julian_year" => "365.25 day",
+  "L" => "litre",  "N" => "kg.m.s-2",  "P" => "poise",  "Pa" => "N.m-2",
+  "Pascal" => "Pa",  "S" => "A/V",  "St" => "stokes",  "Sv" => "J.kg-1",
+  "T" => "Wb.m-2",  "V" => "J/C",  "W" => "J/s",  "Wb" => "V.s",
+  "a" => "are",  "ac" => "acre",  "acre" => "10 chain2",
+  "ampere" => "A",  "angstrom" => "1.0e-10 m",
+  "angular_degree" => "degree",  "angular_minute" => "minute_angle",
+  "angular_second" => "second_angle",  "are" => "100 m2",
+  "astronomical_unit" => "1.49597870e11 m",
+  "astronomical_units" => "1.49597870e11 m",  "atm" => "atmosphere",
+  "atmosphere" => "101325 Pa",  "bar" => "1e6 dyn.cm-2",
+  "cal" => "calorie",  "calorie" => "4.18605 J",
+  "celsius" => "K @ 273.15",  "centigrade" => "K @ 273.15",
+  "century" => "100 year",  "chain" => "22 yard",
+  "common_year" => "365 day",
+  "conventional_mercury" => "gravity 13595.10 kg/m3",  "coulomb" => "C",
+  "d" => "24 hour",  "day" => "24 hour",  "degC" => "K @ 273.15",
+  "degF" => "degree_F",  "degK" => "K",  "deg_C" => "K @ 273.15",
+  "deg_F" => "degree_F",  "deg_K" => "K",  "degree" => "pi.rad/180",
+  "degreeC" => "K @ 273.15",  "degreeF" => "degree_F",
+  "degreeK" => "K",  "degree_C" => "K @ 273.15",
+  "degree_E" => "degree",  "degree_F" => "degree_R @ 459.67",
+  "degree_N" => "degree",  "degree_R" => "K / 1.8",
+  "degree_S" => "degree",  "degree_W" => "degree",
+  "degree_c" => "K @ 273.15",  "degree_east" => "degree_E",
+  "degree_f" => "degree_R @ 459.67",  "degree_north" => "degree_N",
+  "degree_south" => "degree_S",  "degree_west" => "degree_W",
+  "degrees_east" => "degree_E",  "degrees_north" => "degree_N",
+  "degrees_south" => "degree_S",  "degrees_west" => "degree_W",
+  "dyn" => "g.cm.s-2",  "dyne" => "g.cm.s-2",  "erg" => "dyn cm",
+  "fahrenheit" => "degree_F",  "farad" => "coulomb/volt",
+  "feet" => "foot",  "fermi" => "1.0e-15 m",  "foot" => "12 inch",
+  "force" => "9.80665 m.s-2",  "ft" => "foot",  "g" => "kg/1000",
+  "gal" => "cm s-2",  "gauss" => "T / 10000",  "gram" => "kg/1000",
+  "gravity" => "9.806650 meter/second2",  "h" => "60 min",
+  "hectare" => "100 are",  "hertz" => "Hz",  "hg" => "mercury",
+  "horse_power" => "75 m kilogram-force / s",  "hour" => "60 min",
+  "hr" => "60 min",  "in" => "inch",  "inch" => "2.54 cm",
+  "joule" => "J",  "kelvin" => "K",  "kgf" => "kilogram-force",
+  "kilogram" => "kg",  "knot" => "nautical_mile / hour",
+  "kph" => "km / hour",  "lb" => "pound",
+  "light_speed" => "299792458 m/s",  "light_year" => "9.46e15 m",
+  "light_years" => "9.46e15 m",  "litre" => "1.0e-3 m3",
+  "lm" => "cd.sr",  "lx" => "lm.m-2",  "ly" => "light_year",
+  "mb" => "bar / 1000",  "mercury" => "conventional_mercury",
+  "meter" => "metre",  "metre" => "m",  "mgal" => "cm s-2 / 1000",
+  "micron" => "1.0e-6 m",  "mile" => "1760 yard",
+  "millibar" => "bar / 1000",  "min" => "60 s",  "minute" => "60 s",
+  "minute_angle" => "pi.rad/180/60",  "mole" => "mol",
+  "mon" => "month",  "month" => "6 pentad",  "mph" => "mile / hour",
+  "nautical_mile" => "1852 m",  "nautical_miles" => "1852 m",
+  "newton" => "N",  "ohm" => "V/A",  "ounce" => "pound / 16",
+  "oz" => "ounce",  "parsec" => "3.0857e16 m",  "pascal" => "Pa",
+  "pc" => "parsec",  "percent" => "1e-2",  "permil" => "1e-3",
+  "pi" => "3.141592653589793238462",  "poise" => "dyn s / cm2",
+  "pound" => "453.6 g",  "psi" => "pound-force / inch2",
+  "radian" => "rad",  "second" => "s",
+  "second_angle" => "pi.rad/180/60/60",  "steradian" => "sr",
+  "stokes" => "cm2 / s",  "t" => "ton",  "tesla" => "Wb.m-2",
+  "ton" => "1000 kg",  "tonne" => "ton",  "torr" => "133.322 Pa",
+  "volt" => "V",  "watt" => "W",  "weber" => "Wb",  "yard" => "6 feet",
+  "yd" => "yard",  "year" => "12 month",  "yr" => "year",
+}
+UALIASES = {
+  "Celsiuses" => [0, "Celsius"],  "E%" => [18, "%"],  "EA" => [18, "A"],
+  "EAu" => [18, "Au"],  "EBq" => [18, "Bq"],  "EC" => [18, "C"],
+  "EF" => [18, "F"],  "EG" => [18, "G"],  "EGal" => [18, "Gal"],
+  "EGy" => [18, "Gy"],  "EH" => [18, "H"],  "EHg" => [18, "Hg"],
+  "EHz" => [18, "Hz"],  "EJ" => [18, "J"],  "EK" => [18, "K"],
+  "EL" => [18, "L"],  "EN" => [18, "N"],  "EP" => [18, "P"],
+  "EPa" => [18, "Pa"],  "ES" => [18, "S"],  "ESt" => [18, "St"],
+  "ESv" => [18, "Sv"],  "ET" => [18, "T"],  "EV" => [18, "V"],
+  "EW" => [18, "W"],  "EWb" => [18, "Wb"],  "Ea" => [18, "a"],
+  "Eac" => [18, "ac"],  "Eatm" => [18, "atm"],  "Ebar" => [18, "bar"],
+  "Ecal" => [18, "cal"],
+  "Econventional_mercury" => [18, "conventional_mercury"],
+  "Ed" => [18, "d"],  "EdegC" => [18, "degC"],  "EdegF" => [18, "degF"],
+  "Edeg_C" => [18, "deg_C"],  "Edeg_F" => [18, "deg_F"],
+  "EdegreeC" => [18, "degreeC"],  "EdegreeF" => [18, "degreeF"],
+  "Edegree_C" => [18, "degree_C"],  "Edegree_E" => [18, "degree_E"],
+  "Edegree_F" => [18, "degree_F"],  "Edegree_N" => [18, "degree_N"],
+  "Edegree_R" => [18, "degree_R"],  "Edegree_S" => [18, "degree_S"],
+  "Edegree_W" => [18, "degree_W"],  "Edegree_c" => [18, "degree_c"],
+  "Edegree_east" => [18, "degree_east"],
+  "Edegree_f" => [18, "degree_f"],
+  "Edegree_north" => [18, "degree_north"],
+  "Edegree_south" => [18, "degree_south"],
+  "Edegree_west" => [18, "degree_west"],
+  "Edegrees_east" => [18, "degrees_east"],
+  "Edegrees_north" => [18, "degrees_north"],
+  "Edegrees_south" => [18, "degrees_south"],
+  "Edegrees_west" => [18, "degrees_west"],  "Edyn" => [18, "dyn"],
+  "Eerg" => [18, "erg"],  "Eforce" => [18, "force"],  "Eg" => [18, "g"],
+  "Egravity" => [18, "gravity"],  "Eh" => [18, "h"],
+  "Ehg" => [18, "hg"],  "Ehr" => [18, "hr"],  "Ein" => [18, "in"],
+  "Ekg" => [18, "kg"],  "Ekgf" => [18, "kgf"],  "Ekph" => [18, "kph"],
+  "Elb" => [18, "lb"],  "Elm" => [18, "lm"],  "Elx" => [18, "lx"],
+  "Ely" => [18, "ly"],  "Em" => [18, "m"],  "Emb" => [18, "mb"],
+  "Emercury" => [18, "mercury"],  "Emgal" => [18, "mgal"],
+  "Emin" => [18, "min"],  "Emol" => [18, "mol"],  "Emon" => [18, "mon"],
+  "Emph" => [18, "mph"],  "Eohm" => [18, "ohm"],  "Eoz" => [18, "oz"],
+  "Epc" => [18, "pc"],  "Epercent" => [18, "percent"],
+  "Epermil" => [18, "permil"],  "Epsi" => [18, "psi"],
+  "Erad" => [18, "rad"],  "Es" => [18, "s"],  "Esr" => [18, "sr"],
+  "Et" => [18, "t"],  "Eyr" => [18, "yr"],
+  "Fahrenheits" => [0, "Fahrenheit"],  "G%" => [9, "%"],
+  "GA" => [9, "A"],  "GAu" => [9, "Au"],  "GBq" => [9, "Bq"],
+  "GC" => [9, "C"],  "GF" => [9, "F"],  "GG" => [9, "G"],
+  "GGal" => [9, "Gal"],  "GGy" => [9, "Gy"],  "GH" => [9, "H"],
+  "GHg" => [9, "Hg"],  "GHz" => [9, "Hz"],  "GJ" => [9, "J"],
+  "GK" => [9, "K"],  "GL" => [9, "L"],  "GN" => [9, "N"],
+  "GP" => [9, "P"],  "GPa" => [9, "Pa"],  "GS" => [9, "S"],
+  "GSt" => [9, "St"],  "GSv" => [9, "Sv"],  "GT" => [9, "T"],
+  "GV" => [9, "V"],  "GW" => [9, "W"],  "GWb" => [9, "Wb"],
+  "Ga" => [9, "a"],  "Gac" => [9, "ac"],  "Gatm" => [9, "atm"],
+  "Gbar" => [9, "bar"],  "Gcal" => [9, "cal"],
+  "Gconventional_mercury" => [9, "conventional_mercury"],
+  "Gd" => [9, "d"],  "GdegC" => [9, "degC"],  "GdegF" => [9, "degF"],
+  "Gdeg_C" => [9, "deg_C"],  "Gdeg_F" => [9, "deg_F"],
+  "GdegreeC" => [9, "degreeC"],  "GdegreeF" => [9, "degreeF"],
+  "Gdegree_C" => [9, "degree_C"],  "Gdegree_E" => [9, "degree_E"],
+  "Gdegree_F" => [9, "degree_F"],  "Gdegree_N" => [9, "degree_N"],
+  "Gdegree_R" => [9, "degree_R"],  "Gdegree_S" => [9, "degree_S"],
+  "Gdegree_W" => [9, "degree_W"],  "Gdegree_c" => [9, "degree_c"],
+  "Gdegree_east" => [9, "degree_east"],  "Gdegree_f" => [9, "degree_f"],
+  "Gdegree_north" => [9, "degree_north"],
+  "Gdegree_south" => [9, "degree_south"],
+  "Gdegree_west" => [9, "degree_west"],
+  "Gdegrees_east" => [9, "degrees_east"],
+  "Gdegrees_north" => [9, "degrees_north"],
+  "Gdegrees_south" => [9, "degrees_south"],
+  "Gdegrees_west" => [9, "degrees_west"],  "Gdyn" => [9, "dyn"],
+  "Gerg" => [9, "erg"],  "Gforce" => [9, "force"],  "Gg" => [9, "g"],
+  "Ggravity" => [9, "gravity"],  "Gh" => [9, "h"],  "Ghg" => [9, "hg"],
+  "Ghr" => [9, "hr"],  "Gin" => [9, "in"],  "Gkg" => [9, "kg"],
+  "Gkgf" => [9, "kgf"],  "Gkph" => [9, "kph"],  "Glb" => [9, "lb"],
+  "Glm" => [9, "lm"],  "Glx" => [9, "lx"],  "Gly" => [9, "ly"],
+  "Gm" => [9, "m"],  "Gmb" => [9, "mb"],  "Gmercury" => [9, "mercury"],
+  "Gmgal" => [9, "mgal"],  "Gmin" => [9, "min"],  "Gmol" => [9, "mol"],
+  "Gmon" => [9, "mon"],  "Gmph" => [9, "mph"],  "Gohm" => [9, "ohm"],
+  "Goz" => [9, "oz"],  "Gpc" => [9, "pc"],
+  "Gpercent" => [9, "percent"],  "Gpermil" => [9, "permil"],
+  "Gpsi" => [9, "psi"],  "Grad" => [9, "rad"],  "Gs" => [9, "s"],
+  "Gsr" => [9, "sr"],  "Gt" => [9, "t"],  "Gyr" => [9, "yr"],
+  "Julians_year" => [0, "Julian_year"],  "M%" => [6, "%"],
+  "MA" => [6, "A"],  "MAu" => [6, "Au"],  "MBq" => [6, "Bq"],
+  "MC" => [6, "C"],  "MF" => [6, "F"],  "MG" => [6, "G"],
+  "MGal" => [6, "Gal"],  "MGy" => [6, "Gy"],  "MH" => [6, "H"],
+  "MHg" => [6, "Hg"],  "MHz" => [6, "Hz"],  "MJ" => [6, "J"],
+  "MK" => [6, "K"],  "ML" => [6, "L"],  "MN" => [6, "N"],
+  "MP" => [6, "P"],  "MPa" => [6, "Pa"],  "MS" => [6, "S"],
+  "MSt" => [6, "St"],  "MSv" => [6, "Sv"],  "MT" => [6, "T"],
+  "MV" => [6, "V"],  "MW" => [6, "W"],  "MWb" => [6, "Wb"],
+  "Ma" => [6, "a"],  "Mac" => [6, "ac"],  "Matm" => [6, "atm"],
+  "Mbar" => [6, "bar"],  "Mcal" => [6, "cal"],
+  "Mconventional_mercury" => [6, "conventional_mercury"],
+  "Md" => [6, "d"],  "MdegC" => [6, "degC"],  "MdegF" => [6, "degF"],
+  "Mdeg_C" => [6, "deg_C"],  "Mdeg_F" => [6, "deg_F"],
+  "MdegreeC" => [6, "degreeC"],  "MdegreeF" => [6, "degreeF"],
+  "Mdegree_C" => [6, "degree_C"],  "Mdegree_E" => [6, "degree_E"],
+  "Mdegree_F" => [6, "degree_F"],  "Mdegree_N" => [6, "degree_N"],
+  "Mdegree_R" => [6, "degree_R"],  "Mdegree_S" => [6, "degree_S"],
+  "Mdegree_W" => [6, "degree_W"],  "Mdegree_c" => [6, "degree_c"],
+  "Mdegree_east" => [6, "degree_east"],  "Mdegree_f" => [6, "degree_f"],
+  "Mdegree_north" => [6, "degree_north"],
+  "Mdegree_south" => [6, "degree_south"],
+  "Mdegree_west" => [6, "degree_west"],
+  "Mdegrees_east" => [6, "degrees_east"],
+  "Mdegrees_north" => [6, "degrees_north"],
+  "Mdegrees_south" => [6, "degrees_south"],
+  "Mdegrees_west" => [6, "degrees_west"],  "Mdyn" => [6, "dyn"],
+  "Merg" => [6, "erg"],  "Mforce" => [6, "force"],  "Mg" => [6, "g"],
+  "Mgravity" => [6, "gravity"],  "Mh" => [6, "h"],  "Mhg" => [6, "hg"],
+  "Mhr" => [6, "hr"],  "Min" => [6, "in"],  "Mkg" => [6, "kg"],
+  "Mkgf" => [6, "kgf"],  "Mkph" => [6, "kph"],  "Mlb" => [6, "lb"],
+  "Mlm" => [6, "lm"],  "Mlx" => [6, "lx"],  "Mly" => [6, "ly"],
+  "Mm" => [6, "m"],  "Mmb" => [6, "mb"],  "Mmercury" => [6, "mercury"],
+  "Mmgal" => [6, "mgal"],  "Mmin" => [6, "min"],  "Mmol" => [6, "mol"],
+  "Mmon" => [6, "mon"],  "Mmph" => [6, "mph"],  "Mohm" => [6, "ohm"],
+  "Moz" => [6, "oz"],  "Mpc" => [6, "pc"],
+  "Mpercent" => [6, "percent"],  "Mpermil" => [6, "permil"],
+  "Mpsi" => [6, "psi"],  "Mrad" => [6, "rad"],  "Ms" => [6, "s"],
+  "Msr" => [6, "sr"],  "Mt" => [6, "t"],  "Myr" => [6, "yr"],
+  "P%" => [15, "%"],  "PA" => [15, "A"],  "PAu" => [15, "Au"],
+  "PBq" => [15, "Bq"],  "PC" => [15, "C"],  "PF" => [15, "F"],
+  "PG" => [15, "G"],  "PGal" => [15, "Gal"],  "PGy" => [15, "Gy"],
+  "PH" => [15, "H"],  "PHg" => [15, "Hg"],  "PHz" => [15, "Hz"],
+  "PJ" => [15, "J"],  "PK" => [15, "K"],  "PL" => [15, "L"],
+  "PN" => [15, "N"],  "PP" => [15, "P"],  "PPa" => [15, "Pa"],
+  "PS" => [15, "S"],  "PSt" => [15, "St"],  "PSv" => [15, "Sv"],
+  "PT" => [15, "T"],  "PV" => [15, "V"],  "PW" => [15, "W"],
+  "PWb" => [15, "Wb"],  "Pa" => [15, "a"],  "Pac" => [15, "ac"],
+  "Pascals" => [0, "Pascal"],  "Patm" => [15, "atm"],
+  "Pbar" => [15, "bar"],  "Pcal" => [15, "cal"],
+  "Pconventional_mercury" => [15, "conventional_mercury"],
+  "Pd" => [15, "d"],  "PdegC" => [15, "degC"],  "PdegF" => [15, "degF"],
+  "Pdeg_C" => [15, "deg_C"],  "Pdeg_F" => [15, "deg_F"],
+  "PdegreeC" => [15, "degreeC"],  "PdegreeF" => [15, "degreeF"],
+  "Pdegree_C" => [15, "degree_C"],  "Pdegree_E" => [15, "degree_E"],
+  "Pdegree_F" => [15, "degree_F"],  "Pdegree_N" => [15, "degree_N"],
+  "Pdegree_R" => [15, "degree_R"],  "Pdegree_S" => [15, "degree_S"],
+  "Pdegree_W" => [15, "degree_W"],  "Pdegree_c" => [15, "degree_c"],
+  "Pdegree_east" => [15, "degree_east"],
+  "Pdegree_f" => [15, "degree_f"],
+  "Pdegree_north" => [15, "degree_north"],
+  "Pdegree_south" => [15, "degree_south"],
+  "Pdegree_west" => [15, "degree_west"],
+  "Pdegrees_east" => [15, "degrees_east"],
+  "Pdegrees_north" => [15, "degrees_north"],
+  "Pdegrees_south" => [15, "degrees_south"],
+  "Pdegrees_west" => [15, "degrees_west"],  "Pdyn" => [15, "dyn"],
+  "Perg" => [15, "erg"],  "Pforce" => [15, "force"],  "Pg" => [15, "g"],
+  "Pgravity" => [15, "gravity"],  "Ph" => [15, "h"],
+  "Phg" => [15, "hg"],  "Phr" => [15, "hr"],  "Pin" => [15, "in"],
+  "Pkg" => [15, "kg"],  "Pkgf" => [15, "kgf"],  "Pkph" => [15, "kph"],
+  "Plb" => [15, "lb"],  "Plm" => [15, "lm"],  "Plx" => [15, "lx"],
+  "Ply" => [15, "ly"],  "Pm" => [15, "m"],  "Pmb" => [15, "mb"],
+  "Pmercury" => [15, "mercury"],  "Pmgal" => [15, "mgal"],
+  "Pmin" => [15, "min"],  "Pmol" => [15, "mol"],  "Pmon" => [15, "mon"],
+  "Pmph" => [15, "mph"],  "Pohm" => [15, "ohm"],  "Poz" => [15, "oz"],
+  "Ppc" => [15, "pc"],  "Ppercent" => [15, "percent"],
+  "Ppermil" => [15, "permil"],  "Ppsi" => [15, "psi"],
+  "Prad" => [15, "rad"],  "Ps" => [15, "s"],  "Psr" => [15, "sr"],
+  "Pt" => [15, "t"],  "Pyr" => [15, "yr"],  "T%" => [12, "%"],
+  "TA" => [12, "A"],  "TAu" => [12, "Au"],  "TBq" => [12, "Bq"],
+  "TC" => [12, "C"],  "TF" => [12, "F"],  "TG" => [12, "G"],
+  "TGal" => [12, "Gal"],  "TGy" => [12, "Gy"],  "TH" => [12, "H"],
+  "THg" => [12, "Hg"],  "THz" => [12, "Hz"],  "TJ" => [12, "J"],
+  "TK" => [12, "K"],  "TL" => [12, "L"],  "TN" => [12, "N"],
+  "TP" => [12, "P"],  "TPa" => [12, "Pa"],  "TS" => [12, "S"],
+  "TSt" => [12, "St"],  "TSv" => [12, "Sv"],  "TT" => [12, "T"],
+  "TV" => [12, "V"],  "TW" => [12, "W"],  "TWb" => [12, "Wb"],
+  "Ta" => [12, "a"],  "Tac" => [12, "ac"],  "Tatm" => [12, "atm"],
+  "Tbar" => [12, "bar"],  "Tcal" => [12, "cal"],
+  "Tconventional_mercury" => [12, "conventional_mercury"],
+  "Td" => [12, "d"],  "TdegC" => [12, "degC"],  "TdegF" => [12, "degF"],
+  "Tdeg_C" => [12, "deg_C"],  "Tdeg_F" => [12, "deg_F"],
+  "TdegreeC" => [12, "degreeC"],  "TdegreeF" => [12, "degreeF"],
+  "Tdegree_C" => [12, "degree_C"],  "Tdegree_E" => [12, "degree_E"],
+  "Tdegree_F" => [12, "degree_F"],  "Tdegree_N" => [12, "degree_N"],
+  "Tdegree_R" => [12, "degree_R"],  "Tdegree_S" => [12, "degree_S"],
+  "Tdegree_W" => [12, "degree_W"],  "Tdegree_c" => [12, "degree_c"],
+  "Tdegree_east" => [12, "degree_east"],
+  "Tdegree_f" => [12, "degree_f"],
+  "Tdegree_north" => [12, "degree_north"],
+  "Tdegree_south" => [12, "degree_south"],
+  "Tdegree_west" => [12, "degree_west"],
+  "Tdegrees_east" => [12, "degrees_east"],
+  "Tdegrees_north" => [12, "degrees_north"],
+  "Tdegrees_south" => [12, "degrees_south"],
+  "Tdegrees_west" => [12, "degrees_west"],  "Tdyn" => [12, "dyn"],
+  "Terg" => [12, "erg"],  "Tforce" => [12, "force"],  "Tg" => [12, "g"],
+  "Tgravity" => [12, "gravity"],  "Th" => [12, "h"],
+  "Thg" => [12, "hg"],  "Thr" => [12, "hr"],  "Tin" => [12, "in"],
+  "Tkg" => [12, "kg"],  "Tkgf" => [12, "kgf"],  "Tkph" => [12, "kph"],
+  "Tlb" => [12, "lb"],  "Tlm" => [12, "lm"],  "Tlx" => [12, "lx"],
+  "Tly" => [12, "ly"],  "Tm" => [12, "m"],  "Tmb" => [12, "mb"],
+  "Tmercury" => [12, "mercury"],  "Tmgal" => [12, "mgal"],
+  "Tmin" => [12, "min"],  "Tmol" => [12, "mol"],  "Tmon" => [12, "mon"],
+  "Tmph" => [12, "mph"],  "Tohm" => [12, "ohm"],  "Toz" => [12, "oz"],
+  "Tpc" => [12, "pc"],  "Tpercent" => [12, "percent"],
+  "Tpermil" => [12, "permil"],  "Tpsi" => [12, "psi"],
+  "Trad" => [12, "rad"],  "Ts" => [12, "s"],  "Tsr" => [12, "sr"],
+  "Tt" => [12, "t"],  "Tyr" => [12, "yr"],  "a%" => [-18, "%"],
+  "aA" => [-18, "A"],  "aAu" => [-18, "Au"],  "aBq" => [-18, "Bq"],
+  "aC" => [-18, "C"],  "aF" => [-18, "F"],  "aG" => [-18, "G"],
+  "aGal" => [-18, "Gal"],  "aGy" => [-18, "Gy"],  "aH" => [-18, "H"],
+  "aHg" => [-18, "Hg"],  "aHz" => [-18, "Hz"],  "aJ" => [-18, "J"],
+  "aK" => [-18, "K"],  "aL" => [-18, "L"],  "aN" => [-18, "N"],
+  "aP" => [-18, "P"],  "aPa" => [-18, "Pa"],  "aS" => [-18, "S"],
+  "aSt" => [-18, "St"],  "aSv" => [-18, "Sv"],  "aT" => [-18, "T"],
+  "aV" => [-18, "V"],  "aW" => [-18, "W"],  "aWb" => [-18, "Wb"],
+  "aa" => [-18, "a"],  "aac" => [-18, "ac"],  "aatm" => [-18, "atm"],
+  "abar" => [-18, "bar"],  "acal" => [-18, "cal"],
+  "aconventional_mercury" => [-18, "conventional_mercury"],
+  "acres" => [0, "acre"],  "ad" => [-18, "d"],
+  "adegC" => [-18, "degC"],  "adegF" => [-18, "degF"],
+  "adeg_C" => [-18, "deg_C"],  "adeg_F" => [-18, "deg_F"],
+  "adegreeC" => [-18, "degreeC"],  "adegreeF" => [-18, "degreeF"],
+  "adegree_C" => [-18, "degree_C"],  "adegree_E" => [-18, "degree_E"],
+  "adegree_F" => [-18, "degree_F"],  "adegree_N" => [-18, "degree_N"],
+  "adegree_R" => [-18, "degree_R"],  "adegree_S" => [-18, "degree_S"],
+  "adegree_W" => [-18, "degree_W"],  "adegree_c" => [-18, "degree_c"],
+  "adegree_east" => [-18, "degree_east"],
+  "adegree_f" => [-18, "degree_f"],
+  "adegree_north" => [-18, "degree_north"],
+  "adegree_south" => [-18, "degree_south"],
+  "adegree_west" => [-18, "degree_west"],
+  "adegrees_east" => [-18, "degrees_east"],
+  "adegrees_north" => [-18, "degrees_north"],
+  "adegrees_south" => [-18, "degrees_south"],
+  "adegrees_west" => [-18, "degrees_west"],  "adyn" => [-18, "dyn"],
+  "aerg" => [-18, "erg"],  "aforce" => [-18, "force"],
+  "ag" => [-18, "g"],  "agravity" => [-18, "gravity"],
+  "ah" => [-18, "h"],  "ahg" => [-18, "hg"],  "ahr" => [-18, "hr"],
+  "ain" => [-18, "in"],  "akg" => [-18, "kg"],  "akgf" => [-18, "kgf"],
+  "akph" => [-18, "kph"],  "alb" => [-18, "lb"],  "alm" => [-18, "lm"],
+  "alx" => [-18, "lx"],  "aly" => [-18, "ly"],  "am" => [-18, "m"],
+  "amb" => [-18, "mb"],  "amercury" => [-18, "mercury"],
+  "amgal" => [-18, "mgal"],  "amin" => [-18, "min"],
+  "amol" => [-18, "mol"],  "amon" => [-18, "mon"],
+  "amperes" => [0, "ampere"],  "amph" => [-18, "mph"],
+  "angstroms" => [0, "angstrom"],
+  "angulars_degree" => [0, "angular_degree"],
+  "angulars_minute" => [0, "angular_minute"],
+  "angulars_second" => [0, "angular_second"],  "aohm" => [-18, "ohm"],
+  "aoz" => [-18, "oz"],  "apc" => [-18, "pc"],
+  "apercent" => [-18, "percent"],  "apermil" => [-18, "permil"],
+  "apsi" => [-18, "psi"],  "arad" => [-18, "rad"],
+  "ares" => [0, "are"],  "as" => [-18, "s"],  "asr" => [-18, "sr"],
+  "at" => [-18, "t"],  "atmospheres" => [0, "atmosphere"],
+  "attoCelsius" => [-18, "Celsius"],
+  "attoFahrenheit" => [-18, "Fahrenheit"],
+  "attoJulian_year" => [-18, "Julian_year"],
+  "attoPascal" => [-18, "Pascal"],  "attoacre" => [-18, "acre"],
+  "attoampere" => [-18, "ampere"],  "attoangstrom" => [-18, "angstrom"],
+  "attoangular_degree" => [-18, "angular_degree"],
+  "attoangular_minute" => [-18, "angular_minute"],
+  "attoangular_second" => [-18, "angular_second"],
+  "attoare" => [-18, "are"],  "attoatmosphere" => [-18, "atmosphere"],
+  "attocalorie" => [-18, "calorie"],  "attocelsius" => [-18, "celsius"],
+  "attocentigrade" => [-18, "centigrade"],
+  "attocentury" => [-18, "century"],  "attochain" => [-18, "chain"],
+  "attocommon_year" => [-18, "common_year"],
+  "attocoulomb" => [-18, "coulomb"],  "attoday" => [-18, "day"],
+  "attodegK" => [-18, "degK"],  "attodeg_K" => [-18, "deg_K"],
+  "attodegree" => [-18, "degree"],  "attodegreeK" => [-18, "degreeK"],
+  "attodyne" => [-18, "dyne"],  "attoerg" => [-18, "erg"],
+  "attofahrenheit" => [-18, "fahrenheit"],
+  "attofarad" => [-18, "farad"],  "attofermi" => [-18, "fermi"],
+  "attogal" => [-18, "gal"],  "attogauss" => [-18, "gauss"],
+  "attogram" => [-18, "gram"],  "attohectare" => [-18, "hectare"],
+  "attohertz" => [-18, "hertz"],  "attohour" => [-18, "hour"],
+  "attoinch" => [-18, "inch"],  "attojoule" => [-18, "joule"],
+  "attokelvin" => [-18, "kelvin"],  "attokilogram" => [-18, "kilogram"],
+  "attoknot" => [-18, "knot"],  "attolitre" => [-18, "litre"],
+  "attometer" => [-18, "meter"],  "attometre" => [-18, "metre"],
+  "attomicron" => [-18, "micron"],  "attomile" => [-18, "mile"],
+  "attomillibar" => [-18, "millibar"],  "attominute" => [-18, "minute"],
+  "attominute_angle" => [-18, "minute_angle"],
+  "attomole" => [-18, "mole"],  "attomonth" => [-18, "month"],
+  "attonewton" => [-18, "newton"],  "attoounce" => [-18, "ounce"],
+  "attoparsec" => [-18, "parsec"],  "attopascal" => [-18, "pascal"],
+  "attopentad" => [-18, "pentad"],  "attopoise" => [-18, "poise"],
+  "attopound" => [-18, "pound"],  "attoradian" => [-18, "radian"],
+  "attosecond" => [-18, "second"],
+  "attosecond_angle" => [-18, "second_angle"],
+  "attosteradian" => [-18, "steradian"],
+  "attostokes" => [-18, "stokes"],  "attotesla" => [-18, "tesla"],
+  "attoton" => [-18, "ton"],  "attotonne" => [-18, "tonne"],
+  "attotorr" => [-18, "torr"],  "attovolt" => [-18, "volt"],
+  "attowatt" => [-18, "watt"],  "attoweber" => [-18, "weber"],
+  "attoyard" => [-18, "yard"],  "attoyd" => [-18, "yd"],
+  "attoyear" => [-18, "year"],  "ayr" => [-18, "yr"],
+  "c%" => [-2, "%"],  "cA" => [-2, "A"],  "cAu" => [-2, "Au"],
+  "cBq" => [-2, "Bq"],  "cC" => [-2, "C"],  "cF" => [-2, "F"],
+  "cG" => [-2, "G"],  "cGal" => [-2, "Gal"],  "cGy" => [-2, "Gy"],
+  "cH" => [-2, "H"],  "cHg" => [-2, "Hg"],  "cHz" => [-2, "Hz"],
+  "cJ" => [-2, "J"],  "cK" => [-2, "K"],  "cL" => [-2, "L"],
+  "cN" => [-2, "N"],  "cP" => [-2, "P"],  "cPa" => [-2, "Pa"],
+  "cS" => [-2, "S"],  "cSt" => [-2, "St"],  "cSv" => [-2, "Sv"],
+  "cT" => [-2, "T"],  "cV" => [-2, "V"],  "cW" => [-2, "W"],
+  "cWb" => [-2, "Wb"],  "ca" => [-2, "a"],  "cac" => [-2, "ac"],
+  "calories" => [0, "calorie"],  "catm" => [-2, "atm"],
+  "cbar" => [-2, "bar"],  "ccal" => [-2, "cal"],
+  "cconventional_mercury" => [-2, "conventional_mercury"],
+  "cd" => [-2, "d"],  "cdegC" => [-2, "degC"],  "cdegF" => [-2, "degF"],
+  "cdeg_C" => [-2, "deg_C"],  "cdeg_F" => [-2, "deg_F"],
+  "cdegreeC" => [-2, "degreeC"],  "cdegreeF" => [-2, "degreeF"],
+  "cdegree_C" => [-2, "degree_C"],  "cdegree_E" => [-2, "degree_E"],
+  "cdegree_F" => [-2, "degree_F"],  "cdegree_N" => [-2, "degree_N"],
+  "cdegree_R" => [-2, "degree_R"],  "cdegree_S" => [-2, "degree_S"],
+  "cdegree_W" => [-2, "degree_W"],  "cdegree_c" => [-2, "degree_c"],
+  "cdegree_east" => [-2, "degree_east"],
+  "cdegree_f" => [-2, "degree_f"],
+  "cdegree_north" => [-2, "degree_north"],
+  "cdegree_south" => [-2, "degree_south"],
+  "cdegree_west" => [-2, "degree_west"],
+  "cdegrees_east" => [-2, "degrees_east"],
+  "cdegrees_north" => [-2, "degrees_north"],
+  "cdegrees_south" => [-2, "degrees_south"],
+  "cdegrees_west" => [-2, "degrees_west"],  "cdyn" => [-2, "dyn"],
+  "celsiuses" => [0, "celsius"],  "centiCelsius" => [-2, "Celsius"],
+  "centiFahrenheit" => [-2, "Fahrenheit"],
+  "centiJulian_year" => [-2, "Julian_year"],
+  "centiPascal" => [-2, "Pascal"],  "centiacre" => [-2, "acre"],
+  "centiampere" => [-2, "ampere"],  "centiangstrom" => [-2, "angstrom"],
+  "centiangular_degree" => [-2, "angular_degree"],
+  "centiangular_minute" => [-2, "angular_minute"],
+  "centiangular_second" => [-2, "angular_second"],
+  "centiare" => [-2, "are"],  "centiatmosphere" => [-2, "atmosphere"],
+  "centicalorie" => [-2, "calorie"],  "centicelsius" => [-2, "celsius"],
+  "centicentigrade" => [-2, "centigrade"],
+  "centicentury" => [-2, "century"],  "centichain" => [-2, "chain"],
+  "centicommon_year" => [-2, "common_year"],
+  "centicoulomb" => [-2, "coulomb"],  "centiday" => [-2, "day"],
+  "centidegK" => [-2, "degK"],  "centideg_K" => [-2, "deg_K"],
+  "centidegree" => [-2, "degree"],  "centidegreeK" => [-2, "degreeK"],
+  "centidyne" => [-2, "dyne"],  "centierg" => [-2, "erg"],
+  "centifahrenheit" => [-2, "fahrenheit"],
+  "centifarad" => [-2, "farad"],  "centifermi" => [-2, "fermi"],
+  "centigal" => [-2, "gal"],  "centigauss" => [-2, "gauss"],
+  "centigrades" => [0, "centigrade"],  "centigram" => [-2, "gram"],
+  "centihectare" => [-2, "hectare"],  "centihertz" => [-2, "hertz"],
+  "centihour" => [-2, "hour"],  "centiinch" => [-2, "inch"],
+  "centijoule" => [-2, "joule"],  "centikelvin" => [-2, "kelvin"],
+  "centikilogram" => [-2, "kilogram"],  "centiknot" => [-2, "knot"],
+  "centilitre" => [-2, "litre"],  "centimeter" => [-2, "meter"],
+  "centimetre" => [-2, "metre"],  "centimicron" => [-2, "micron"],
+  "centimile" => [-2, "mile"],  "centimillibar" => [-2, "millibar"],
+  "centiminute" => [-2, "minute"],
+  "centiminute_angle" => [-2, "minute_angle"],
+  "centimole" => [-2, "mole"],  "centimonth" => [-2, "month"],
+  "centinewton" => [-2, "newton"],  "centiounce" => [-2, "ounce"],
+  "centiparsec" => [-2, "parsec"],  "centipascal" => [-2, "pascal"],
+  "centipentad" => [-2, "pentad"],  "centipoise" => [-2, "poise"],
+  "centipound" => [-2, "pound"],  "centiradian" => [-2, "radian"],
+  "centisecond" => [-2, "second"],
+  "centisecond_angle" => [-2, "second_angle"],
+  "centisteradian" => [-2, "steradian"],
+  "centistokes" => [-2, "stokes"],  "centitesla" => [-2, "tesla"],
+  "centiton" => [-2, "ton"],  "centitonne" => [-2, "tonne"],
+  "centitorr" => [-2, "torr"],  "centivolt" => [-2, "volt"],
+  "centiwatt" => [-2, "watt"],  "centiweber" => [-2, "weber"],
+  "centiyard" => [-2, "yard"],  "centiyd" => [-2, "yd"],
+  "centiyear" => [-2, "year"],  "centuries" => [0, "century"],
+  "cerg" => [-2, "erg"],  "cforce" => [-2, "force"],  "cg" => [-2, "g"],
+  "cgravity" => [-2, "gravity"],  "ch" => [-2, "h"],
+  "chains" => [0, "chain"],  "chg" => [-2, "hg"],  "chr" => [-2, "hr"],
+  "cin" => [-2, "in"],  "ckg" => [-2, "kg"],  "ckgf" => [-2, "kgf"],
+  "ckph" => [-2, "kph"],  "clb" => [-2, "lb"],  "clm" => [-2, "lm"],
+  "clx" => [-2, "lx"],  "cly" => [-2, "ly"],  "cm" => [-2, "m"],
+  "cmb" => [-2, "mb"],  "cmercury" => [-2, "mercury"],
+  "cmgal" => [-2, "mgal"],  "cmin" => [-2, "min"],
+  "cmol" => [-2, "mol"],  "cmon" => [-2, "mon"],  "cmph" => [-2, "mph"],
+  "cohm" => [-2, "ohm"],  "commons_year" => [0, "common_year"],
+  "coulombs" => [0, "coulomb"],  "coz" => [-2, "oz"],
+  "cpc" => [-2, "pc"],  "cpercent" => [-2, "percent"],
+  "cpermil" => [-2, "permil"],  "cpsi" => [-2, "psi"],
+  "crad" => [-2, "rad"],  "cs" => [-2, "s"],  "csr" => [-2, "sr"],
+  "ct" => [-2, "t"],  "cyr" => [-2, "yr"],  "d%" => [-1, "%"],
+  "dA" => [-1, "A"],  "dAu" => [-1, "Au"],  "dBq" => [-1, "Bq"],
+  "dC" => [-1, "C"],  "dF" => [-1, "F"],  "dG" => [-1, "G"],
+  "dGal" => [-1, "Gal"],  "dGy" => [-1, "Gy"],  "dH" => [-1, "H"],
+  "dHg" => [-1, "Hg"],  "dHz" => [-1, "Hz"],  "dJ" => [-1, "J"],
+  "dK" => [-1, "K"],  "dL" => [-1, "L"],  "dN" => [-1, "N"],
+  "dP" => [-1, "P"],  "dPa" => [-1, "Pa"],  "dS" => [-1, "S"],
+  "dSt" => [-1, "St"],  "dSv" => [-1, "Sv"],  "dT" => [-1, "T"],
+  "dV" => [-1, "V"],  "dW" => [-1, "W"],  "dWb" => [-1, "Wb"],
+  "da" => [-1, "a"],  "da%" => [1, "%"],  "daA" => [1, "A"],
+  "daAu" => [1, "Au"],  "daBq" => [1, "Bq"],  "daC" => [1, "C"],
+  "daF" => [1, "F"],  "daG" => [1, "G"],  "daGal" => [1, "Gal"],
+  "daGy" => [1, "Gy"],  "daH" => [1, "H"],  "daHg" => [1, "Hg"],
+  "daHz" => [1, "Hz"],  "daJ" => [1, "J"],  "daK" => [1, "K"],
+  "daL" => [1, "L"],  "daN" => [1, "N"],  "daP" => [1, "P"],
+  "daPa" => [1, "Pa"],  "daS" => [1, "S"],  "daSt" => [1, "St"],
+  "daSv" => [1, "Sv"],  "daT" => [1, "T"],  "daV" => [1, "V"],
+  "daW" => [1, "W"],  "daWb" => [1, "Wb"],  "daa" => [1, "a"],
+  "daac" => [1, "ac"],  "daatm" => [1, "atm"],  "dabar" => [1, "bar"],
+  "dac" => [-1, "ac"],  "dacal" => [1, "cal"],
+  "daconventional_mercury" => [1, "conventional_mercury"],
+  "dad" => [1, "d"],  "dadegC" => [1, "degC"],  "dadegF" => [1, "degF"],
+  "dadeg_C" => [1, "deg_C"],  "dadeg_F" => [1, "deg_F"],
+  "dadegreeC" => [1, "degreeC"],  "dadegreeF" => [1, "degreeF"],
+  "dadegree_C" => [1, "degree_C"],  "dadegree_E" => [1, "degree_E"],
+  "dadegree_F" => [1, "degree_F"],  "dadegree_N" => [1, "degree_N"],
+  "dadegree_R" => [1, "degree_R"],  "dadegree_S" => [1, "degree_S"],
+  "dadegree_W" => [1, "degree_W"],  "dadegree_c" => [1, "degree_c"],
+  "dadegree_east" => [1, "degree_east"],
+  "dadegree_f" => [1, "degree_f"],
+  "dadegree_north" => [1, "degree_north"],
+  "dadegree_south" => [1, "degree_south"],
+  "dadegree_west" => [1, "degree_west"],
+  "dadegrees_east" => [1, "degrees_east"],
+  "dadegrees_north" => [1, "degrees_north"],
+  "dadegrees_south" => [1, "degrees_south"],
+  "dadegrees_west" => [1, "degrees_west"],  "dadyn" => [1, "dyn"],
+  "daerg" => [1, "erg"],  "daforce" => [1, "force"],  "dag" => [1, "g"],
+  "dagravity" => [1, "gravity"],  "dah" => [1, "h"],
+  "dahg" => [1, "hg"],  "dahr" => [1, "hr"],  "dain" => [1, "in"],
+  "dakg" => [1, "kg"],  "dakgf" => [1, "kgf"],  "dakph" => [1, "kph"],
+  "dalb" => [1, "lb"],  "dalm" => [1, "lm"],  "dalx" => [1, "lx"],
+  "daly" => [1, "ly"],  "dam" => [1, "m"],  "damb" => [1, "mb"],
+  "damercury" => [1, "mercury"],  "damgal" => [1, "mgal"],
+  "damin" => [1, "min"],  "damol" => [1, "mol"],  "damon" => [1, "mon"],
+  "damph" => [1, "mph"],  "daohm" => [1, "ohm"],  "daoz" => [1, "oz"],
+  "dapc" => [1, "pc"],  "dapercent" => [1, "percent"],
+  "dapermil" => [1, "permil"],  "dapsi" => [1, "psi"],
+  "darad" => [1, "rad"],  "das" => [1, "s"],  "dasr" => [1, "sr"],
+  "dat" => [1, "t"],  "datm" => [-1, "atm"],  "dayr" => [1, "yr"],
+  "days" => [0, "day"],  "dbar" => [-1, "bar"],  "dcal" => [-1, "cal"],
+  "dconventional_mercury" => [-1, "conventional_mercury"],
+  "dd" => [-1, "d"],  "ddegC" => [-1, "degC"],  "ddegF" => [-1, "degF"],
+  "ddeg_C" => [-1, "deg_C"],  "ddeg_F" => [-1, "deg_F"],
+  "ddegreeC" => [-1, "degreeC"],  "ddegreeF" => [-1, "degreeF"],
+  "ddegree_C" => [-1, "degree_C"],  "ddegree_E" => [-1, "degree_E"],
+  "ddegree_F" => [-1, "degree_F"],  "ddegree_N" => [-1, "degree_N"],
+  "ddegree_R" => [-1, "degree_R"],  "ddegree_S" => [-1, "degree_S"],
+  "ddegree_W" => [-1, "degree_W"],  "ddegree_c" => [-1, "degree_c"],
+  "ddegree_east" => [-1, "degree_east"],
+  "ddegree_f" => [-1, "degree_f"],
+  "ddegree_north" => [-1, "degree_north"],
+  "ddegree_south" => [-1, "degree_south"],
+  "ddegree_west" => [-1, "degree_west"],
+  "ddegrees_east" => [-1, "degrees_east"],
+  "ddegrees_north" => [-1, "degrees_north"],
+  "ddegrees_south" => [-1, "degrees_south"],
+  "ddegrees_west" => [-1, "degrees_west"],  "ddyn" => [-1, "dyn"],
+  "decaCelsius" => [1, "Celsius"],
+  "decaFahrenheit" => [1, "Fahrenheit"],
+  "decaJulian_year" => [1, "Julian_year"],
+  "decaPascal" => [1, "Pascal"],  "decaacre" => [1, "acre"],
+  "decaampere" => [1, "ampere"],  "decaangstrom" => [1, "angstrom"],
+  "decaangular_degree" => [1, "angular_degree"],
+  "decaangular_minute" => [1, "angular_minute"],
+  "decaangular_second" => [1, "angular_second"],
+  "decaare" => [1, "are"],  "decaatmosphere" => [1, "atmosphere"],
+  "decacalorie" => [1, "calorie"],  "decacelsius" => [1, "celsius"],
+  "decacentigrade" => [1, "centigrade"],
+  "decacentury" => [1, "century"],  "decachain" => [1, "chain"],
+  "decacommon_year" => [1, "common_year"],
+  "decacoulomb" => [1, "coulomb"],  "decaday" => [1, "day"],
+  "decadegK" => [1, "degK"],  "decadeg_K" => [1, "deg_K"],
+  "decadegree" => [1, "degree"],  "decadegreeK" => [1, "degreeK"],
+  "decadyne" => [1, "dyne"],  "decaerg" => [1, "erg"],
+  "decafahrenheit" => [1, "fahrenheit"],  "decafarad" => [1, "farad"],
+  "decafermi" => [1, "fermi"],  "decagal" => [1, "gal"],
+  "decagauss" => [1, "gauss"],  "decagram" => [1, "gram"],
+  "decahectare" => [1, "hectare"],  "decahertz" => [1, "hertz"],
+  "decahour" => [1, "hour"],  "decainch" => [1, "inch"],
+  "decajoule" => [1, "joule"],  "decakelvin" => [1, "kelvin"],
+  "decakilogram" => [1, "kilogram"],  "decaknot" => [1, "knot"],
+  "decalitre" => [1, "litre"],  "decameter" => [1, "meter"],
+  "decametre" => [1, "metre"],  "decamicron" => [1, "micron"],
+  "decamile" => [1, "mile"],  "decamillibar" => [1, "millibar"],
+  "decaminute" => [1, "minute"],
+  "decaminute_angle" => [1, "minute_angle"],  "decamole" => [1, "mole"],
+  "decamonth" => [1, "month"],  "decanewton" => [1, "newton"],
+  "decaounce" => [1, "ounce"],  "decaparsec" => [1, "parsec"],
+  "decapascal" => [1, "pascal"],  "decapentad" => [1, "pentad"],
+  "decapoise" => [1, "poise"],  "decapound" => [1, "pound"],
+  "decaradian" => [1, "radian"],  "decasecond" => [1, "second"],
+  "decasecond_angle" => [1, "second_angle"],
+  "decasteradian" => [1, "steradian"],  "decastokes" => [1, "stokes"],
+  "decatesla" => [1, "tesla"],  "decaton" => [1, "ton"],
+  "decatonne" => [1, "tonne"],  "decatorr" => [1, "torr"],
+  "decavolt" => [1, "volt"],  "decawatt" => [1, "watt"],
+  "decaweber" => [1, "weber"],  "decayard" => [1, "yard"],
+  "decayd" => [1, "yd"],  "decayear" => [1, "year"],
+  "deciCelsius" => [-1, "Celsius"],
+  "deciFahrenheit" => [-1, "Fahrenheit"],
+  "deciJulian_year" => [-1, "Julian_year"],
+  "deciPascal" => [-1, "Pascal"],  "deciacre" => [-1, "acre"],
+  "deciampere" => [-1, "ampere"],  "deciangstrom" => [-1, "angstrom"],
+  "deciangular_degree" => [-1, "angular_degree"],
+  "deciangular_minute" => [-1, "angular_minute"],
+  "deciangular_second" => [-1, "angular_second"],
+  "deciare" => [-1, "are"],  "deciatmosphere" => [-1, "atmosphere"],
+  "decicalorie" => [-1, "calorie"],  "decicelsius" => [-1, "celsius"],
+  "decicentigrade" => [-1, "centigrade"],
+  "decicentury" => [-1, "century"],  "decichain" => [-1, "chain"],
+  "decicommon_year" => [-1, "common_year"],
+  "decicoulomb" => [-1, "coulomb"],  "deciday" => [-1, "day"],
+  "decidegK" => [-1, "degK"],  "decideg_K" => [-1, "deg_K"],
+  "decidegree" => [-1, "degree"],  "decidegreeK" => [-1, "degreeK"],
+  "decidyne" => [-1, "dyne"],  "decierg" => [-1, "erg"],
+  "decifahrenheit" => [-1, "fahrenheit"],  "decifarad" => [-1, "farad"],
+  "decifermi" => [-1, "fermi"],  "decigal" => [-1, "gal"],
+  "decigauss" => [-1, "gauss"],  "decigram" => [-1, "gram"],
+  "decihectare" => [-1, "hectare"],  "decihertz" => [-1, "hertz"],
+  "decihour" => [-1, "hour"],  "deciinch" => [-1, "inch"],
+  "decijoule" => [-1, "joule"],  "decikelvin" => [-1, "kelvin"],
+  "decikilogram" => [-1, "kilogram"],  "deciknot" => [-1, "knot"],
+  "decilitre" => [-1, "litre"],  "decimeter" => [-1, "meter"],
+  "decimetre" => [-1, "metre"],  "decimicron" => [-1, "micron"],
+  "decimile" => [-1, "mile"],  "decimillibar" => [-1, "millibar"],
+  "deciminute" => [-1, "minute"],
+  "deciminute_angle" => [-1, "minute_angle"],
+  "decimole" => [-1, "mole"],  "decimonth" => [-1, "month"],
+  "decinewton" => [-1, "newton"],  "deciounce" => [-1, "ounce"],
+  "deciparsec" => [-1, "parsec"],  "decipascal" => [-1, "pascal"],
+  "decipentad" => [-1, "pentad"],  "decipoise" => [-1, "poise"],
+  "decipound" => [-1, "pound"],  "deciradian" => [-1, "radian"],
+  "decisecond" => [-1, "second"],
+  "decisecond_angle" => [-1, "second_angle"],
+  "decisteradian" => [-1, "steradian"],  "decistokes" => [-1, "stokes"],
+  "decitesla" => [-1, "tesla"],  "deciton" => [-1, "ton"],
+  "decitonne" => [-1, "tonne"],  "decitorr" => [-1, "torr"],
+  "decivolt" => [-1, "volt"],  "deciwatt" => [-1, "watt"],
+  "deciweber" => [-1, "weber"],  "deciyard" => [-1, "yard"],
+  "deciyd" => [-1, "yd"],  "deciyear" => [-1, "year"],
+  "degKs" => [0, "degK"],  "degreeKs" => [0, "degreeK"],
+  "degrees" => [0, "degree"],  "degs_K" => [0, "deg_K"],
+  "derg" => [-1, "erg"],  "dforce" => [-1, "force"],  "dg" => [-1, "g"],
+  "dgravity" => [-1, "gravity"],  "dh" => [-1, "h"],
+  "dhg" => [-1, "hg"],  "dhr" => [-1, "hr"],  "din" => [-1, "in"],
+  "dkg" => [-1, "kg"],  "dkgf" => [-1, "kgf"],  "dkph" => [-1, "kph"],
+  "dlb" => [-1, "lb"],  "dlm" => [-1, "lm"],  "dlx" => [-1, "lx"],
+  "dly" => [-1, "ly"],  "dm" => [-1, "m"],  "dmb" => [-1, "mb"],
+  "dmercury" => [-1, "mercury"],  "dmgal" => [-1, "mgal"],
+  "dmin" => [-1, "min"],  "dmol" => [-1, "mol"],  "dmon" => [-1, "mon"],
+  "dmph" => [-1, "mph"],  "dohm" => [-1, "ohm"],  "doz" => [-1, "oz"],
+  "dpc" => [-1, "pc"],  "dpercent" => [-1, "percent"],
+  "dpermil" => [-1, "permil"],  "dpsi" => [-1, "psi"],
+  "drad" => [-1, "rad"],  "ds" => [-1, "s"],  "dsr" => [-1, "sr"],
+  "dt" => [-1, "t"],  "dynes" => [0, "dyne"],  "dyr" => [-1, "yr"],
+  "ergs" => [0, "erg"],  "exaCelsius" => [18, "Celsius"],
+  "exaFahrenheit" => [18, "Fahrenheit"],
+  "exaJulian_year" => [18, "Julian_year"],
+  "exaPascal" => [18, "Pascal"],  "exaacre" => [18, "acre"],
+  "exaampere" => [18, "ampere"],  "exaangstrom" => [18, "angstrom"],
+  "exaangular_degree" => [18, "angular_degree"],
+  "exaangular_minute" => [18, "angular_minute"],
+  "exaangular_second" => [18, "angular_second"],
+  "exaare" => [18, "are"],  "exaatmosphere" => [18, "atmosphere"],
+  "exacalorie" => [18, "calorie"],  "exacelsius" => [18, "celsius"],
+  "exacentigrade" => [18, "centigrade"],
+  "exacentury" => [18, "century"],  "exachain" => [18, "chain"],
+  "exacommon_year" => [18, "common_year"],
+  "exacoulomb" => [18, "coulomb"],  "exaday" => [18, "day"],
+  "exadegK" => [18, "degK"],  "exadeg_K" => [18, "deg_K"],
+  "exadegree" => [18, "degree"],  "exadegreeK" => [18, "degreeK"],
+  "exadyne" => [18, "dyne"],  "exaerg" => [18, "erg"],
+  "exafahrenheit" => [18, "fahrenheit"],  "exafarad" => [18, "farad"],
+  "exafermi" => [18, "fermi"],  "exagal" => [18, "gal"],
+  "exagauss" => [18, "gauss"],  "exagram" => [18, "gram"],
+  "exahectare" => [18, "hectare"],  "exahertz" => [18, "hertz"],
+  "exahour" => [18, "hour"],  "exainch" => [18, "inch"],
+  "exajoule" => [18, "joule"],  "exakelvin" => [18, "kelvin"],
+  "exakilogram" => [18, "kilogram"],  "exaknot" => [18, "knot"],
+  "exalitre" => [18, "litre"],  "exameter" => [18, "meter"],
+  "exametre" => [18, "metre"],  "examicron" => [18, "micron"],
+  "examile" => [18, "mile"],  "examillibar" => [18, "millibar"],
+  "examinute" => [18, "minute"],
+  "examinute_angle" => [18, "minute_angle"],  "examole" => [18, "mole"],
+  "examonth" => [18, "month"],  "exanewton" => [18, "newton"],
+  "exaounce" => [18, "ounce"],  "exaparsec" => [18, "parsec"],
+  "exapascal" => [18, "pascal"],  "exapentad" => [18, "pentad"],
+  "exapoise" => [18, "poise"],  "exapound" => [18, "pound"],
+  "exaradian" => [18, "radian"],  "exasecond" => [18, "second"],
+  "exasecond_angle" => [18, "second_angle"],
+  "exasteradian" => [18, "steradian"],  "exastokes" => [18, "stokes"],
+  "exatesla" => [18, "tesla"],  "exaton" => [18, "ton"],
+  "exatonne" => [18, "tonne"],  "exatorr" => [18, "torr"],
+  "exavolt" => [18, "volt"],  "exawatt" => [18, "watt"],
+  "exaweber" => [18, "weber"],  "exayard" => [18, "yard"],
+  "exayd" => [18, "yd"],  "exayear" => [18, "year"],
+  "f%" => [-15, "%"],  "fA" => [-15, "A"],  "fAu" => [-15, "Au"],
+  "fBq" => [-15, "Bq"],  "fC" => [-15, "C"],  "fF" => [-15, "F"],
+  "fG" => [-15, "G"],  "fGal" => [-15, "Gal"],  "fGy" => [-15, "Gy"],
+  "fH" => [-15, "H"],  "fHg" => [-15, "Hg"],  "fHz" => [-15, "Hz"],
+  "fJ" => [-15, "J"],  "fK" => [-15, "K"],  "fL" => [-15, "L"],
+  "fN" => [-15, "N"],  "fP" => [-15, "P"],  "fPa" => [-15, "Pa"],
+  "fS" => [-15, "S"],  "fSt" => [-15, "St"],  "fSv" => [-15, "Sv"],
+  "fT" => [-15, "T"],  "fV" => [-15, "V"],  "fW" => [-15, "W"],
+  "fWb" => [-15, "Wb"],  "fa" => [-15, "a"],  "fac" => [-15, "ac"],
+  "fahrenheits" => [0, "fahrenheit"],  "farads" => [0, "farad"],
+  "fatm" => [-15, "atm"],  "fbar" => [-15, "bar"],
+  "fcal" => [-15, "cal"],
+  "fconventional_mercury" => [-15, "conventional_mercury"],
+  "fd" => [-15, "d"],  "fdegC" => [-15, "degC"],
+  "fdegF" => [-15, "degF"],  "fdeg_C" => [-15, "deg_C"],
+  "fdeg_F" => [-15, "deg_F"],  "fdegreeC" => [-15, "degreeC"],
+  "fdegreeF" => [-15, "degreeF"],  "fdegree_C" => [-15, "degree_C"],
+  "fdegree_E" => [-15, "degree_E"],  "fdegree_F" => [-15, "degree_F"],
+  "fdegree_N" => [-15, "degree_N"],  "fdegree_R" => [-15, "degree_R"],
+  "fdegree_S" => [-15, "degree_S"],  "fdegree_W" => [-15, "degree_W"],
+  "fdegree_c" => [-15, "degree_c"],
+  "fdegree_east" => [-15, "degree_east"],
+  "fdegree_f" => [-15, "degree_f"],
+  "fdegree_north" => [-15, "degree_north"],
+  "fdegree_south" => [-15, "degree_south"],
+  "fdegree_west" => [-15, "degree_west"],
+  "fdegrees_east" => [-15, "degrees_east"],
+  "fdegrees_north" => [-15, "degrees_north"],
+  "fdegrees_south" => [-15, "degrees_south"],
+  "fdegrees_west" => [-15, "degrees_west"],  "fdyn" => [-15, "dyn"],
+  "femtoCelsius" => [-15, "Celsius"],
+  "femtoFahrenheit" => [-15, "Fahrenheit"],
+  "femtoJulian_year" => [-15, "Julian_year"],
+  "femtoPascal" => [-15, "Pascal"],  "femtoacre" => [-15, "acre"],
+  "femtoampere" => [-15, "ampere"],
+  "femtoangstrom" => [-15, "angstrom"],
+  "femtoangular_degree" => [-15, "angular_degree"],
+  "femtoangular_minute" => [-15, "angular_minute"],
+  "femtoangular_second" => [-15, "angular_second"],
+  "femtoare" => [-15, "are"],  "femtoatmosphere" => [-15, "atmosphere"],
+  "femtocalorie" => [-15, "calorie"],
+  "femtocelsius" => [-15, "celsius"],
+  "femtocentigrade" => [-15, "centigrade"],
+  "femtocentury" => [-15, "century"],  "femtochain" => [-15, "chain"],
+  "femtocommon_year" => [-15, "common_year"],
+  "femtocoulomb" => [-15, "coulomb"],  "femtoday" => [-15, "day"],
+  "femtodegK" => [-15, "degK"],  "femtodeg_K" => [-15, "deg_K"],
+  "femtodegree" => [-15, "degree"],  "femtodegreeK" => [-15, "degreeK"],
+  "femtodyne" => [-15, "dyne"],  "femtoerg" => [-15, "erg"],
+  "femtofahrenheit" => [-15, "fahrenheit"],
+  "femtofarad" => [-15, "farad"],  "femtofermi" => [-15, "fermi"],
+  "femtogal" => [-15, "gal"],  "femtogauss" => [-15, "gauss"],
+  "femtogram" => [-15, "gram"],  "femtohectare" => [-15, "hectare"],
+  "femtohertz" => [-15, "hertz"],  "femtohour" => [-15, "hour"],
+  "femtoinch" => [-15, "inch"],  "femtojoule" => [-15, "joule"],
+  "femtokelvin" => [-15, "kelvin"],
+  "femtokilogram" => [-15, "kilogram"],  "femtoknot" => [-15, "knot"],
+  "femtolitre" => [-15, "litre"],  "femtometer" => [-15, "meter"],
+  "femtometre" => [-15, "metre"],  "femtomicron" => [-15, "micron"],
+  "femtomile" => [-15, "mile"],  "femtomillibar" => [-15, "millibar"],
+  "femtominute" => [-15, "minute"],
+  "femtominute_angle" => [-15, "minute_angle"],
+  "femtomole" => [-15, "mole"],  "femtomonth" => [-15, "month"],
+  "femtonewton" => [-15, "newton"],  "femtoounce" => [-15, "ounce"],
+  "femtoparsec" => [-15, "parsec"],  "femtopascal" => [-15, "pascal"],
+  "femtopentad" => [-15, "pentad"],  "femtopoise" => [-15, "poise"],
+  "femtopound" => [-15, "pound"],  "femtoradian" => [-15, "radian"],
+  "femtosecond" => [-15, "second"],
+  "femtosecond_angle" => [-15, "second_angle"],
+  "femtosteradian" => [-15, "steradian"],
+  "femtostokes" => [-15, "stokes"],  "femtotesla" => [-15, "tesla"],
+  "femtoton" => [-15, "ton"],  "femtotonne" => [-15, "tonne"],
+  "femtotorr" => [-15, "torr"],  "femtovolt" => [-15, "volt"],
+  "femtowatt" => [-15, "watt"],  "femtoweber" => [-15, "weber"],
+  "femtoyard" => [-15, "yard"],  "femtoyd" => [-15, "yd"],
+  "femtoyear" => [-15, "year"],  "ferg" => [-15, "erg"],
+  "fermis" => [0, "fermi"],  "fforce" => [-15, "force"],
+  "fg" => [-15, "g"],  "fgravity" => [-15, "gravity"],
+  "fh" => [-15, "h"],  "fhg" => [-15, "hg"],  "fhr" => [-15, "hr"],
+  "fin" => [-15, "in"],  "fkg" => [-15, "kg"],  "fkgf" => [-15, "kgf"],
+  "fkph" => [-15, "kph"],  "flb" => [-15, "lb"],  "flm" => [-15, "lm"],
+  "flx" => [-15, "lx"],  "fly" => [-15, "ly"],  "fm" => [-15, "m"],
+  "fmb" => [-15, "mb"],  "fmercury" => [-15, "mercury"],
+  "fmgal" => [-15, "mgal"],  "fmin" => [-15, "min"],
+  "fmol" => [-15, "mol"],  "fmon" => [-15, "mon"],
+  "fmph" => [-15, "mph"],  "fohm" => [-15, "ohm"],
+  "foz" => [-15, "oz"],  "fpc" => [-15, "pc"],
+  "fpercent" => [-15, "percent"],  "fpermil" => [-15, "permil"],
+  "fpsi" => [-15, "psi"],  "frad" => [-15, "rad"],  "fs" => [-15, "s"],
+  "fsr" => [-15, "sr"],  "ft" => [-15, "t"],  "fyr" => [-15, "yr"],
+  "gals" => [0, "gal"],  "gausses" => [0, "gauss"],
+  "gigaCelsius" => [9, "Celsius"],
+  "gigaFahrenheit" => [9, "Fahrenheit"],
+  "gigaJulian_year" => [9, "Julian_year"],
+  "gigaPascal" => [9, "Pascal"],  "gigaacre" => [9, "acre"],
+  "gigaampere" => [9, "ampere"],  "gigaangstrom" => [9, "angstrom"],
+  "gigaangular_degree" => [9, "angular_degree"],
+  "gigaangular_minute" => [9, "angular_minute"],
+  "gigaangular_second" => [9, "angular_second"],
+  "gigaare" => [9, "are"],  "gigaatmosphere" => [9, "atmosphere"],
+  "gigacalorie" => [9, "calorie"],  "gigacelsius" => [9, "celsius"],
+  "gigacentigrade" => [9, "centigrade"],
+  "gigacentury" => [9, "century"],  "gigachain" => [9, "chain"],
+  "gigacommon_year" => [9, "common_year"],
+  "gigacoulomb" => [9, "coulomb"],  "gigaday" => [9, "day"],
+  "gigadegK" => [9, "degK"],  "gigadeg_K" => [9, "deg_K"],
+  "gigadegree" => [9, "degree"],  "gigadegreeK" => [9, "degreeK"],
+  "gigadyne" => [9, "dyne"],  "gigaerg" => [9, "erg"],
+  "gigafahrenheit" => [9, "fahrenheit"],  "gigafarad" => [9, "farad"],
+  "gigafermi" => [9, "fermi"],  "gigagal" => [9, "gal"],
+  "gigagauss" => [9, "gauss"],  "gigagram" => [9, "gram"],
+  "gigahectare" => [9, "hectare"],  "gigahertz" => [9, "hertz"],
+  "gigahour" => [9, "hour"],  "gigainch" => [9, "inch"],
+  "gigajoule" => [9, "joule"],  "gigakelvin" => [9, "kelvin"],
+  "gigakilogram" => [9, "kilogram"],  "gigaknot" => [9, "knot"],
+  "gigalitre" => [9, "litre"],  "gigameter" => [9, "meter"],
+  "gigametre" => [9, "metre"],  "gigamicron" => [9, "micron"],
+  "gigamile" => [9, "mile"],  "gigamillibar" => [9, "millibar"],
+  "gigaminute" => [9, "minute"],
+  "gigaminute_angle" => [9, "minute_angle"],  "gigamole" => [9, "mole"],
+  "gigamonth" => [9, "month"],  "giganewton" => [9, "newton"],
+  "gigaounce" => [9, "ounce"],  "gigaparsec" => [9, "parsec"],
+  "gigapascal" => [9, "pascal"],  "gigapentad" => [9, "pentad"],
+  "gigapoise" => [9, "poise"],  "gigapound" => [9, "pound"],
+  "gigaradian" => [9, "radian"],  "gigasecond" => [9, "second"],
+  "gigasecond_angle" => [9, "second_angle"],
+  "gigasteradian" => [9, "steradian"],  "gigastokes" => [9, "stokes"],
+  "gigatesla" => [9, "tesla"],  "gigaton" => [9, "ton"],
+  "gigatonne" => [9, "tonne"],  "gigatorr" => [9, "torr"],
+  "gigavolt" => [9, "volt"],  "gigawatt" => [9, "watt"],
+  "gigaweber" => [9, "weber"],  "gigayard" => [9, "yard"],
+  "gigayd" => [9, "yd"],  "gigayear" => [9, "year"],
+  "grams" => [0, "gram"],  "h%" => [2, "%"],  "hA" => [2, "A"],
+  "hAu" => [2, "Au"],  "hBq" => [2, "Bq"],  "hC" => [2, "C"],
+  "hF" => [2, "F"],  "hG" => [2, "G"],  "hGal" => [2, "Gal"],
+  "hGy" => [2, "Gy"],  "hH" => [2, "H"],  "hHg" => [2, "Hg"],
+  "hHz" => [2, "Hz"],  "hJ" => [2, "J"],  "hK" => [2, "K"],
+  "hL" => [2, "L"],  "hN" => [2, "N"],  "hP" => [2, "P"],
+  "hPa" => [2, "Pa"],  "hS" => [2, "S"],  "hSt" => [2, "St"],
+  "hSv" => [2, "Sv"],  "hT" => [2, "T"],  "hV" => [2, "V"],
+  "hW" => [2, "W"],  "hWb" => [2, "Wb"],  "ha" => [2, "a"],
+  "hac" => [2, "ac"],  "hatm" => [2, "atm"],  "hbar" => [2, "bar"],
+  "hcal" => [2, "cal"],
+  "hconventional_mercury" => [2, "conventional_mercury"],
+  "hd" => [2, "d"],  "hdegC" => [2, "degC"],  "hdegF" => [2, "degF"],
+  "hdeg_C" => [2, "deg_C"],  "hdeg_F" => [2, "deg_F"],
+  "hdegreeC" => [2, "degreeC"],  "hdegreeF" => [2, "degreeF"],
+  "hdegree_C" => [2, "degree_C"],  "hdegree_E" => [2, "degree_E"],
+  "hdegree_F" => [2, "degree_F"],  "hdegree_N" => [2, "degree_N"],
+  "hdegree_R" => [2, "degree_R"],  "hdegree_S" => [2, "degree_S"],
+  "hdegree_W" => [2, "degree_W"],  "hdegree_c" => [2, "degree_c"],
+  "hdegree_east" => [2, "degree_east"],  "hdegree_f" => [2, "degree_f"],
+  "hdegree_north" => [2, "degree_north"],
+  "hdegree_south" => [2, "degree_south"],
+  "hdegree_west" => [2, "degree_west"],
+  "hdegrees_east" => [2, "degrees_east"],
+  "hdegrees_north" => [2, "degrees_north"],
+  "hdegrees_south" => [2, "degrees_south"],
+  "hdegrees_west" => [2, "degrees_west"],  "hdyn" => [2, "dyn"],
+  "hectares" => [0, "hectare"],  "hectoCelsius" => [2, "Celsius"],
+  "hectoFahrenheit" => [2, "Fahrenheit"],
+  "hectoJulian_year" => [2, "Julian_year"],
+  "hectoPascal" => [2, "Pascal"],  "hectoacre" => [2, "acre"],
+  "hectoampere" => [2, "ampere"],  "hectoangstrom" => [2, "angstrom"],
+  "hectoangular_degree" => [2, "angular_degree"],
+  "hectoangular_minute" => [2, "angular_minute"],
+  "hectoangular_second" => [2, "angular_second"],
+  "hectoare" => [2, "are"],  "hectoatmosphere" => [2, "atmosphere"],
+  "hectocalorie" => [2, "calorie"],  "hectocelsius" => [2, "celsius"],
+  "hectocentigrade" => [2, "centigrade"],
+  "hectocentury" => [2, "century"],  "hectochain" => [2, "chain"],
+  "hectocommon_year" => [2, "common_year"],
+  "hectocoulomb" => [2, "coulomb"],  "hectoday" => [2, "day"],
+  "hectodegK" => [2, "degK"],  "hectodeg_K" => [2, "deg_K"],
+  "hectodegree" => [2, "degree"],  "hectodegreeK" => [2, "degreeK"],
+  "hectodyne" => [2, "dyne"],  "hectoerg" => [2, "erg"],
+  "hectofahrenheit" => [2, "fahrenheit"],  "hectofarad" => [2, "farad"],
+  "hectofermi" => [2, "fermi"],  "hectogal" => [2, "gal"],
+  "hectogauss" => [2, "gauss"],  "hectogram" => [2, "gram"],
+  "hectohectare" => [2, "hectare"],  "hectohertz" => [2, "hertz"],
+  "hectohour" => [2, "hour"],  "hectoinch" => [2, "inch"],
+  "hectojoule" => [2, "joule"],  "hectokelvin" => [2, "kelvin"],
+  "hectokilogram" => [2, "kilogram"],  "hectoknot" => [2, "knot"],
+  "hectolitre" => [2, "litre"],  "hectometer" => [2, "meter"],
+  "hectometre" => [2, "metre"],  "hectomicron" => [2, "micron"],
+  "hectomile" => [2, "mile"],  "hectomillibar" => [2, "millibar"],
+  "hectominute" => [2, "minute"],
+  "hectominute_angle" => [2, "minute_angle"],
+  "hectomole" => [2, "mole"],  "hectomonth" => [2, "month"],
+  "hectonewton" => [2, "newton"],  "hectoounce" => [2, "ounce"],
+  "hectoparsec" => [2, "parsec"],  "hectopascal" => [2, "pascal"],
+  "hectopentad" => [2, "pentad"],  "hectopoise" => [2, "poise"],
+  "hectopound" => [2, "pound"],  "hectoradian" => [2, "radian"],
+  "hectosecond" => [2, "second"],
+  "hectosecond_angle" => [2, "second_angle"],
+  "hectosteradian" => [2, "steradian"],  "hectostokes" => [2, "stokes"],
+  "hectotesla" => [2, "tesla"],  "hectoton" => [2, "ton"],
+  "hectotonne" => [2, "tonne"],  "hectotorr" => [2, "torr"],
+  "hectovolt" => [2, "volt"],  "hectowatt" => [2, "watt"],
+  "hectoweber" => [2, "weber"],  "hectoyard" => [2, "yard"],
+  "hectoyd" => [2, "yd"],  "hectoyear" => [2, "year"],
+  "herg" => [2, "erg"],  "hertzes" => [0, "hertz"],
+  "hforce" => [2, "force"],  "hg" => [2, "g"],
+  "hgravity" => [2, "gravity"],  "hh" => [2, "h"],  "hhg" => [2, "hg"],
+  "hhr" => [2, "hr"],  "hin" => [2, "in"],  "hkg" => [2, "kg"],
+  "hkgf" => [2, "kgf"],  "hkph" => [2, "kph"],  "hlb" => [2, "lb"],
+  "hlm" => [2, "lm"],  "hlx" => [2, "lx"],  "hly" => [2, "ly"],
+  "hm" => [2, "m"],  "hmb" => [2, "mb"],  "hmercury" => [2, "mercury"],
+  "hmgal" => [2, "mgal"],  "hmin" => [2, "min"],  "hmol" => [2, "mol"],
+  "hmon" => [2, "mon"],  "hmph" => [2, "mph"],  "hohm" => [2, "ohm"],
+  "hours" => [0, "hour"],  "hoz" => [2, "oz"],  "hpc" => [2, "pc"],
+  "hpercent" => [2, "percent"],  "hpermil" => [2, "permil"],
+  "hpsi" => [2, "psi"],  "hrad" => [2, "rad"],  "hs" => [2, "s"],
+  "hsr" => [2, "sr"],  "ht" => [2, "t"],  "hyr" => [2, "yr"],
+  "inchs" => [0, "inch"],  "joules" => [0, "joule"],  "k%" => [3, "%"],
+  "kA" => [3, "A"],  "kAu" => [3, "Au"],  "kBq" => [3, "Bq"],
+  "kC" => [3, "C"],  "kF" => [3, "F"],  "kG" => [3, "G"],
+  "kGal" => [3, "Gal"],  "kGy" => [3, "Gy"],  "kH" => [3, "H"],
+  "kHg" => [3, "Hg"],  "kHz" => [3, "Hz"],  "kJ" => [3, "J"],
+  "kK" => [3, "K"],  "kL" => [3, "L"],  "kN" => [3, "N"],
+  "kP" => [3, "P"],  "kPa" => [3, "Pa"],  "kS" => [3, "S"],
+  "kSt" => [3, "St"],  "kSv" => [3, "Sv"],  "kT" => [3, "T"],
+  "kV" => [3, "V"],  "kW" => [3, "W"],  "kWb" => [3, "Wb"],
+  "ka" => [3, "a"],  "kac" => [3, "ac"],  "katm" => [3, "atm"],
+  "kbar" => [3, "bar"],  "kcal" => [3, "cal"],
+  "kconventional_mercury" => [3, "conventional_mercury"],
+  "kd" => [3, "d"],  "kdegC" => [3, "degC"],  "kdegF" => [3, "degF"],
+  "kdeg_C" => [3, "deg_C"],  "kdeg_F" => [3, "deg_F"],
+  "kdegreeC" => [3, "degreeC"],  "kdegreeF" => [3, "degreeF"],
+  "kdegree_C" => [3, "degree_C"],  "kdegree_E" => [3, "degree_E"],
+  "kdegree_F" => [3, "degree_F"],  "kdegree_N" => [3, "degree_N"],
+  "kdegree_R" => [3, "degree_R"],  "kdegree_S" => [3, "degree_S"],
+  "kdegree_W" => [3, "degree_W"],  "kdegree_c" => [3, "degree_c"],
+  "kdegree_east" => [3, "degree_east"],  "kdegree_f" => [3, "degree_f"],
+  "kdegree_north" => [3, "degree_north"],
+  "kdegree_south" => [3, "degree_south"],
+  "kdegree_west" => [3, "degree_west"],
+  "kdegrees_east" => [3, "degrees_east"],
+  "kdegrees_north" => [3, "degrees_north"],
+  "kdegrees_south" => [3, "degrees_south"],
+  "kdegrees_west" => [3, "degrees_west"],  "kdyn" => [3, "dyn"],
+  "kelvins" => [0, "kelvin"],  "kerg" => [3, "erg"],
+  "kforce" => [3, "force"],  "kgravity" => [3, "gravity"],
+  "kh" => [3, "h"],  "khg" => [3, "hg"],  "khr" => [3, "hr"],
+  "kiloCelsius" => [3, "Celsius"],
+  "kiloFahrenheit" => [3, "Fahrenheit"],
+  "kiloJulian_year" => [3, "Julian_year"],
+  "kiloPascal" => [3, "Pascal"],  "kiloacre" => [3, "acre"],
+  "kiloampere" => [3, "ampere"],  "kiloangstrom" => [3, "angstrom"],
+  "kiloangular_degree" => [3, "angular_degree"],
+  "kiloangular_minute" => [3, "angular_minute"],
+  "kiloangular_second" => [3, "angular_second"],
+  "kiloare" => [3, "are"],  "kiloatmosphere" => [3, "atmosphere"],
+  "kilocalorie" => [3, "calorie"],  "kilocelsius" => [3, "celsius"],
+  "kilocentigrade" => [3, "centigrade"],
+  "kilocentury" => [3, "century"],  "kilochain" => [3, "chain"],
+  "kilocommon_year" => [3, "common_year"],
+  "kilocoulomb" => [3, "coulomb"],  "kiloday" => [3, "day"],
+  "kilodegK" => [3, "degK"],  "kilodeg_K" => [3, "deg_K"],
+  "kilodegree" => [3, "degree"],  "kilodegreeK" => [3, "degreeK"],
+  "kilodyne" => [3, "dyne"],  "kiloerg" => [3, "erg"],
+  "kilofahrenheit" => [3, "fahrenheit"],  "kilofarad" => [3, "farad"],
+  "kilofermi" => [3, "fermi"],  "kilogal" => [3, "gal"],
+  "kilogauss" => [3, "gauss"],  "kilogram" => [3, "gram"],
+  "kilograms" => [0, "kilogram"],  "kilohectare" => [3, "hectare"],
+  "kilohertz" => [3, "hertz"],  "kilohour" => [3, "hour"],
+  "kiloinch" => [3, "inch"],  "kilojoule" => [3, "joule"],
+  "kilokelvin" => [3, "kelvin"],  "kilokilogram" => [3, "kilogram"],
+  "kiloknot" => [3, "knot"],  "kilolitre" => [3, "litre"],
+  "kilometer" => [3, "meter"],  "kilometre" => [3, "metre"],
+  "kilomicron" => [3, "micron"],  "kilomile" => [3, "mile"],
+  "kilomillibar" => [3, "millibar"],  "kilominute" => [3, "minute"],
+  "kilominute_angle" => [3, "minute_angle"],  "kilomole" => [3, "mole"],
+  "kilomonth" => [3, "month"],  "kilonewton" => [3, "newton"],
+  "kiloounce" => [3, "ounce"],  "kiloparsec" => [3, "parsec"],
+  "kilopascal" => [3, "pascal"],  "kilopentad" => [3, "pentad"],
+  "kilopoise" => [3, "poise"],  "kilopound" => [3, "pound"],
+  "kiloradian" => [3, "radian"],  "kilosecond" => [3, "second"],
+  "kilosecond_angle" => [3, "second_angle"],
+  "kilosteradian" => [3, "steradian"],  "kilostokes" => [3, "stokes"],
+  "kilotesla" => [3, "tesla"],  "kiloton" => [3, "ton"],
+  "kilotonne" => [3, "tonne"],  "kilotorr" => [3, "torr"],
+  "kilovolt" => [3, "volt"],  "kilowatt" => [3, "watt"],
+  "kiloweber" => [3, "weber"],  "kiloyard" => [3, "yard"],
+  "kiloyd" => [3, "yd"],  "kiloyear" => [3, "year"],
+  "kin" => [3, "in"],  "kkg" => [3, "kg"],  "kkgf" => [3, "kgf"],
+  "kkph" => [3, "kph"],  "klb" => [3, "lb"],  "klm" => [3, "lm"],
+  "klx" => [3, "lx"],  "kly" => [3, "ly"],  "km" => [3, "m"],
+  "kmb" => [3, "mb"],  "kmercury" => [3, "mercury"],
+  "kmgal" => [3, "mgal"],  "kmin" => [3, "min"],  "kmol" => [3, "mol"],
+  "kmon" => [3, "mon"],  "kmph" => [3, "mph"],  "knots" => [0, "knot"],
+  "kohm" => [3, "ohm"],  "koz" => [3, "oz"],  "kpc" => [3, "pc"],
+  "kpercent" => [3, "percent"],  "kpermil" => [3, "permil"],
+  "kpsi" => [3, "psi"],  "krad" => [3, "rad"],  "ks" => [3, "s"],
+  "ksr" => [3, "sr"],  "kt" => [3, "t"],  "kyr" => [3, "yr"],
+  "litres" => [0, "litre"],  "m%" => [-3, "%"],  "mA" => [-3, "A"],
+  "mAu" => [-3, "Au"],  "mBq" => [-3, "Bq"],  "mC" => [-3, "C"],
+  "mF" => [-3, "F"],  "mG" => [-3, "G"],  "mGal" => [-3, "Gal"],
+  "mGy" => [-3, "Gy"],  "mH" => [-3, "H"],  "mHg" => [-3, "Hg"],
+  "mHz" => [-3, "Hz"],  "mJ" => [-3, "J"],  "mK" => [-3, "K"],
+  "mL" => [-3, "L"],  "mN" => [-3, "N"],  "mP" => [-3, "P"],
+  "mPa" => [-3, "Pa"],  "mS" => [-3, "S"],  "mSt" => [-3, "St"],
+  "mSv" => [-3, "Sv"],  "mT" => [-3, "T"],  "mV" => [-3, "V"],
+  "mW" => [-3, "W"],  "mWb" => [-3, "Wb"],  "ma" => [-3, "a"],
+  "mac" => [-3, "ac"],  "matm" => [-3, "atm"],  "mbar" => [-3, "bar"],
+  "mcal" => [-3, "cal"],
+  "mconventional_mercury" => [-3, "conventional_mercury"],
+  "md" => [-3, "d"],  "mdegC" => [-3, "degC"],  "mdegF" => [-3, "degF"],
+  "mdeg_C" => [-3, "deg_C"],  "mdeg_F" => [-3, "deg_F"],
+  "mdegreeC" => [-3, "degreeC"],  "mdegreeF" => [-3, "degreeF"],
+  "mdegree_C" => [-3, "degree_C"],  "mdegree_E" => [-3, "degree_E"],
+  "mdegree_F" => [-3, "degree_F"],  "mdegree_N" => [-3, "degree_N"],
+  "mdegree_R" => [-3, "degree_R"],  "mdegree_S" => [-3, "degree_S"],
+  "mdegree_W" => [-3, "degree_W"],  "mdegree_c" => [-3, "degree_c"],
+  "mdegree_east" => [-3, "degree_east"],
+  "mdegree_f" => [-3, "degree_f"],
+  "mdegree_north" => [-3, "degree_north"],
+  "mdegree_south" => [-3, "degree_south"],
+  "mdegree_west" => [-3, "degree_west"],
+  "mdegrees_east" => [-3, "degrees_east"],
+  "mdegrees_north" => [-3, "degrees_north"],
+  "mdegrees_south" => [-3, "degrees_south"],
+  "mdegrees_west" => [-3, "degrees_west"],  "mdyn" => [-3, "dyn"],
+  "megaCelsius" => [6, "Celsius"],
+  "megaFahrenheit" => [6, "Fahrenheit"],
+  "megaJulian_year" => [6, "Julian_year"],
+  "megaPascal" => [6, "Pascal"],  "megaacre" => [6, "acre"],
+  "megaampere" => [6, "ampere"],  "megaangstrom" => [6, "angstrom"],
+  "megaangular_degree" => [6, "angular_degree"],
+  "megaangular_minute" => [6, "angular_minute"],
+  "megaangular_second" => [6, "angular_second"],
+  "megaare" => [6, "are"],  "megaatmosphere" => [6, "atmosphere"],
+  "megacalorie" => [6, "calorie"],  "megacelsius" => [6, "celsius"],
+  "megacentigrade" => [6, "centigrade"],
+  "megacentury" => [6, "century"],  "megachain" => [6, "chain"],
+  "megacommon_year" => [6, "common_year"],
+  "megacoulomb" => [6, "coulomb"],  "megaday" => [6, "day"],
+  "megadegK" => [6, "degK"],  "megadeg_K" => [6, "deg_K"],
+  "megadegree" => [6, "degree"],  "megadegreeK" => [6, "degreeK"],
+  "megadyne" => [6, "dyne"],  "megaerg" => [6, "erg"],
+  "megafahrenheit" => [6, "fahrenheit"],  "megafarad" => [6, "farad"],
+  "megafermi" => [6, "fermi"],  "megagal" => [6, "gal"],
+  "megagauss" => [6, "gauss"],  "megagram" => [6, "gram"],
+  "megahectare" => [6, "hectare"],  "megahertz" => [6, "hertz"],
+  "megahour" => [6, "hour"],  "megainch" => [6, "inch"],
+  "megajoule" => [6, "joule"],  "megakelvin" => [6, "kelvin"],
+  "megakilogram" => [6, "kilogram"],  "megaknot" => [6, "knot"],
+  "megalitre" => [6, "litre"],  "megameter" => [6, "meter"],
+  "megametre" => [6, "metre"],  "megamicron" => [6, "micron"],
+  "megamile" => [6, "mile"],  "megamillibar" => [6, "millibar"],
+  "megaminute" => [6, "minute"],
+  "megaminute_angle" => [6, "minute_angle"],  "megamole" => [6, "mole"],
+  "megamonth" => [6, "month"],  "meganewton" => [6, "newton"],
+  "megaounce" => [6, "ounce"],  "megaparsec" => [6, "parsec"],
+  "megapascal" => [6, "pascal"],  "megapentad" => [6, "pentad"],
+  "megapoise" => [6, "poise"],  "megapound" => [6, "pound"],
+  "megaradian" => [6, "radian"],  "megasecond" => [6, "second"],
+  "megasecond_angle" => [6, "second_angle"],
+  "megasteradian" => [6, "steradian"],  "megastokes" => [6, "stokes"],
+  "megatesla" => [6, "tesla"],  "megaton" => [6, "ton"],
+  "megatonne" => [6, "tonne"],  "megatorr" => [6, "torr"],
+  "megavolt" => [6, "volt"],  "megawatt" => [6, "watt"],
+  "megaweber" => [6, "weber"],  "megayard" => [6, "yard"],
+  "megayd" => [6, "yd"],  "megayear" => [6, "year"],
+  "merg" => [-3, "erg"],  "meters" => [0, "meter"],
+  "metres" => [0, "metre"],  "mforce" => [-3, "force"],
+  "mg" => [-3, "g"],  "mgravity" => [-3, "gravity"],  "mh" => [-3, "h"],
+  "mhg" => [-3, "hg"],  "mhr" => [-3, "hr"],
+  "microCelsius" => [-6, "Celsius"],
+  "microFahrenheit" => [-6, "Fahrenheit"],
+  "microJulian_year" => [-6, "Julian_year"],
+  "microPascal" => [-6, "Pascal"],  "microacre" => [-6, "acre"],
+  "microampere" => [-6, "ampere"],  "microangstrom" => [-6, "angstrom"],
+  "microangular_degree" => [-6, "angular_degree"],
+  "microangular_minute" => [-6, "angular_minute"],
+  "microangular_second" => [-6, "angular_second"],
+  "microare" => [-6, "are"],  "microatmosphere" => [-6, "atmosphere"],
+  "microcalorie" => [-6, "calorie"],  "microcelsius" => [-6, "celsius"],
+  "microcentigrade" => [-6, "centigrade"],
+  "microcentury" => [-6, "century"],  "microchain" => [-6, "chain"],
+  "microcommon_year" => [-6, "common_year"],
+  "microcoulomb" => [-6, "coulomb"],  "microday" => [-6, "day"],
+  "microdegK" => [-6, "degK"],  "microdeg_K" => [-6, "deg_K"],
+  "microdegree" => [-6, "degree"],  "microdegreeK" => [-6, "degreeK"],
+  "microdyne" => [-6, "dyne"],  "microerg" => [-6, "erg"],
+  "microfahrenheit" => [-6, "fahrenheit"],
+  "microfarad" => [-6, "farad"],  "microfermi" => [-6, "fermi"],
+  "microgal" => [-6, "gal"],  "microgauss" => [-6, "gauss"],
+  "microgram" => [-6, "gram"],  "microhectare" => [-6, "hectare"],
+  "microhertz" => [-6, "hertz"],  "microhour" => [-6, "hour"],
+  "microinch" => [-6, "inch"],  "microjoule" => [-6, "joule"],
+  "microkelvin" => [-6, "kelvin"],  "microkilogram" => [-6, "kilogram"],
+  "microknot" => [-6, "knot"],  "microlitre" => [-6, "litre"],
+  "micrometer" => [-6, "meter"],  "micrometre" => [-6, "metre"],
+  "micromicron" => [-6, "micron"],  "micromile" => [-6, "mile"],
+  "micromillibar" => [-6, "millibar"],  "microminute" => [-6, "minute"],
+  "microminute_angle" => [-6, "minute_angle"],
+  "micromole" => [-6, "mole"],  "micromonth" => [-6, "month"],
+  "micronewton" => [-6, "newton"],  "microns" => [0, "micron"],
+  "microounce" => [-6, "ounce"],  "microparsec" => [-6, "parsec"],
+  "micropascal" => [-6, "pascal"],  "micropentad" => [-6, "pentad"],
+  "micropoise" => [-6, "poise"],  "micropound" => [-6, "pound"],
+  "microradian" => [-6, "radian"],  "microsecond" => [-6, "second"],
+  "microsecond_angle" => [-6, "second_angle"],
+  "microsteradian" => [-6, "steradian"],
+  "microstokes" => [-6, "stokes"],  "microtesla" => [-6, "tesla"],
+  "microton" => [-6, "ton"],  "microtonne" => [-6, "tonne"],
+  "microtorr" => [-6, "torr"],  "microvolt" => [-6, "volt"],
+  "microwatt" => [-6, "watt"],  "microweber" => [-6, "weber"],
+  "microyard" => [-6, "yard"],  "microyd" => [-6, "yd"],
+  "microyear" => [-6, "year"],  "miles" => [0, "mile"],
+  "milliCelsius" => [-3, "Celsius"],
+  "milliFahrenheit" => [-3, "Fahrenheit"],
+  "milliJulian_year" => [-3, "Julian_year"],
+  "milliPascal" => [-3, "Pascal"],  "milliacre" => [-3, "acre"],
+  "milliampere" => [-3, "ampere"],  "milliangstrom" => [-3, "angstrom"],
+  "milliangular_degree" => [-3, "angular_degree"],
+  "milliangular_minute" => [-3, "angular_minute"],
+  "milliangular_second" => [-3, "angular_second"],
+  "milliare" => [-3, "are"],  "milliatmosphere" => [-3, "atmosphere"],
+  "millibars" => [0, "millibar"],  "millicalorie" => [-3, "calorie"],
+  "millicelsius" => [-3, "celsius"],
+  "millicentigrade" => [-3, "centigrade"],
+  "millicentury" => [-3, "century"],  "millichain" => [-3, "chain"],
+  "millicommon_year" => [-3, "common_year"],
+  "millicoulomb" => [-3, "coulomb"],  "milliday" => [-3, "day"],
+  "millidegK" => [-3, "degK"],  "millideg_K" => [-3, "deg_K"],
+  "millidegree" => [-3, "degree"],  "millidegreeK" => [-3, "degreeK"],
+  "millidyne" => [-3, "dyne"],  "millierg" => [-3, "erg"],
+  "millifahrenheit" => [-3, "fahrenheit"],
+  "millifarad" => [-3, "farad"],  "millifermi" => [-3, "fermi"],
+  "milligal" => [-3, "gal"],  "milligauss" => [-3, "gauss"],
+  "milligram" => [-3, "gram"],  "millihectare" => [-3, "hectare"],
+  "millihertz" => [-3, "hertz"],  "millihour" => [-3, "hour"],
+  "milliinch" => [-3, "inch"],  "millijoule" => [-3, "joule"],
+  "millikelvin" => [-3, "kelvin"],  "millikilogram" => [-3, "kilogram"],
+  "milliknot" => [-3, "knot"],  "millilitre" => [-3, "litre"],
+  "millimeter" => [-3, "meter"],  "millimetre" => [-3, "metre"],
+  "millimicron" => [-3, "micron"],  "millimile" => [-3, "mile"],
+  "millimillibar" => [-3, "millibar"],  "milliminute" => [-3, "minute"],
+  "milliminute_angle" => [-3, "minute_angle"],
+  "millimole" => [-3, "mole"],  "millimonth" => [-3, "month"],
+  "millinewton" => [-3, "newton"],  "milliounce" => [-3, "ounce"],
+  "milliparsec" => [-3, "parsec"],  "millipascal" => [-3, "pascal"],
+  "millipentad" => [-3, "pentad"],  "millipoise" => [-3, "poise"],
+  "millipound" => [-3, "pound"],  "milliradian" => [-3, "radian"],
+  "millisecond" => [-3, "second"],
+  "millisecond_angle" => [-3, "second_angle"],
+  "millisteradian" => [-3, "steradian"],
+  "millistokes" => [-3, "stokes"],  "millitesla" => [-3, "tesla"],
+  "milliton" => [-3, "ton"],  "millitonne" => [-3, "tonne"],
+  "millitorr" => [-3, "torr"],  "millivolt" => [-3, "volt"],
+  "milliwatt" => [-3, "watt"],  "milliweber" => [-3, "weber"],
+  "milliyard" => [-3, "yard"],  "milliyd" => [-3, "yd"],
+  "milliyear" => [-3, "year"],  "min" => [-3, "in"],
+  "minutes" => [0, "minute"],  "minutes_angle" => [0, "minute_angle"],
+  "mkg" => [-3, "kg"],  "mkgf" => [-3, "kgf"],  "mkph" => [-3, "kph"],
+  "mlb" => [-3, "lb"],  "mlm" => [-3, "lm"],  "mlx" => [-3, "lx"],
+  "mly" => [-3, "ly"],  "mm" => [-3, "m"],  "mmb" => [-3, "mb"],
+  "mmercury" => [-3, "mercury"],  "mmgal" => [-3, "mgal"],
+  "mmin" => [-3, "min"],  "mmol" => [-3, "mol"],  "mmon" => [-3, "mon"],
+  "mmph" => [-3, "mph"],  "mohm" => [-3, "ohm"],
+  "moles" => [0, "mole"],  "months" => [0, "month"],
+  "moz" => [-3, "oz"],  "mpc" => [-3, "pc"],
+  "mpercent" => [-3, "percent"],  "mpermil" => [-3, "permil"],
+  "mpsi" => [-3, "psi"],  "mrad" => [-3, "rad"],  "ms" => [-3, "s"],
+  "msr" => [-3, "sr"],  "mt" => [-3, "t"],  "myr" => [-3, "yr"],
+  "n%" => [-9, "%"],  "nA" => [-9, "A"],  "nAu" => [-9, "Au"],
+  "nBq" => [-9, "Bq"],  "nC" => [-9, "C"],  "nF" => [-9, "F"],
+  "nG" => [-9, "G"],  "nGal" => [-9, "Gal"],  "nGy" => [-9, "Gy"],
+  "nH" => [-9, "H"],  "nHg" => [-9, "Hg"],  "nHz" => [-9, "Hz"],
+  "nJ" => [-9, "J"],  "nK" => [-9, "K"],  "nL" => [-9, "L"],
+  "nN" => [-9, "N"],  "nP" => [-9, "P"],  "nPa" => [-9, "Pa"],
+  "nS" => [-9, "S"],  "nSt" => [-9, "St"],  "nSv" => [-9, "Sv"],
+  "nT" => [-9, "T"],  "nV" => [-9, "V"],  "nW" => [-9, "W"],
+  "nWb" => [-9, "Wb"],  "na" => [-9, "a"],  "nac" => [-9, "ac"],
+  "nanoCelsius" => [-9, "Celsius"],
+  "nanoFahrenheit" => [-9, "Fahrenheit"],
+  "nanoJulian_year" => [-9, "Julian_year"],
+  "nanoPascal" => [-9, "Pascal"],  "nanoacre" => [-9, "acre"],
+  "nanoampere" => [-9, "ampere"],  "nanoangstrom" => [-9, "angstrom"],
+  "nanoangular_degree" => [-9, "angular_degree"],
+  "nanoangular_minute" => [-9, "angular_minute"],
+  "nanoangular_second" => [-9, "angular_second"],
+  "nanoare" => [-9, "are"],  "nanoatmosphere" => [-9, "atmosphere"],
+  "nanocalorie" => [-9, "calorie"],  "nanocelsius" => [-9, "celsius"],
+  "nanocentigrade" => [-9, "centigrade"],
+  "nanocentury" => [-9, "century"],  "nanochain" => [-9, "chain"],
+  "nanocommon_year" => [-9, "common_year"],
+  "nanocoulomb" => [-9, "coulomb"],  "nanoday" => [-9, "day"],
+  "nanodegK" => [-9, "degK"],  "nanodeg_K" => [-9, "deg_K"],
+  "nanodegree" => [-9, "degree"],  "nanodegreeK" => [-9, "degreeK"],
+  "nanodyne" => [-9, "dyne"],  "nanoerg" => [-9, "erg"],
+  "nanofahrenheit" => [-9, "fahrenheit"],  "nanofarad" => [-9, "farad"],
+  "nanofermi" => [-9, "fermi"],  "nanogal" => [-9, "gal"],
+  "nanogauss" => [-9, "gauss"],  "nanogram" => [-9, "gram"],
+  "nanohectare" => [-9, "hectare"],  "nanohertz" => [-9, "hertz"],
+  "nanohour" => [-9, "hour"],  "nanoinch" => [-9, "inch"],
+  "nanojoule" => [-9, "joule"],  "nanokelvin" => [-9, "kelvin"],
+  "nanokilogram" => [-9, "kilogram"],  "nanoknot" => [-9, "knot"],
+  "nanolitre" => [-9, "litre"],  "nanometer" => [-9, "meter"],
+  "nanometre" => [-9, "metre"],  "nanomicron" => [-9, "micron"],
+  "nanomile" => [-9, "mile"],  "nanomillibar" => [-9, "millibar"],
+  "nanominute" => [-9, "minute"],
+  "nanominute_angle" => [-9, "minute_angle"],
+  "nanomole" => [-9, "mole"],  "nanomonth" => [-9, "month"],
+  "nanonewton" => [-9, "newton"],  "nanoounce" => [-9, "ounce"],
+  "nanoparsec" => [-9, "parsec"],  "nanopascal" => [-9, "pascal"],
+  "nanopentad" => [-9, "pentad"],  "nanopoise" => [-9, "poise"],
+  "nanopound" => [-9, "pound"],  "nanoradian" => [-9, "radian"],
+  "nanosecond" => [-9, "second"],
+  "nanosecond_angle" => [-9, "second_angle"],
+  "nanosteradian" => [-9, "steradian"],  "nanostokes" => [-9, "stokes"],
+  "nanotesla" => [-9, "tesla"],  "nanoton" => [-9, "ton"],
+  "nanotonne" => [-9, "tonne"],  "nanotorr" => [-9, "torr"],
+  "nanovolt" => [-9, "volt"],  "nanowatt" => [-9, "watt"],
+  "nanoweber" => [-9, "weber"],  "nanoyard" => [-9, "yard"],
+  "nanoyd" => [-9, "yd"],  "nanoyear" => [-9, "year"],
+  "natm" => [-9, "atm"],  "nbar" => [-9, "bar"],  "ncal" => [-9, "cal"],
+  "nconventional_mercury" => [-9, "conventional_mercury"],
+  "nd" => [-9, "d"],  "ndegC" => [-9, "degC"],  "ndegF" => [-9, "degF"],
+  "ndeg_C" => [-9, "deg_C"],  "ndeg_F" => [-9, "deg_F"],
+  "ndegreeC" => [-9, "degreeC"],  "ndegreeF" => [-9, "degreeF"],
+  "ndegree_C" => [-9, "degree_C"],  "ndegree_E" => [-9, "degree_E"],
+  "ndegree_F" => [-9, "degree_F"],  "ndegree_N" => [-9, "degree_N"],
+  "ndegree_R" => [-9, "degree_R"],  "ndegree_S" => [-9, "degree_S"],
+  "ndegree_W" => [-9, "degree_W"],  "ndegree_c" => [-9, "degree_c"],
+  "ndegree_east" => [-9, "degree_east"],
+  "ndegree_f" => [-9, "degree_f"],
+  "ndegree_north" => [-9, "degree_north"],
+  "ndegree_south" => [-9, "degree_south"],
+  "ndegree_west" => [-9, "degree_west"],
+  "ndegrees_east" => [-9, "degrees_east"],
+  "ndegrees_north" => [-9, "degrees_north"],
+  "ndegrees_south" => [-9, "degrees_south"],
+  "ndegrees_west" => [-9, "degrees_west"],  "ndyn" => [-9, "dyn"],
+  "nerg" => [-9, "erg"],  "newtons" => [0, "newton"],
+  "nforce" => [-9, "force"],  "ng" => [-9, "g"],
+  "ngravity" => [-9, "gravity"],  "nh" => [-9, "h"],
+  "nhg" => [-9, "hg"],  "nhr" => [-9, "hr"],  "nin" => [-9, "in"],
+  "nkg" => [-9, "kg"],  "nkgf" => [-9, "kgf"],  "nkph" => [-9, "kph"],
+  "nlb" => [-9, "lb"],  "nlm" => [-9, "lm"],  "nlx" => [-9, "lx"],
+  "nly" => [-9, "ly"],  "nm" => [-9, "m"],  "nmb" => [-9, "mb"],
+  "nmercury" => [-9, "mercury"],  "nmgal" => [-9, "mgal"],
+  "nmin" => [-9, "min"],  "nmol" => [-9, "mol"],  "nmon" => [-9, "mon"],
+  "nmph" => [-9, "mph"],  "nohm" => [-9, "ohm"],  "noz" => [-9, "oz"],
+  "npc" => [-9, "pc"],  "npercent" => [-9, "percent"],
+  "npermil" => [-9, "permil"],  "npsi" => [-9, "psi"],
+  "nrad" => [-9, "rad"],  "ns" => [-9, "s"],  "nsr" => [-9, "sr"],
+  "nt" => [-9, "t"],  "nyr" => [-9, "yr"],  "ounces" => [0, "ounce"],
+  "p%" => [-12, "%"],  "pA" => [-12, "A"],  "pAu" => [-12, "Au"],
+  "pBq" => [-12, "Bq"],  "pC" => [-12, "C"],  "pF" => [-12, "F"],
+  "pG" => [-12, "G"],  "pGal" => [-12, "Gal"],  "pGy" => [-12, "Gy"],
+  "pH" => [-12, "H"],  "pHg" => [-12, "Hg"],  "pHz" => [-12, "Hz"],
+  "pJ" => [-12, "J"],  "pK" => [-12, "K"],  "pL" => [-12, "L"],
+  "pN" => [-12, "N"],  "pP" => [-12, "P"],  "pPa" => [-12, "Pa"],
+  "pS" => [-12, "S"],  "pSt" => [-12, "St"],  "pSv" => [-12, "Sv"],
+  "pT" => [-12, "T"],  "pV" => [-12, "V"],  "pW" => [-12, "W"],
+  "pWb" => [-12, "Wb"],  "pa" => [-12, "a"],  "pac" => [-12, "ac"],
+  "parsecs" => [0, "parsec"],  "pascals" => [0, "pascal"],
+  "patm" => [-12, "atm"],  "pbar" => [-12, "bar"],
+  "pcal" => [-12, "cal"],
+  "pconventional_mercury" => [-12, "conventional_mercury"],
+  "pd" => [-12, "d"],  "pdegC" => [-12, "degC"],
+  "pdegF" => [-12, "degF"],  "pdeg_C" => [-12, "deg_C"],
+  "pdeg_F" => [-12, "deg_F"],  "pdegreeC" => [-12, "degreeC"],
+  "pdegreeF" => [-12, "degreeF"],  "pdegree_C" => [-12, "degree_C"],
+  "pdegree_E" => [-12, "degree_E"],  "pdegree_F" => [-12, "degree_F"],
+  "pdegree_N" => [-12, "degree_N"],  "pdegree_R" => [-12, "degree_R"],
+  "pdegree_S" => [-12, "degree_S"],  "pdegree_W" => [-12, "degree_W"],
+  "pdegree_c" => [-12, "degree_c"],
+  "pdegree_east" => [-12, "degree_east"],
+  "pdegree_f" => [-12, "degree_f"],
+  "pdegree_north" => [-12, "degree_north"],
+  "pdegree_south" => [-12, "degree_south"],
+  "pdegree_west" => [-12, "degree_west"],
+  "pdegrees_east" => [-12, "degrees_east"],
+  "pdegrees_north" => [-12, "degrees_north"],
+  "pdegrees_south" => [-12, "degrees_south"],
+  "pdegrees_west" => [-12, "degrees_west"],  "pdyn" => [-12, "dyn"],
+  "pentads" => [0, "pentad"],  "perg" => [-12, "erg"],
+  "petaCelsius" => [15, "Celsius"],
+  "petaFahrenheit" => [15, "Fahrenheit"],
+  "petaJulian_year" => [15, "Julian_year"],
+  "petaPascal" => [15, "Pascal"],  "petaacre" => [15, "acre"],
+  "petaampere" => [15, "ampere"],  "petaangstrom" => [15, "angstrom"],
+  "petaangular_degree" => [15, "angular_degree"],
+  "petaangular_minute" => [15, "angular_minute"],
+  "petaangular_second" => [15, "angular_second"],
+  "petaare" => [15, "are"],  "petaatmosphere" => [15, "atmosphere"],
+  "petacalorie" => [15, "calorie"],  "petacelsius" => [15, "celsius"],
+  "petacentigrade" => [15, "centigrade"],
+  "petacentury" => [15, "century"],  "petachain" => [15, "chain"],
+  "petacommon_year" => [15, "common_year"],
+  "petacoulomb" => [15, "coulomb"],  "petaday" => [15, "day"],
+  "petadegK" => [15, "degK"],  "petadeg_K" => [15, "deg_K"],
+  "petadegree" => [15, "degree"],  "petadegreeK" => [15, "degreeK"],
+  "petadyne" => [15, "dyne"],  "petaerg" => [15, "erg"],
+  "petafahrenheit" => [15, "fahrenheit"],  "petafarad" => [15, "farad"],
+  "petafermi" => [15, "fermi"],  "petagal" => [15, "gal"],
+  "petagauss" => [15, "gauss"],  "petagram" => [15, "gram"],
+  "petahectare" => [15, "hectare"],  "petahertz" => [15, "hertz"],
+  "petahour" => [15, "hour"],  "petainch" => [15, "inch"],
+  "petajoule" => [15, "joule"],  "petakelvin" => [15, "kelvin"],
+  "petakilogram" => [15, "kilogram"],  "petaknot" => [15, "knot"],
+  "petalitre" => [15, "litre"],  "petameter" => [15, "meter"],
+  "petametre" => [15, "metre"],  "petamicron" => [15, "micron"],
+  "petamile" => [15, "mile"],  "petamillibar" => [15, "millibar"],
+  "petaminute" => [15, "minute"],
+  "petaminute_angle" => [15, "minute_angle"],
+  "petamole" => [15, "mole"],  "petamonth" => [15, "month"],
+  "petanewton" => [15, "newton"],  "petaounce" => [15, "ounce"],
+  "petaparsec" => [15, "parsec"],  "petapascal" => [15, "pascal"],
+  "petapentad" => [15, "pentad"],  "petapoise" => [15, "poise"],
+  "petapound" => [15, "pound"],  "petaradian" => [15, "radian"],
+  "petasecond" => [15, "second"],
+  "petasecond_angle" => [15, "second_angle"],
+  "petasteradian" => [15, "steradian"],  "petastokes" => [15, "stokes"],
+  "petatesla" => [15, "tesla"],  "petaton" => [15, "ton"],
+  "petatonne" => [15, "tonne"],  "petatorr" => [15, "torr"],
+  "petavolt" => [15, "volt"],  "petawatt" => [15, "watt"],
+  "petaweber" => [15, "weber"],  "petayard" => [15, "yard"],
+  "petayd" => [15, "yd"],  "petayear" => [15, "year"],
+  "pforce" => [-12, "force"],  "pg" => [-12, "g"],
+  "pgravity" => [-12, "gravity"],  "ph" => [-12, "h"],
+  "phg" => [-12, "hg"],  "phr" => [-12, "hr"],
+  "picoCelsius" => [-12, "Celsius"],
+  "picoFahrenheit" => [-12, "Fahrenheit"],
+  "picoJulian_year" => [-12, "Julian_year"],
+  "picoPascal" => [-12, "Pascal"],  "picoacre" => [-12, "acre"],
+  "picoampere" => [-12, "ampere"],  "picoangstrom" => [-12, "angstrom"],
+  "picoangular_degree" => [-12, "angular_degree"],
+  "picoangular_minute" => [-12, "angular_minute"],
+  "picoangular_second" => [-12, "angular_second"],
+  "picoare" => [-12, "are"],  "picoatmosphere" => [-12, "atmosphere"],
+  "picocalorie" => [-12, "calorie"],  "picocelsius" => [-12, "celsius"],
+  "picocentigrade" => [-12, "centigrade"],
+  "picocentury" => [-12, "century"],  "picochain" => [-12, "chain"],
+  "picocommon_year" => [-12, "common_year"],
+  "picocoulomb" => [-12, "coulomb"],  "picoday" => [-12, "day"],
+  "picodegK" => [-12, "degK"],  "picodeg_K" => [-12, "deg_K"],
+  "picodegree" => [-12, "degree"],  "picodegreeK" => [-12, "degreeK"],
+  "picodyne" => [-12, "dyne"],  "picoerg" => [-12, "erg"],
+  "picofahrenheit" => [-12, "fahrenheit"],
+  "picofarad" => [-12, "farad"],  "picofermi" => [-12, "fermi"],
+  "picogal" => [-12, "gal"],  "picogauss" => [-12, "gauss"],
+  "picogram" => [-12, "gram"],  "picohectare" => [-12, "hectare"],
+  "picohertz" => [-12, "hertz"],  "picohour" => [-12, "hour"],
+  "picoinch" => [-12, "inch"],  "picojoule" => [-12, "joule"],
+  "picokelvin" => [-12, "kelvin"],  "picokilogram" => [-12, "kilogram"],
+  "picoknot" => [-12, "knot"],  "picolitre" => [-12, "litre"],
+  "picometer" => [-12, "meter"],  "picometre" => [-12, "metre"],
+  "picomicron" => [-12, "micron"],  "picomile" => [-12, "mile"],
+  "picomillibar" => [-12, "millibar"],  "picominute" => [-12, "minute"],
+  "picominute_angle" => [-12, "minute_angle"],
+  "picomole" => [-12, "mole"],  "picomonth" => [-12, "month"],
+  "piconewton" => [-12, "newton"],  "picoounce" => [-12, "ounce"],
+  "picoparsec" => [-12, "parsec"],  "picopascal" => [-12, "pascal"],
+  "picopentad" => [-12, "pentad"],  "picopoise" => [-12, "poise"],
+  "picopound" => [-12, "pound"],  "picoradian" => [-12, "radian"],
+  "picosecond" => [-12, "second"],
+  "picosecond_angle" => [-12, "second_angle"],
+  "picosteradian" => [-12, "steradian"],
+  "picostokes" => [-12, "stokes"],  "picotesla" => [-12, "tesla"],
+  "picoton" => [-12, "ton"],  "picotonne" => [-12, "tonne"],
+  "picotorr" => [-12, "torr"],  "picovolt" => [-12, "volt"],
+  "picowatt" => [-12, "watt"],  "picoweber" => [-12, "weber"],
+  "picoyard" => [-12, "yard"],  "picoyd" => [-12, "yd"],
+  "picoyear" => [-12, "year"],  "pin" => [-12, "in"],
+  "pkg" => [-12, "kg"],  "pkgf" => [-12, "kgf"],
+  "pkph" => [-12, "kph"],  "plb" => [-12, "lb"],  "plm" => [-12, "lm"],
+  "plx" => [-12, "lx"],  "ply" => [-12, "ly"],  "pm" => [-12, "m"],
+  "pmb" => [-12, "mb"],  "pmercury" => [-12, "mercury"],
+  "pmgal" => [-12, "mgal"],  "pmin" => [-12, "min"],
+  "pmol" => [-12, "mol"],  "pmon" => [-12, "mon"],
+  "pmph" => [-12, "mph"],  "pohm" => [-12, "ohm"],
+  "poises" => [0, "poise"],  "pounds" => [0, "pound"],
+  "poz" => [-12, "oz"],  "ppc" => [-12, "pc"],
+  "ppercent" => [-12, "percent"],  "ppermil" => [-12, "permil"],
+  "ppsi" => [-12, "psi"],  "prad" => [-12, "rad"],  "ps" => [-12, "s"],
+  "psr" => [-12, "sr"],  "pt" => [-12, "t"],  "pyr" => [-12, "yr"],
+  "radians" => [0, "radian"],  "seconds" => [0, "second"],
+  "seconds_angle" => [0, "second_angle"],
+  "steradians" => [0, "steradian"],  "stokeses" => [0, "stokes"],
+  "telaCelsius" => [12, "Celsius"],
+  "telaFahrenheit" => [12, "Fahrenheit"],
+  "telaJulian_year" => [12, "Julian_year"],
+  "telaPascal" => [12, "Pascal"],  "telaacre" => [12, "acre"],
+  "telaampere" => [12, "ampere"],  "telaangstrom" => [12, "angstrom"],
+  "telaangular_degree" => [12, "angular_degree"],
+  "telaangular_minute" => [12, "angular_minute"],
+  "telaangular_second" => [12, "angular_second"],
+  "telaare" => [12, "are"],  "telaatmosphere" => [12, "atmosphere"],
+  "telacalorie" => [12, "calorie"],  "telacelsius" => [12, "celsius"],
+  "telacentigrade" => [12, "centigrade"],
+  "telacentury" => [12, "century"],  "telachain" => [12, "chain"],
+  "telacommon_year" => [12, "common_year"],
+  "telacoulomb" => [12, "coulomb"],  "teladay" => [12, "day"],
+  "teladegK" => [12, "degK"],  "teladeg_K" => [12, "deg_K"],
+  "teladegree" => [12, "degree"],  "teladegreeK" => [12, "degreeK"],
+  "teladyne" => [12, "dyne"],  "telaerg" => [12, "erg"],
+  "telafahrenheit" => [12, "fahrenheit"],  "telafarad" => [12, "farad"],
+  "telafermi" => [12, "fermi"],  "telagal" => [12, "gal"],
+  "telagauss" => [12, "gauss"],  "telagram" => [12, "gram"],
+  "telahectare" => [12, "hectare"],  "telahertz" => [12, "hertz"],
+  "telahour" => [12, "hour"],  "telainch" => [12, "inch"],
+  "telajoule" => [12, "joule"],  "telakelvin" => [12, "kelvin"],
+  "telakilogram" => [12, "kilogram"],  "telaknot" => [12, "knot"],
+  "telalitre" => [12, "litre"],  "telameter" => [12, "meter"],
+  "telametre" => [12, "metre"],  "telamicron" => [12, "micron"],
+  "telamile" => [12, "mile"],  "telamillibar" => [12, "millibar"],
+  "telaminute" => [12, "minute"],
+  "telaminute_angle" => [12, "minute_angle"],
+  "telamole" => [12, "mole"],  "telamonth" => [12, "month"],
+  "telanewton" => [12, "newton"],  "telaounce" => [12, "ounce"],
+  "telaparsec" => [12, "parsec"],  "telapascal" => [12, "pascal"],
+  "telapentad" => [12, "pentad"],  "telapoise" => [12, "poise"],
+  "telapound" => [12, "pound"],  "telaradian" => [12, "radian"],
+  "telasecond" => [12, "second"],
+  "telasecond_angle" => [12, "second_angle"],
+  "telasteradian" => [12, "steradian"],  "telastokes" => [12, "stokes"],
+  "telatesla" => [12, "tesla"],  "telaton" => [12, "ton"],
+  "telatonne" => [12, "tonne"],  "telatorr" => [12, "torr"],
+  "telavolt" => [12, "volt"],  "telawatt" => [12, "watt"],
+  "telaweber" => [12, "weber"],  "telayard" => [12, "yard"],
+  "telayd" => [12, "yd"],  "telayear" => [12, "year"],
+  "teslas" => [0, "tesla"],  "tonnes" => [0, "tonne"],
+  "tons" => [0, "ton"],  "torrs" => [0, "torr"],  "u%" => [-6, "%"],
+  "uA" => [-6, "A"],  "uAu" => [-6, "Au"],  "uBq" => [-6, "Bq"],
+  "uC" => [-6, "C"],  "uF" => [-6, "F"],  "uG" => [-6, "G"],
+  "uGal" => [-6, "Gal"],  "uGy" => [-6, "Gy"],  "uH" => [-6, "H"],
+  "uHg" => [-6, "Hg"],  "uHz" => [-6, "Hz"],  "uJ" => [-6, "J"],
+  "uK" => [-6, "K"],  "uL" => [-6, "L"],  "uN" => [-6, "N"],
+  "uP" => [-6, "P"],  "uPa" => [-6, "Pa"],  "uS" => [-6, "S"],
+  "uSt" => [-6, "St"],  "uSv" => [-6, "Sv"],  "uT" => [-6, "T"],
+  "uV" => [-6, "V"],  "uW" => [-6, "W"],  "uWb" => [-6, "Wb"],
+  "ua" => [-6, "a"],  "uac" => [-6, "ac"],  "uatm" => [-6, "atm"],
+  "ubar" => [-6, "bar"],  "ucal" => [-6, "cal"],
+  "uconventional_mercury" => [-6, "conventional_mercury"],
+  "ud" => [-6, "d"],  "udegC" => [-6, "degC"],  "udegF" => [-6, "degF"],
+  "udeg_C" => [-6, "deg_C"],  "udeg_F" => [-6, "deg_F"],
+  "udegreeC" => [-6, "degreeC"],  "udegreeF" => [-6, "degreeF"],
+  "udegree_C" => [-6, "degree_C"],  "udegree_E" => [-6, "degree_E"],
+  "udegree_F" => [-6, "degree_F"],  "udegree_N" => [-6, "degree_N"],
+  "udegree_R" => [-6, "degree_R"],  "udegree_S" => [-6, "degree_S"],
+  "udegree_W" => [-6, "degree_W"],  "udegree_c" => [-6, "degree_c"],
+  "udegree_east" => [-6, "degree_east"],
+  "udegree_f" => [-6, "degree_f"],
+  "udegree_north" => [-6, "degree_north"],
+  "udegree_south" => [-6, "degree_south"],
+  "udegree_west" => [-6, "degree_west"],
+  "udegrees_east" => [-6, "degrees_east"],
+  "udegrees_north" => [-6, "degrees_north"],
+  "udegrees_south" => [-6, "degrees_south"],
+  "udegrees_west" => [-6, "degrees_west"],  "udyn" => [-6, "dyn"],
+  "uerg" => [-6, "erg"],  "uforce" => [-6, "force"],  "ug" => [-6, "g"],
+  "ugravity" => [-6, "gravity"],  "uh" => [-6, "h"],
+  "uhg" => [-6, "hg"],  "uhr" => [-6, "hr"],  "uin" => [-6, "in"],
+  "ukg" => [-6, "kg"],  "ukgf" => [-6, "kgf"],  "ukph" => [-6, "kph"],
+  "ulb" => [-6, "lb"],  "ulm" => [-6, "lm"],  "ulx" => [-6, "lx"],
+  "uly" => [-6, "ly"],  "um" => [-6, "m"],  "umb" => [-6, "mb"],
+  "umercury" => [-6, "mercury"],  "umgal" => [-6, "mgal"],
+  "umin" => [-6, "min"],  "umol" => [-6, "mol"],  "umon" => [-6, "mon"],
+  "umph" => [-6, "mph"],  "uohm" => [-6, "ohm"],  "uoz" => [-6, "oz"],
+  "upc" => [-6, "pc"],  "upercent" => [-6, "percent"],
+  "upermil" => [-6, "permil"],  "upsi" => [-6, "psi"],
+  "urad" => [-6, "rad"],  "us" => [-6, "s"],  "usr" => [-6, "sr"],
+  "ut" => [-6, "t"],  "uyr" => [-6, "yr"],  "volts" => [0, "volt"],
+  "watts" => [0, "watt"],  "webers" => [0, "weber"],
+  "yards" => [0, "yard"],  "yds" => [0, "yd"],  "years" => [0, "year"],
+}
+UPLURALS = {
+  "Celsiuses" => "Celsius",  "Fahrenheits" => "Fahrenheit",
+  "Julians_year" => "Julian_year",  "Pascals" => "Pascal",
+  "acres" => "acre",  "amperes" => "ampere",  "angstroms" => "angstrom",
+  "angulars_degree" => "angular_degree",
+  "angulars_minute" => "angular_minute",
+  "angulars_second" => "angular_second",  "ares" => "are",
+  "atmospheres" => "atmosphere",  "calories" => "calorie",
+  "celsiuses" => "celsius",  "centigrades" => "centigrade",
+  "centuries" => "century",  "chains" => "chain",
+  "commons_year" => "common_year",  "coulombs" => "coulomb",
+  "days" => "day",  "degKs" => "degK",  "degreeKs" => "degreeK",
+  "degrees" => "degree",  "degs_K" => "deg_K",  "dynes" => "dyne",
+  "ergs" => "erg",  "fahrenheits" => "fahrenheit",  "farads" => "farad",
+  "fermis" => "fermi",  "gals" => "gal",  "gausses" => "gauss",
+  "grams" => "gram",  "hectares" => "hectare",  "hertzes" => "hertz",
+  "hours" => "hour",  "inchs" => "inch",  "joules" => "joule",
+  "kelvins" => "kelvin",  "kilograms" => "kilogram",  "knots" => "knot",
+  "litres" => "litre",  "meters" => "meter",  "metres" => "metre",
+  "microns" => "micron",  "miles" => "mile",  "millibars" => "millibar",
+  "minutes" => "minute",  "minutes_angle" => "minute_angle",
+  "moles" => "mole",  "months" => "month",  "newtons" => "newton",
+  "ounces" => "ounce",  "parsecs" => "parsec",  "pascals" => "pascal",
+  "pentads" => "pentad",  "poises" => "poise",  "pounds" => "pound",
+  "radians" => "radian",  "seconds" => "second",
+  "seconds_angle" => "second_angle",  "steradians" => "steradian",
+  "stokeses" => "stokes",  "teslas" => "tesla",  "tonnes" => "tonne",
+  "tons" => "ton",  "torrs" => "torr",  "volts" => "volt",
+  "watts" => "watt",  "webers" => "weber",  "yards" => "yard",
+  "yds" => "yd",  "years" => "year",
+}
+end
+class NumberNode < TerminalNode
+
+    def initialize(arg)
+	raise TypeError unless Numeric === arg
+	@a = arg
+    end
+
+    UNITY = NumberNode.new(1)
+    ZERO = NumberNode.new(0)
+
+    def to_s
+      if @a == @a.to_i
+        sprintf("%d", at a)
+      else
+        String(@a)
+      end
+    end
+
+    attr_reader :a
+
+    alias :value :a
+    alias :factor :a
+
+    def == (other)
+      case other
+      when NumberNode
+	@a == other.a
+      else
+	false
+      end
+    end
+
+    def add_eval(another)
+	raise TypeError unless NumberNode === another
+	NumberNode.new(@a + another.value)
+    end
+
+    def mul_eval(another)
+	case another
+	when NumberNode then NumberNode.new(@a * another.a)
+	when PowNode
+	    raise TypeError unless NumberNode === another.lhs
+	    raise TypeError unless NumberNode === another.rhs
+	    NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value))
+	else raise TypeError
+	end
+    end
+
+    def name; "1"; end
+
+    def power;  UNITY;  end
+
+end
+class XDate
+
+    def initialize(year, month, day)
+	@year, @month, @day = year.to_i, month.to_i, day.to_i
+    end
+
+    attr_reader :year, :month, :day
+
+    def to_s
+	format('%04d-%02d-%02d', @year, @month, @day)
+    end
+
+    alias :inspect :to_s
+
+    def to_time
+	Time.gm(@year, @month, @day)
+    end
+
+    def to_date
+	Date.new(@year, @month, @day)
+    end
+
+    def -(other)
+	case other
+	when XDate
+	    (to_date - other.to_date)
+	when Time
+	    to_time - other
+	when Date
+            (to_date - other.to_date)
+	else
+	    to_date - other
+	end
+    end
+
+    def +(other)
+	t = to_date + other
+	self.class.new(t.year, t.month, t.mday)
+    end
+
+end
+
+class TimeNode < TerminalNode
+
+    def initialize(date, time, zone)
+	@date, @time, @zone = date, time, zone
+	if :now === @date then
+	    now = Time.now.utc
+	    @date = XDate.new(now.year, now.month, now.day)
+	    @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec))
+	else
+	    qdays = (@time / 86400).floor
+	    if not qdays.zero?
+	        @date += qdays
+	        @time -= (qdays * 86400)
+	    end
+	end
+	raise TypeError unless XDate === @date
+	@time = 0.0 unless @time
+	raise TypeError unless Float === @time
+	@zone = 0 unless @zone
+	raise TypeError unless Integer === @zone
+    end
+
+    attr_reader :date, :time, :zone
+
+    def to_s
+	hr = @time.floor / 3600
+	mi = (@time.floor / 60) % 60
+	sc = @time % 60
+	tzm = @zone.abs
+	tzh = tzm / 60
+	tzm %= 60
+	tzh = -tzh if @zone < 0
+	format("%sT%02d:%02d:%05.2f %+03d:%02d", \
+	    @date.to_s, hr, mi, sc, tzh, tzm)
+    end
+
+    def self::pentad(d)
+	(d > 25) ? 5 : ((d - 1) / 5)
+    end
+
+    def add_time(increment)
+	inc = increment.reduce5
+	case inc.name
+	when 's'
+	    t2 = @time + inc.factor
+	    d2 = @date + (t2 / 86400)
+	    t2 = t2 % 86400
+	    self.class.new(d2, t2, @zone)
+	when 'pentad'
+	    ifac = Integer(inc.factor)
+	    ipen = ifac % 6
+	    imon = ifac / 6
+	    spen = self.class.pentad(@date.day)
+	    smon = @date.month + imon + spen / 6
+	    spen = spen % 6
+	    sday = spen * 5 + (@date.day - 1) % 5 + 1
+	    syear = @date.year + (smon - 1) / 12
+	    smon = (smon - 1) % 12 + 1
+	    sdate = XDate.new(syear, smon, sday)
+	    self.class.new(sdate, @time, @zone)
+	else
+	    raise "bad time unit '#{inc.name}'"
+	end
+    end
+
+    def utcsod
+	@time - @zone * 60
+    end
+
+    def div_time(units)
+	base = units.ref
+	inc = units.deref.reduce5
+	begin
+	    incname = inc.name
+	rescue Exception
+	    incname = "(undefined)"
+	end
+	case incname
+	when 's'
+	    dif = (@date - base.date) * 86400 + (utcsod - base.utcsod)
+	    dif / inc.factor
+	when 'pentad'
+	    dif = (@date.year - base.date.year) * 72
+	    dif += (@date.month - base.date.month) * 6
+	    dif += self.class.pentad(@date.day)
+	    dif -= self.class.pentad(base.date.day)
+	    dif = Float(dif) if dif % inc.factor != 0
+	    dif / inc.factor
+	else
+	    raise "bad time unit '#{incname}'"
+	end
+    end
+
+end
+class PowNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+	raise TypeError unless NumberNode === @rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	case lhs
+	when /\d$/, /[\d\.]/
+	    lhs = "(#{lhs})"
+	end
+	rhs = @rhs.to_s
+        if rhs == '1'
+	    lhs
+	else
+	    rhs = "^(#{rhs})" if (/\./ =~ rhs)
+	    lhs + rhs
+	end
+    end
+
+    attr_reader :lhs, :rhs
+    alias :power :rhs
+
+    def pow_eval(other)
+	case other
+	when NumberNode
+	    PowNode.new(@lhs, @rhs.mul_eval(other))
+	else
+	    super(other)
+	end
+    end
+
+    def flatten2
+	x = @lhs.flatten2
+	case x
+	when NumberNode
+	    a = @lhs.pow_eval(@rhs)
+	when TerminalNode
+	    a = self
+	when PowNode
+	    a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs))
+	when MulNode, MultiNode
+	    a = MultiNode.new()
+	    for gc in x
+		a.append(gc.pow_eval(@rhs))
+	    end
+	else
+	    raise "internal error"
+	end
+	return a
+    end
+
+    def name
+	case @lhs
+	when NumberNode, NameNode
+	    @lhs.name
+	else
+	    raise "internal error"
+	end
+    end
+
+    def value
+	case @lhs
+	when NumberNode
+	    Units::pow_f(@lhs.value, @rhs.value)
+	else
+	    raise(format('%s#value: internal error', self.class.to_s))
+	end
+    end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value)
+	else
+	    self.class.new(@lhs, @rhs.add_eval(another.power))
+	end
+    end
+
+    def sort
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value))
+	else
+	    self
+	end
+    end
+
+    def factor
+	Units::pow_f(@lhs.factor, @rhs.value)
+    end
+
+end
+
+module Kakezan
+
+    def flatten2
+	r = MultiNode.new()
+	each do |child|
+	    case child
+	    when MultiNode
+		r.append child
+	    when MulNode
+		r.append child.flatten2
+	    when ContainerNode
+		r.append child.flatten2
+	    else
+		r.append child
+	    end 
+	end
+	r
+    end
+
+    def name
+	n = nil
+	for c in @children
+	    next if NumberNode === c
+	    na = c.name
+	    if n.nil?
+		n = na
+	    else
+		raise "multiple names found" if na != n
+	    end
+	end
+	n = "1" if n.nil?
+	n
+    end
+
+    def factor
+	f = 1
+	for c in @children
+	    f *= c.factor
+	end
+	f
+    end
+
+end
+
+class MulNode < ContainerNode
+
+    include BinaryNode
+    include Kakezan
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	rhs = @rhs.to_s
+	if (/\d$/ =~ lhs && /^\w/ =~ rhs) then
+	    "#{lhs} #{rhs}"
+	else
+	    "#{lhs}.#{rhs}"
+	end
+    end
+
+end
+
+class MultiNode < ContainerNode
+
+    include Kakezan
+
+    def initialize(*children)
+	@children = children
+	for c in @children
+	    raise "# MultiNode.new(#{children.inspect})" unless Node === c
+	end
+    end
+
+    def to_s
+	s = @children.join(';')
+	s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.')
+    end
+
+    def each
+	@children.each {|child| yield child }
+    end
+
+    attr_reader :children
+    
+    def append(other)
+	case other
+	when MultiNode
+	    @children += other.children
+	else
+	    @children.push other
+	end
+    end
+
+    def sort
+	table = {}
+	for child in self
+	    name = child.name
+	    if (table.include?(name)) then
+		table[name] = table[name].mul_eval(child)
+	    else
+		table[name] = child
+	    end
+	end
+	list = []
+	for name in table.keys.sort
+	    candi = table[name]
+	    if PowNode === candi and NumberNode === candi.lhs then
+		v = candi.value
+		list.push NumberNode.new(v) unless v == 1
+		next
+	    end
+	    next if candi.power.value == 0
+	    list.push candi
+	end
+        if list.length > 1
+	  list.delete(NumberNode::UNITY)
+	end
+	self.class.new(*list)
+    end
+
+    def collect_hash(stopper, op)
+	list = []
+	for child in self
+	    list.push(child.send(op, stopper))
+	end
+	self.class.new(*list).flatten2
+    end
+
+    def expand(stopper)
+	collect_hash(stopper, :expand)
+    end
+
+    def unalias(stopper)
+	collect_hash(stopper, :unalias)
+    end
+
+    def foldnumber(stopper)
+	collect_hash(stopper, :foldnumber)
+    end
+
+    def value
+	raise "this is dimensional units" if (@children.size > 1)
+	@children.first ? @children.first.value : NumberNode::UNITY.value
+    end
+
+end
+class ShiftNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    attr_reader :lhs, :rhs
+    alias :ref :rhs
+
+    def to_s
+	"(#{@lhs.to_s} @ #{@rhs.to_s})"
+    end
+
+    def trim2;  @lhs;  end
+    def trim
+      	self.class.new(@lhs.trim, @rhs.trim2)
+    end
+
+    def flatten2;  @lhs;  end
+    def flatten
+	lf = @lhs.flatten
+	case lf
+	when ShiftNode
+	    rf = lf.rhs.add_eval(@rhs)
+	    self.class.new(lf.lhs, rf)
+	else
+	    self.class.new(lf, @rhs.flatten)
+	end
+    end
+
+    def sort
+	self.class.new(@lhs.sort, @rhs.sort)
+    end
+
+    def ref
+	case @lhs
+	when ShiftNode
+	    @lhs.ref.add_eval(@rhs)
+	else
+	    @rhs
+	end
+    end
+
+    def deref
+	case @lhs
+	when ShiftNode
+	    @lhs.deref
+	else
+	    @lhs
+	end
+    end
+
+    def name
+	@lhs.name
+    end
+
+    def factor
+	@lhs.factor
+    end
+
+end
+def initialize string
+    case string
+    when String
+        @string, @ptree = string, nil
+    when Node
+        @string, @ptree = nil, string
+    else
+        @string, @ptree = String(string), nil
+    end
+    @copy = @lexstat = nil
+end
+
+#
+# === LEXICAL ANALYZER ===
+#
+
+def rewind
+    @copy = @string.dup.strip
+    @lexstat = nil
+end
+
+RE_SPACE	= '([ \t])'
+RE_INTEGER	= '([-+]?\d+)'
+RE_EXP		= '([eE][-+]?[0-9]+)'
+RE_REAL		= "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))"
+RE_YEAR		= "([-+]?[0-9]{1,4})"
+RE_MONTH	= "(0?[1-9]|1[0-2])"
+RE_DAY		= "([12][0-9]|30|31|0?[1-9])"
+RE_HOUR		= "(2[0-3]|[0-1]?[0-9])"
+RE_MINUTE	= "([0-5]?[0-9])"
+RE_SECOND	= "((#{RE_MINUTE}|60)(\\.[0-9]*)?)"
+RE_NAME		= "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)"
+
+RE_DATE		= "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}"
+RE_TIME		= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?"
+RE_HandM	= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?"
+
+def next_token
+
+    # decomment
+    @copy.sub!(/^#.*/, '');
+
+    if @copy.sub!(%r{^\s*(\))}, '') then
+	@lexstat = nil
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^\s*(\()\s*}, '') then
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then
+	@lexstat = :SHIFT_SEEN
+	return [:SHIFT, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then
+	@lexstat = nil
+	return [:DIVIDE, $1]
+    end
+
+    if @copy.sub!(%r{^(\^|\*\*)}, '') then
+	@lexstat = nil
+	return [:EXPONENT, $1]
+    end
+
+    if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then
+	y, m, d = $1, $2, $3
+	@lexstat = :DATE_SEEN
+	return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^now[ \t]*}, '') then
+	@lexstat = nil
+	return [:DATE, :now]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then
+	h, m, s = $1, $3, $5
+        m = m.sub(/:/,'') if m
+	s = 0 if s.nil?
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^UTC[ \t]*}, '') then
+	@lexstat = nil
+	return [:ZONE, 0]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then
+	sgn, h, m = $1, $2, $4
+        m = m.sub(/:/,'') if m
+	@lexstat = nil
+	h = h.to_i
+	h = -h if sgn == "-"
+	m = m.to_i
+	m = -m if sgn == "-"
+	return [:ZONE, ((h * 60) + m)]
+    end
+
+    if @copy.sub!(%r{^#{RE_NAME}}, '') then
+	@lexstat = nil
+	return [:NAME, $1]
+    end
+
+    if @copy.sub!(%r{^#{RE_REAL}}, '') then
+	@lexstat = nil
+	return [:REAL, $1.to_f]
+    end
+
+    if @copy.sub!(%r{^#{RE_INTEGER}}, '') then
+	@lexstat = nil
+	return [:INT, $1.to_i]
+    end
+
+    if @copy.sub!(%r{^(-)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if @copy.sub!(%r{^(.)}, '') then
+	return [$1, $1]
+    end
+
+    return [false, false]
+
+end
+
+#
+# === USER LEVEL METHODS ===
+#
+
+def tokens
+    rewind
+    x = []
+    while (t = next_token).first
+	x.push t
+    end
+    x
+end
+
+def do_parse2
+    rewind
+    return NumberNode.new(1) if @string.nil? or @string.empty?
+    pa = do_parse
+    pa ? pa : ErrorNode.new(@string)
+end
+
+def ptree
+    @ptree = do_parse2 if not @ptree
+    @ptree
+end
+
+def dup
+    @string ? self.class.new(@string) : self.class.new(@ptree)
+end
+
+def parse
+    dup.parse!
+end
+
+def parse!
+    @ptree = do_parse2 if not @ptree
+    self
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+=begin
+--- reduce0
+    just do nothing.
+=end
+
+def reduce0
+    self
+end
+
+=begin
+--- reduce1
+    removes unnecessary parentheses.
+=end
+
+def reduce1
+    @string = ptree.to_s
+    self
+end
+
+=begin
+--- reduce2
+    removes shift operator within multiplication/division/exponent
+=end
+
+def reduce2
+    @ptree = ptree.reduce2
+    @string = nil
+    self
+end
+
+=begin
+--- reduce3
+    flattens expression and collects all factors
+=end
+
+def reduce3
+    @ptree = ptree.reduce3
+    @string = nil
+    self
+end
+
+=begin
+--- reduce4
+    collects terms with the same name
+=end
+
+def reduce4
+    @ptree = ptree.reduce4
+    @string = nil
+    self
+end
+
+=begin
+--- reduce5
+    expands all terms recursively
+=end
+
+def reduce5
+    @ptree = ptree.reduce5
+    @string = nil
+    self
+end
+
+attr_reader :string
+
+def to_s
+    @string = @ptree.to_s if @string.nil?
+    @string
+end
+
+def inspect
+    if @ptree.nil? then
+	"Units{#{@string}}"
+    else
+	"Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[')
+    end
+end
+
+def self::[](string)
+    new(string)
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+def eval(x = 0)
+    r5 = ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add(x, r5.name)
+    else
+	fac = NumberNode.new(x + r.value)
+	self.class.new(MulNode.new(fac, r5.deref))
+    end
+end
+
+def convert(numeric, to_units)
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    r5 = dup.ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree)
+    else
+	shift1 = r.value
+	numeric = shift1 + numeric if shift1 != 0
+	fact = r5.divide(tp = to_units.dup.ptree).reduce5.value
+	numeric *= fact if fact != 1
+	shift2 = tp.reduce5.ref.value
+	numeric = numeric - shift2 if shift2 != 0
+	numeric
+    end
+end
+
+def factor_and_offset(to_units)
+    # To convert a numeric from self to to_units: 
+    # scale_factor * numeric + add_offset
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    add_offset = convert(0, to_units)
+    scale_factor = convert(1, to_units) - add_offset
+    [ scale_factor, add_offset ]
+end
+
+def convert2(val, to_units)
+    # Like Units#convert, but applicable to any Numeric-like objects.
+    # Returns the original value if the units are incompatible.
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    if ( self == to_units )
+        val
+    elsif ( self =~ to_units )
+        if Numeric===val
+            convert( val, to_units )
+        else
+            factor, offset = factor_and_offset( to_units )
+            val*factor + offset
+        end
+    else
+      unless $VERBOSE.nil?
+	$stderr.print( "*WARNING*: " +
+                 "incompatible units: #{self.to_s} and #{to_units.to_s}\n")
+        caller(0).each{|c| $stderr.print "\t* ",c,"\n"}
+      end        
+      val
+    end
+end
+
+@@reduce = :reduce4
+
+def self::reduce_level
+    @@reduce.to_s[-1]
+end
+
+def self::reduce_level=(n)
+    @@reduce = case n
+    when 1 then :reduce1
+    when 2 then :reduce2
+    when 3 then :reduce3
+    when 4 then :reduce4
+    else :reduce5
+    end
+end
+
+def binop(op, other)
+    case other
+    when Numeric
+	other = NumberNode.new(other)
+    when Units
+	other = other.ptree
+    end
+    q = self.ptree.send(op, other).send(@@reduce)
+    Units.new(q)
+end
+
+def *(other)
+    binop(:mul, other)
+end
+
+def **(other)
+    binop(:pow, other)
+end
+
+def /(other)
+    binop(:divide, other)
+end
+
+def ^(other)
+    binop(:shift, other)
+end
+
+def ==(other)
+    case other
+    when self.class
+	dup.reduce5.to_s == other.dup.reduce5.to_s
+    else
+	false
+    end
+end
+
+#def === (other)
+#    reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s
+#end
+
+alias === ==
+
+#def === (other)
+#  # returns true if other is within a factor and/or offset of difference.
+#  case other
+#  when self.class
+#    (self/other).reduce5.ptree.children.each do |child|
+#      return false if !( NumberNode === child )
+#    end
+#    true
+#  else
+#    false
+#  end
+#end
+
+
+def =~(other)
+  case other
+  when self.class
+    (self/other).reduce5.ptree.children.each{ |node|
+      return false unless NumberNode === node
+    }
+    true
+  else
+    false
+  end
+end
+
+def self::pow_f(a, b)
+    if Integer === b and b < 0 then
+	a ** b.to_f
+    else
+	a ** b
+    end
+end
diff --git a/src/units.rb b/src/units.rb
new file mode 100644
index 0000000..2b89761
--- /dev/null
+++ b/src/units.rb
@@ -0,0 +1,3505 @@
+#
+# DO NOT MODIFY!!!!
+# This file is automatically generated by racc 1.4.5
+# from racc grammer file "units.racc".
+#
+#
+# tmp.rb: generated by racc (runtime embedded)
+#
+###### racc/parser.rb begin
+unless $".index 'racc/parser.rb'
+$".push 'racc/parser.rb'
+
+#
+# $Id: units.rb,v 1.24 2011-08-03 09:16:08 horinout Exp $
+#
+# Copyright (c) 1999-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the same terms of ruby.
+#
+# As a special exception, when this code is copied by Racc
+# into a Racc output file, you may use that output file
+# without restriction.
+#
+
+unless defined?(NotImplementedError)
+  NotImplementedError = NotImplementError
+end
+
+module Racc
+  class ParseError < StandardError; end
+end
+unless defined?(::ParseError)
+  ParseError = Racc::ParseError
+end
+
+module Racc
+
+  unless defined?(Racc_No_Extentions)
+    Racc_No_Extentions = false
+  end
+
+  class Parser
+
+    Racc_Runtime_Version = '1.4.5'
+    Racc_Runtime_Revision = '$Revision: 1.24 $'.split[1]
+
+    Racc_Runtime_Core_Version_R = '1.4.5'
+    Racc_Runtime_Core_Revision_R = '$Revision: 1.24 $'.split[1]
+    begin
+      require 'racc/cparse'
+    # Racc_Runtime_Core_Version_C  = (defined in extention)
+      Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
+      unless new.respond_to?(:_racc_do_parse_c, true)
+        raise LoadError, 'old cparse.so'
+      end
+      if Racc_No_Extentions
+        raise LoadError, 'selecting ruby version of racc runtime core'
+      end
+
+      Racc_Main_Parsing_Routine    = :_racc_do_parse_c
+      Racc_YY_Parse_Method         = :_racc_yyparse_c
+      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_C
+      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_C
+      Racc_Runtime_Type            = 'c'
+    rescue LoadError
+      Racc_Main_Parsing_Routine    = :_racc_do_parse_rb
+      Racc_YY_Parse_Method         = :_racc_yyparse_rb
+      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_R
+      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_R
+      Racc_Runtime_Type            = 'ruby'
+    end
+
+    def Parser.racc_runtime_type
+      Racc_Runtime_Type
+    end
+
+    private
+
+    def _racc_setup
+      @yydebug = false unless self.class::Racc_debug_parser
+      @yydebug = false unless defined?(@yydebug)
+      if @yydebug
+        @racc_debug_out = $stderr unless defined?(@racc_debug_out)
+        @racc_debug_out ||= $stderr
+      end
+      arg = self.class::Racc_arg
+      arg[13] = true if arg.size < 14
+      arg
+    end
+
+    def _racc_init_sysvars
+      @racc_state  = [0]
+      @racc_tstack = []
+      @racc_vstack = []
+
+      @racc_t = nil
+      @racc_val = nil
+
+      @racc_read_next = true
+
+      @racc_user_yyerror = false
+      @racc_error_status = 0
+    end
+
+    ###
+    ### do_parse
+    ###
+
+    def do_parse
+      __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
+    end
+
+    def next_token
+      raise NotImplementedError, "#{self.class}\#next_token is not defined"
+    end
+
+    def _racc_do_parse_rb(arg, in_debug)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+
+      _racc_init_sysvars
+      tok = act = i = nil
+      nerr = 0
+
+      catch(:racc_end_parse) {
+        while true
+          if i = action_pointer[@racc_state[-1]]
+            if @racc_read_next
+              if @racc_t != 0   # not EOF
+                tok, @racc_val = next_token()
+                unless tok      # EOF
+                  @racc_t = 0
+                else
+                  @racc_t = (token_table[tok] or 1)   # error token
+                end
+                racc_read_token(@racc_t, tok, @racc_val) if @yydebug
+                @racc_read_next = false
+              end
+            end
+            i += @racc_t
+            unless i >= 0 and
+                   act = action_table[i] and
+                   action_check[i] == @racc_state[-1]
+              act = action_default[@racc_state[-1]]
+            end
+          else
+            act = action_default[@racc_state[-1]]
+          end
+          while act = _racc_evalact(act, arg)
+            ;
+          end
+        end
+      }
+    end
+
+    ###
+    ### yyparse
+    ###
+
+    def yyparse(recv, mid)
+      __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
+    end
+
+    def _racc_yyparse_rb(recv, mid, arg, c_debug)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+
+      _racc_init_sysvars
+      tok = nil
+      act = nil
+      i = nil
+      nerr = 0
+
+      catch(:racc_end_parse) {
+        until i = action_pointer[@racc_state[-1]]
+          while act = _racc_evalact(action_default[@racc_state[-1]], arg)
+            ;
+          end
+        end
+        recv.__send__(mid) do |tok, val|
+          unless tok
+            @racc_t = 0
+          else
+            @racc_t = (token_table[tok] or 1)   # error token
+          end
+          @racc_val = val
+          @racc_read_next = false
+
+          i += @racc_t
+          unless i >= 0 and
+                 act = action_table[i] and
+                 action_check[i] == @racc_state[-1]
+            act = action_default[@racc_state[-1]]
+          end
+          while act = _racc_evalact(act, arg)
+            ;
+          end
+
+          while not (i = action_pointer[@racc_state[-1]]) or
+                not @racc_read_next or
+                @racc_t == 0   # $
+            unless i and i += @racc_t and
+                   i >= 0 and
+                   act = action_table[i] and
+                   action_check[i] == @racc_state[-1]
+              act = action_default[@racc_state[-1]]
+            end
+            while act = _racc_evalact(act, arg)
+              ;
+            end
+          end
+        end
+      }
+    end
+
+    ###
+    ### common
+    ###
+
+    def _racc_evalact(act, arg)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+      nerr = 0   # tmp
+
+      if act > 0 and act < shift_n
+        #
+        # shift
+        #
+        if @racc_error_status > 0
+          @racc_error_status -= 1 unless @racc_t == 1   # error token
+        end
+        @racc_vstack.push @racc_val
+        @racc_state.push act
+        @racc_read_next = true
+        if @yydebug
+          @racc_tstack.push @racc_t
+          racc_shift @racc_t, @racc_tstack, @racc_vstack
+        end
+
+      elsif act < 0 and act > -reduce_n
+        #
+        # reduce
+        #
+        code = catch(:racc_jump) {
+          @racc_state.push _racc_do_reduce(arg, act)
+          false
+        }
+        if code
+          case code
+          when 1 # yyerror
+            @racc_user_yyerror = true   # user_yyerror
+            return -reduce_n
+          when 2 # yyaccept
+            return shift_n
+          else
+            raise '[Racc Bug] unknown jump code'
+          end
+        end
+
+      elsif act == shift_n
+        #
+        # accept
+        #
+        racc_accept if @yydebug
+        throw :racc_end_parse, @racc_vstack[0]
+
+      elsif act == -reduce_n
+        #
+        # error
+        #
+        case @racc_error_status
+        when 0
+          unless arg[21]    # user_yyerror
+            nerr += 1
+            on_error @racc_t, @racc_val, @racc_vstack
+          end
+        when 3
+          if @racc_t == 0   # is $
+            throw :racc_end_parse, nil
+          end
+          @racc_read_next = true
+        end
+        @racc_user_yyerror = false
+        @racc_error_status = 3
+        while true
+          if i = action_pointer[@racc_state[-1]]
+            i += 1   # error token
+            if  i >= 0 and
+                (act = action_table[i]) and
+                action_check[i] == @racc_state[-1]
+              break
+            end
+          end
+          throw :racc_end_parse, nil if @racc_state.size <= 1
+          @racc_state.pop
+          @racc_vstack.pop
+          if @yydebug
+            @racc_tstack.pop
+            racc_e_pop @racc_state, @racc_tstack, @racc_vstack
+          end
+        end
+        return act
+
+      else
+        raise "[Racc Bug] unknown action #{act.inspect}"
+      end
+
+      racc_next_state(@racc_state[-1], @racc_state) if @yydebug
+
+      nil
+    end
+
+    def _racc_do_reduce(arg, act)
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+      state = @racc_state
+      vstack = @racc_vstack
+      tstack = @racc_tstack
+
+      i = act * -3
+      len       = reduce_table[i]
+      reduce_to = reduce_table[i+1]
+      method_id = reduce_table[i+2]
+      void_array = []
+
+      tmp_t = tstack[-len, len] if @yydebug
+      tmp_v = vstack[-len, len]
+      tstack[-len, len] = void_array if @yydebug
+      vstack[-len, len] = void_array
+      state[-len, len]  = void_array
+
+      # tstack must be updated AFTER method call
+      if use_result
+        vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
+      else
+        vstack.push __send__(method_id, tmp_v, vstack)
+      end
+      tstack.push reduce_to
+
+      racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
+
+      k1 = reduce_to - nt_base
+      if i = goto_pointer[k1]
+        i += state[-1]
+        if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
+          return curstate
+        end
+      end
+      goto_default[k1]
+    end
+
+    def on_error(t, val, vstack)
+      raise ParseError, sprintf("\nparse error on value %s (%s)",
+                                val.inspect, token_to_str(t) || '?')
+    end
+
+    def yyerror
+      throw :racc_jump, 1
+    end
+
+    def yyaccept
+      throw :racc_jump, 2
+    end
+
+    def yyerrok
+      @racc_error_status = 0
+    end
+
+    #
+    # for debugging output
+    #
+
+    def racc_read_token(t, tok, val)
+      @racc_debug_out.print 'read    '
+      @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
+      @racc_debug_out.puts val.inspect
+      @racc_debug_out.puts
+    end
+
+    def racc_shift(tok, tstack, vstack)
+      @racc_debug_out.puts "shift   #{racc_token2str tok}"
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_reduce(toks, sim, tstack, vstack)
+      out = @racc_debug_out
+      out.print 'reduce '
+      if toks.empty?
+        out.print ' <none>'
+      else
+        toks.each {|t| out.print ' ', racc_token2str(t) }
+      end
+      out.puts " --> #{racc_token2str(sim)}"
+          
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_accept
+      @racc_debug_out.puts 'accept'
+      @racc_debug_out.puts
+    end
+
+    def racc_e_pop(state, tstack, vstack)
+      @racc_debug_out.puts 'error recovering mode: pop token'
+      racc_print_states state
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_next_state(curstate, state)
+      @racc_debug_out.puts  "goto    #{curstate}"
+      racc_print_states state
+      @racc_debug_out.puts
+    end
+
+    def racc_print_stacks(t, v)
+      out = @racc_debug_out
+      out.print '        ['
+      t.each_index do |i|
+        out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
+      end
+      out.puts ' ]'
+    end
+
+    def racc_print_states(s)
+      out = @racc_debug_out
+      out.print '        ['
+      s.each {|st| out.print ' ', st }
+      out.puts ' ]'
+    end
+
+    def racc_token2str(tok)
+      self.class::Racc_token_to_s_table[tok] or
+          raise "[Racc Bug] can't convert token #{tok} to string"
+    end
+
+    def token_to_str(t)
+      self.class::Racc_token_to_s_table[t]
+    end
+
+  end
+
+end
+end
+###### racc/parser.rb end
+
+
+
+require 'date'
+
+
+module NumRu
+class Units < Racc::Parser
+
+
+=begin
+= class Node
+Node is a parent class for classes of parse tree node.
+This is not expected to be instanciated directly.
+=end
+
+class Node
+
+    def initialize(*args)
+	raise "#{self.class} is virtual."
+    end
+
+    def to_s(*args)
+	raise "#{self.class}#to_s is virtual."
+    end
+
+=begin
+--- pow other
+    simply constructs a PowNode object.
+    No reduction is performed.
+=end
+
+    def pow(other)
+	PowNode.new(self, other)
+    end
+
+=begin
+--- mul other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def mul(other)
+	other = NumberNode.new(other) if Numeric === other
+	MulNode.new(self, other)
+    end
+
+=begin
+--- divide other
+    simply constructs a MulNode object.
+    No reduction is performed.
+=end
+
+    def divide(other)
+	MulNode.new(self, PowNode.new(other, NumberNode.new(-1)))
+    end
+
+=begin
+--- shift other
+    simply constructs a ShiftNode object.
+    No reduction is performed.
+=end
+
+    def shift(other)
+	ShiftNode.new(self, other)
+    end
+
+=begin
+--- pow_eval other
+    similar to ((<pow other>)), but reduces PowNode[PowNode[...]] into
+    single PowNode[...], so overriden at PowNode class.
+=end
+
+    def pow_eval(other)
+	pow(other)
+    end
+
+=begin
+--- inspect
+=end
+
+    def inspect2;  "#{self.class}[#{to_s}]";  end
+
+    def inspect;  inspect2.gsub(/Units::/, '').gsub(/NumRu::/, '').gsub(/Node\[/, '[');  end
+
+=begin
+--- trim
+    in most subclasses, "trim" is redirected into "trim2".
+=end
+
+    def trim
+	trim2
+    end
+
+=begin
+--- flatten
+    in most subclasses, "flatten" is redirected into "flatten2".
+=end
+
+    def flatten
+	flatten2
+    end
+
+=begin
+--- sort
+=end
+
+    def sort
+	raise "#{self.class}#sort is virtual: call after flatten"
+    end
+
+=begin
+--- reduce1
+--- reduce2
+--- reduce3
+--- reduce4
+--- reduce5
+=end
+
+    def reduce1
+	self
+    end
+
+    def reduce2
+	trim
+    end
+
+    def reduce3
+	trim.flatten
+    end
+
+    def reduce4
+	# unalias(Hash.new).trim.flatten.sort
+	foldnumber(nil).trim.flatten.sort
+    end
+
+    def reduce5
+	expand(Hash.new).trim.flatten.sort
+    end
+
+=begin
+--- ref
+    to be overriden at ShiftNode
+--- deref
+    to be overriden at ShiftNode
+=end
+
+    def ref
+	NumberNode::ZERO
+    end
+
+    def deref
+	self
+    end
+
+end
+
+class ErrorNode < Node
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+end
+
+class ContainerNode < Node
+
+    def trim2
+	x = []
+	for child in self
+	    x.push child.trim2
+	end
+	self.class.new(*x)
+    end
+
+    def inspect2
+	a = []
+	for child in self
+	    a.push child.inspect2
+	end
+      	"#{self.class}[#{a.join(', ')}]"
+    end
+
+end
+
+module BinaryNode
+
+    def each
+	yield @lhs
+	yield @rhs
+    end
+
+    def expand(stopper)
+	self.class.new(@lhs.expand(stopper), @rhs.expand(stopper))
+    end
+
+    def unalias(stopper)
+	self.class.new(@lhs.unalias(stopper), @rhs.unalias(stopper))
+    end
+
+    def foldnumber(stopper)
+	self.class.new(@lhs.foldnumber(stopper), @rhs.foldnumber(stopper))
+    end
+
+end
+
+class TerminalNode < Node
+
+    def trim2;  self;  end
+    def flatten2;  self;  end
+
+    def expand(stopper);  self;  end
+    alias :unalias :expand
+    alias :foldnumber :expand
+
+    def sort;  self;  end
+
+end
+class NameNode < TerminalNode
+
+    def initialize(string)
+	@a = string
+    end
+
+    def to_s;  @a;  end
+
+    alias :name :to_s
+
+    def power;  NumberNode::UNITY;  end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	PowNode.new(self, self.power.add_eval(another.power))
+    end
+
+    def expand(stopper) 
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self if basic?
+	return CACHE[@a] if CACHE.include?(@a)
+	CACHE[@a] = expand2(stopper)
+    end
+
+    def expand2(stopper)
+	newstopper = stopper.dup
+	newstopper[@a] = true
+	if UDEFS.include?(@a) then
+	    Units.new(UDEFS[@a]).ptree.expand(newstopper)
+	else
+	    p, n = UALIASES[@a]
+	    u = Units.new(UDEFS[n] || n).ptree.expand(newstopper)
+	    MulNode.new(u, PowNode.new(NumberNode.new(10), NumberNode.new(p)))
+	end
+    end
+
+    def unalias(stopper)
+	raise "circular dependency for #{@a}" if stopper[@a]
+	return self unless UALIASES.include?(@a)
+	p, n = UALIASES[@a]
+	u = NameNode.new(n)
+	q = PowNode.new(NumberNode.new(10), NumberNode.new(p))
+	MulNode.new(u, q)
+    end
+
+    def foldnumber(stopper)
+	return self unless UPLURALS.include?(@a)
+	n = UPLURALS[@a]
+	NameNode.new(n)
+    end
+
+    def basic?
+	not (UDEFS.include?(@a) or UALIASES.include?(@a))
+    end
+
+    CACHE = {}
+
+    def factor
+	1
+    end
+
+end
+
+class NameNode
+UDEFS = {
+  "%" => "1e-2",  "Au" => "astronomical_unit",  "Bq" => "s-1",
+  "C" => "A.s",  "Celsius" => "K @ 273.15",  "F" => "C/V",
+  "Fahrenheit" => "degree_F",  "G" => "gauss",  "Gal" => "cm s-2",
+  "Gy" => "J.kg-1",  "H" => "Wb.A-1",  "Hg" => "mercury",
+  "Hz" => "1/s",  "J" => "N.m",  "Julian_year" => "365.25 day",
+  "L" => "litre",  "N" => "kg.m.s-2",  "P" => "poise",  "Pa" => "N.m-2",
+  "Pascal" => "Pa",  "S" => "A/V",  "St" => "stokes",  "Sv" => "J.kg-1",
+  "T" => "Wb.m-2",  "V" => "J/C",  "W" => "J/s",  "Wb" => "V.s",
+  "a" => "are",  "ac" => "acre",  "acre" => "10 chain2",
+  "ampere" => "A",  "angstrom" => "1.0e-10 m",
+  "angular_degree" => "degree",  "angular_minute" => "minute_angle",
+  "angular_second" => "second_angle",  "are" => "100 m2",
+  "astronomical_unit" => "1.49597870e11 m",
+  "astronomical_units" => "1.49597870e11 m",  "atm" => "atmosphere",
+  "atmosphere" => "101325 Pa",  "bar" => "1e6 dyn.cm-2",
+  "cal" => "calorie",  "calorie" => "4.18605 J",
+  "celsius" => "K @ 273.15",  "centigrade" => "K @ 273.15",
+  "century" => "100 year",  "chain" => "22 yard",
+  "common_year" => "365 day",
+  "conventional_mercury" => "gravity 13595.10 kg/m3",  "coulomb" => "C",
+  "d" => "24 hour",  "day" => "24 hour",  "degC" => "K @ 273.15",
+  "degF" => "degree_F",  "degK" => "K",  "deg_C" => "K @ 273.15",
+  "deg_F" => "degree_F",  "deg_K" => "K",  "degree" => "pi.rad/180",
+  "degreeC" => "K @ 273.15",  "degreeF" => "degree_F",
+  "degreeK" => "K",  "degree_C" => "K @ 273.15",
+  "degree_E" => "degree",  "degree_F" => "degree_R @ 459.67",
+  "degree_N" => "degree",  "degree_R" => "K / 1.8",
+  "degree_S" => "degree",  "degree_W" => "degree",
+  "degree_c" => "K @ 273.15",  "degree_east" => "degree_E",
+  "degree_f" => "degree_R @ 459.67",  "degree_north" => "degree_N",
+  "degree_south" => "degree_S",  "degree_west" => "degree_W",
+  "degrees_east" => "degree_E",  "degrees_north" => "degree_N",
+  "degrees_south" => "degree_S",  "degrees_west" => "degree_W",
+  "dyn" => "g.cm.s-2",  "dyne" => "g.cm.s-2",  "erg" => "dyn cm",
+  "fahrenheit" => "degree_F",  "farad" => "coulomb/volt",
+  "feet" => "foot",  "fermi" => "1.0e-15 m",  "foot" => "12 inch",
+  "force" => "9.80665 m.s-2",  "ft" => "foot",  "g" => "kg/1000",
+  "gal" => "cm s-2",  "gauss" => "T / 10000",  "gram" => "kg/1000",
+  "gravity" => "9.806650 meter/second2",  "h" => "60 min",
+  "hectare" => "100 are",  "hertz" => "Hz",  "hg" => "mercury",
+  "horse_power" => "75 m kilogram-force / s",  "hour" => "60 min",
+  "hr" => "60 min",  "in" => "inch",  "inch" => "2.54 cm",
+  "joule" => "J",  "kelvin" => "K",  "kgf" => "kilogram-force",
+  "kilogram" => "kg",  "knot" => "nautical_mile / hour",
+  "kph" => "km / hour",  "lb" => "pound",
+  "light_speed" => "299792458 m/s",  "light_year" => "9.46e15 m",
+  "light_years" => "9.46e15 m",  "litre" => "1.0e-3 m3",
+  "lm" => "cd.sr",  "lx" => "lm.m-2",  "ly" => "light_year",
+  "mb" => "bar / 1000",  "mercury" => "conventional_mercury",
+  "meter" => "metre",  "metre" => "m",  "mgal" => "cm s-2 / 1000",
+  "micron" => "1.0e-6 m",  "mile" => "1760 yard",
+  "millibar" => "bar / 1000",  "min" => "60 s",  "minute" => "60 s",
+  "minute_angle" => "pi.rad/180/60",  "mole" => "mol",
+  "mon" => "month",  "month" => "6 pentad",  "mph" => "mile / hour",
+  "nautical_mile" => "1852 m",  "nautical_miles" => "1852 m",
+  "newton" => "N",  "ohm" => "V/A",  "ounce" => "pound / 16",
+  "oz" => "ounce",  "parsec" => "3.0857e16 m",  "pascal" => "Pa",
+  "pc" => "parsec",  "percent" => "1e-2",  "permil" => "1e-3",
+  "pi" => "3.141592653589793238462",  "poise" => "dyn s / cm2",
+  "pound" => "453.6 g",  "psi" => "pound-force / inch2",
+  "radian" => "rad",  "second" => "s",
+  "second_angle" => "pi.rad/180/60/60",  "steradian" => "sr",
+  "stokes" => "cm2 / s",  "t" => "ton",  "tesla" => "Wb.m-2",
+  "ton" => "1000 kg",  "tonne" => "ton",  "torr" => "133.322 Pa",
+  "volt" => "V",  "watt" => "W",  "weber" => "Wb",  "yard" => "6 feet",
+  "yd" => "yard",  "year" => "12 month",  "yr" => "year",
+}
+UALIASES = {
+  "Celsiuses" => [0, "Celsius"],  "E%" => [18, "%"],  "EA" => [18, "A"],
+  "EAu" => [18, "Au"],  "EBq" => [18, "Bq"],  "EC" => [18, "C"],
+  "EF" => [18, "F"],  "EG" => [18, "G"],  "EGal" => [18, "Gal"],
+  "EGy" => [18, "Gy"],  "EH" => [18, "H"],  "EHg" => [18, "Hg"],
+  "EHz" => [18, "Hz"],  "EJ" => [18, "J"],  "EK" => [18, "K"],
+  "EL" => [18, "L"],  "EN" => [18, "N"],  "EP" => [18, "P"],
+  "EPa" => [18, "Pa"],  "ES" => [18, "S"],  "ESt" => [18, "St"],
+  "ESv" => [18, "Sv"],  "ET" => [18, "T"],  "EV" => [18, "V"],
+  "EW" => [18, "W"],  "EWb" => [18, "Wb"],  "Ea" => [18, "a"],
+  "Eac" => [18, "ac"],  "Eatm" => [18, "atm"],  "Ebar" => [18, "bar"],
+  "Ecal" => [18, "cal"],
+  "Econventional_mercury" => [18, "conventional_mercury"],
+  "Ed" => [18, "d"],  "EdegC" => [18, "degC"],  "EdegF" => [18, "degF"],
+  "Edeg_C" => [18, "deg_C"],  "Edeg_F" => [18, "deg_F"],
+  "EdegreeC" => [18, "degreeC"],  "EdegreeF" => [18, "degreeF"],
+  "Edegree_C" => [18, "degree_C"],  "Edegree_E" => [18, "degree_E"],
+  "Edegree_F" => [18, "degree_F"],  "Edegree_N" => [18, "degree_N"],
+  "Edegree_R" => [18, "degree_R"],  "Edegree_S" => [18, "degree_S"],
+  "Edegree_W" => [18, "degree_W"],  "Edegree_c" => [18, "degree_c"],
+  "Edegree_east" => [18, "degree_east"],
+  "Edegree_f" => [18, "degree_f"],
+  "Edegree_north" => [18, "degree_north"],
+  "Edegree_south" => [18, "degree_south"],
+  "Edegree_west" => [18, "degree_west"],
+  "Edegrees_east" => [18, "degrees_east"],
+  "Edegrees_north" => [18, "degrees_north"],
+  "Edegrees_south" => [18, "degrees_south"],
+  "Edegrees_west" => [18, "degrees_west"],  "Edyn" => [18, "dyn"],
+  "Eerg" => [18, "erg"],  "Eforce" => [18, "force"],  "Eg" => [18, "g"],
+  "Egravity" => [18, "gravity"],  "Eh" => [18, "h"],
+  "Ehg" => [18, "hg"],  "Ehr" => [18, "hr"],  "Ein" => [18, "in"],
+  "Ekg" => [18, "kg"],  "Ekgf" => [18, "kgf"],  "Ekph" => [18, "kph"],
+  "Elb" => [18, "lb"],  "Elm" => [18, "lm"],  "Elx" => [18, "lx"],
+  "Ely" => [18, "ly"],  "Em" => [18, "m"],  "Emb" => [18, "mb"],
+  "Emercury" => [18, "mercury"],  "Emgal" => [18, "mgal"],
+  "Emin" => [18, "min"],  "Emol" => [18, "mol"],  "Emon" => [18, "mon"],
+  "Emph" => [18, "mph"],  "Eohm" => [18, "ohm"],  "Eoz" => [18, "oz"],
+  "Epc" => [18, "pc"],  "Epercent" => [18, "percent"],
+  "Epermil" => [18, "permil"],  "Epsi" => [18, "psi"],
+  "Erad" => [18, "rad"],  "Es" => [18, "s"],  "Esr" => [18, "sr"],
+  "Et" => [18, "t"],  "Eyr" => [18, "yr"],
+  "Fahrenheits" => [0, "Fahrenheit"],  "G%" => [9, "%"],
+  "GA" => [9, "A"],  "GAu" => [9, "Au"],  "GBq" => [9, "Bq"],
+  "GC" => [9, "C"],  "GF" => [9, "F"],  "GG" => [9, "G"],
+  "GGal" => [9, "Gal"],  "GGy" => [9, "Gy"],  "GH" => [9, "H"],
+  "GHg" => [9, "Hg"],  "GHz" => [9, "Hz"],  "GJ" => [9, "J"],
+  "GK" => [9, "K"],  "GL" => [9, "L"],  "GN" => [9, "N"],
+  "GP" => [9, "P"],  "GPa" => [9, "Pa"],  "GS" => [9, "S"],
+  "GSt" => [9, "St"],  "GSv" => [9, "Sv"],  "GT" => [9, "T"],
+  "GV" => [9, "V"],  "GW" => [9, "W"],  "GWb" => [9, "Wb"],
+  "Ga" => [9, "a"],  "Gac" => [9, "ac"],  "Gatm" => [9, "atm"],
+  "Gbar" => [9, "bar"],  "Gcal" => [9, "cal"],
+  "Gconventional_mercury" => [9, "conventional_mercury"],
+  "Gd" => [9, "d"],  "GdegC" => [9, "degC"],  "GdegF" => [9, "degF"],
+  "Gdeg_C" => [9, "deg_C"],  "Gdeg_F" => [9, "deg_F"],
+  "GdegreeC" => [9, "degreeC"],  "GdegreeF" => [9, "degreeF"],
+  "Gdegree_C" => [9, "degree_C"],  "Gdegree_E" => [9, "degree_E"],
+  "Gdegree_F" => [9, "degree_F"],  "Gdegree_N" => [9, "degree_N"],
+  "Gdegree_R" => [9, "degree_R"],  "Gdegree_S" => [9, "degree_S"],
+  "Gdegree_W" => [9, "degree_W"],  "Gdegree_c" => [9, "degree_c"],
+  "Gdegree_east" => [9, "degree_east"],  "Gdegree_f" => [9, "degree_f"],
+  "Gdegree_north" => [9, "degree_north"],
+  "Gdegree_south" => [9, "degree_south"],
+  "Gdegree_west" => [9, "degree_west"],
+  "Gdegrees_east" => [9, "degrees_east"],
+  "Gdegrees_north" => [9, "degrees_north"],
+  "Gdegrees_south" => [9, "degrees_south"],
+  "Gdegrees_west" => [9, "degrees_west"],  "Gdyn" => [9, "dyn"],
+  "Gerg" => [9, "erg"],  "Gforce" => [9, "force"],  "Gg" => [9, "g"],
+  "Ggravity" => [9, "gravity"],  "Gh" => [9, "h"],  "Ghg" => [9, "hg"],
+  "Ghr" => [9, "hr"],  "Gin" => [9, "in"],  "Gkg" => [9, "kg"],
+  "Gkgf" => [9, "kgf"],  "Gkph" => [9, "kph"],  "Glb" => [9, "lb"],
+  "Glm" => [9, "lm"],  "Glx" => [9, "lx"],  "Gly" => [9, "ly"],
+  "Gm" => [9, "m"],  "Gmb" => [9, "mb"],  "Gmercury" => [9, "mercury"],
+  "Gmgal" => [9, "mgal"],  "Gmin" => [9, "min"],  "Gmol" => [9, "mol"],
+  "Gmon" => [9, "mon"],  "Gmph" => [9, "mph"],  "Gohm" => [9, "ohm"],
+  "Goz" => [9, "oz"],  "Gpc" => [9, "pc"],
+  "Gpercent" => [9, "percent"],  "Gpermil" => [9, "permil"],
+  "Gpsi" => [9, "psi"],  "Grad" => [9, "rad"],  "Gs" => [9, "s"],
+  "Gsr" => [9, "sr"],  "Gt" => [9, "t"],  "Gyr" => [9, "yr"],
+  "Julians_year" => [0, "Julian_year"],  "M%" => [6, "%"],
+  "MA" => [6, "A"],  "MAu" => [6, "Au"],  "MBq" => [6, "Bq"],
+  "MC" => [6, "C"],  "MF" => [6, "F"],  "MG" => [6, "G"],
+  "MGal" => [6, "Gal"],  "MGy" => [6, "Gy"],  "MH" => [6, "H"],
+  "MHg" => [6, "Hg"],  "MHz" => [6, "Hz"],  "MJ" => [6, "J"],
+  "MK" => [6, "K"],  "ML" => [6, "L"],  "MN" => [6, "N"],
+  "MP" => [6, "P"],  "MPa" => [6, "Pa"],  "MS" => [6, "S"],
+  "MSt" => [6, "St"],  "MSv" => [6, "Sv"],  "MT" => [6, "T"],
+  "MV" => [6, "V"],  "MW" => [6, "W"],  "MWb" => [6, "Wb"],
+  "Ma" => [6, "a"],  "Mac" => [6, "ac"],  "Matm" => [6, "atm"],
+  "Mbar" => [6, "bar"],  "Mcal" => [6, "cal"],
+  "Mconventional_mercury" => [6, "conventional_mercury"],
+  "Md" => [6, "d"],  "MdegC" => [6, "degC"],  "MdegF" => [6, "degF"],
+  "Mdeg_C" => [6, "deg_C"],  "Mdeg_F" => [6, "deg_F"],
+  "MdegreeC" => [6, "degreeC"],  "MdegreeF" => [6, "degreeF"],
+  "Mdegree_C" => [6, "degree_C"],  "Mdegree_E" => [6, "degree_E"],
+  "Mdegree_F" => [6, "degree_F"],  "Mdegree_N" => [6, "degree_N"],
+  "Mdegree_R" => [6, "degree_R"],  "Mdegree_S" => [6, "degree_S"],
+  "Mdegree_W" => [6, "degree_W"],  "Mdegree_c" => [6, "degree_c"],
+  "Mdegree_east" => [6, "degree_east"],  "Mdegree_f" => [6, "degree_f"],
+  "Mdegree_north" => [6, "degree_north"],
+  "Mdegree_south" => [6, "degree_south"],
+  "Mdegree_west" => [6, "degree_west"],
+  "Mdegrees_east" => [6, "degrees_east"],
+  "Mdegrees_north" => [6, "degrees_north"],
+  "Mdegrees_south" => [6, "degrees_south"],
+  "Mdegrees_west" => [6, "degrees_west"],  "Mdyn" => [6, "dyn"],
+  "Merg" => [6, "erg"],  "Mforce" => [6, "force"],  "Mg" => [6, "g"],
+  "Mgravity" => [6, "gravity"],  "Mh" => [6, "h"],  "Mhg" => [6, "hg"],
+  "Mhr" => [6, "hr"],  "Min" => [6, "in"],  "Mkg" => [6, "kg"],
+  "Mkgf" => [6, "kgf"],  "Mkph" => [6, "kph"],  "Mlb" => [6, "lb"],
+  "Mlm" => [6, "lm"],  "Mlx" => [6, "lx"],  "Mly" => [6, "ly"],
+  "Mm" => [6, "m"],  "Mmb" => [6, "mb"],  "Mmercury" => [6, "mercury"],
+  "Mmgal" => [6, "mgal"],  "Mmin" => [6, "min"],  "Mmol" => [6, "mol"],
+  "Mmon" => [6, "mon"],  "Mmph" => [6, "mph"],  "Mohm" => [6, "ohm"],
+  "Moz" => [6, "oz"],  "Mpc" => [6, "pc"],
+  "Mpercent" => [6, "percent"],  "Mpermil" => [6, "permil"],
+  "Mpsi" => [6, "psi"],  "Mrad" => [6, "rad"],  "Ms" => [6, "s"],
+  "Msr" => [6, "sr"],  "Mt" => [6, "t"],  "Myr" => [6, "yr"],
+  "P%" => [15, "%"],  "PA" => [15, "A"],  "PAu" => [15, "Au"],
+  "PBq" => [15, "Bq"],  "PC" => [15, "C"],  "PF" => [15, "F"],
+  "PG" => [15, "G"],  "PGal" => [15, "Gal"],  "PGy" => [15, "Gy"],
+  "PH" => [15, "H"],  "PHg" => [15, "Hg"],  "PHz" => [15, "Hz"],
+  "PJ" => [15, "J"],  "PK" => [15, "K"],  "PL" => [15, "L"],
+  "PN" => [15, "N"],  "PP" => [15, "P"],  "PPa" => [15, "Pa"],
+  "PS" => [15, "S"],  "PSt" => [15, "St"],  "PSv" => [15, "Sv"],
+  "PT" => [15, "T"],  "PV" => [15, "V"],  "PW" => [15, "W"],
+  "PWb" => [15, "Wb"],  "Pa" => [15, "a"],  "Pac" => [15, "ac"],
+  "Pascals" => [0, "Pascal"],  "Patm" => [15, "atm"],
+  "Pbar" => [15, "bar"],  "Pcal" => [15, "cal"],
+  "Pconventional_mercury" => [15, "conventional_mercury"],
+  "Pd" => [15, "d"],  "PdegC" => [15, "degC"],  "PdegF" => [15, "degF"],
+  "Pdeg_C" => [15, "deg_C"],  "Pdeg_F" => [15, "deg_F"],
+  "PdegreeC" => [15, "degreeC"],  "PdegreeF" => [15, "degreeF"],
+  "Pdegree_C" => [15, "degree_C"],  "Pdegree_E" => [15, "degree_E"],
+  "Pdegree_F" => [15, "degree_F"],  "Pdegree_N" => [15, "degree_N"],
+  "Pdegree_R" => [15, "degree_R"],  "Pdegree_S" => [15, "degree_S"],
+  "Pdegree_W" => [15, "degree_W"],  "Pdegree_c" => [15, "degree_c"],
+  "Pdegree_east" => [15, "degree_east"],
+  "Pdegree_f" => [15, "degree_f"],
+  "Pdegree_north" => [15, "degree_north"],
+  "Pdegree_south" => [15, "degree_south"],
+  "Pdegree_west" => [15, "degree_west"],
+  "Pdegrees_east" => [15, "degrees_east"],
+  "Pdegrees_north" => [15, "degrees_north"],
+  "Pdegrees_south" => [15, "degrees_south"],
+  "Pdegrees_west" => [15, "degrees_west"],  "Pdyn" => [15, "dyn"],
+  "Perg" => [15, "erg"],  "Pforce" => [15, "force"],  "Pg" => [15, "g"],
+  "Pgravity" => [15, "gravity"],  "Ph" => [15, "h"],
+  "Phg" => [15, "hg"],  "Phr" => [15, "hr"],  "Pin" => [15, "in"],
+  "Pkg" => [15, "kg"],  "Pkgf" => [15, "kgf"],  "Pkph" => [15, "kph"],
+  "Plb" => [15, "lb"],  "Plm" => [15, "lm"],  "Plx" => [15, "lx"],
+  "Ply" => [15, "ly"],  "Pm" => [15, "m"],  "Pmb" => [15, "mb"],
+  "Pmercury" => [15, "mercury"],  "Pmgal" => [15, "mgal"],
+  "Pmin" => [15, "min"],  "Pmol" => [15, "mol"],  "Pmon" => [15, "mon"],
+  "Pmph" => [15, "mph"],  "Pohm" => [15, "ohm"],  "Poz" => [15, "oz"],
+  "Ppc" => [15, "pc"],  "Ppercent" => [15, "percent"],
+  "Ppermil" => [15, "permil"],  "Ppsi" => [15, "psi"],
+  "Prad" => [15, "rad"],  "Ps" => [15, "s"],  "Psr" => [15, "sr"],
+  "Pt" => [15, "t"],  "Pyr" => [15, "yr"],  "T%" => [12, "%"],
+  "TA" => [12, "A"],  "TAu" => [12, "Au"],  "TBq" => [12, "Bq"],
+  "TC" => [12, "C"],  "TF" => [12, "F"],  "TG" => [12, "G"],
+  "TGal" => [12, "Gal"],  "TGy" => [12, "Gy"],  "TH" => [12, "H"],
+  "THg" => [12, "Hg"],  "THz" => [12, "Hz"],  "TJ" => [12, "J"],
+  "TK" => [12, "K"],  "TL" => [12, "L"],  "TN" => [12, "N"],
+  "TP" => [12, "P"],  "TPa" => [12, "Pa"],  "TS" => [12, "S"],
+  "TSt" => [12, "St"],  "TSv" => [12, "Sv"],  "TT" => [12, "T"],
+  "TV" => [12, "V"],  "TW" => [12, "W"],  "TWb" => [12, "Wb"],
+  "Ta" => [12, "a"],  "Tac" => [12, "ac"],  "Tatm" => [12, "atm"],
+  "Tbar" => [12, "bar"],  "Tcal" => [12, "cal"],
+  "Tconventional_mercury" => [12, "conventional_mercury"],
+  "Td" => [12, "d"],  "TdegC" => [12, "degC"],  "TdegF" => [12, "degF"],
+  "Tdeg_C" => [12, "deg_C"],  "Tdeg_F" => [12, "deg_F"],
+  "TdegreeC" => [12, "degreeC"],  "TdegreeF" => [12, "degreeF"],
+  "Tdegree_C" => [12, "degree_C"],  "Tdegree_E" => [12, "degree_E"],
+  "Tdegree_F" => [12, "degree_F"],  "Tdegree_N" => [12, "degree_N"],
+  "Tdegree_R" => [12, "degree_R"],  "Tdegree_S" => [12, "degree_S"],
+  "Tdegree_W" => [12, "degree_W"],  "Tdegree_c" => [12, "degree_c"],
+  "Tdegree_east" => [12, "degree_east"],
+  "Tdegree_f" => [12, "degree_f"],
+  "Tdegree_north" => [12, "degree_north"],
+  "Tdegree_south" => [12, "degree_south"],
+  "Tdegree_west" => [12, "degree_west"],
+  "Tdegrees_east" => [12, "degrees_east"],
+  "Tdegrees_north" => [12, "degrees_north"],
+  "Tdegrees_south" => [12, "degrees_south"],
+  "Tdegrees_west" => [12, "degrees_west"],  "Tdyn" => [12, "dyn"],
+  "Terg" => [12, "erg"],  "Tforce" => [12, "force"],  "Tg" => [12, "g"],
+  "Tgravity" => [12, "gravity"],  "Th" => [12, "h"],
+  "Thg" => [12, "hg"],  "Thr" => [12, "hr"],  "Tin" => [12, "in"],
+  "Tkg" => [12, "kg"],  "Tkgf" => [12, "kgf"],  "Tkph" => [12, "kph"],
+  "Tlb" => [12, "lb"],  "Tlm" => [12, "lm"],  "Tlx" => [12, "lx"],
+  "Tly" => [12, "ly"],  "Tm" => [12, "m"],  "Tmb" => [12, "mb"],
+  "Tmercury" => [12, "mercury"],  "Tmgal" => [12, "mgal"],
+  "Tmin" => [12, "min"],  "Tmol" => [12, "mol"],  "Tmon" => [12, "mon"],
+  "Tmph" => [12, "mph"],  "Tohm" => [12, "ohm"],  "Toz" => [12, "oz"],
+  "Tpc" => [12, "pc"],  "Tpercent" => [12, "percent"],
+  "Tpermil" => [12, "permil"],  "Tpsi" => [12, "psi"],
+  "Trad" => [12, "rad"],  "Ts" => [12, "s"],  "Tsr" => [12, "sr"],
+  "Tt" => [12, "t"],  "Tyr" => [12, "yr"],  "a%" => [-18, "%"],
+  "aA" => [-18, "A"],  "aAu" => [-18, "Au"],  "aBq" => [-18, "Bq"],
+  "aC" => [-18, "C"],  "aF" => [-18, "F"],  "aG" => [-18, "G"],
+  "aGal" => [-18, "Gal"],  "aGy" => [-18, "Gy"],  "aH" => [-18, "H"],
+  "aHg" => [-18, "Hg"],  "aHz" => [-18, "Hz"],  "aJ" => [-18, "J"],
+  "aK" => [-18, "K"],  "aL" => [-18, "L"],  "aN" => [-18, "N"],
+  "aP" => [-18, "P"],  "aPa" => [-18, "Pa"],  "aS" => [-18, "S"],
+  "aSt" => [-18, "St"],  "aSv" => [-18, "Sv"],  "aT" => [-18, "T"],
+  "aV" => [-18, "V"],  "aW" => [-18, "W"],  "aWb" => [-18, "Wb"],
+  "aa" => [-18, "a"],  "aac" => [-18, "ac"],  "aatm" => [-18, "atm"],
+  "abar" => [-18, "bar"],  "acal" => [-18, "cal"],
+  "aconventional_mercury" => [-18, "conventional_mercury"],
+  "acres" => [0, "acre"],  "ad" => [-18, "d"],
+  "adegC" => [-18, "degC"],  "adegF" => [-18, "degF"],
+  "adeg_C" => [-18, "deg_C"],  "adeg_F" => [-18, "deg_F"],
+  "adegreeC" => [-18, "degreeC"],  "adegreeF" => [-18, "degreeF"],
+  "adegree_C" => [-18, "degree_C"],  "adegree_E" => [-18, "degree_E"],
+  "adegree_F" => [-18, "degree_F"],  "adegree_N" => [-18, "degree_N"],
+  "adegree_R" => [-18, "degree_R"],  "adegree_S" => [-18, "degree_S"],
+  "adegree_W" => [-18, "degree_W"],  "adegree_c" => [-18, "degree_c"],
+  "adegree_east" => [-18, "degree_east"],
+  "adegree_f" => [-18, "degree_f"],
+  "adegree_north" => [-18, "degree_north"],
+  "adegree_south" => [-18, "degree_south"],
+  "adegree_west" => [-18, "degree_west"],
+  "adegrees_east" => [-18, "degrees_east"],
+  "adegrees_north" => [-18, "degrees_north"],
+  "adegrees_south" => [-18, "degrees_south"],
+  "adegrees_west" => [-18, "degrees_west"],  "adyn" => [-18, "dyn"],
+  "aerg" => [-18, "erg"],  "aforce" => [-18, "force"],
+  "ag" => [-18, "g"],  "agravity" => [-18, "gravity"],
+  "ah" => [-18, "h"],  "ahg" => [-18, "hg"],  "ahr" => [-18, "hr"],
+  "ain" => [-18, "in"],  "akg" => [-18, "kg"],  "akgf" => [-18, "kgf"],
+  "akph" => [-18, "kph"],  "alb" => [-18, "lb"],  "alm" => [-18, "lm"],
+  "alx" => [-18, "lx"],  "aly" => [-18, "ly"],  "am" => [-18, "m"],
+  "amb" => [-18, "mb"],  "amercury" => [-18, "mercury"],
+  "amgal" => [-18, "mgal"],  "amin" => [-18, "min"],
+  "amol" => [-18, "mol"],  "amon" => [-18, "mon"],
+  "amperes" => [0, "ampere"],  "amph" => [-18, "mph"],
+  "angstroms" => [0, "angstrom"],
+  "angulars_degree" => [0, "angular_degree"],
+  "angulars_minute" => [0, "angular_minute"],
+  "angulars_second" => [0, "angular_second"],  "aohm" => [-18, "ohm"],
+  "aoz" => [-18, "oz"],  "apc" => [-18, "pc"],
+  "apercent" => [-18, "percent"],  "apermil" => [-18, "permil"],
+  "apsi" => [-18, "psi"],  "arad" => [-18, "rad"],
+  "ares" => [0, "are"],  "as" => [-18, "s"],  "asr" => [-18, "sr"],
+  "at" => [-18, "t"],  "atmospheres" => [0, "atmosphere"],
+  "attoCelsius" => [-18, "Celsius"],
+  "attoFahrenheit" => [-18, "Fahrenheit"],
+  "attoJulian_year" => [-18, "Julian_year"],
+  "attoPascal" => [-18, "Pascal"],  "attoacre" => [-18, "acre"],
+  "attoampere" => [-18, "ampere"],  "attoangstrom" => [-18, "angstrom"],
+  "attoangular_degree" => [-18, "angular_degree"],
+  "attoangular_minute" => [-18, "angular_minute"],
+  "attoangular_second" => [-18, "angular_second"],
+  "attoare" => [-18, "are"],  "attoatmosphere" => [-18, "atmosphere"],
+  "attocalorie" => [-18, "calorie"],  "attocelsius" => [-18, "celsius"],
+  "attocentigrade" => [-18, "centigrade"],
+  "attocentury" => [-18, "century"],  "attochain" => [-18, "chain"],
+  "attocommon_year" => [-18, "common_year"],
+  "attocoulomb" => [-18, "coulomb"],  "attoday" => [-18, "day"],
+  "attodegK" => [-18, "degK"],  "attodeg_K" => [-18, "deg_K"],
+  "attodegree" => [-18, "degree"],  "attodegreeK" => [-18, "degreeK"],
+  "attodyne" => [-18, "dyne"],  "attoerg" => [-18, "erg"],
+  "attofahrenheit" => [-18, "fahrenheit"],
+  "attofarad" => [-18, "farad"],  "attofermi" => [-18, "fermi"],
+  "attogal" => [-18, "gal"],  "attogauss" => [-18, "gauss"],
+  "attogram" => [-18, "gram"],  "attohectare" => [-18, "hectare"],
+  "attohertz" => [-18, "hertz"],  "attohour" => [-18, "hour"],
+  "attoinch" => [-18, "inch"],  "attojoule" => [-18, "joule"],
+  "attokelvin" => [-18, "kelvin"],  "attokilogram" => [-18, "kilogram"],
+  "attoknot" => [-18, "knot"],  "attolitre" => [-18, "litre"],
+  "attometer" => [-18, "meter"],  "attometre" => [-18, "metre"],
+  "attomicron" => [-18, "micron"],  "attomile" => [-18, "mile"],
+  "attomillibar" => [-18, "millibar"],  "attominute" => [-18, "minute"],
+  "attominute_angle" => [-18, "minute_angle"],
+  "attomole" => [-18, "mole"],  "attomonth" => [-18, "month"],
+  "attonewton" => [-18, "newton"],  "attoounce" => [-18, "ounce"],
+  "attoparsec" => [-18, "parsec"],  "attopascal" => [-18, "pascal"],
+  "attopentad" => [-18, "pentad"],  "attopoise" => [-18, "poise"],
+  "attopound" => [-18, "pound"],  "attoradian" => [-18, "radian"],
+  "attosecond" => [-18, "second"],
+  "attosecond_angle" => [-18, "second_angle"],
+  "attosteradian" => [-18, "steradian"],
+  "attostokes" => [-18, "stokes"],  "attotesla" => [-18, "tesla"],
+  "attoton" => [-18, "ton"],  "attotonne" => [-18, "tonne"],
+  "attotorr" => [-18, "torr"],  "attovolt" => [-18, "volt"],
+  "attowatt" => [-18, "watt"],  "attoweber" => [-18, "weber"],
+  "attoyard" => [-18, "yard"],  "attoyd" => [-18, "yd"],
+  "attoyear" => [-18, "year"],  "ayr" => [-18, "yr"],
+  "c%" => [-2, "%"],  "cA" => [-2, "A"],  "cAu" => [-2, "Au"],
+  "cBq" => [-2, "Bq"],  "cC" => [-2, "C"],  "cF" => [-2, "F"],
+  "cG" => [-2, "G"],  "cGal" => [-2, "Gal"],  "cGy" => [-2, "Gy"],
+  "cH" => [-2, "H"],  "cHg" => [-2, "Hg"],  "cHz" => [-2, "Hz"],
+  "cJ" => [-2, "J"],  "cK" => [-2, "K"],  "cL" => [-2, "L"],
+  "cN" => [-2, "N"],  "cP" => [-2, "P"],  "cPa" => [-2, "Pa"],
+  "cS" => [-2, "S"],  "cSt" => [-2, "St"],  "cSv" => [-2, "Sv"],
+  "cT" => [-2, "T"],  "cV" => [-2, "V"],  "cW" => [-2, "W"],
+  "cWb" => [-2, "Wb"],  "ca" => [-2, "a"],  "cac" => [-2, "ac"],
+  "calories" => [0, "calorie"],  "catm" => [-2, "atm"],
+  "cbar" => [-2, "bar"],  "ccal" => [-2, "cal"],
+  "cconventional_mercury" => [-2, "conventional_mercury"],
+  "cd" => [-2, "d"],  "cdegC" => [-2, "degC"],  "cdegF" => [-2, "degF"],
+  "cdeg_C" => [-2, "deg_C"],  "cdeg_F" => [-2, "deg_F"],
+  "cdegreeC" => [-2, "degreeC"],  "cdegreeF" => [-2, "degreeF"],
+  "cdegree_C" => [-2, "degree_C"],  "cdegree_E" => [-2, "degree_E"],
+  "cdegree_F" => [-2, "degree_F"],  "cdegree_N" => [-2, "degree_N"],
+  "cdegree_R" => [-2, "degree_R"],  "cdegree_S" => [-2, "degree_S"],
+  "cdegree_W" => [-2, "degree_W"],  "cdegree_c" => [-2, "degree_c"],
+  "cdegree_east" => [-2, "degree_east"],
+  "cdegree_f" => [-2, "degree_f"],
+  "cdegree_north" => [-2, "degree_north"],
+  "cdegree_south" => [-2, "degree_south"],
+  "cdegree_west" => [-2, "degree_west"],
+  "cdegrees_east" => [-2, "degrees_east"],
+  "cdegrees_north" => [-2, "degrees_north"],
+  "cdegrees_south" => [-2, "degrees_south"],
+  "cdegrees_west" => [-2, "degrees_west"],  "cdyn" => [-2, "dyn"],
+  "celsiuses" => [0, "celsius"],  "centiCelsius" => [-2, "Celsius"],
+  "centiFahrenheit" => [-2, "Fahrenheit"],
+  "centiJulian_year" => [-2, "Julian_year"],
+  "centiPascal" => [-2, "Pascal"],  "centiacre" => [-2, "acre"],
+  "centiampere" => [-2, "ampere"],  "centiangstrom" => [-2, "angstrom"],
+  "centiangular_degree" => [-2, "angular_degree"],
+  "centiangular_minute" => [-2, "angular_minute"],
+  "centiangular_second" => [-2, "angular_second"],
+  "centiare" => [-2, "are"],  "centiatmosphere" => [-2, "atmosphere"],
+  "centicalorie" => [-2, "calorie"],  "centicelsius" => [-2, "celsius"],
+  "centicentigrade" => [-2, "centigrade"],
+  "centicentury" => [-2, "century"],  "centichain" => [-2, "chain"],
+  "centicommon_year" => [-2, "common_year"],
+  "centicoulomb" => [-2, "coulomb"],  "centiday" => [-2, "day"],
+  "centidegK" => [-2, "degK"],  "centideg_K" => [-2, "deg_K"],
+  "centidegree" => [-2, "degree"],  "centidegreeK" => [-2, "degreeK"],
+  "centidyne" => [-2, "dyne"],  "centierg" => [-2, "erg"],
+  "centifahrenheit" => [-2, "fahrenheit"],
+  "centifarad" => [-2, "farad"],  "centifermi" => [-2, "fermi"],
+  "centigal" => [-2, "gal"],  "centigauss" => [-2, "gauss"],
+  "centigrades" => [0, "centigrade"],  "centigram" => [-2, "gram"],
+  "centihectare" => [-2, "hectare"],  "centihertz" => [-2, "hertz"],
+  "centihour" => [-2, "hour"],  "centiinch" => [-2, "inch"],
+  "centijoule" => [-2, "joule"],  "centikelvin" => [-2, "kelvin"],
+  "centikilogram" => [-2, "kilogram"],  "centiknot" => [-2, "knot"],
+  "centilitre" => [-2, "litre"],  "centimeter" => [-2, "meter"],
+  "centimetre" => [-2, "metre"],  "centimicron" => [-2, "micron"],
+  "centimile" => [-2, "mile"],  "centimillibar" => [-2, "millibar"],
+  "centiminute" => [-2, "minute"],
+  "centiminute_angle" => [-2, "minute_angle"],
+  "centimole" => [-2, "mole"],  "centimonth" => [-2, "month"],
+  "centinewton" => [-2, "newton"],  "centiounce" => [-2, "ounce"],
+  "centiparsec" => [-2, "parsec"],  "centipascal" => [-2, "pascal"],
+  "centipentad" => [-2, "pentad"],  "centipoise" => [-2, "poise"],
+  "centipound" => [-2, "pound"],  "centiradian" => [-2, "radian"],
+  "centisecond" => [-2, "second"],
+  "centisecond_angle" => [-2, "second_angle"],
+  "centisteradian" => [-2, "steradian"],
+  "centistokes" => [-2, "stokes"],  "centitesla" => [-2, "tesla"],
+  "centiton" => [-2, "ton"],  "centitonne" => [-2, "tonne"],
+  "centitorr" => [-2, "torr"],  "centivolt" => [-2, "volt"],
+  "centiwatt" => [-2, "watt"],  "centiweber" => [-2, "weber"],
+  "centiyard" => [-2, "yard"],  "centiyd" => [-2, "yd"],
+  "centiyear" => [-2, "year"],  "centuries" => [0, "century"],
+  "cerg" => [-2, "erg"],  "cforce" => [-2, "force"],  "cg" => [-2, "g"],
+  "cgravity" => [-2, "gravity"],  "ch" => [-2, "h"],
+  "chains" => [0, "chain"],  "chg" => [-2, "hg"],  "chr" => [-2, "hr"],
+  "cin" => [-2, "in"],  "ckg" => [-2, "kg"],  "ckgf" => [-2, "kgf"],
+  "ckph" => [-2, "kph"],  "clb" => [-2, "lb"],  "clm" => [-2, "lm"],
+  "clx" => [-2, "lx"],  "cly" => [-2, "ly"],  "cm" => [-2, "m"],
+  "cmb" => [-2, "mb"],  "cmercury" => [-2, "mercury"],
+  "cmgal" => [-2, "mgal"],  "cmin" => [-2, "min"],
+  "cmol" => [-2, "mol"],  "cmon" => [-2, "mon"],  "cmph" => [-2, "mph"],
+  "cohm" => [-2, "ohm"],  "commons_year" => [0, "common_year"],
+  "coulombs" => [0, "coulomb"],  "coz" => [-2, "oz"],
+  "cpc" => [-2, "pc"],  "cpercent" => [-2, "percent"],
+  "cpermil" => [-2, "permil"],  "cpsi" => [-2, "psi"],
+  "crad" => [-2, "rad"],  "cs" => [-2, "s"],  "csr" => [-2, "sr"],
+  "ct" => [-2, "t"],  "cyr" => [-2, "yr"],  "d%" => [-1, "%"],
+  "dA" => [-1, "A"],  "dAu" => [-1, "Au"],  "dBq" => [-1, "Bq"],
+  "dC" => [-1, "C"],  "dF" => [-1, "F"],  "dG" => [-1, "G"],
+  "dGal" => [-1, "Gal"],  "dGy" => [-1, "Gy"],  "dH" => [-1, "H"],
+  "dHg" => [-1, "Hg"],  "dHz" => [-1, "Hz"],  "dJ" => [-1, "J"],
+  "dK" => [-1, "K"],  "dL" => [-1, "L"],  "dN" => [-1, "N"],
+  "dP" => [-1, "P"],  "dPa" => [-1, "Pa"],  "dS" => [-1, "S"],
+  "dSt" => [-1, "St"],  "dSv" => [-1, "Sv"],  "dT" => [-1, "T"],
+  "dV" => [-1, "V"],  "dW" => [-1, "W"],  "dWb" => [-1, "Wb"],
+  "da" => [-1, "a"],  "da%" => [1, "%"],  "daA" => [1, "A"],
+  "daAu" => [1, "Au"],  "daBq" => [1, "Bq"],  "daC" => [1, "C"],
+  "daF" => [1, "F"],  "daG" => [1, "G"],  "daGal" => [1, "Gal"],
+  "daGy" => [1, "Gy"],  "daH" => [1, "H"],  "daHg" => [1, "Hg"],
+  "daHz" => [1, "Hz"],  "daJ" => [1, "J"],  "daK" => [1, "K"],
+  "daL" => [1, "L"],  "daN" => [1, "N"],  "daP" => [1, "P"],
+  "daPa" => [1, "Pa"],  "daS" => [1, "S"],  "daSt" => [1, "St"],
+  "daSv" => [1, "Sv"],  "daT" => [1, "T"],  "daV" => [1, "V"],
+  "daW" => [1, "W"],  "daWb" => [1, "Wb"],  "daa" => [1, "a"],
+  "daac" => [1, "ac"],  "daatm" => [1, "atm"],  "dabar" => [1, "bar"],
+  "dac" => [-1, "ac"],  "dacal" => [1, "cal"],
+  "daconventional_mercury" => [1, "conventional_mercury"],
+  "dad" => [1, "d"],  "dadegC" => [1, "degC"],  "dadegF" => [1, "degF"],
+  "dadeg_C" => [1, "deg_C"],  "dadeg_F" => [1, "deg_F"],
+  "dadegreeC" => [1, "degreeC"],  "dadegreeF" => [1, "degreeF"],
+  "dadegree_C" => [1, "degree_C"],  "dadegree_E" => [1, "degree_E"],
+  "dadegree_F" => [1, "degree_F"],  "dadegree_N" => [1, "degree_N"],
+  "dadegree_R" => [1, "degree_R"],  "dadegree_S" => [1, "degree_S"],
+  "dadegree_W" => [1, "degree_W"],  "dadegree_c" => [1, "degree_c"],
+  "dadegree_east" => [1, "degree_east"],
+  "dadegree_f" => [1, "degree_f"],
+  "dadegree_north" => [1, "degree_north"],
+  "dadegree_south" => [1, "degree_south"],
+  "dadegree_west" => [1, "degree_west"],
+  "dadegrees_east" => [1, "degrees_east"],
+  "dadegrees_north" => [1, "degrees_north"],
+  "dadegrees_south" => [1, "degrees_south"],
+  "dadegrees_west" => [1, "degrees_west"],  "dadyn" => [1, "dyn"],
+  "daerg" => [1, "erg"],  "daforce" => [1, "force"],  "dag" => [1, "g"],
+  "dagravity" => [1, "gravity"],  "dah" => [1, "h"],
+  "dahg" => [1, "hg"],  "dahr" => [1, "hr"],  "dain" => [1, "in"],
+  "dakg" => [1, "kg"],  "dakgf" => [1, "kgf"],  "dakph" => [1, "kph"],
+  "dalb" => [1, "lb"],  "dalm" => [1, "lm"],  "dalx" => [1, "lx"],
+  "daly" => [1, "ly"],  "dam" => [1, "m"],  "damb" => [1, "mb"],
+  "damercury" => [1, "mercury"],  "damgal" => [1, "mgal"],
+  "damin" => [1, "min"],  "damol" => [1, "mol"],  "damon" => [1, "mon"],
+  "damph" => [1, "mph"],  "daohm" => [1, "ohm"],  "daoz" => [1, "oz"],
+  "dapc" => [1, "pc"],  "dapercent" => [1, "percent"],
+  "dapermil" => [1, "permil"],  "dapsi" => [1, "psi"],
+  "darad" => [1, "rad"],  "das" => [1, "s"],  "dasr" => [1, "sr"],
+  "dat" => [1, "t"],  "datm" => [-1, "atm"],  "dayr" => [1, "yr"],
+  "days" => [0, "day"],  "dbar" => [-1, "bar"],  "dcal" => [-1, "cal"],
+  "dconventional_mercury" => [-1, "conventional_mercury"],
+  "dd" => [-1, "d"],  "ddegC" => [-1, "degC"],  "ddegF" => [-1, "degF"],
+  "ddeg_C" => [-1, "deg_C"],  "ddeg_F" => [-1, "deg_F"],
+  "ddegreeC" => [-1, "degreeC"],  "ddegreeF" => [-1, "degreeF"],
+  "ddegree_C" => [-1, "degree_C"],  "ddegree_E" => [-1, "degree_E"],
+  "ddegree_F" => [-1, "degree_F"],  "ddegree_N" => [-1, "degree_N"],
+  "ddegree_R" => [-1, "degree_R"],  "ddegree_S" => [-1, "degree_S"],
+  "ddegree_W" => [-1, "degree_W"],  "ddegree_c" => [-1, "degree_c"],
+  "ddegree_east" => [-1, "degree_east"],
+  "ddegree_f" => [-1, "degree_f"],
+  "ddegree_north" => [-1, "degree_north"],
+  "ddegree_south" => [-1, "degree_south"],
+  "ddegree_west" => [-1, "degree_west"],
+  "ddegrees_east" => [-1, "degrees_east"],
+  "ddegrees_north" => [-1, "degrees_north"],
+  "ddegrees_south" => [-1, "degrees_south"],
+  "ddegrees_west" => [-1, "degrees_west"],  "ddyn" => [-1, "dyn"],
+  "decaCelsius" => [1, "Celsius"],
+  "decaFahrenheit" => [1, "Fahrenheit"],
+  "decaJulian_year" => [1, "Julian_year"],
+  "decaPascal" => [1, "Pascal"],  "decaacre" => [1, "acre"],
+  "decaampere" => [1, "ampere"],  "decaangstrom" => [1, "angstrom"],
+  "decaangular_degree" => [1, "angular_degree"],
+  "decaangular_minute" => [1, "angular_minute"],
+  "decaangular_second" => [1, "angular_second"],
+  "decaare" => [1, "are"],  "decaatmosphere" => [1, "atmosphere"],
+  "decacalorie" => [1, "calorie"],  "decacelsius" => [1, "celsius"],
+  "decacentigrade" => [1, "centigrade"],
+  "decacentury" => [1, "century"],  "decachain" => [1, "chain"],
+  "decacommon_year" => [1, "common_year"],
+  "decacoulomb" => [1, "coulomb"],  "decaday" => [1, "day"],
+  "decadegK" => [1, "degK"],  "decadeg_K" => [1, "deg_K"],
+  "decadegree" => [1, "degree"],  "decadegreeK" => [1, "degreeK"],
+  "decadyne" => [1, "dyne"],  "decaerg" => [1, "erg"],
+  "decafahrenheit" => [1, "fahrenheit"],  "decafarad" => [1, "farad"],
+  "decafermi" => [1, "fermi"],  "decagal" => [1, "gal"],
+  "decagauss" => [1, "gauss"],  "decagram" => [1, "gram"],
+  "decahectare" => [1, "hectare"],  "decahertz" => [1, "hertz"],
+  "decahour" => [1, "hour"],  "decainch" => [1, "inch"],
+  "decajoule" => [1, "joule"],  "decakelvin" => [1, "kelvin"],
+  "decakilogram" => [1, "kilogram"],  "decaknot" => [1, "knot"],
+  "decalitre" => [1, "litre"],  "decameter" => [1, "meter"],
+  "decametre" => [1, "metre"],  "decamicron" => [1, "micron"],
+  "decamile" => [1, "mile"],  "decamillibar" => [1, "millibar"],
+  "decaminute" => [1, "minute"],
+  "decaminute_angle" => [1, "minute_angle"],  "decamole" => [1, "mole"],
+  "decamonth" => [1, "month"],  "decanewton" => [1, "newton"],
+  "decaounce" => [1, "ounce"],  "decaparsec" => [1, "parsec"],
+  "decapascal" => [1, "pascal"],  "decapentad" => [1, "pentad"],
+  "decapoise" => [1, "poise"],  "decapound" => [1, "pound"],
+  "decaradian" => [1, "radian"],  "decasecond" => [1, "second"],
+  "decasecond_angle" => [1, "second_angle"],
+  "decasteradian" => [1, "steradian"],  "decastokes" => [1, "stokes"],
+  "decatesla" => [1, "tesla"],  "decaton" => [1, "ton"],
+  "decatonne" => [1, "tonne"],  "decatorr" => [1, "torr"],
+  "decavolt" => [1, "volt"],  "decawatt" => [1, "watt"],
+  "decaweber" => [1, "weber"],  "decayard" => [1, "yard"],
+  "decayd" => [1, "yd"],  "decayear" => [1, "year"],
+  "deciCelsius" => [-1, "Celsius"],
+  "deciFahrenheit" => [-1, "Fahrenheit"],
+  "deciJulian_year" => [-1, "Julian_year"],
+  "deciPascal" => [-1, "Pascal"],  "deciacre" => [-1, "acre"],
+  "deciampere" => [-1, "ampere"],  "deciangstrom" => [-1, "angstrom"],
+  "deciangular_degree" => [-1, "angular_degree"],
+  "deciangular_minute" => [-1, "angular_minute"],
+  "deciangular_second" => [-1, "angular_second"],
+  "deciare" => [-1, "are"],  "deciatmosphere" => [-1, "atmosphere"],
+  "decicalorie" => [-1, "calorie"],  "decicelsius" => [-1, "celsius"],
+  "decicentigrade" => [-1, "centigrade"],
+  "decicentury" => [-1, "century"],  "decichain" => [-1, "chain"],
+  "decicommon_year" => [-1, "common_year"],
+  "decicoulomb" => [-1, "coulomb"],  "deciday" => [-1, "day"],
+  "decidegK" => [-1, "degK"],  "decideg_K" => [-1, "deg_K"],
+  "decidegree" => [-1, "degree"],  "decidegreeK" => [-1, "degreeK"],
+  "decidyne" => [-1, "dyne"],  "decierg" => [-1, "erg"],
+  "decifahrenheit" => [-1, "fahrenheit"],  "decifarad" => [-1, "farad"],
+  "decifermi" => [-1, "fermi"],  "decigal" => [-1, "gal"],
+  "decigauss" => [-1, "gauss"],  "decigram" => [-1, "gram"],
+  "decihectare" => [-1, "hectare"],  "decihertz" => [-1, "hertz"],
+  "decihour" => [-1, "hour"],  "deciinch" => [-1, "inch"],
+  "decijoule" => [-1, "joule"],  "decikelvin" => [-1, "kelvin"],
+  "decikilogram" => [-1, "kilogram"],  "deciknot" => [-1, "knot"],
+  "decilitre" => [-1, "litre"],  "decimeter" => [-1, "meter"],
+  "decimetre" => [-1, "metre"],  "decimicron" => [-1, "micron"],
+  "decimile" => [-1, "mile"],  "decimillibar" => [-1, "millibar"],
+  "deciminute" => [-1, "minute"],
+  "deciminute_angle" => [-1, "minute_angle"],
+  "decimole" => [-1, "mole"],  "decimonth" => [-1, "month"],
+  "decinewton" => [-1, "newton"],  "deciounce" => [-1, "ounce"],
+  "deciparsec" => [-1, "parsec"],  "decipascal" => [-1, "pascal"],
+  "decipentad" => [-1, "pentad"],  "decipoise" => [-1, "poise"],
+  "decipound" => [-1, "pound"],  "deciradian" => [-1, "radian"],
+  "decisecond" => [-1, "second"],
+  "decisecond_angle" => [-1, "second_angle"],
+  "decisteradian" => [-1, "steradian"],  "decistokes" => [-1, "stokes"],
+  "decitesla" => [-1, "tesla"],  "deciton" => [-1, "ton"],
+  "decitonne" => [-1, "tonne"],  "decitorr" => [-1, "torr"],
+  "decivolt" => [-1, "volt"],  "deciwatt" => [-1, "watt"],
+  "deciweber" => [-1, "weber"],  "deciyard" => [-1, "yard"],
+  "deciyd" => [-1, "yd"],  "deciyear" => [-1, "year"],
+  "degKs" => [0, "degK"],  "degreeKs" => [0, "degreeK"],
+  "degrees" => [0, "degree"],  "degs_K" => [0, "deg_K"],
+  "derg" => [-1, "erg"],  "dforce" => [-1, "force"],  "dg" => [-1, "g"],
+  "dgravity" => [-1, "gravity"],  "dh" => [-1, "h"],
+  "dhg" => [-1, "hg"],  "dhr" => [-1, "hr"],  "din" => [-1, "in"],
+  "dkg" => [-1, "kg"],  "dkgf" => [-1, "kgf"],  "dkph" => [-1, "kph"],
+  "dlb" => [-1, "lb"],  "dlm" => [-1, "lm"],  "dlx" => [-1, "lx"],
+  "dly" => [-1, "ly"],  "dm" => [-1, "m"],  "dmb" => [-1, "mb"],
+  "dmercury" => [-1, "mercury"],  "dmgal" => [-1, "mgal"],
+  "dmin" => [-1, "min"],  "dmol" => [-1, "mol"],  "dmon" => [-1, "mon"],
+  "dmph" => [-1, "mph"],  "dohm" => [-1, "ohm"],  "doz" => [-1, "oz"],
+  "dpc" => [-1, "pc"],  "dpercent" => [-1, "percent"],
+  "dpermil" => [-1, "permil"],  "dpsi" => [-1, "psi"],
+  "drad" => [-1, "rad"],  "ds" => [-1, "s"],  "dsr" => [-1, "sr"],
+  "dt" => [-1, "t"],  "dynes" => [0, "dyne"],  "dyr" => [-1, "yr"],
+  "ergs" => [0, "erg"],  "exaCelsius" => [18, "Celsius"],
+  "exaFahrenheit" => [18, "Fahrenheit"],
+  "exaJulian_year" => [18, "Julian_year"],
+  "exaPascal" => [18, "Pascal"],  "exaacre" => [18, "acre"],
+  "exaampere" => [18, "ampere"],  "exaangstrom" => [18, "angstrom"],
+  "exaangular_degree" => [18, "angular_degree"],
+  "exaangular_minute" => [18, "angular_minute"],
+  "exaangular_second" => [18, "angular_second"],
+  "exaare" => [18, "are"],  "exaatmosphere" => [18, "atmosphere"],
+  "exacalorie" => [18, "calorie"],  "exacelsius" => [18, "celsius"],
+  "exacentigrade" => [18, "centigrade"],
+  "exacentury" => [18, "century"],  "exachain" => [18, "chain"],
+  "exacommon_year" => [18, "common_year"],
+  "exacoulomb" => [18, "coulomb"],  "exaday" => [18, "day"],
+  "exadegK" => [18, "degK"],  "exadeg_K" => [18, "deg_K"],
+  "exadegree" => [18, "degree"],  "exadegreeK" => [18, "degreeK"],
+  "exadyne" => [18, "dyne"],  "exaerg" => [18, "erg"],
+  "exafahrenheit" => [18, "fahrenheit"],  "exafarad" => [18, "farad"],
+  "exafermi" => [18, "fermi"],  "exagal" => [18, "gal"],
+  "exagauss" => [18, "gauss"],  "exagram" => [18, "gram"],
+  "exahectare" => [18, "hectare"],  "exahertz" => [18, "hertz"],
+  "exahour" => [18, "hour"],  "exainch" => [18, "inch"],
+  "exajoule" => [18, "joule"],  "exakelvin" => [18, "kelvin"],
+  "exakilogram" => [18, "kilogram"],  "exaknot" => [18, "knot"],
+  "exalitre" => [18, "litre"],  "exameter" => [18, "meter"],
+  "exametre" => [18, "metre"],  "examicron" => [18, "micron"],
+  "examile" => [18, "mile"],  "examillibar" => [18, "millibar"],
+  "examinute" => [18, "minute"],
+  "examinute_angle" => [18, "minute_angle"],  "examole" => [18, "mole"],
+  "examonth" => [18, "month"],  "exanewton" => [18, "newton"],
+  "exaounce" => [18, "ounce"],  "exaparsec" => [18, "parsec"],
+  "exapascal" => [18, "pascal"],  "exapentad" => [18, "pentad"],
+  "exapoise" => [18, "poise"],  "exapound" => [18, "pound"],
+  "exaradian" => [18, "radian"],  "exasecond" => [18, "second"],
+  "exasecond_angle" => [18, "second_angle"],
+  "exasteradian" => [18, "steradian"],  "exastokes" => [18, "stokes"],
+  "exatesla" => [18, "tesla"],  "exaton" => [18, "ton"],
+  "exatonne" => [18, "tonne"],  "exatorr" => [18, "torr"],
+  "exavolt" => [18, "volt"],  "exawatt" => [18, "watt"],
+  "exaweber" => [18, "weber"],  "exayard" => [18, "yard"],
+  "exayd" => [18, "yd"],  "exayear" => [18, "year"],
+  "f%" => [-15, "%"],  "fA" => [-15, "A"],  "fAu" => [-15, "Au"],
+  "fBq" => [-15, "Bq"],  "fC" => [-15, "C"],  "fF" => [-15, "F"],
+  "fG" => [-15, "G"],  "fGal" => [-15, "Gal"],  "fGy" => [-15, "Gy"],
+  "fH" => [-15, "H"],  "fHg" => [-15, "Hg"],  "fHz" => [-15, "Hz"],
+  "fJ" => [-15, "J"],  "fK" => [-15, "K"],  "fL" => [-15, "L"],
+  "fN" => [-15, "N"],  "fP" => [-15, "P"],  "fPa" => [-15, "Pa"],
+  "fS" => [-15, "S"],  "fSt" => [-15, "St"],  "fSv" => [-15, "Sv"],
+  "fT" => [-15, "T"],  "fV" => [-15, "V"],  "fW" => [-15, "W"],
+  "fWb" => [-15, "Wb"],  "fa" => [-15, "a"],  "fac" => [-15, "ac"],
+  "fahrenheits" => [0, "fahrenheit"],  "farads" => [0, "farad"],
+  "fatm" => [-15, "atm"],  "fbar" => [-15, "bar"],
+  "fcal" => [-15, "cal"],
+  "fconventional_mercury" => [-15, "conventional_mercury"],
+  "fd" => [-15, "d"],  "fdegC" => [-15, "degC"],
+  "fdegF" => [-15, "degF"],  "fdeg_C" => [-15, "deg_C"],
+  "fdeg_F" => [-15, "deg_F"],  "fdegreeC" => [-15, "degreeC"],
+  "fdegreeF" => [-15, "degreeF"],  "fdegree_C" => [-15, "degree_C"],
+  "fdegree_E" => [-15, "degree_E"],  "fdegree_F" => [-15, "degree_F"],
+  "fdegree_N" => [-15, "degree_N"],  "fdegree_R" => [-15, "degree_R"],
+  "fdegree_S" => [-15, "degree_S"],  "fdegree_W" => [-15, "degree_W"],
+  "fdegree_c" => [-15, "degree_c"],
+  "fdegree_east" => [-15, "degree_east"],
+  "fdegree_f" => [-15, "degree_f"],
+  "fdegree_north" => [-15, "degree_north"],
+  "fdegree_south" => [-15, "degree_south"],
+  "fdegree_west" => [-15, "degree_west"],
+  "fdegrees_east" => [-15, "degrees_east"],
+  "fdegrees_north" => [-15, "degrees_north"],
+  "fdegrees_south" => [-15, "degrees_south"],
+  "fdegrees_west" => [-15, "degrees_west"],  "fdyn" => [-15, "dyn"],
+  "femtoCelsius" => [-15, "Celsius"],
+  "femtoFahrenheit" => [-15, "Fahrenheit"],
+  "femtoJulian_year" => [-15, "Julian_year"],
+  "femtoPascal" => [-15, "Pascal"],  "femtoacre" => [-15, "acre"],
+  "femtoampere" => [-15, "ampere"],
+  "femtoangstrom" => [-15, "angstrom"],
+  "femtoangular_degree" => [-15, "angular_degree"],
+  "femtoangular_minute" => [-15, "angular_minute"],
+  "femtoangular_second" => [-15, "angular_second"],
+  "femtoare" => [-15, "are"],  "femtoatmosphere" => [-15, "atmosphere"],
+  "femtocalorie" => [-15, "calorie"],
+  "femtocelsius" => [-15, "celsius"],
+  "femtocentigrade" => [-15, "centigrade"],
+  "femtocentury" => [-15, "century"],  "femtochain" => [-15, "chain"],
+  "femtocommon_year" => [-15, "common_year"],
+  "femtocoulomb" => [-15, "coulomb"],  "femtoday" => [-15, "day"],
+  "femtodegK" => [-15, "degK"],  "femtodeg_K" => [-15, "deg_K"],
+  "femtodegree" => [-15, "degree"],  "femtodegreeK" => [-15, "degreeK"],
+  "femtodyne" => [-15, "dyne"],  "femtoerg" => [-15, "erg"],
+  "femtofahrenheit" => [-15, "fahrenheit"],
+  "femtofarad" => [-15, "farad"],  "femtofermi" => [-15, "fermi"],
+  "femtogal" => [-15, "gal"],  "femtogauss" => [-15, "gauss"],
+  "femtogram" => [-15, "gram"],  "femtohectare" => [-15, "hectare"],
+  "femtohertz" => [-15, "hertz"],  "femtohour" => [-15, "hour"],
+  "femtoinch" => [-15, "inch"],  "femtojoule" => [-15, "joule"],
+  "femtokelvin" => [-15, "kelvin"],
+  "femtokilogram" => [-15, "kilogram"],  "femtoknot" => [-15, "knot"],
+  "femtolitre" => [-15, "litre"],  "femtometer" => [-15, "meter"],
+  "femtometre" => [-15, "metre"],  "femtomicron" => [-15, "micron"],
+  "femtomile" => [-15, "mile"],  "femtomillibar" => [-15, "millibar"],
+  "femtominute" => [-15, "minute"],
+  "femtominute_angle" => [-15, "minute_angle"],
+  "femtomole" => [-15, "mole"],  "femtomonth" => [-15, "month"],
+  "femtonewton" => [-15, "newton"],  "femtoounce" => [-15, "ounce"],
+  "femtoparsec" => [-15, "parsec"],  "femtopascal" => [-15, "pascal"],
+  "femtopentad" => [-15, "pentad"],  "femtopoise" => [-15, "poise"],
+  "femtopound" => [-15, "pound"],  "femtoradian" => [-15, "radian"],
+  "femtosecond" => [-15, "second"],
+  "femtosecond_angle" => [-15, "second_angle"],
+  "femtosteradian" => [-15, "steradian"],
+  "femtostokes" => [-15, "stokes"],  "femtotesla" => [-15, "tesla"],
+  "femtoton" => [-15, "ton"],  "femtotonne" => [-15, "tonne"],
+  "femtotorr" => [-15, "torr"],  "femtovolt" => [-15, "volt"],
+  "femtowatt" => [-15, "watt"],  "femtoweber" => [-15, "weber"],
+  "femtoyard" => [-15, "yard"],  "femtoyd" => [-15, "yd"],
+  "femtoyear" => [-15, "year"],  "ferg" => [-15, "erg"],
+  "fermis" => [0, "fermi"],  "fforce" => [-15, "force"],
+  "fg" => [-15, "g"],  "fgravity" => [-15, "gravity"],
+  "fh" => [-15, "h"],  "fhg" => [-15, "hg"],  "fhr" => [-15, "hr"],
+  "fin" => [-15, "in"],  "fkg" => [-15, "kg"],  "fkgf" => [-15, "kgf"],
+  "fkph" => [-15, "kph"],  "flb" => [-15, "lb"],  "flm" => [-15, "lm"],
+  "flx" => [-15, "lx"],  "fly" => [-15, "ly"],  "fm" => [-15, "m"],
+  "fmb" => [-15, "mb"],  "fmercury" => [-15, "mercury"],
+  "fmgal" => [-15, "mgal"],  "fmin" => [-15, "min"],
+  "fmol" => [-15, "mol"],  "fmon" => [-15, "mon"],
+  "fmph" => [-15, "mph"],  "fohm" => [-15, "ohm"],
+  "foz" => [-15, "oz"],  "fpc" => [-15, "pc"],
+  "fpercent" => [-15, "percent"],  "fpermil" => [-15, "permil"],
+  "fpsi" => [-15, "psi"],  "frad" => [-15, "rad"],  "fs" => [-15, "s"],
+  "fsr" => [-15, "sr"],  "ft" => [-15, "t"],  "fyr" => [-15, "yr"],
+  "gals" => [0, "gal"],  "gausses" => [0, "gauss"],
+  "gigaCelsius" => [9, "Celsius"],
+  "gigaFahrenheit" => [9, "Fahrenheit"],
+  "gigaJulian_year" => [9, "Julian_year"],
+  "gigaPascal" => [9, "Pascal"],  "gigaacre" => [9, "acre"],
+  "gigaampere" => [9, "ampere"],  "gigaangstrom" => [9, "angstrom"],
+  "gigaangular_degree" => [9, "angular_degree"],
+  "gigaangular_minute" => [9, "angular_minute"],
+  "gigaangular_second" => [9, "angular_second"],
+  "gigaare" => [9, "are"],  "gigaatmosphere" => [9, "atmosphere"],
+  "gigacalorie" => [9, "calorie"],  "gigacelsius" => [9, "celsius"],
+  "gigacentigrade" => [9, "centigrade"],
+  "gigacentury" => [9, "century"],  "gigachain" => [9, "chain"],
+  "gigacommon_year" => [9, "common_year"],
+  "gigacoulomb" => [9, "coulomb"],  "gigaday" => [9, "day"],
+  "gigadegK" => [9, "degK"],  "gigadeg_K" => [9, "deg_K"],
+  "gigadegree" => [9, "degree"],  "gigadegreeK" => [9, "degreeK"],
+  "gigadyne" => [9, "dyne"],  "gigaerg" => [9, "erg"],
+  "gigafahrenheit" => [9, "fahrenheit"],  "gigafarad" => [9, "farad"],
+  "gigafermi" => [9, "fermi"],  "gigagal" => [9, "gal"],
+  "gigagauss" => [9, "gauss"],  "gigagram" => [9, "gram"],
+  "gigahectare" => [9, "hectare"],  "gigahertz" => [9, "hertz"],
+  "gigahour" => [9, "hour"],  "gigainch" => [9, "inch"],
+  "gigajoule" => [9, "joule"],  "gigakelvin" => [9, "kelvin"],
+  "gigakilogram" => [9, "kilogram"],  "gigaknot" => [9, "knot"],
+  "gigalitre" => [9, "litre"],  "gigameter" => [9, "meter"],
+  "gigametre" => [9, "metre"],  "gigamicron" => [9, "micron"],
+  "gigamile" => [9, "mile"],  "gigamillibar" => [9, "millibar"],
+  "gigaminute" => [9, "minute"],
+  "gigaminute_angle" => [9, "minute_angle"],  "gigamole" => [9, "mole"],
+  "gigamonth" => [9, "month"],  "giganewton" => [9, "newton"],
+  "gigaounce" => [9, "ounce"],  "gigaparsec" => [9, "parsec"],
+  "gigapascal" => [9, "pascal"],  "gigapentad" => [9, "pentad"],
+  "gigapoise" => [9, "poise"],  "gigapound" => [9, "pound"],
+  "gigaradian" => [9, "radian"],  "gigasecond" => [9, "second"],
+  "gigasecond_angle" => [9, "second_angle"],
+  "gigasteradian" => [9, "steradian"],  "gigastokes" => [9, "stokes"],
+  "gigatesla" => [9, "tesla"],  "gigaton" => [9, "ton"],
+  "gigatonne" => [9, "tonne"],  "gigatorr" => [9, "torr"],
+  "gigavolt" => [9, "volt"],  "gigawatt" => [9, "watt"],
+  "gigaweber" => [9, "weber"],  "gigayard" => [9, "yard"],
+  "gigayd" => [9, "yd"],  "gigayear" => [9, "year"],
+  "grams" => [0, "gram"],  "h%" => [2, "%"],  "hA" => [2, "A"],
+  "hAu" => [2, "Au"],  "hBq" => [2, "Bq"],  "hC" => [2, "C"],
+  "hF" => [2, "F"],  "hG" => [2, "G"],  "hGal" => [2, "Gal"],
+  "hGy" => [2, "Gy"],  "hH" => [2, "H"],  "hHg" => [2, "Hg"],
+  "hHz" => [2, "Hz"],  "hJ" => [2, "J"],  "hK" => [2, "K"],
+  "hL" => [2, "L"],  "hN" => [2, "N"],  "hP" => [2, "P"],
+  "hPa" => [2, "Pa"],  "hS" => [2, "S"],  "hSt" => [2, "St"],
+  "hSv" => [2, "Sv"],  "hT" => [2, "T"],  "hV" => [2, "V"],
+  "hW" => [2, "W"],  "hWb" => [2, "Wb"],  "ha" => [2, "a"],
+  "hac" => [2, "ac"],  "hatm" => [2, "atm"],  "hbar" => [2, "bar"],
+  "hcal" => [2, "cal"],
+  "hconventional_mercury" => [2, "conventional_mercury"],
+  "hd" => [2, "d"],  "hdegC" => [2, "degC"],  "hdegF" => [2, "degF"],
+  "hdeg_C" => [2, "deg_C"],  "hdeg_F" => [2, "deg_F"],
+  "hdegreeC" => [2, "degreeC"],  "hdegreeF" => [2, "degreeF"],
+  "hdegree_C" => [2, "degree_C"],  "hdegree_E" => [2, "degree_E"],
+  "hdegree_F" => [2, "degree_F"],  "hdegree_N" => [2, "degree_N"],
+  "hdegree_R" => [2, "degree_R"],  "hdegree_S" => [2, "degree_S"],
+  "hdegree_W" => [2, "degree_W"],  "hdegree_c" => [2, "degree_c"],
+  "hdegree_east" => [2, "degree_east"],  "hdegree_f" => [2, "degree_f"],
+  "hdegree_north" => [2, "degree_north"],
+  "hdegree_south" => [2, "degree_south"],
+  "hdegree_west" => [2, "degree_west"],
+  "hdegrees_east" => [2, "degrees_east"],
+  "hdegrees_north" => [2, "degrees_north"],
+  "hdegrees_south" => [2, "degrees_south"],
+  "hdegrees_west" => [2, "degrees_west"],  "hdyn" => [2, "dyn"],
+  "hectares" => [0, "hectare"],  "hectoCelsius" => [2, "Celsius"],
+  "hectoFahrenheit" => [2, "Fahrenheit"],
+  "hectoJulian_year" => [2, "Julian_year"],
+  "hectoPascal" => [2, "Pascal"],  "hectoacre" => [2, "acre"],
+  "hectoampere" => [2, "ampere"],  "hectoangstrom" => [2, "angstrom"],
+  "hectoangular_degree" => [2, "angular_degree"],
+  "hectoangular_minute" => [2, "angular_minute"],
+  "hectoangular_second" => [2, "angular_second"],
+  "hectoare" => [2, "are"],  "hectoatmosphere" => [2, "atmosphere"],
+  "hectocalorie" => [2, "calorie"],  "hectocelsius" => [2, "celsius"],
+  "hectocentigrade" => [2, "centigrade"],
+  "hectocentury" => [2, "century"],  "hectochain" => [2, "chain"],
+  "hectocommon_year" => [2, "common_year"],
+  "hectocoulomb" => [2, "coulomb"],  "hectoday" => [2, "day"],
+  "hectodegK" => [2, "degK"],  "hectodeg_K" => [2, "deg_K"],
+  "hectodegree" => [2, "degree"],  "hectodegreeK" => [2, "degreeK"],
+  "hectodyne" => [2, "dyne"],  "hectoerg" => [2, "erg"],
+  "hectofahrenheit" => [2, "fahrenheit"],  "hectofarad" => [2, "farad"],
+  "hectofermi" => [2, "fermi"],  "hectogal" => [2, "gal"],
+  "hectogauss" => [2, "gauss"],  "hectogram" => [2, "gram"],
+  "hectohectare" => [2, "hectare"],  "hectohertz" => [2, "hertz"],
+  "hectohour" => [2, "hour"],  "hectoinch" => [2, "inch"],
+  "hectojoule" => [2, "joule"],  "hectokelvin" => [2, "kelvin"],
+  "hectokilogram" => [2, "kilogram"],  "hectoknot" => [2, "knot"],
+  "hectolitre" => [2, "litre"],  "hectometer" => [2, "meter"],
+  "hectometre" => [2, "metre"],  "hectomicron" => [2, "micron"],
+  "hectomile" => [2, "mile"],  "hectomillibar" => [2, "millibar"],
+  "hectominute" => [2, "minute"],
+  "hectominute_angle" => [2, "minute_angle"],
+  "hectomole" => [2, "mole"],  "hectomonth" => [2, "month"],
+  "hectonewton" => [2, "newton"],  "hectoounce" => [2, "ounce"],
+  "hectoparsec" => [2, "parsec"],  "hectopascal" => [2, "pascal"],
+  "hectopentad" => [2, "pentad"],  "hectopoise" => [2, "poise"],
+  "hectopound" => [2, "pound"],  "hectoradian" => [2, "radian"],
+  "hectosecond" => [2, "second"],
+  "hectosecond_angle" => [2, "second_angle"],
+  "hectosteradian" => [2, "steradian"],  "hectostokes" => [2, "stokes"],
+  "hectotesla" => [2, "tesla"],  "hectoton" => [2, "ton"],
+  "hectotonne" => [2, "tonne"],  "hectotorr" => [2, "torr"],
+  "hectovolt" => [2, "volt"],  "hectowatt" => [2, "watt"],
+  "hectoweber" => [2, "weber"],  "hectoyard" => [2, "yard"],
+  "hectoyd" => [2, "yd"],  "hectoyear" => [2, "year"],
+  "herg" => [2, "erg"],  "hertzes" => [0, "hertz"],
+  "hforce" => [2, "force"],  "hg" => [2, "g"],
+  "hgravity" => [2, "gravity"],  "hh" => [2, "h"],  "hhg" => [2, "hg"],
+  "hhr" => [2, "hr"],  "hin" => [2, "in"],  "hkg" => [2, "kg"],
+  "hkgf" => [2, "kgf"],  "hkph" => [2, "kph"],  "hlb" => [2, "lb"],
+  "hlm" => [2, "lm"],  "hlx" => [2, "lx"],  "hly" => [2, "ly"],
+  "hm" => [2, "m"],  "hmb" => [2, "mb"],  "hmercury" => [2, "mercury"],
+  "hmgal" => [2, "mgal"],  "hmin" => [2, "min"],  "hmol" => [2, "mol"],
+  "hmon" => [2, "mon"],  "hmph" => [2, "mph"],  "hohm" => [2, "ohm"],
+  "hours" => [0, "hour"],  "hoz" => [2, "oz"],  "hpc" => [2, "pc"],
+  "hpercent" => [2, "percent"],  "hpermil" => [2, "permil"],
+  "hpsi" => [2, "psi"],  "hrad" => [2, "rad"],  "hs" => [2, "s"],
+  "hsr" => [2, "sr"],  "ht" => [2, "t"],  "hyr" => [2, "yr"],
+  "inchs" => [0, "inch"],  "joules" => [0, "joule"],  "k%" => [3, "%"],
+  "kA" => [3, "A"],  "kAu" => [3, "Au"],  "kBq" => [3, "Bq"],
+  "kC" => [3, "C"],  "kF" => [3, "F"],  "kG" => [3, "G"],
+  "kGal" => [3, "Gal"],  "kGy" => [3, "Gy"],  "kH" => [3, "H"],
+  "kHg" => [3, "Hg"],  "kHz" => [3, "Hz"],  "kJ" => [3, "J"],
+  "kK" => [3, "K"],  "kL" => [3, "L"],  "kN" => [3, "N"],
+  "kP" => [3, "P"],  "kPa" => [3, "Pa"],  "kS" => [3, "S"],
+  "kSt" => [3, "St"],  "kSv" => [3, "Sv"],  "kT" => [3, "T"],
+  "kV" => [3, "V"],  "kW" => [3, "W"],  "kWb" => [3, "Wb"],
+  "ka" => [3, "a"],  "kac" => [3, "ac"],  "katm" => [3, "atm"],
+  "kbar" => [3, "bar"],  "kcal" => [3, "cal"],
+  "kconventional_mercury" => [3, "conventional_mercury"],
+  "kd" => [3, "d"],  "kdegC" => [3, "degC"],  "kdegF" => [3, "degF"],
+  "kdeg_C" => [3, "deg_C"],  "kdeg_F" => [3, "deg_F"],
+  "kdegreeC" => [3, "degreeC"],  "kdegreeF" => [3, "degreeF"],
+  "kdegree_C" => [3, "degree_C"],  "kdegree_E" => [3, "degree_E"],
+  "kdegree_F" => [3, "degree_F"],  "kdegree_N" => [3, "degree_N"],
+  "kdegree_R" => [3, "degree_R"],  "kdegree_S" => [3, "degree_S"],
+  "kdegree_W" => [3, "degree_W"],  "kdegree_c" => [3, "degree_c"],
+  "kdegree_east" => [3, "degree_east"],  "kdegree_f" => [3, "degree_f"],
+  "kdegree_north" => [3, "degree_north"],
+  "kdegree_south" => [3, "degree_south"],
+  "kdegree_west" => [3, "degree_west"],
+  "kdegrees_east" => [3, "degrees_east"],
+  "kdegrees_north" => [3, "degrees_north"],
+  "kdegrees_south" => [3, "degrees_south"],
+  "kdegrees_west" => [3, "degrees_west"],  "kdyn" => [3, "dyn"],
+  "kelvins" => [0, "kelvin"],  "kerg" => [3, "erg"],
+  "kforce" => [3, "force"],  "kgravity" => [3, "gravity"],
+  "kh" => [3, "h"],  "khg" => [3, "hg"],  "khr" => [3, "hr"],
+  "kiloCelsius" => [3, "Celsius"],
+  "kiloFahrenheit" => [3, "Fahrenheit"],
+  "kiloJulian_year" => [3, "Julian_year"],
+  "kiloPascal" => [3, "Pascal"],  "kiloacre" => [3, "acre"],
+  "kiloampere" => [3, "ampere"],  "kiloangstrom" => [3, "angstrom"],
+  "kiloangular_degree" => [3, "angular_degree"],
+  "kiloangular_minute" => [3, "angular_minute"],
+  "kiloangular_second" => [3, "angular_second"],
+  "kiloare" => [3, "are"],  "kiloatmosphere" => [3, "atmosphere"],
+  "kilocalorie" => [3, "calorie"],  "kilocelsius" => [3, "celsius"],
+  "kilocentigrade" => [3, "centigrade"],
+  "kilocentury" => [3, "century"],  "kilochain" => [3, "chain"],
+  "kilocommon_year" => [3, "common_year"],
+  "kilocoulomb" => [3, "coulomb"],  "kiloday" => [3, "day"],
+  "kilodegK" => [3, "degK"],  "kilodeg_K" => [3, "deg_K"],
+  "kilodegree" => [3, "degree"],  "kilodegreeK" => [3, "degreeK"],
+  "kilodyne" => [3, "dyne"],  "kiloerg" => [3, "erg"],
+  "kilofahrenheit" => [3, "fahrenheit"],  "kilofarad" => [3, "farad"],
+  "kilofermi" => [3, "fermi"],  "kilogal" => [3, "gal"],
+  "kilogauss" => [3, "gauss"],  "kilogram" => [3, "gram"],
+  "kilograms" => [0, "kilogram"],  "kilohectare" => [3, "hectare"],
+  "kilohertz" => [3, "hertz"],  "kilohour" => [3, "hour"],
+  "kiloinch" => [3, "inch"],  "kilojoule" => [3, "joule"],
+  "kilokelvin" => [3, "kelvin"],  "kilokilogram" => [3, "kilogram"],
+  "kiloknot" => [3, "knot"],  "kilolitre" => [3, "litre"],
+  "kilometer" => [3, "meter"],  "kilometre" => [3, "metre"],
+  "kilomicron" => [3, "micron"],  "kilomile" => [3, "mile"],
+  "kilomillibar" => [3, "millibar"],  "kilominute" => [3, "minute"],
+  "kilominute_angle" => [3, "minute_angle"],  "kilomole" => [3, "mole"],
+  "kilomonth" => [3, "month"],  "kilonewton" => [3, "newton"],
+  "kiloounce" => [3, "ounce"],  "kiloparsec" => [3, "parsec"],
+  "kilopascal" => [3, "pascal"],  "kilopentad" => [3, "pentad"],
+  "kilopoise" => [3, "poise"],  "kilopound" => [3, "pound"],
+  "kiloradian" => [3, "radian"],  "kilosecond" => [3, "second"],
+  "kilosecond_angle" => [3, "second_angle"],
+  "kilosteradian" => [3, "steradian"],  "kilostokes" => [3, "stokes"],
+  "kilotesla" => [3, "tesla"],  "kiloton" => [3, "ton"],
+  "kilotonne" => [3, "tonne"],  "kilotorr" => [3, "torr"],
+  "kilovolt" => [3, "volt"],  "kilowatt" => [3, "watt"],
+  "kiloweber" => [3, "weber"],  "kiloyard" => [3, "yard"],
+  "kiloyd" => [3, "yd"],  "kiloyear" => [3, "year"],
+  "kin" => [3, "in"],  "kkg" => [3, "kg"],  "kkgf" => [3, "kgf"],
+  "kkph" => [3, "kph"],  "klb" => [3, "lb"],  "klm" => [3, "lm"],
+  "klx" => [3, "lx"],  "kly" => [3, "ly"],  "km" => [3, "m"],
+  "kmb" => [3, "mb"],  "kmercury" => [3, "mercury"],
+  "kmgal" => [3, "mgal"],  "kmin" => [3, "min"],  "kmol" => [3, "mol"],
+  "kmon" => [3, "mon"],  "kmph" => [3, "mph"],  "knots" => [0, "knot"],
+  "kohm" => [3, "ohm"],  "koz" => [3, "oz"],  "kpc" => [3, "pc"],
+  "kpercent" => [3, "percent"],  "kpermil" => [3, "permil"],
+  "kpsi" => [3, "psi"],  "krad" => [3, "rad"],  "ks" => [3, "s"],
+  "ksr" => [3, "sr"],  "kt" => [3, "t"],  "kyr" => [3, "yr"],
+  "litres" => [0, "litre"],  "m%" => [-3, "%"],  "mA" => [-3, "A"],
+  "mAu" => [-3, "Au"],  "mBq" => [-3, "Bq"],  "mC" => [-3, "C"],
+  "mF" => [-3, "F"],  "mG" => [-3, "G"],  "mGal" => [-3, "Gal"],
+  "mGy" => [-3, "Gy"],  "mH" => [-3, "H"],  "mHg" => [-3, "Hg"],
+  "mHz" => [-3, "Hz"],  "mJ" => [-3, "J"],  "mK" => [-3, "K"],
+  "mL" => [-3, "L"],  "mN" => [-3, "N"],  "mP" => [-3, "P"],
+  "mPa" => [-3, "Pa"],  "mS" => [-3, "S"],  "mSt" => [-3, "St"],
+  "mSv" => [-3, "Sv"],  "mT" => [-3, "T"],  "mV" => [-3, "V"],
+  "mW" => [-3, "W"],  "mWb" => [-3, "Wb"],  "ma" => [-3, "a"],
+  "mac" => [-3, "ac"],  "matm" => [-3, "atm"],  "mbar" => [-3, "bar"],
+  "mcal" => [-3, "cal"],
+  "mconventional_mercury" => [-3, "conventional_mercury"],
+  "md" => [-3, "d"],  "mdegC" => [-3, "degC"],  "mdegF" => [-3, "degF"],
+  "mdeg_C" => [-3, "deg_C"],  "mdeg_F" => [-3, "deg_F"],
+  "mdegreeC" => [-3, "degreeC"],  "mdegreeF" => [-3, "degreeF"],
+  "mdegree_C" => [-3, "degree_C"],  "mdegree_E" => [-3, "degree_E"],
+  "mdegree_F" => [-3, "degree_F"],  "mdegree_N" => [-3, "degree_N"],
+  "mdegree_R" => [-3, "degree_R"],  "mdegree_S" => [-3, "degree_S"],
+  "mdegree_W" => [-3, "degree_W"],  "mdegree_c" => [-3, "degree_c"],
+  "mdegree_east" => [-3, "degree_east"],
+  "mdegree_f" => [-3, "degree_f"],
+  "mdegree_north" => [-3, "degree_north"],
+  "mdegree_south" => [-3, "degree_south"],
+  "mdegree_west" => [-3, "degree_west"],
+  "mdegrees_east" => [-3, "degrees_east"],
+  "mdegrees_north" => [-3, "degrees_north"],
+  "mdegrees_south" => [-3, "degrees_south"],
+  "mdegrees_west" => [-3, "degrees_west"],  "mdyn" => [-3, "dyn"],
+  "megaCelsius" => [6, "Celsius"],
+  "megaFahrenheit" => [6, "Fahrenheit"],
+  "megaJulian_year" => [6, "Julian_year"],
+  "megaPascal" => [6, "Pascal"],  "megaacre" => [6, "acre"],
+  "megaampere" => [6, "ampere"],  "megaangstrom" => [6, "angstrom"],
+  "megaangular_degree" => [6, "angular_degree"],
+  "megaangular_minute" => [6, "angular_minute"],
+  "megaangular_second" => [6, "angular_second"],
+  "megaare" => [6, "are"],  "megaatmosphere" => [6, "atmosphere"],
+  "megacalorie" => [6, "calorie"],  "megacelsius" => [6, "celsius"],
+  "megacentigrade" => [6, "centigrade"],
+  "megacentury" => [6, "century"],  "megachain" => [6, "chain"],
+  "megacommon_year" => [6, "common_year"],
+  "megacoulomb" => [6, "coulomb"],  "megaday" => [6, "day"],
+  "megadegK" => [6, "degK"],  "megadeg_K" => [6, "deg_K"],
+  "megadegree" => [6, "degree"],  "megadegreeK" => [6, "degreeK"],
+  "megadyne" => [6, "dyne"],  "megaerg" => [6, "erg"],
+  "megafahrenheit" => [6, "fahrenheit"],  "megafarad" => [6, "farad"],
+  "megafermi" => [6, "fermi"],  "megagal" => [6, "gal"],
+  "megagauss" => [6, "gauss"],  "megagram" => [6, "gram"],
+  "megahectare" => [6, "hectare"],  "megahertz" => [6, "hertz"],
+  "megahour" => [6, "hour"],  "megainch" => [6, "inch"],
+  "megajoule" => [6, "joule"],  "megakelvin" => [6, "kelvin"],
+  "megakilogram" => [6, "kilogram"],  "megaknot" => [6, "knot"],
+  "megalitre" => [6, "litre"],  "megameter" => [6, "meter"],
+  "megametre" => [6, "metre"],  "megamicron" => [6, "micron"],
+  "megamile" => [6, "mile"],  "megamillibar" => [6, "millibar"],
+  "megaminute" => [6, "minute"],
+  "megaminute_angle" => [6, "minute_angle"],  "megamole" => [6, "mole"],
+  "megamonth" => [6, "month"],  "meganewton" => [6, "newton"],
+  "megaounce" => [6, "ounce"],  "megaparsec" => [6, "parsec"],
+  "megapascal" => [6, "pascal"],  "megapentad" => [6, "pentad"],
+  "megapoise" => [6, "poise"],  "megapound" => [6, "pound"],
+  "megaradian" => [6, "radian"],  "megasecond" => [6, "second"],
+  "megasecond_angle" => [6, "second_angle"],
+  "megasteradian" => [6, "steradian"],  "megastokes" => [6, "stokes"],
+  "megatesla" => [6, "tesla"],  "megaton" => [6, "ton"],
+  "megatonne" => [6, "tonne"],  "megatorr" => [6, "torr"],
+  "megavolt" => [6, "volt"],  "megawatt" => [6, "watt"],
+  "megaweber" => [6, "weber"],  "megayard" => [6, "yard"],
+  "megayd" => [6, "yd"],  "megayear" => [6, "year"],
+  "merg" => [-3, "erg"],  "meters" => [0, "meter"],
+  "metres" => [0, "metre"],  "mforce" => [-3, "force"],
+  "mg" => [-3, "g"],  "mgravity" => [-3, "gravity"],  "mh" => [-3, "h"],
+  "mhg" => [-3, "hg"],  "mhr" => [-3, "hr"],
+  "microCelsius" => [-6, "Celsius"],
+  "microFahrenheit" => [-6, "Fahrenheit"],
+  "microJulian_year" => [-6, "Julian_year"],
+  "microPascal" => [-6, "Pascal"],  "microacre" => [-6, "acre"],
+  "microampere" => [-6, "ampere"],  "microangstrom" => [-6, "angstrom"],
+  "microangular_degree" => [-6, "angular_degree"],
+  "microangular_minute" => [-6, "angular_minute"],
+  "microangular_second" => [-6, "angular_second"],
+  "microare" => [-6, "are"],  "microatmosphere" => [-6, "atmosphere"],
+  "microcalorie" => [-6, "calorie"],  "microcelsius" => [-6, "celsius"],
+  "microcentigrade" => [-6, "centigrade"],
+  "microcentury" => [-6, "century"],  "microchain" => [-6, "chain"],
+  "microcommon_year" => [-6, "common_year"],
+  "microcoulomb" => [-6, "coulomb"],  "microday" => [-6, "day"],
+  "microdegK" => [-6, "degK"],  "microdeg_K" => [-6, "deg_K"],
+  "microdegree" => [-6, "degree"],  "microdegreeK" => [-6, "degreeK"],
+  "microdyne" => [-6, "dyne"],  "microerg" => [-6, "erg"],
+  "microfahrenheit" => [-6, "fahrenheit"],
+  "microfarad" => [-6, "farad"],  "microfermi" => [-6, "fermi"],
+  "microgal" => [-6, "gal"],  "microgauss" => [-6, "gauss"],
+  "microgram" => [-6, "gram"],  "microhectare" => [-6, "hectare"],
+  "microhertz" => [-6, "hertz"],  "microhour" => [-6, "hour"],
+  "microinch" => [-6, "inch"],  "microjoule" => [-6, "joule"],
+  "microkelvin" => [-6, "kelvin"],  "microkilogram" => [-6, "kilogram"],
+  "microknot" => [-6, "knot"],  "microlitre" => [-6, "litre"],
+  "micrometer" => [-6, "meter"],  "micrometre" => [-6, "metre"],
+  "micromicron" => [-6, "micron"],  "micromile" => [-6, "mile"],
+  "micromillibar" => [-6, "millibar"],  "microminute" => [-6, "minute"],
+  "microminute_angle" => [-6, "minute_angle"],
+  "micromole" => [-6, "mole"],  "micromonth" => [-6, "month"],
+  "micronewton" => [-6, "newton"],  "microns" => [0, "micron"],
+  "microounce" => [-6, "ounce"],  "microparsec" => [-6, "parsec"],
+  "micropascal" => [-6, "pascal"],  "micropentad" => [-6, "pentad"],
+  "micropoise" => [-6, "poise"],  "micropound" => [-6, "pound"],
+  "microradian" => [-6, "radian"],  "microsecond" => [-6, "second"],
+  "microsecond_angle" => [-6, "second_angle"],
+  "microsteradian" => [-6, "steradian"],
+  "microstokes" => [-6, "stokes"],  "microtesla" => [-6, "tesla"],
+  "microton" => [-6, "ton"],  "microtonne" => [-6, "tonne"],
+  "microtorr" => [-6, "torr"],  "microvolt" => [-6, "volt"],
+  "microwatt" => [-6, "watt"],  "microweber" => [-6, "weber"],
+  "microyard" => [-6, "yard"],  "microyd" => [-6, "yd"],
+  "microyear" => [-6, "year"],  "miles" => [0, "mile"],
+  "milliCelsius" => [-3, "Celsius"],
+  "milliFahrenheit" => [-3, "Fahrenheit"],
+  "milliJulian_year" => [-3, "Julian_year"],
+  "milliPascal" => [-3, "Pascal"],  "milliacre" => [-3, "acre"],
+  "milliampere" => [-3, "ampere"],  "milliangstrom" => [-3, "angstrom"],
+  "milliangular_degree" => [-3, "angular_degree"],
+  "milliangular_minute" => [-3, "angular_minute"],
+  "milliangular_second" => [-3, "angular_second"],
+  "milliare" => [-3, "are"],  "milliatmosphere" => [-3, "atmosphere"],
+  "millibars" => [0, "millibar"],  "millicalorie" => [-3, "calorie"],
+  "millicelsius" => [-3, "celsius"],
+  "millicentigrade" => [-3, "centigrade"],
+  "millicentury" => [-3, "century"],  "millichain" => [-3, "chain"],
+  "millicommon_year" => [-3, "common_year"],
+  "millicoulomb" => [-3, "coulomb"],  "milliday" => [-3, "day"],
+  "millidegK" => [-3, "degK"],  "millideg_K" => [-3, "deg_K"],
+  "millidegree" => [-3, "degree"],  "millidegreeK" => [-3, "degreeK"],
+  "millidyne" => [-3, "dyne"],  "millierg" => [-3, "erg"],
+  "millifahrenheit" => [-3, "fahrenheit"],
+  "millifarad" => [-3, "farad"],  "millifermi" => [-3, "fermi"],
+  "milligal" => [-3, "gal"],  "milligauss" => [-3, "gauss"],
+  "milligram" => [-3, "gram"],  "millihectare" => [-3, "hectare"],
+  "millihertz" => [-3, "hertz"],  "millihour" => [-3, "hour"],
+  "milliinch" => [-3, "inch"],  "millijoule" => [-3, "joule"],
+  "millikelvin" => [-3, "kelvin"],  "millikilogram" => [-3, "kilogram"],
+  "milliknot" => [-3, "knot"],  "millilitre" => [-3, "litre"],
+  "millimeter" => [-3, "meter"],  "millimetre" => [-3, "metre"],
+  "millimicron" => [-3, "micron"],  "millimile" => [-3, "mile"],
+  "millimillibar" => [-3, "millibar"],  "milliminute" => [-3, "minute"],
+  "milliminute_angle" => [-3, "minute_angle"],
+  "millimole" => [-3, "mole"],  "millimonth" => [-3, "month"],
+  "millinewton" => [-3, "newton"],  "milliounce" => [-3, "ounce"],
+  "milliparsec" => [-3, "parsec"],  "millipascal" => [-3, "pascal"],
+  "millipentad" => [-3, "pentad"],  "millipoise" => [-3, "poise"],
+  "millipound" => [-3, "pound"],  "milliradian" => [-3, "radian"],
+  "millisecond" => [-3, "second"],
+  "millisecond_angle" => [-3, "second_angle"],
+  "millisteradian" => [-3, "steradian"],
+  "millistokes" => [-3, "stokes"],  "millitesla" => [-3, "tesla"],
+  "milliton" => [-3, "ton"],  "millitonne" => [-3, "tonne"],
+  "millitorr" => [-3, "torr"],  "millivolt" => [-3, "volt"],
+  "milliwatt" => [-3, "watt"],  "milliweber" => [-3, "weber"],
+  "milliyard" => [-3, "yard"],  "milliyd" => [-3, "yd"],
+  "milliyear" => [-3, "year"],  "min" => [-3, "in"],
+  "minutes" => [0, "minute"],  "minutes_angle" => [0, "minute_angle"],
+  "mkg" => [-3, "kg"],  "mkgf" => [-3, "kgf"],  "mkph" => [-3, "kph"],
+  "mlb" => [-3, "lb"],  "mlm" => [-3, "lm"],  "mlx" => [-3, "lx"],
+  "mly" => [-3, "ly"],  "mm" => [-3, "m"],  "mmb" => [-3, "mb"],
+  "mmercury" => [-3, "mercury"],  "mmgal" => [-3, "mgal"],
+  "mmin" => [-3, "min"],  "mmol" => [-3, "mol"],  "mmon" => [-3, "mon"],
+  "mmph" => [-3, "mph"],  "mohm" => [-3, "ohm"],
+  "moles" => [0, "mole"],  "months" => [0, "month"],
+  "moz" => [-3, "oz"],  "mpc" => [-3, "pc"],
+  "mpercent" => [-3, "percent"],  "mpermil" => [-3, "permil"],
+  "mpsi" => [-3, "psi"],  "mrad" => [-3, "rad"],  "ms" => [-3, "s"],
+  "msr" => [-3, "sr"],  "mt" => [-3, "t"],  "myr" => [-3, "yr"],
+  "n%" => [-9, "%"],  "nA" => [-9, "A"],  "nAu" => [-9, "Au"],
+  "nBq" => [-9, "Bq"],  "nC" => [-9, "C"],  "nF" => [-9, "F"],
+  "nG" => [-9, "G"],  "nGal" => [-9, "Gal"],  "nGy" => [-9, "Gy"],
+  "nH" => [-9, "H"],  "nHg" => [-9, "Hg"],  "nHz" => [-9, "Hz"],
+  "nJ" => [-9, "J"],  "nK" => [-9, "K"],  "nL" => [-9, "L"],
+  "nN" => [-9, "N"],  "nP" => [-9, "P"],  "nPa" => [-9, "Pa"],
+  "nS" => [-9, "S"],  "nSt" => [-9, "St"],  "nSv" => [-9, "Sv"],
+  "nT" => [-9, "T"],  "nV" => [-9, "V"],  "nW" => [-9, "W"],
+  "nWb" => [-9, "Wb"],  "na" => [-9, "a"],  "nac" => [-9, "ac"],
+  "nanoCelsius" => [-9, "Celsius"],
+  "nanoFahrenheit" => [-9, "Fahrenheit"],
+  "nanoJulian_year" => [-9, "Julian_year"],
+  "nanoPascal" => [-9, "Pascal"],  "nanoacre" => [-9, "acre"],
+  "nanoampere" => [-9, "ampere"],  "nanoangstrom" => [-9, "angstrom"],
+  "nanoangular_degree" => [-9, "angular_degree"],
+  "nanoangular_minute" => [-9, "angular_minute"],
+  "nanoangular_second" => [-9, "angular_second"],
+  "nanoare" => [-9, "are"],  "nanoatmosphere" => [-9, "atmosphere"],
+  "nanocalorie" => [-9, "calorie"],  "nanocelsius" => [-9, "celsius"],
+  "nanocentigrade" => [-9, "centigrade"],
+  "nanocentury" => [-9, "century"],  "nanochain" => [-9, "chain"],
+  "nanocommon_year" => [-9, "common_year"],
+  "nanocoulomb" => [-9, "coulomb"],  "nanoday" => [-9, "day"],
+  "nanodegK" => [-9, "degK"],  "nanodeg_K" => [-9, "deg_K"],
+  "nanodegree" => [-9, "degree"],  "nanodegreeK" => [-9, "degreeK"],
+  "nanodyne" => [-9, "dyne"],  "nanoerg" => [-9, "erg"],
+  "nanofahrenheit" => [-9, "fahrenheit"],  "nanofarad" => [-9, "farad"],
+  "nanofermi" => [-9, "fermi"],  "nanogal" => [-9, "gal"],
+  "nanogauss" => [-9, "gauss"],  "nanogram" => [-9, "gram"],
+  "nanohectare" => [-9, "hectare"],  "nanohertz" => [-9, "hertz"],
+  "nanohour" => [-9, "hour"],  "nanoinch" => [-9, "inch"],
+  "nanojoule" => [-9, "joule"],  "nanokelvin" => [-9, "kelvin"],
+  "nanokilogram" => [-9, "kilogram"],  "nanoknot" => [-9, "knot"],
+  "nanolitre" => [-9, "litre"],  "nanometer" => [-9, "meter"],
+  "nanometre" => [-9, "metre"],  "nanomicron" => [-9, "micron"],
+  "nanomile" => [-9, "mile"],  "nanomillibar" => [-9, "millibar"],
+  "nanominute" => [-9, "minute"],
+  "nanominute_angle" => [-9, "minute_angle"],
+  "nanomole" => [-9, "mole"],  "nanomonth" => [-9, "month"],
+  "nanonewton" => [-9, "newton"],  "nanoounce" => [-9, "ounce"],
+  "nanoparsec" => [-9, "parsec"],  "nanopascal" => [-9, "pascal"],
+  "nanopentad" => [-9, "pentad"],  "nanopoise" => [-9, "poise"],
+  "nanopound" => [-9, "pound"],  "nanoradian" => [-9, "radian"],
+  "nanosecond" => [-9, "second"],
+  "nanosecond_angle" => [-9, "second_angle"],
+  "nanosteradian" => [-9, "steradian"],  "nanostokes" => [-9, "stokes"],
+  "nanotesla" => [-9, "tesla"],  "nanoton" => [-9, "ton"],
+  "nanotonne" => [-9, "tonne"],  "nanotorr" => [-9, "torr"],
+  "nanovolt" => [-9, "volt"],  "nanowatt" => [-9, "watt"],
+  "nanoweber" => [-9, "weber"],  "nanoyard" => [-9, "yard"],
+  "nanoyd" => [-9, "yd"],  "nanoyear" => [-9, "year"],
+  "natm" => [-9, "atm"],  "nbar" => [-9, "bar"],  "ncal" => [-9, "cal"],
+  "nconventional_mercury" => [-9, "conventional_mercury"],
+  "nd" => [-9, "d"],  "ndegC" => [-9, "degC"],  "ndegF" => [-9, "degF"],
+  "ndeg_C" => [-9, "deg_C"],  "ndeg_F" => [-9, "deg_F"],
+  "ndegreeC" => [-9, "degreeC"],  "ndegreeF" => [-9, "degreeF"],
+  "ndegree_C" => [-9, "degree_C"],  "ndegree_E" => [-9, "degree_E"],
+  "ndegree_F" => [-9, "degree_F"],  "ndegree_N" => [-9, "degree_N"],
+  "ndegree_R" => [-9, "degree_R"],  "ndegree_S" => [-9, "degree_S"],
+  "ndegree_W" => [-9, "degree_W"],  "ndegree_c" => [-9, "degree_c"],
+  "ndegree_east" => [-9, "degree_east"],
+  "ndegree_f" => [-9, "degree_f"],
+  "ndegree_north" => [-9, "degree_north"],
+  "ndegree_south" => [-9, "degree_south"],
+  "ndegree_west" => [-9, "degree_west"],
+  "ndegrees_east" => [-9, "degrees_east"],
+  "ndegrees_north" => [-9, "degrees_north"],
+  "ndegrees_south" => [-9, "degrees_south"],
+  "ndegrees_west" => [-9, "degrees_west"],  "ndyn" => [-9, "dyn"],
+  "nerg" => [-9, "erg"],  "newtons" => [0, "newton"],
+  "nforce" => [-9, "force"],  "ng" => [-9, "g"],
+  "ngravity" => [-9, "gravity"],  "nh" => [-9, "h"],
+  "nhg" => [-9, "hg"],  "nhr" => [-9, "hr"],  "nin" => [-9, "in"],
+  "nkg" => [-9, "kg"],  "nkgf" => [-9, "kgf"],  "nkph" => [-9, "kph"],
+  "nlb" => [-9, "lb"],  "nlm" => [-9, "lm"],  "nlx" => [-9, "lx"],
+  "nly" => [-9, "ly"],  "nm" => [-9, "m"],  "nmb" => [-9, "mb"],
+  "nmercury" => [-9, "mercury"],  "nmgal" => [-9, "mgal"],
+  "nmin" => [-9, "min"],  "nmol" => [-9, "mol"],  "nmon" => [-9, "mon"],
+  "nmph" => [-9, "mph"],  "nohm" => [-9, "ohm"],  "noz" => [-9, "oz"],
+  "npc" => [-9, "pc"],  "npercent" => [-9, "percent"],
+  "npermil" => [-9, "permil"],  "npsi" => [-9, "psi"],
+  "nrad" => [-9, "rad"],  "ns" => [-9, "s"],  "nsr" => [-9, "sr"],
+  "nt" => [-9, "t"],  "nyr" => [-9, "yr"],  "ounces" => [0, "ounce"],
+  "p%" => [-12, "%"],  "pA" => [-12, "A"],  "pAu" => [-12, "Au"],
+  "pBq" => [-12, "Bq"],  "pC" => [-12, "C"],  "pF" => [-12, "F"],
+  "pG" => [-12, "G"],  "pGal" => [-12, "Gal"],  "pGy" => [-12, "Gy"],
+  "pH" => [-12, "H"],  "pHg" => [-12, "Hg"],  "pHz" => [-12, "Hz"],
+  "pJ" => [-12, "J"],  "pK" => [-12, "K"],  "pL" => [-12, "L"],
+  "pN" => [-12, "N"],  "pP" => [-12, "P"],  "pPa" => [-12, "Pa"],
+  "pS" => [-12, "S"],  "pSt" => [-12, "St"],  "pSv" => [-12, "Sv"],
+  "pT" => [-12, "T"],  "pV" => [-12, "V"],  "pW" => [-12, "W"],
+  "pWb" => [-12, "Wb"],  "pa" => [-12, "a"],  "pac" => [-12, "ac"],
+  "parsecs" => [0, "parsec"],  "pascals" => [0, "pascal"],
+  "patm" => [-12, "atm"],  "pbar" => [-12, "bar"],
+  "pcal" => [-12, "cal"],
+  "pconventional_mercury" => [-12, "conventional_mercury"],
+  "pd" => [-12, "d"],  "pdegC" => [-12, "degC"],
+  "pdegF" => [-12, "degF"],  "pdeg_C" => [-12, "deg_C"],
+  "pdeg_F" => [-12, "deg_F"],  "pdegreeC" => [-12, "degreeC"],
+  "pdegreeF" => [-12, "degreeF"],  "pdegree_C" => [-12, "degree_C"],
+  "pdegree_E" => [-12, "degree_E"],  "pdegree_F" => [-12, "degree_F"],
+  "pdegree_N" => [-12, "degree_N"],  "pdegree_R" => [-12, "degree_R"],
+  "pdegree_S" => [-12, "degree_S"],  "pdegree_W" => [-12, "degree_W"],
+  "pdegree_c" => [-12, "degree_c"],
+  "pdegree_east" => [-12, "degree_east"],
+  "pdegree_f" => [-12, "degree_f"],
+  "pdegree_north" => [-12, "degree_north"],
+  "pdegree_south" => [-12, "degree_south"],
+  "pdegree_west" => [-12, "degree_west"],
+  "pdegrees_east" => [-12, "degrees_east"],
+  "pdegrees_north" => [-12, "degrees_north"],
+  "pdegrees_south" => [-12, "degrees_south"],
+  "pdegrees_west" => [-12, "degrees_west"],  "pdyn" => [-12, "dyn"],
+  "pentads" => [0, "pentad"],  "perg" => [-12, "erg"],
+  "petaCelsius" => [15, "Celsius"],
+  "petaFahrenheit" => [15, "Fahrenheit"],
+  "petaJulian_year" => [15, "Julian_year"],
+  "petaPascal" => [15, "Pascal"],  "petaacre" => [15, "acre"],
+  "petaampere" => [15, "ampere"],  "petaangstrom" => [15, "angstrom"],
+  "petaangular_degree" => [15, "angular_degree"],
+  "petaangular_minute" => [15, "angular_minute"],
+  "petaangular_second" => [15, "angular_second"],
+  "petaare" => [15, "are"],  "petaatmosphere" => [15, "atmosphere"],
+  "petacalorie" => [15, "calorie"],  "petacelsius" => [15, "celsius"],
+  "petacentigrade" => [15, "centigrade"],
+  "petacentury" => [15, "century"],  "petachain" => [15, "chain"],
+  "petacommon_year" => [15, "common_year"],
+  "petacoulomb" => [15, "coulomb"],  "petaday" => [15, "day"],
+  "petadegK" => [15, "degK"],  "petadeg_K" => [15, "deg_K"],
+  "petadegree" => [15, "degree"],  "petadegreeK" => [15, "degreeK"],
+  "petadyne" => [15, "dyne"],  "petaerg" => [15, "erg"],
+  "petafahrenheit" => [15, "fahrenheit"],  "petafarad" => [15, "farad"],
+  "petafermi" => [15, "fermi"],  "petagal" => [15, "gal"],
+  "petagauss" => [15, "gauss"],  "petagram" => [15, "gram"],
+  "petahectare" => [15, "hectare"],  "petahertz" => [15, "hertz"],
+  "petahour" => [15, "hour"],  "petainch" => [15, "inch"],
+  "petajoule" => [15, "joule"],  "petakelvin" => [15, "kelvin"],
+  "petakilogram" => [15, "kilogram"],  "petaknot" => [15, "knot"],
+  "petalitre" => [15, "litre"],  "petameter" => [15, "meter"],
+  "petametre" => [15, "metre"],  "petamicron" => [15, "micron"],
+  "petamile" => [15, "mile"],  "petamillibar" => [15, "millibar"],
+  "petaminute" => [15, "minute"],
+  "petaminute_angle" => [15, "minute_angle"],
+  "petamole" => [15, "mole"],  "petamonth" => [15, "month"],
+  "petanewton" => [15, "newton"],  "petaounce" => [15, "ounce"],
+  "petaparsec" => [15, "parsec"],  "petapascal" => [15, "pascal"],
+  "petapentad" => [15, "pentad"],  "petapoise" => [15, "poise"],
+  "petapound" => [15, "pound"],  "petaradian" => [15, "radian"],
+  "petasecond" => [15, "second"],
+  "petasecond_angle" => [15, "second_angle"],
+  "petasteradian" => [15, "steradian"],  "petastokes" => [15, "stokes"],
+  "petatesla" => [15, "tesla"],  "petaton" => [15, "ton"],
+  "petatonne" => [15, "tonne"],  "petatorr" => [15, "torr"],
+  "petavolt" => [15, "volt"],  "petawatt" => [15, "watt"],
+  "petaweber" => [15, "weber"],  "petayard" => [15, "yard"],
+  "petayd" => [15, "yd"],  "petayear" => [15, "year"],
+  "pforce" => [-12, "force"],  "pg" => [-12, "g"],
+  "pgravity" => [-12, "gravity"],  "ph" => [-12, "h"],
+  "phg" => [-12, "hg"],  "phr" => [-12, "hr"],
+  "picoCelsius" => [-12, "Celsius"],
+  "picoFahrenheit" => [-12, "Fahrenheit"],
+  "picoJulian_year" => [-12, "Julian_year"],
+  "picoPascal" => [-12, "Pascal"],  "picoacre" => [-12, "acre"],
+  "picoampere" => [-12, "ampere"],  "picoangstrom" => [-12, "angstrom"],
+  "picoangular_degree" => [-12, "angular_degree"],
+  "picoangular_minute" => [-12, "angular_minute"],
+  "picoangular_second" => [-12, "angular_second"],
+  "picoare" => [-12, "are"],  "picoatmosphere" => [-12, "atmosphere"],
+  "picocalorie" => [-12, "calorie"],  "picocelsius" => [-12, "celsius"],
+  "picocentigrade" => [-12, "centigrade"],
+  "picocentury" => [-12, "century"],  "picochain" => [-12, "chain"],
+  "picocommon_year" => [-12, "common_year"],
+  "picocoulomb" => [-12, "coulomb"],  "picoday" => [-12, "day"],
+  "picodegK" => [-12, "degK"],  "picodeg_K" => [-12, "deg_K"],
+  "picodegree" => [-12, "degree"],  "picodegreeK" => [-12, "degreeK"],
+  "picodyne" => [-12, "dyne"],  "picoerg" => [-12, "erg"],
+  "picofahrenheit" => [-12, "fahrenheit"],
+  "picofarad" => [-12, "farad"],  "picofermi" => [-12, "fermi"],
+  "picogal" => [-12, "gal"],  "picogauss" => [-12, "gauss"],
+  "picogram" => [-12, "gram"],  "picohectare" => [-12, "hectare"],
+  "picohertz" => [-12, "hertz"],  "picohour" => [-12, "hour"],
+  "picoinch" => [-12, "inch"],  "picojoule" => [-12, "joule"],
+  "picokelvin" => [-12, "kelvin"],  "picokilogram" => [-12, "kilogram"],
+  "picoknot" => [-12, "knot"],  "picolitre" => [-12, "litre"],
+  "picometer" => [-12, "meter"],  "picometre" => [-12, "metre"],
+  "picomicron" => [-12, "micron"],  "picomile" => [-12, "mile"],
+  "picomillibar" => [-12, "millibar"],  "picominute" => [-12, "minute"],
+  "picominute_angle" => [-12, "minute_angle"],
+  "picomole" => [-12, "mole"],  "picomonth" => [-12, "month"],
+  "piconewton" => [-12, "newton"],  "picoounce" => [-12, "ounce"],
+  "picoparsec" => [-12, "parsec"],  "picopascal" => [-12, "pascal"],
+  "picopentad" => [-12, "pentad"],  "picopoise" => [-12, "poise"],
+  "picopound" => [-12, "pound"],  "picoradian" => [-12, "radian"],
+  "picosecond" => [-12, "second"],
+  "picosecond_angle" => [-12, "second_angle"],
+  "picosteradian" => [-12, "steradian"],
+  "picostokes" => [-12, "stokes"],  "picotesla" => [-12, "tesla"],
+  "picoton" => [-12, "ton"],  "picotonne" => [-12, "tonne"],
+  "picotorr" => [-12, "torr"],  "picovolt" => [-12, "volt"],
+  "picowatt" => [-12, "watt"],  "picoweber" => [-12, "weber"],
+  "picoyard" => [-12, "yard"],  "picoyd" => [-12, "yd"],
+  "picoyear" => [-12, "year"],  "pin" => [-12, "in"],
+  "pkg" => [-12, "kg"],  "pkgf" => [-12, "kgf"],
+  "pkph" => [-12, "kph"],  "plb" => [-12, "lb"],  "plm" => [-12, "lm"],
+  "plx" => [-12, "lx"],  "ply" => [-12, "ly"],  "pm" => [-12, "m"],
+  "pmb" => [-12, "mb"],  "pmercury" => [-12, "mercury"],
+  "pmgal" => [-12, "mgal"],  "pmin" => [-12, "min"],
+  "pmol" => [-12, "mol"],  "pmon" => [-12, "mon"],
+  "pmph" => [-12, "mph"],  "pohm" => [-12, "ohm"],
+  "poises" => [0, "poise"],  "pounds" => [0, "pound"],
+  "poz" => [-12, "oz"],  "ppc" => [-12, "pc"],
+  "ppercent" => [-12, "percent"],  "ppermil" => [-12, "permil"],
+  "ppsi" => [-12, "psi"],  "prad" => [-12, "rad"],  "ps" => [-12, "s"],
+  "psr" => [-12, "sr"],  "pt" => [-12, "t"],  "pyr" => [-12, "yr"],
+  "radians" => [0, "radian"],  "seconds" => [0, "second"],
+  "seconds_angle" => [0, "second_angle"],
+  "steradians" => [0, "steradian"],  "stokeses" => [0, "stokes"],
+  "telaCelsius" => [12, "Celsius"],
+  "telaFahrenheit" => [12, "Fahrenheit"],
+  "telaJulian_year" => [12, "Julian_year"],
+  "telaPascal" => [12, "Pascal"],  "telaacre" => [12, "acre"],
+  "telaampere" => [12, "ampere"],  "telaangstrom" => [12, "angstrom"],
+  "telaangular_degree" => [12, "angular_degree"],
+  "telaangular_minute" => [12, "angular_minute"],
+  "telaangular_second" => [12, "angular_second"],
+  "telaare" => [12, "are"],  "telaatmosphere" => [12, "atmosphere"],
+  "telacalorie" => [12, "calorie"],  "telacelsius" => [12, "celsius"],
+  "telacentigrade" => [12, "centigrade"],
+  "telacentury" => [12, "century"],  "telachain" => [12, "chain"],
+  "telacommon_year" => [12, "common_year"],
+  "telacoulomb" => [12, "coulomb"],  "teladay" => [12, "day"],
+  "teladegK" => [12, "degK"],  "teladeg_K" => [12, "deg_K"],
+  "teladegree" => [12, "degree"],  "teladegreeK" => [12, "degreeK"],
+  "teladyne" => [12, "dyne"],  "telaerg" => [12, "erg"],
+  "telafahrenheit" => [12, "fahrenheit"],  "telafarad" => [12, "farad"],
+  "telafermi" => [12, "fermi"],  "telagal" => [12, "gal"],
+  "telagauss" => [12, "gauss"],  "telagram" => [12, "gram"],
+  "telahectare" => [12, "hectare"],  "telahertz" => [12, "hertz"],
+  "telahour" => [12, "hour"],  "telainch" => [12, "inch"],
+  "telajoule" => [12, "joule"],  "telakelvin" => [12, "kelvin"],
+  "telakilogram" => [12, "kilogram"],  "telaknot" => [12, "knot"],
+  "telalitre" => [12, "litre"],  "telameter" => [12, "meter"],
+  "telametre" => [12, "metre"],  "telamicron" => [12, "micron"],
+  "telamile" => [12, "mile"],  "telamillibar" => [12, "millibar"],
+  "telaminute" => [12, "minute"],
+  "telaminute_angle" => [12, "minute_angle"],
+  "telamole" => [12, "mole"],  "telamonth" => [12, "month"],
+  "telanewton" => [12, "newton"],  "telaounce" => [12, "ounce"],
+  "telaparsec" => [12, "parsec"],  "telapascal" => [12, "pascal"],
+  "telapentad" => [12, "pentad"],  "telapoise" => [12, "poise"],
+  "telapound" => [12, "pound"],  "telaradian" => [12, "radian"],
+  "telasecond" => [12, "second"],
+  "telasecond_angle" => [12, "second_angle"],
+  "telasteradian" => [12, "steradian"],  "telastokes" => [12, "stokes"],
+  "telatesla" => [12, "tesla"],  "telaton" => [12, "ton"],
+  "telatonne" => [12, "tonne"],  "telatorr" => [12, "torr"],
+  "telavolt" => [12, "volt"],  "telawatt" => [12, "watt"],
+  "telaweber" => [12, "weber"],  "telayard" => [12, "yard"],
+  "telayd" => [12, "yd"],  "telayear" => [12, "year"],
+  "teslas" => [0, "tesla"],  "tonnes" => [0, "tonne"],
+  "tons" => [0, "ton"],  "torrs" => [0, "torr"],  "u%" => [-6, "%"],
+  "uA" => [-6, "A"],  "uAu" => [-6, "Au"],  "uBq" => [-6, "Bq"],
+  "uC" => [-6, "C"],  "uF" => [-6, "F"],  "uG" => [-6, "G"],
+  "uGal" => [-6, "Gal"],  "uGy" => [-6, "Gy"],  "uH" => [-6, "H"],
+  "uHg" => [-6, "Hg"],  "uHz" => [-6, "Hz"],  "uJ" => [-6, "J"],
+  "uK" => [-6, "K"],  "uL" => [-6, "L"],  "uN" => [-6, "N"],
+  "uP" => [-6, "P"],  "uPa" => [-6, "Pa"],  "uS" => [-6, "S"],
+  "uSt" => [-6, "St"],  "uSv" => [-6, "Sv"],  "uT" => [-6, "T"],
+  "uV" => [-6, "V"],  "uW" => [-6, "W"],  "uWb" => [-6, "Wb"],
+  "ua" => [-6, "a"],  "uac" => [-6, "ac"],  "uatm" => [-6, "atm"],
+  "ubar" => [-6, "bar"],  "ucal" => [-6, "cal"],
+  "uconventional_mercury" => [-6, "conventional_mercury"],
+  "ud" => [-6, "d"],  "udegC" => [-6, "degC"],  "udegF" => [-6, "degF"],
+  "udeg_C" => [-6, "deg_C"],  "udeg_F" => [-6, "deg_F"],
+  "udegreeC" => [-6, "degreeC"],  "udegreeF" => [-6, "degreeF"],
+  "udegree_C" => [-6, "degree_C"],  "udegree_E" => [-6, "degree_E"],
+  "udegree_F" => [-6, "degree_F"],  "udegree_N" => [-6, "degree_N"],
+  "udegree_R" => [-6, "degree_R"],  "udegree_S" => [-6, "degree_S"],
+  "udegree_W" => [-6, "degree_W"],  "udegree_c" => [-6, "degree_c"],
+  "udegree_east" => [-6, "degree_east"],
+  "udegree_f" => [-6, "degree_f"],
+  "udegree_north" => [-6, "degree_north"],
+  "udegree_south" => [-6, "degree_south"],
+  "udegree_west" => [-6, "degree_west"],
+  "udegrees_east" => [-6, "degrees_east"],
+  "udegrees_north" => [-6, "degrees_north"],
+  "udegrees_south" => [-6, "degrees_south"],
+  "udegrees_west" => [-6, "degrees_west"],  "udyn" => [-6, "dyn"],
+  "uerg" => [-6, "erg"],  "uforce" => [-6, "force"],  "ug" => [-6, "g"],
+  "ugravity" => [-6, "gravity"],  "uh" => [-6, "h"],
+  "uhg" => [-6, "hg"],  "uhr" => [-6, "hr"],  "uin" => [-6, "in"],
+  "ukg" => [-6, "kg"],  "ukgf" => [-6, "kgf"],  "ukph" => [-6, "kph"],
+  "ulb" => [-6, "lb"],  "ulm" => [-6, "lm"],  "ulx" => [-6, "lx"],
+  "uly" => [-6, "ly"],  "um" => [-6, "m"],  "umb" => [-6, "mb"],
+  "umercury" => [-6, "mercury"],  "umgal" => [-6, "mgal"],
+  "umin" => [-6, "min"],  "umol" => [-6, "mol"],  "umon" => [-6, "mon"],
+  "umph" => [-6, "mph"],  "uohm" => [-6, "ohm"],  "uoz" => [-6, "oz"],
+  "upc" => [-6, "pc"],  "upercent" => [-6, "percent"],
+  "upermil" => [-6, "permil"],  "upsi" => [-6, "psi"],
+  "urad" => [-6, "rad"],  "us" => [-6, "s"],  "usr" => [-6, "sr"],
+  "ut" => [-6, "t"],  "uyr" => [-6, "yr"],  "volts" => [0, "volt"],
+  "watts" => [0, "watt"],  "webers" => [0, "weber"],
+  "yards" => [0, "yard"],  "yds" => [0, "yd"],  "years" => [0, "year"],
+}
+UPLURALS = {
+  "Celsiuses" => "Celsius",  "Fahrenheits" => "Fahrenheit",
+  "Julians_year" => "Julian_year",  "Pascals" => "Pascal",
+  "acres" => "acre",  "amperes" => "ampere",  "angstroms" => "angstrom",
+  "angulars_degree" => "angular_degree",
+  "angulars_minute" => "angular_minute",
+  "angulars_second" => "angular_second",  "ares" => "are",
+  "atmospheres" => "atmosphere",  "calories" => "calorie",
+  "celsiuses" => "celsius",  "centigrades" => "centigrade",
+  "centuries" => "century",  "chains" => "chain",
+  "commons_year" => "common_year",  "coulombs" => "coulomb",
+  "days" => "day",  "degKs" => "degK",  "degreeKs" => "degreeK",
+  "degrees" => "degree",  "degs_K" => "deg_K",  "dynes" => "dyne",
+  "ergs" => "erg",  "fahrenheits" => "fahrenheit",  "farads" => "farad",
+  "fermis" => "fermi",  "gals" => "gal",  "gausses" => "gauss",
+  "grams" => "gram",  "hectares" => "hectare",  "hertzes" => "hertz",
+  "hours" => "hour",  "inchs" => "inch",  "joules" => "joule",
+  "kelvins" => "kelvin",  "kilograms" => "kilogram",  "knots" => "knot",
+  "litres" => "litre",  "meters" => "meter",  "metres" => "metre",
+  "microns" => "micron",  "miles" => "mile",  "millibars" => "millibar",
+  "minutes" => "minute",  "minutes_angle" => "minute_angle",
+  "moles" => "mole",  "months" => "month",  "newtons" => "newton",
+  "ounces" => "ounce",  "parsecs" => "parsec",  "pascals" => "pascal",
+  "pentads" => "pentad",  "poises" => "poise",  "pounds" => "pound",
+  "radians" => "radian",  "seconds" => "second",
+  "seconds_angle" => "second_angle",  "steradians" => "steradian",
+  "stokeses" => "stokes",  "teslas" => "tesla",  "tonnes" => "tonne",
+  "tons" => "ton",  "torrs" => "torr",  "volts" => "volt",
+  "watts" => "watt",  "webers" => "weber",  "yards" => "yard",
+  "yds" => "yd",  "years" => "year",
+}
+end
+class NumberNode < TerminalNode
+
+    def initialize(arg)
+	raise TypeError unless Numeric === arg
+	@a = arg
+    end
+
+    UNITY = NumberNode.new(1)
+    ZERO = NumberNode.new(0)
+
+    def to_s
+      if @a == @a.to_i
+        sprintf("%d", at a)
+      else
+        String(@a)
+      end
+    end
+
+    attr_reader :a
+
+    alias :value :a
+    alias :factor :a
+
+    def == (other)
+      case other
+      when NumberNode
+	@a == other.a
+      else
+	false
+      end
+    end
+
+    def add_eval(another)
+	raise TypeError unless NumberNode === another
+	NumberNode.new(@a + another.value)
+    end
+
+    def mul_eval(another)
+	case another
+	when NumberNode then NumberNode.new(@a * another.a)
+	when PowNode
+	    raise TypeError unless NumberNode === another.lhs
+	    raise TypeError unless NumberNode === another.rhs
+	    NumberNode.new(@a * Units::pow_f(another.lhs.value, another.rhs.value))
+	else raise TypeError
+	end
+    end
+
+    def name; "1"; end
+
+    def power;  UNITY;  end
+
+end
+class XDate
+
+    def initialize(year, month, day)
+	@year, @month, @day = year.to_i, month.to_i, day.to_i
+    end
+
+    attr_reader :year, :month, :day
+
+    def to_s
+	format('%04d-%02d-%02d', @year, @month, @day)
+    end
+
+    alias :inspect :to_s
+
+    def to_time
+	Time.gm(@year, @month, @day)
+    end
+
+    def to_date
+	Date.new(@year, @month, @day)
+    end
+
+    def -(other)
+	case other
+	when XDate
+	    (to_date - other.to_date)
+	when Time
+	    to_time - other
+	when Date
+            (to_date - other.to_date)
+	else
+	    to_date - other
+	end
+    end
+
+    def +(other)
+	t = to_date + other
+	self.class.new(t.year, t.month, t.mday)
+    end
+
+end
+
+class TimeNode < TerminalNode
+
+    def initialize(date, time, zone)
+	@date, @time, @zone = date, time, zone
+	if :now === @date then
+	    now = Time.now.utc
+	    @date = XDate.new(now.year, now.month, now.day)
+	    @time = ((now.hour * 60 + now.min) * 60 + Float(now.sec))
+	else
+	    qdays = (@time / 86400).floor
+	    if not qdays.zero?
+	        @date += qdays
+	        @time -= (qdays * 86400)
+	    end
+	end
+	raise TypeError unless XDate === @date
+	@time = 0.0 unless @time
+	raise TypeError unless Float === @time
+	@zone = 0 unless @zone
+	raise TypeError unless Integer === @zone
+    end
+
+    attr_reader :date, :time, :zone
+
+    def to_s
+	hr = @time.floor / 3600
+	mi = (@time.floor / 60) % 60
+	sc = @time % 60
+	tzm = @zone.abs
+	tzh = tzm / 60
+	tzm %= 60
+	tzh = -tzh if @zone < 0
+	format("%sT%02d:%02d:%05.2f %+03d:%02d", \
+	    @date.to_s, hr, mi, sc, tzh, tzm)
+    end
+
+    def self::pentad(d)
+	(d > 25) ? 5 : ((d - 1) / 5)
+    end
+
+    def add_time(increment)
+	inc = increment.reduce5
+	case inc.name
+	when 's'
+	    t2 = @time + inc.factor
+	    d2 = @date + (t2 / 86400)
+	    t2 = t2 % 86400
+	    self.class.new(d2, t2, @zone)
+	when 'pentad'
+	    ifac = Integer(inc.factor)
+	    ipen = ifac % 6
+	    imon = ifac / 6
+	    spen = self.class.pentad(@date.day)
+	    smon = @date.month + imon + spen / 6
+	    spen = spen % 6
+	    sday = spen * 5 + (@date.day - 1) % 5 + 1
+	    syear = @date.year + (smon - 1) / 12
+	    smon = (smon - 1) % 12 + 1
+	    sdate = XDate.new(syear, smon, sday)
+	    self.class.new(sdate, @time, @zone)
+	else
+	    raise "bad time unit '#{inc.name}'"
+	end
+    end
+
+    def utcsod
+	@time - @zone * 60
+    end
+
+    def div_time(units)
+	base = units.ref
+	inc = units.deref.reduce5
+	begin
+	    incname = inc.name
+	rescue Exception
+	    incname = "(undefined)"
+	end
+	case incname
+	when 's'
+	    dif = (@date - base.date) * 86400 + (utcsod - base.utcsod)
+	    dif / inc.factor
+	when 'pentad'
+	    dif = (@date.year - base.date.year) * 72
+	    dif += (@date.month - base.date.month) * 6
+	    dif += self.class.pentad(@date.day)
+	    dif -= self.class.pentad(base.date.day)
+	    dif = Float(dif) if dif % inc.factor != 0
+	    dif / inc.factor
+	else
+	    raise "bad time unit '#{incname}'"
+	end
+    end
+
+end
+class PowNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+	raise TypeError unless NumberNode === @rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	case lhs
+	when /\d$/, /[\d\.]/
+	    lhs = "(#{lhs})"
+	end
+	rhs = @rhs.to_s
+        if rhs == '1'
+	    lhs
+	else
+	    rhs = "^(#{rhs})" if (/\./ =~ rhs)
+	    lhs + rhs
+	end
+    end
+
+    attr_reader :lhs, :rhs
+    alias :power :rhs
+
+    def pow_eval(other)
+	case other
+	when NumberNode
+	    PowNode.new(@lhs, @rhs.mul_eval(other))
+	else
+	    super(other)
+	end
+    end
+
+    def flatten2
+	x = @lhs.flatten2
+	case x
+	when NumberNode
+	    a = @lhs.pow_eval(@rhs)
+	when TerminalNode
+	    a = self
+	when PowNode
+	    a = PowNode.new(x.lhs, x.rhs.mul_eval(@rhs))
+	when MulNode, MultiNode
+	    a = MultiNode.new()
+	    for gc in x
+		a.append(gc.pow_eval(@rhs))
+	    end
+	else
+	    raise "internal error"
+	end
+	return a
+    end
+
+    def name
+	case @lhs
+	when NumberNode, NameNode
+	    @lhs.name
+	else
+	    raise "internal error"
+	end
+    end
+
+    def value
+	case @lhs
+	when NumberNode
+	    Units::pow_f(@lhs.value, @rhs.value)
+	else
+	    raise(format('%s#value: internal error', self.class.to_s))
+	end
+    end
+
+    def mul_eval(another)
+	raise "internal error (#{name}, #{another.name})" if name != another.name
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value) * another.value)
+	else
+	    self.class.new(@lhs, @rhs.add_eval(another.power))
+	end
+    end
+
+    def sort
+	case @lhs
+	when NumberNode
+	    NumberNode.new(Units::pow_f(@lhs.value, @rhs.value))
+	else
+	    self
+	end
+    end
+
+    def factor
+	Units::pow_f(@lhs.factor, @rhs.value)
+    end
+
+end
+
+module Kakezan
+
+    def flatten2
+	r = MultiNode.new()
+	each do |child|
+	    case child
+	    when MultiNode
+		r.append child
+	    when MulNode
+		r.append child.flatten2
+	    when ContainerNode
+		r.append child.flatten2
+	    else
+		r.append child
+	    end 
+	end
+	r
+    end
+
+    def name
+	n = nil
+	for c in @children
+	    next if NumberNode === c
+	    na = c.name
+	    if n.nil?
+		n = na
+	    else
+		raise "multiple names found" if na != n
+	    end
+	end
+	n = "1" if n.nil?
+	n
+    end
+
+    def factor
+	f = 1
+	for c in @children
+	    f *= c.factor
+	end
+	f
+    end
+
+end
+
+class MulNode < ContainerNode
+
+    include BinaryNode
+    include Kakezan
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    def to_s
+	lhs = @lhs.to_s
+	rhs = @rhs.to_s
+	if (/\d$/ =~ lhs && /^\w/ =~ rhs) then
+	    "#{lhs} #{rhs}"
+	else
+	    "#{lhs}.#{rhs}"
+	end
+    end
+
+end
+
+class MultiNode < ContainerNode
+
+    include Kakezan
+
+    def initialize(*children)
+	@children = children
+	for c in @children
+	    raise "# MultiNode.new(#{children.inspect})" unless Node === c
+	end
+    end
+
+    def to_s
+	s = @children.join(';')
+	s.gsub(/\d;\w/) { |dsw| dsw.sub(/;/, ' ') }.gsub(/;/, '.')
+    end
+
+    def each
+	@children.each {|child| yield child }
+    end
+
+    attr_reader :children
+    
+    def append(other)
+	case other
+	when MultiNode
+	    @children += other.children
+	else
+	    @children.push other
+	end
+    end
+
+    def sort
+	table = {}
+	for child in self
+	    name = child.name
+	    if (table.include?(name)) then
+		table[name] = table[name].mul_eval(child)
+	    else
+		table[name] = child
+	    end
+	end
+	list = []
+	for name in table.keys.sort
+	    candi = table[name]
+	    if PowNode === candi and NumberNode === candi.lhs then
+		v = candi.value
+		list.push NumberNode.new(v) unless v == 1
+		next
+	    end
+	    next if candi.power.value == 0
+	    list.push candi
+	end
+        if list.length > 1
+	  list.delete(NumberNode::UNITY)
+	end
+	self.class.new(*list)
+    end
+
+    def collect_hash(stopper, op)
+	list = []
+	for child in self
+	    list.push(child.send(op, stopper))
+	end
+	self.class.new(*list).flatten2
+    end
+
+    def expand(stopper)
+	collect_hash(stopper, :expand)
+    end
+
+    def unalias(stopper)
+	collect_hash(stopper, :unalias)
+    end
+
+    def foldnumber(stopper)
+	collect_hash(stopper, :foldnumber)
+    end
+
+    def value
+	raise "this is dimensional units" if (@children.size > 1)
+	@children.first ? @children.first.value : NumberNode::UNITY.value
+    end
+
+end
+class ShiftNode < ContainerNode
+
+    include BinaryNode
+
+    def initialize(lhs, rhs)
+	@lhs, @rhs = lhs, rhs
+    end
+
+    attr_reader :lhs, :rhs
+    alias :ref :rhs
+
+    def to_s
+	"(#{@lhs.to_s} @ #{@rhs.to_s})"
+    end
+
+    def trim2;  @lhs;  end
+    def trim
+      	self.class.new(@lhs.trim, @rhs.trim2)
+    end
+
+    def flatten2;  @lhs;  end
+    def flatten
+	lf = @lhs.flatten
+	case lf
+	when ShiftNode
+	    rf = lf.rhs.add_eval(@rhs)
+	    self.class.new(lf.lhs, rf)
+	else
+	    self.class.new(lf, @rhs.flatten)
+	end
+    end
+
+    def sort
+	self.class.new(@lhs.sort, @rhs.sort)
+    end
+
+    def ref
+	case @lhs
+	when ShiftNode
+	    @lhs.ref.add_eval(@rhs)
+	else
+	    @rhs
+	end
+    end
+
+    def deref
+	case @lhs
+	when ShiftNode
+	    @lhs.deref
+	else
+	    @lhs
+	end
+    end
+
+    def name
+	@lhs.name
+    end
+
+    def factor
+	@lhs.factor
+    end
+
+end
+def initialize string
+    case string
+    when String
+        @string, @ptree = string, nil
+    when Node
+        @string, @ptree = nil, string
+    else
+        @string, @ptree = String(string), nil
+    end
+    @copy = @lexstat = nil
+end
+
+#
+# === LEXICAL ANALYZER ===
+#
+
+def rewind
+    @copy = @string.dup.strip
+    @lexstat = nil
+end
+
+RE_SPACE	= '([ \t])'
+RE_INTEGER	= '([-+]?\d+)'
+RE_EXP		= '([eE][-+]?[0-9]+)'
+RE_REAL		= "([-+]?[0-9]*(\\.[0-9]*#{RE_EXP}?|#{RE_EXP}))"
+RE_YEAR		= "([-+]?[0-9]{1,4})"
+RE_MONTH	= "(0?[1-9]|1[0-2])"
+RE_DAY		= "([12][0-9]|30|31|0?[1-9])"
+RE_HOUR		= "(2[0-3]|[0-1]?[0-9])"
+RE_MINUTE	= "([0-5]?[0-9])"
+RE_SECOND	= "((#{RE_MINUTE}|60)(\\.[0-9]*)?)"
+RE_NAME		= "(%|[a-zA-Z][a-zA-Z_]*([0-9]+[a-zA-Z_]+)*)"
+
+RE_DATE		= "#{RE_YEAR}-#{RE_MONTH}-#{RE_DAY}"
+RE_TIME		= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9])(:#{RE_SECOND})?)?"
+RE_HandM	= "#{RE_HOUR}((:[0-5]?[0-9]|[0-5][0-9]))?"
+
+def next_token
+
+    # decomment
+    @copy.sub!(/^#.*/, '');
+
+    if @copy.sub!(%r{^\s*(\))}, '') then
+	@lexstat = nil
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^\s*(\()\s*}, '') then
+	return [$1, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(@)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(after|from|since|ref)[ \t]+}i, '') then
+	@lexstat = :SHIFT_SEEN
+	return [:SHIFT, $1]
+    end
+
+    if @copy.sub!(%r{^[ \t]*(/)[ \t]*}, '') \
+    or @copy.sub!(%r{^[ \t]+(per)[ \t]+}i, '') then
+	@lexstat = nil
+	return [:DIVIDE, $1]
+    end
+
+    if @copy.sub!(%r{^(\^|\*\*)}, '') then
+	@lexstat = nil
+	return [:EXPONENT, $1]
+    end
+
+    if @copy.sub!(%r{^(\.|\*|[ \t]+)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_DATE}T?[ \t]*}, '') then
+	y, m, d = $1, $2, $3
+	@lexstat = :DATE_SEEN
+	return [:DATE, XDate.new(y.to_i, m.to_i, d.to_i)]
+    end
+
+    if :SHIFT_SEEN === @lexstat \
+    and @copy.sub!(%r{^now[ \t]*}, '') then
+	@lexstat = nil
+	return [:DATE, :now]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^#{RE_TIME}[ \t]*}, '') then
+	h, m, s = $1, $3, $5
+        m = m.sub(/:/,'') if m
+	s = 0 if s.nil?
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60 + Float(s))]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-2][0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :DATE_SEEN === @lexstat \
+    and @copy.sub!(%r{^([0-9])([0-5][0-9])[ \t]*}, '') then
+	h, m = $1, $2
+	@lexstat = :TIME_SEEN
+	return [:TIME, ((h.to_i * 60 + m.to_i) * 60.0)]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^UTC[ \t]*}, '') then
+	@lexstat = nil
+	return [:ZONE, 0]
+    end
+
+    if :TIME_SEEN === @lexstat \
+    and @copy.sub!(%r{^([-+]?)#{RE_HandM}[ \t]*}, '') then
+	sgn, h, m = $1, $2, $4
+        m = m.sub(/:/,'') if m
+	@lexstat = nil
+	h = h.to_i
+	h = -h if sgn == "-"
+	m = m.to_i
+	m = -m if sgn == "-"
+	return [:ZONE, ((h * 60) + m)]
+    end
+
+    if @copy.sub!(%r{^#{RE_NAME}}, '') then
+	@lexstat = nil
+	return [:NAME, $1]
+    end
+
+    if @copy.sub!(%r{^#{RE_REAL}}, '') then
+	@lexstat = nil
+	return [:REAL, $1.to_f]
+    end
+
+    if @copy.sub!(%r{^#{RE_INTEGER}}, '') then
+	@lexstat = nil
+	return [:INT, $1.to_i]
+    end
+
+    if @copy.sub!(%r{^(-)}, '') then
+	@lexstat = nil
+	return [:MULTIPLY, $1]
+    end
+
+    if @copy.sub!(%r{^(.)}, '') then
+	return [$1, $1]
+    end
+
+    return [false, false]
+
+end
+
+#
+# === USER LEVEL METHODS ===
+#
+
+def tokens
+    rewind
+    x = []
+    while (t = next_token).first
+	x.push t
+    end
+    x
+end
+
+def do_parse2
+    rewind
+    return NumberNode.new(1) if @string.nil? or @string.empty?
+    pa = do_parse
+    pa ? pa : ErrorNode.new(@string)
+end
+
+def ptree
+    @ptree = do_parse2 if not @ptree
+    @ptree
+end
+
+def dup
+    @string ? self.class.new(@string) : self.class.new(@ptree)
+end
+
+def parse
+    dup.parse!
+end
+
+def parse!
+    @ptree = do_parse2 if not @ptree
+    self
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+=begin
+--- reduce0
+    just do nothing.
+=end
+
+def reduce0
+    self
+end
+
+=begin
+--- reduce1
+    removes unnecessary parentheses.
+=end
+
+def reduce1
+    @string = ptree.to_s
+    self
+end
+
+=begin
+--- reduce2
+    removes shift operator within multiplication/division/exponent
+=end
+
+def reduce2
+    @ptree = ptree.reduce2
+    @string = nil
+    self
+end
+
+=begin
+--- reduce3
+    flattens expression and collects all factors
+=end
+
+def reduce3
+    @ptree = ptree.reduce3
+    @string = nil
+    self
+end
+
+=begin
+--- reduce4
+    collects terms with the same name
+=end
+
+def reduce4
+    @ptree = ptree.reduce4
+    @string = nil
+    self
+end
+
+=begin
+--- reduce5
+    expands all terms recursively
+=end
+
+def reduce5
+    @ptree = ptree.reduce5
+    @string = nil
+    self
+end
+
+attr_reader :string
+
+def to_s
+    @string = @ptree.to_s if @string.nil?
+    @string
+end
+
+def inspect
+    if @ptree.nil? then
+	"Units{#{@string}}"
+    else
+	"Units[#{@ptree.inspect}]".gsub(/Units::/, '').gsub(/Node\[/, '[')
+    end
+end
+
+def self::[](string)
+    new(string)
+end
+
+def self::parse(string)
+    new(string).parse!
+end
+
+def eval(x = 0)
+    r5 = ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add(x, r5.name)
+    else
+	fac = NumberNode.new(x + r.value)
+	self.class.new(MulNode.new(fac, r5.deref))
+    end
+end
+
+def convert(numeric, to_units)
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    r5 = dup.ptree.reduce5
+    case r = r5.ref
+    when TimeNode
+	r.add_time(r5.deref.mul(numeric)).div_time(to_units.ptree)
+    else
+	shift1 = r.value
+	numeric = shift1 + numeric if shift1 != 0
+	fact = r5.divide(tp = to_units.dup.ptree).reduce5.value
+	numeric *= fact if fact != 1
+	shift2 = tp.reduce5.ref.value
+	numeric = numeric - shift2 if shift2 != 0
+	numeric
+    end
+end
+
+def factor_and_offset(to_units)
+    # To convert a numeric from self to to_units: 
+    # scale_factor * numeric + add_offset
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    add_offset = convert(0, to_units)
+    scale_factor = convert(1, to_units) - add_offset
+    [ scale_factor, add_offset ]
+end
+
+def convert2(val, to_units)
+    # Like Units#convert, but applicable to any Numeric-like objects.
+    # Returns the original value if the units are incompatible.
+    to_units = Units.new( to_units ) if to_units.is_a?(String)
+    if ( self == to_units )
+        val
+    elsif ( self =~ to_units )
+        if Numeric===val
+            convert( val, to_units )
+        else
+            factor, offset = factor_and_offset( to_units )
+            val*factor + offset
+        end
+    else
+      unless $VERBOSE.nil?
+	$stderr.print( "*WARNING*: " +
+                 "incompatible units: #{self.to_s} and #{to_units.to_s}\n")
+        caller(0).each{|c| $stderr.print "\t* ",c,"\n"}
+      end        
+      val
+    end
+end
+
+@@reduce = :reduce4
+
+def self::reduce_level
+    @@reduce.to_s[-1]
+end
+
+def self::reduce_level=(n)
+    @@reduce = case n
+    when 1 then :reduce1
+    when 2 then :reduce2
+    when 3 then :reduce3
+    when 4 then :reduce4
+    else :reduce5
+    end
+end
+
+def binop(op, other)
+    case other
+    when Numeric
+	other = NumberNode.new(other)
+    when Units
+	other = other.ptree
+    end
+    q = self.ptree.send(op, other).send(@@reduce)
+    Units.new(q)
+end
+
+def *(other)
+    binop(:mul, other)
+end
+
+def **(other)
+    binop(:pow, other)
+end
+
+def /(other)
+    binop(:divide, other)
+end
+
+def ^(other)
+    binop(:shift, other)
+end
+
+def ==(other)
+    case other
+    when self.class
+	dup.reduce5.to_s == other.dup.reduce5.to_s
+    else
+	false
+    end
+end
+
+#def === (other)
+#    reduce5.ptree.deref.to_s == other.reduce5.ptree.deref.to_s
+#end
+
+alias === ==
+
+#def === (other)
+#  # returns true if other is within a factor and/or offset of difference.
+#  case other
+#  when self.class
+#    (self/other).reduce5.ptree.children.each do |child|
+#      return false if !( NumberNode === child )
+#    end
+#    true
+#  else
+#    false
+#  end
+#end
+
+
+def =~(other)
+  case other
+  when self.class
+    (self/other).reduce5.ptree.children.each{ |node|
+      return false unless NumberNode === node
+    }
+    true
+  else
+    false
+  end
+end
+
+def self::pow_f(a, b)
+    if Integer === b and b < 0 then
+	a ** b.to_f
+    else
+	a ** b
+    end
+end
+
+##### racc 1.4.5 generates ###
+
+racc_reduce_table = [
+ 0, 0, :racc_error,
+ 0, 17, :_reduce_none,
+ 1, 17, :_reduce_2,
+ 1, 17, :_reduce_3,
+ 1, 18, :_reduce_none,
+ 3, 18, :_reduce_5,
+ 3, 18, :_reduce_6,
+ 1, 19, :_reduce_none,
+ 1, 19, :_reduce_none,
+ 2, 19, :_reduce_9,
+ 3, 19, :_reduce_10,
+ 3, 19, :_reduce_11,
+ 3, 19, :_reduce_12,
+ 3, 19, :_reduce_13,
+ 1, 22, :_reduce_14,
+ 2, 22, :_reduce_15,
+ 3, 22, :_reduce_16,
+ 3, 22, :_reduce_17,
+ 1, 20, :_reduce_none,
+ 3, 20, :_reduce_19,
+ 1, 23, :_reduce_20,
+ 1, 23, :_reduce_21,
+ 1, 21, :_reduce_none,
+ 3, 21, :_reduce_23,
+ 1, 24, :_reduce_24,
+ 2, 24, :_reduce_25,
+ 3, 24, :_reduce_26 ]
+
+racc_reduce_n = 27
+
+racc_shift_n = 39
+
+racc_action_table = [
+     3,     4,    34,     4,    14,    22,    23,    36,     9,    10,
+     9,     4,    24,     5,     4,    26,    37,     4,     9,    10,
+     4,     9,    38,     5,     9,    10,    20,     9,     4,     5,
+   nil,     4,    20,   nil,   nil,     9,   nil,    24,     9,    10,
+    26,   nil,    16,     5,    17,    18,   nil,     4,    10,     4,
+   nil,     4,     5,    12,     9,    12,     9,    12,     9,     4,
+   nil,   nil,   nil,   nil,   nil,    12,     9 ]
+
+racc_action_check = [
+     0,     0,    24,    26,     6,    13,    14,    33,     0,     0,
+    26,     5,    26,     0,    20,    26,    34,    18,     5,     5,
+    12,    20,    35,     5,    18,    18,    20,    12,    16,    18,
+   nil,    17,    12,   nil,   nil,    16,   nil,    16,    17,    17,
+    16,   nil,     8,    17,     8,     8,   nil,    29,     8,    31,
+   nil,    15,     8,    29,    29,    31,    31,    15,    15,     1,
+   nil,   nil,   nil,   nil,   nil,     1,     1 ]
+
+racc_action_pointer = [
+    -1,    57,   nil,   nil,   nil,     9,     4,   nil,    38,   nil,
+   nil,   nil,    18,   -10,     6,    49,    26,    29,    15,   nil,
+    12,   nil,   nil,   nil,   -10,   nil,     1,   nil,   nil,    45,
+   nil,    47,   nil,    -8,     3,     7,   nil,   nil,   nil ]
+
+racc_action_default = [
+    -1,    -7,    -8,    -3,   -20,   -27,   -27,    -2,    -4,   -21,
+   -14,   -15,   -27,   -27,   -27,    -9,   -27,   -27,   -27,   -18,
+   -27,   -16,   -17,    39,   -24,   -22,   -27,    -5,    -6,   -10,
+   -12,   -11,   -13,   -27,   -25,   -27,   -19,   -26,   -23 ]
+
+racc_goto_table = [
+     2,    15,     7,    28,    21,     2,     6,    13,    27,   nil,
+    29,    31,    19,    35,   nil,   nil,    19,    30,    32,   nil,
+    19,   nil,   nil,   nil,   nil,   nil,    19 ]
+
+racc_goto_check = [
+     7,     6,     2,     5,     4,     7,     1,     2,     4,   nil,
+     6,     6,     7,     5,   nil,   nil,     7,     7,     7,   nil,
+     7,   nil,   nil,   nil,   nil,   nil,     7 ]
+
+racc_goto_pointer = [
+   nil,     6,     2,   nil,    -8,   -13,    -7,     0,   nil ]
+
+racc_goto_default = [
+   nil,   nil,   nil,     8,    33,   nil,     1,    11,    25 ]
+
+racc_token_table = {
+ false => 0,
+ Object.new => 1,
+ :INT => 2,
+ :ERR => 3,
+ :SHIFT => 4,
+ :SPACE => 5,
+ :MULTIPLY => 6,
+ :DIVIDE => 7,
+ :EXPONENT => 8,
+ :REAL => 9,
+ :NAME => 10,
+ :DATE => 11,
+ :TIME => 12,
+ :ZONE => 13,
+ "(" => 14,
+ ")" => 15 }
+
+racc_use_result_var = false
+
+racc_nt_base = 16
+
+Racc_arg = [
+ racc_action_table,
+ racc_action_check,
+ racc_action_default,
+ racc_action_pointer,
+ racc_goto_table,
+ racc_goto_check,
+ racc_goto_default,
+ racc_goto_pointer,
+ racc_nt_base,
+ racc_reduce_table,
+ racc_token_table,
+ racc_shift_n,
+ racc_reduce_n,
+ racc_use_result_var ]
+
+Racc_token_to_s_table = [
+'$end',
+'error',
+'INT',
+'ERR',
+'SHIFT',
+'SPACE',
+'MULTIPLY',
+'DIVIDE',
+'EXPONENT',
+'REAL',
+'NAME',
+'DATE',
+'TIME',
+'ZONE',
+'"("',
+'")"',
+'$start',
+'unit_spec',
+'origin_exp',
+'unit_exp',
+'value_exp',
+'timestamp',
+'power_exp',
+'number_exp',
+'time_exp']
+
+Racc_debug_parser = false
+
+##### racc system variables end #####
+
+ # reduce 0 omitted
+
+ # reduce 1 omitted
+
+  def _reduce_2( val, _values)
+ yyaccept;
+  end
+
+  def _reduce_3( val, _values)
+ yyerrok
+  end
+
+ # reduce 4 omitted
+
+  def _reduce_5( val, _values)
+ val[0].shift(val[2])
+  end
+
+  def _reduce_6( val, _values)
+ val[0].shift(val[2])
+  end
+
+ # reduce 7 omitted
+
+ # reduce 8 omitted
+
+  def _reduce_9( val, _values)
+ val[0].mul(val[1])
+  end
+
+  def _reduce_10( val, _values)
+ val[0].mul(val[2])
+  end
+
+  def _reduce_11( val, _values)
+ val[0].divide(val[2])
+  end
+
+  def _reduce_12( val, _values)
+ val[0].mul(val[2])
+  end
+
+  def _reduce_13( val, _values)
+ val[0].divide(val[2])
+  end
+
+  def _reduce_14( val, _values)
+ NameNode.new(val[0])
+  end
+
+  def _reduce_15( val, _values)
+ val[0].pow(val[1])
+  end
+
+  def _reduce_16( val, _values)
+ val[0].pow(val[2])
+  end
+
+  def _reduce_17( val, _values)
+ val[1]
+  end
+
+ # reduce 18 omitted
+
+  def _reduce_19( val, _values)
+ val[1]
+  end
+
+  def _reduce_20( val, _values)
+ NumberNode.new(val[0])
+  end
+
+  def _reduce_21( val, _values)
+ NumberNode.new(val[0])
+  end
+
+ # reduce 22 omitted
+
+  def _reduce_23( val, _values)
+ val[1]
+  end
+
+  def _reduce_24( val, _values)
+ TimeNode.new(val[0], 0.0, 0)
+  end
+
+  def _reduce_25( val, _values)
+ TimeNode.new(val[0], val[1], 0)
+  end
+
+  def _reduce_26( val, _values)
+ TimeNode.new(val[0], val[1], val[2])
+  end
+
+ def _reduce_none( val, _values)
+  val[0]
+ end
+
+end   # class Units
+end   # module NumRu
+
+####################
+if $0 == __FILE__
+  include NumRu
+  
+  def assert(test, seikai)
+  	raise "#{test.inspect} != #{seikai.inspect}" if test != seikai
+  	puts "ok #{seikai.inspect}"
+  end
+  
+  puts "=== reduce1 ==="
+  
+  assert Units.new('').reduce1.to_s, ""
+  assert Units.new('m').reduce1.to_s, "m"
+  assert Units.new('3').reduce1.to_s, "3"
+  assert Units.new('3.14').reduce1.to_s, "3.14"
+  assert Units.new('m2').reduce1.to_s, "m2"
+  assert Units.new('m.s').reduce1.to_s, "m.s"
+  assert Units.new('m/s').reduce1.to_s, "m.s-1"
+  assert Units.new('kg.m/s2').reduce1.to_s, "kg.m.(s2)-1"
+  assert Units.new('s @ 2003-11-29').reduce1.to_s,
+  	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+  assert Units.new('s @ 2003-11-29T11:24').reduce1.to_s,
+  	"(s @ 2003-11-29T11:24:00.00 +00:00)"
+  assert Units.new('s @ 2003-11-29T11:24:11 -09:00').reduce1.to_s,
+  	"(s @ 2003-11-29T11:24:11.00 -09:00)"
+  
+  assert Units.new('100').reduce1.to_s, "100"
+  assert Units.new('(10)^2').reduce1.to_s, "(10)2"
+  assert Units.new('(10)^2/100').reduce1.to_s, "(10)2.(100)-1"
+  
+  puts "=== reduce2 ==="
+  
+  assert Units.new('s @ 2003-11-29').reduce2.to_s,
+  	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+  assert Units.new('m/(s @ 2003-11-29)').reduce2.to_s, "m.s-1"
+  assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce2.to_s, "m.(K.s)-1"
+  
+  assert Units.new('(10)^2/100').reduce2.to_s, "(10)2.(100)-1"
+  
+  puts "=== reduce3 ==="
+  
+  assert Units::MultiNode.new(Units::NameNode.new('a'),  \
+  	Units::NumberNode.new(1), \
+  	Units::NameNode.new('b')).to_s, 'a.1 b'
+  
+  assert Units.new('kg').reduce3.inspect, "Units[Name[kg]]"
+  assert Units.new('kg.m').reduce3.inspect, "Units[Multi[Name[kg], Name[m]]]"
+  assert Units.new('kg.m.s').reduce3.inspect,
+  	"Units[Multi[Name[kg], Name[m], Name[s]]]"
+  
+  assert Units.new('(m.s)^2').reduce3.inspect,
+  	"Units[Multi[Pow[Name[m], Number[2]], Pow[Name[s], Number[2]]]]"
+  assert Units.new('K @ 273.15').reduce3.inspect,
+  	"Units[Shift[Name[K], Number[273.15]]]"
+  assert Units.new('((a.b)^2)^2').reduce3.inspect,
+  	"Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]]]]"
+  assert Units.new('((a.b)^2 c4 d)^2').reduce3.inspect,
+  	"Units[Multi[Pow[Name[a], Number[4]], Pow[Name[b], Number[4]], Pow[Name[c], Number[8]], Pow[Name[d], Number[2]]]]"
+  assert Units.new('((a.b)^2 c4 d)^2').reduce3.to_s,
+  	"a4 b4 c8 d2"
+  assert Units.new('((a.b)^2 a4 b)^2').reduce3.to_s,
+  	"a4 b4 a8 b2"
+  
+  assert Units.new('s @ 2003-11-29').reduce3.to_s,
+  	"(s @ 2003-11-29T00:00:00.00 +00:00)"
+  assert Units.new('m/(s @ 2003-11-29)').reduce3.to_s, "m.s-1"
+  assert Units.new('m/((K @ 273.15) (s from 2003-11-29))').reduce3.to_s, "m.K-1 s-1"
+  
+  assert Units.new('(10)^2/100').reduce3.to_s, "(10)2.(100)-1"
+  
+  puts "=== reduce4 ==="
+  
+  assert Units.new('((a.b)^2 a4 b @ now)^2 @ 273.15').reduce4.to_s,
+  	"(a12 b6 @ 273.15)"
+  
+  assert Units.new('km2').reduce4.to_s, "km2"
+  assert Units.new('hours.hour').reduce4.to_s, "hour2"
+  assert Units.new('(10)^2').reduce4.to_s, "100"
+  assert Units.new('100/10').reduce4.to_s, "10.0"
+  assert Units.new('(10)^2/100').reduce4.to_s, "1.0"
+  
+  puts "=== reduce5 ==="
+  
+  assert Units.new('km2').reduce5.to_s, "1000000 m2"
+  assert Units.new('(10)^2/100').reduce5.to_s, "1.0"
+  
+  assert Units.new('hPa').reduce5.to_s, "100 kg.m-1 s-2"
+  assert Units.new('mb').reduce5.to_s, "100.0 kg.m-1 s-2"
+  
+  assert Units.new('hPa/mb').reduce5.to_s, "1.0"
+  
+  assert Units.new('(K @ 273.15)@ 10').reduce5.to_s, "(K @ 283.15)"
+  
+  puts "=== APPLICATIONS ==="
+  
+  assert Units.new('km @ 2').convert(3, Units.new('m @ 100')), 4900
+  assert Units.new('degree_F').convert(32, Units.new('K')).to_s, "273.15"
+  
+  u1 = Units.new('m/s')
+  u2 = Units.new('mm/s')
+  assert((u1/u2).to_s, "m.mm-1")
+  assert((u1*u2).to_s, "m.mm.s-2")
+  
+  u1 = Units.new('years since 1999-01-01 00:00').reduce4
+  u2 = Units.new('hours since 2001-01-01 00:00').reduce4
+  assert u1.convert(3, u2), 24 * 365
+  u3 = Units.new('months since 2001-01-01 00:00').reduce4
+  assert u1.convert(3, u3), 12.0
+  
+  Units.reduce_level = 3
+  assert((Units.new('hours') ** 2).to_s, "hours2")
+  Units.reduce_level = 4
+  assert((Units.new('hours') ** 2).to_s, "hour2")
+  Units.reduce_level = 5
+  assert((Units.new('hours') ** 2).to_s, "12960000 s2")
+  
+  assert(Units.new('day') =~ Units.new('s since 2002-01-01'), true)
+  assert(Units.new('m') =~ Units.new('1'), false)
+  
+  un1  = Units['day since 2000-01-01']
+  un2 = Units['s since 2000-01-01']
+  assert(un1.convert(0, un2), 0.0)
+  assert(un1.convert(1, un2), 86400.0)
+end
diff --git a/src/units.rd b/src/units.rd
new file mode 100644
index 0000000..c2b7c6f
--- /dev/null
+++ b/src/units.rd
@@ -0,0 +1,139 @@
+=begin
+=class Units
+A class of units of physical quantities.
+
+This class covers most functionality of UNIDATA's UDUNITS Library
+(http://www.unidata.ucar.edu/packages/udunits/), however, with a more 
+sophisticated handling of string expressions. 
+
+UDUNITS always decomposes units into the four base units and discards
+the original string expressions. Therefore, 'hPa' always becomes
+'100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the otehr 
+hand, this library tries to keep the original expressions as much as
+possible by default, while allowing partial to complete decompositions
+if needed.
+
+==class methods
+---Units.new(string)
+    Constructor.
+
+    ARGUMENTS
+    * string (String): string expression of the units. 
+      [factor] units; [factor] time units [since ...] (see EXAMPLES below)
+
+    RETURN VALUE
+    * a Units
+
+    EXAMPLE
+
+      units = Units.new('kg.m2/s')
+      units = Units.new('100 m')
+      units = Units.new('g/kg')
+      units = Units.new('hour since 2003-10-01 00:00:0 +0:00')
+      units = Units.new('hour since 2003-10-01')   # same as above
+      units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00')
+
+---reduce_level
+    by default returns 4.
+---reduce_level = i
+    Integer value within 1..5 is acceptable for ((|i|)).
+    After this call, ((*reduce*))((|i|)) is used in
+    ((<*>)), ((<"/">)), ((<**>)) instance methods.
+
+==instance methods
+
+---to_s
+    Returns a string expression of the units.
+
+---*(other)
+    Multiplies self with another units. 
+    Applies ((<reduce4>)) to format the string expression of the result.
+
+    ARGUMENTS
+    * other [Units]: the other units
+
+    RETURN VALUE
+    * a Units
+
+---/(other)
+    Divides self with another units.
+    Applies ((<reduce4>)) to format the string expression of the result.
+
+    ARGUMENTS
+    * other [Units]: the other units
+
+    RETURN VALUE
+    * a Units
+
+---**(pow)
+    Power.
+    Applies ((<reduce4>)) to format the string expression of the result.
+
+    ARGUMENTS
+    * pow [Integer]
+
+    RETURN VALUE
+    * a Units
+
+---==(other)
+    Judges whether the two units are the same. 
+    Comparison is done after ((<reduce5>)) operation is applied
+    to both self and other.
+    ('m/s' and 'm.s-1' will be the same, for instance.)
+
+---===(other)
+    Similar to ((<==>)), but reference date or shift value is ignored.
+
+---=~(other)
+    Similar to ((<===>)), but numerical factor is also ignored.
+    When (units1 =~ units2) is true, you may add or subtract
+    two quantities in units1 and units2.
+
+---reduce4
+    Moderately parses the string expression of the units (destructive method).
+    This method preserves string expression of atomic units,
+    but plural form and SI prefixes are normalized.
+    See also ((<reduce5>)).
+
+    RETURN VALUE
+    * self
+
+    EXAMPLE
+      Untis.new('hour/hour').reduce4.to_s
+        # => ""
+      Units.new('mm/m').reduce4.to_s
+        # => "m-1 mm"
+
+---reduce5
+    Parses and aggressively reduces
+    the string expression of the units (destructive method).
+    See also ((<reduce4>)).
+
+    RETURN VALUE
+    * self
+
+    EXAMPLE
+      Units.new('hour/hour').reduce5.to_s
+        # => "1.0"
+      Units.new('mm/m').reduce5.to_s
+        # => "0.001"
+
+---convert(numeric, to_units)
+    converts Numeric value ((|numeric|)) into new units ((|to_units|)).
+
+    EXAMPLE
+      Units.new('degree_F').convert(32, Units.new('K')).to_s
+      # => "273.15"
+
+---convert2(numeric_etc, to_units)
+    Similat to ((<convert>)), but the first argument is more flexible
+    to accept not only numerics but also NArray etc etc.
+
+    EXAMPLE
+      require "narray"
+      na = NArray[-40.0, 0.0]
+      Units.new('degree_F').convert(na, Units.new('degC'))
+      # => NArray.float(2): 
+           [ -40.0, -17.7778 ]
+
+=end
diff --git a/src/utab.rb b/src/utab.rb
new file mode 100644
index 0000000..c8be96e
--- /dev/null
+++ b/src/utab.rb
@@ -0,0 +1,1456 @@
+class NameNode
+UDEFS = {
+  "%" => "1e-2",  "Au" => "astronomical_unit",  "Bq" => "s-1",
+  "C" => "A.s",  "Celsius" => "K @ 273.15",  "F" => "C/V",
+  "Fahrenheit" => "degree_F",  "G" => "gauss",  "Gal" => "cm s-2",
+  "Gy" => "J.kg-1",  "H" => "Wb.A-1",  "Hg" => "mercury",
+  "Hz" => "1/s",  "J" => "N.m",  "Julian_year" => "365.25 day",
+  "L" => "litre",  "N" => "kg.m.s-2",  "P" => "poise",  "Pa" => "N.m-2",
+  "Pascal" => "Pa",  "S" => "A/V",  "St" => "stokes",  "Sv" => "J.kg-1",
+  "T" => "Wb.m-2",  "V" => "J/C",  "W" => "J/s",  "Wb" => "V.s",
+  "a" => "are",  "ac" => "acre",  "acre" => "10 chain2",
+  "ampere" => "A",  "angstrom" => "1.0e-10 m",
+  "angular_degree" => "degree",  "angular_minute" => "minute_angle",
+  "angular_second" => "second_angle",  "are" => "100 m2",
+  "astronomical_unit" => "1.49597870e11 m",
+  "astronomical_units" => "1.49597870e11 m",  "atm" => "atmosphere",
+  "atmosphere" => "101325 Pa",  "bar" => "1e6 dyn.cm-2",
+  "cal" => "calorie",  "calorie" => "4.18605 J",
+  "celsius" => "K @ 273.15",  "centigrade" => "K @ 273.15",
+  "century" => "100 year",  "chain" => "22 yard",
+  "common_year" => "365 day",
+  "conventional_mercury" => "gravity 13595.10 kg/m3",  "coulomb" => "C",
+  "d" => "24 hour",  "day" => "24 hour",  "degC" => "K @ 273.15",
+  "degF" => "degree_F",  "degK" => "K",  "deg_C" => "K @ 273.15",
+  "deg_F" => "degree_F",  "deg_K" => "K",  "degree" => "pi.rad/180",
+  "degreeC" => "K @ 273.15",  "degreeF" => "degree_F",
+  "degreeK" => "K",  "degree_C" => "K @ 273.15",
+  "degree_E" => "degree",  "degree_F" => "degree_R @ 459.67",
+  "degree_N" => "degree",  "degree_R" => "K / 1.8",
+  "degree_S" => "degree",  "degree_W" => "degree",
+  "degree_c" => "K @ 273.15",  "degree_east" => "degree_E",
+  "degree_f" => "degree_R @ 459.67",  "degree_north" => "degree_N",
+  "degree_south" => "degree_S",  "degree_west" => "degree_W",
+  "degrees_east" => "degree_E",  "degrees_north" => "degree_N",
+  "degrees_south" => "degree_S",  "degrees_west" => "degree_W",
+  "dyn" => "g.cm.s-2",  "dyne" => "g.cm.s-2",  "erg" => "dyn cm",
+  "fahrenheit" => "degree_F",  "farad" => "coulomb/volt",
+  "feet" => "foot",  "fermi" => "1.0e-15 m",  "foot" => "12 inch",
+  "force" => "9.80665 m.s-2",  "ft" => "foot",  "g" => "kg/1000",
+  "gal" => "cm s-2",  "gauss" => "T / 10000",  "gram" => "kg/1000",
+  "gravity" => "9.806650 meter/second2",  "h" => "60 min",
+  "hectare" => "100 are",  "hertz" => "Hz",  "hg" => "mercury",
+  "horse_power" => "75 m kilogram-force / s",  "hour" => "60 min",
+  "hr" => "60 min",  "in" => "inch",  "inch" => "2.54 cm",
+  "joule" => "J",  "kelvin" => "K",  "kgf" => "kilogram-force",
+  "kilogram" => "kg",  "knot" => "nautical_mile / hour",
+  "kph" => "km / hour",  "lb" => "pound",
+  "light_speed" => "299792458 m/s",  "light_year" => "9.46e15 m",
+  "light_years" => "9.46e15 m",  "litre" => "1.0e-3 m3",
+  "lm" => "cd.sr",  "lx" => "lm.m-2",  "ly" => "light_year",
+  "mb" => "bar / 1000",  "mercury" => "conventional_mercury",
+  "meter" => "metre",  "metre" => "m",  "mgal" => "cm s-2 / 1000",
+  "micron" => "1.0e-6 m",  "mile" => "1760 yard",
+  "millibar" => "bar / 1000",  "min" => "60 s",  "minute" => "60 s",
+  "minute_angle" => "pi.rad/180/60",  "mole" => "mol",
+  "mon" => "month",  "month" => "6 pentad",  "mph" => "mile / hour",
+  "nautical_mile" => "1852 m",  "nautical_miles" => "1852 m",
+  "newton" => "N",  "ohm" => "V/A",  "ounce" => "pound / 16",
+  "oz" => "ounce",  "parsec" => "3.0857e16 m",  "pascal" => "Pa",
+  "pc" => "parsec",  "percent" => "1e-2",  "permil" => "1e-3",
+  "pi" => "3.141592653589793238462",  "poise" => "dyn s / cm2",
+  "pound" => "453.6 g",  "psi" => "pound-force / inch2",
+  "radian" => "rad",  "second" => "s",
+  "second_angle" => "pi.rad/180/60/60",  "steradian" => "sr",
+  "stokes" => "cm2 / s",  "t" => "ton",  "tesla" => "Wb.m-2",
+  "ton" => "1000 kg",  "tonne" => "ton",  "torr" => "133.322 Pa",
+  "volt" => "V",  "watt" => "W",  "weber" => "Wb",  "yard" => "6 feet",
+  "yd" => "yard",  "year" => "12 month",  "yr" => "year",
+}
+UALIASES = {
+  "Celsiuses" => [0, "Celsius"],  "E%" => [18, "%"],  "EA" => [18, "A"],
+  "EAu" => [18, "Au"],  "EBq" => [18, "Bq"],  "EC" => [18, "C"],
+  "EF" => [18, "F"],  "EG" => [18, "G"],  "EGal" => [18, "Gal"],
+  "EGy" => [18, "Gy"],  "EH" => [18, "H"],  "EHg" => [18, "Hg"],
+  "EHz" => [18, "Hz"],  "EJ" => [18, "J"],  "EK" => [18, "K"],
+  "EL" => [18, "L"],  "EN" => [18, "N"],  "EP" => [18, "P"],
+  "EPa" => [18, "Pa"],  "ES" => [18, "S"],  "ESt" => [18, "St"],
+  "ESv" => [18, "Sv"],  "ET" => [18, "T"],  "EV" => [18, "V"],
+  "EW" => [18, "W"],  "EWb" => [18, "Wb"],  "Ea" => [18, "a"],
+  "Eac" => [18, "ac"],  "Eatm" => [18, "atm"],  "Ebar" => [18, "bar"],
+  "Ecal" => [18, "cal"],
+  "Econventional_mercury" => [18, "conventional_mercury"],
+  "Ed" => [18, "d"],  "EdegC" => [18, "degC"],  "EdegF" => [18, "degF"],
+  "Edeg_C" => [18, "deg_C"],  "Edeg_F" => [18, "deg_F"],
+  "EdegreeC" => [18, "degreeC"],  "EdegreeF" => [18, "degreeF"],
+  "Edegree_C" => [18, "degree_C"],  "Edegree_E" => [18, "degree_E"],
+  "Edegree_F" => [18, "degree_F"],  "Edegree_N" => [18, "degree_N"],
+  "Edegree_R" => [18, "degree_R"],  "Edegree_S" => [18, "degree_S"],
+  "Edegree_W" => [18, "degree_W"],  "Edegree_c" => [18, "degree_c"],
+  "Edegree_east" => [18, "degree_east"],
+  "Edegree_f" => [18, "degree_f"],
+  "Edegree_north" => [18, "degree_north"],
+  "Edegree_south" => [18, "degree_south"],
+  "Edegree_west" => [18, "degree_west"],
+  "Edegrees_east" => [18, "degrees_east"],
+  "Edegrees_north" => [18, "degrees_north"],
+  "Edegrees_south" => [18, "degrees_south"],
+  "Edegrees_west" => [18, "degrees_west"],  "Edyn" => [18, "dyn"],
+  "Eerg" => [18, "erg"],  "Eforce" => [18, "force"],  "Eg" => [18, "g"],
+  "Egravity" => [18, "gravity"],  "Eh" => [18, "h"],
+  "Ehg" => [18, "hg"],  "Ehr" => [18, "hr"],  "Ein" => [18, "in"],
+  "Ekg" => [18, "kg"],  "Ekgf" => [18, "kgf"],  "Ekph" => [18, "kph"],
+  "Elb" => [18, "lb"],  "Elm" => [18, "lm"],  "Elx" => [18, "lx"],
+  "Ely" => [18, "ly"],  "Em" => [18, "m"],  "Emb" => [18, "mb"],
+  "Emercury" => [18, "mercury"],  "Emgal" => [18, "mgal"],
+  "Emin" => [18, "min"],  "Emol" => [18, "mol"],  "Emon" => [18, "mon"],
+  "Emph" => [18, "mph"],  "Eohm" => [18, "ohm"],  "Eoz" => [18, "oz"],
+  "Epc" => [18, "pc"],  "Epercent" => [18, "percent"],
+  "Epermil" => [18, "permil"],  "Epsi" => [18, "psi"],
+  "Erad" => [18, "rad"],  "Es" => [18, "s"],  "Esr" => [18, "sr"],
+  "Et" => [18, "t"],  "Eyr" => [18, "yr"],
+  "Fahrenheits" => [0, "Fahrenheit"],  "G%" => [9, "%"],
+  "GA" => [9, "A"],  "GAu" => [9, "Au"],  "GBq" => [9, "Bq"],
+  "GC" => [9, "C"],  "GF" => [9, "F"],  "GG" => [9, "G"],
+  "GGal" => [9, "Gal"],  "GGy" => [9, "Gy"],  "GH" => [9, "H"],
+  "GHg" => [9, "Hg"],  "GHz" => [9, "Hz"],  "GJ" => [9, "J"],
+  "GK" => [9, "K"],  "GL" => [9, "L"],  "GN" => [9, "N"],
+  "GP" => [9, "P"],  "GPa" => [9, "Pa"],  "GS" => [9, "S"],
+  "GSt" => [9, "St"],  "GSv" => [9, "Sv"],  "GT" => [9, "T"],
+  "GV" => [9, "V"],  "GW" => [9, "W"],  "GWb" => [9, "Wb"],
+  "Ga" => [9, "a"],  "Gac" => [9, "ac"],  "Gatm" => [9, "atm"],
+  "Gbar" => [9, "bar"],  "Gcal" => [9, "cal"],
+  "Gconventional_mercury" => [9, "conventional_mercury"],
+  "Gd" => [9, "d"],  "GdegC" => [9, "degC"],  "GdegF" => [9, "degF"],
+  "Gdeg_C" => [9, "deg_C"],  "Gdeg_F" => [9, "deg_F"],
+  "GdegreeC" => [9, "degreeC"],  "GdegreeF" => [9, "degreeF"],
+  "Gdegree_C" => [9, "degree_C"],  "Gdegree_E" => [9, "degree_E"],
+  "Gdegree_F" => [9, "degree_F"],  "Gdegree_N" => [9, "degree_N"],
+  "Gdegree_R" => [9, "degree_R"],  "Gdegree_S" => [9, "degree_S"],
+  "Gdegree_W" => [9, "degree_W"],  "Gdegree_c" => [9, "degree_c"],
+  "Gdegree_east" => [9, "degree_east"],  "Gdegree_f" => [9, "degree_f"],
+  "Gdegree_north" => [9, "degree_north"],
+  "Gdegree_south" => [9, "degree_south"],
+  "Gdegree_west" => [9, "degree_west"],
+  "Gdegrees_east" => [9, "degrees_east"],
+  "Gdegrees_north" => [9, "degrees_north"],
+  "Gdegrees_south" => [9, "degrees_south"],
+  "Gdegrees_west" => [9, "degrees_west"],  "Gdyn" => [9, "dyn"],
+  "Gerg" => [9, "erg"],  "Gforce" => [9, "force"],  "Gg" => [9, "g"],
+  "Ggravity" => [9, "gravity"],  "Gh" => [9, "h"],  "Ghg" => [9, "hg"],
+  "Ghr" => [9, "hr"],  "Gin" => [9, "in"],  "Gkg" => [9, "kg"],
+  "Gkgf" => [9, "kgf"],  "Gkph" => [9, "kph"],  "Glb" => [9, "lb"],
+  "Glm" => [9, "lm"],  "Glx" => [9, "lx"],  "Gly" => [9, "ly"],
+  "Gm" => [9, "m"],  "Gmb" => [9, "mb"],  "Gmercury" => [9, "mercury"],
+  "Gmgal" => [9, "mgal"],  "Gmin" => [9, "min"],  "Gmol" => [9, "mol"],
+  "Gmon" => [9, "mon"],  "Gmph" => [9, "mph"],  "Gohm" => [9, "ohm"],
+  "Goz" => [9, "oz"],  "Gpc" => [9, "pc"],
+  "Gpercent" => [9, "percent"],  "Gpermil" => [9, "permil"],
+  "Gpsi" => [9, "psi"],  "Grad" => [9, "rad"],  "Gs" => [9, "s"],
+  "Gsr" => [9, "sr"],  "Gt" => [9, "t"],  "Gyr" => [9, "yr"],
+  "Julians_year" => [0, "Julian_year"],  "M%" => [6, "%"],
+  "MA" => [6, "A"],  "MAu" => [6, "Au"],  "MBq" => [6, "Bq"],
+  "MC" => [6, "C"],  "MF" => [6, "F"],  "MG" => [6, "G"],
+  "MGal" => [6, "Gal"],  "MGy" => [6, "Gy"],  "MH" => [6, "H"],
+  "MHg" => [6, "Hg"],  "MHz" => [6, "Hz"],  "MJ" => [6, "J"],
+  "MK" => [6, "K"],  "ML" => [6, "L"],  "MN" => [6, "N"],
+  "MP" => [6, "P"],  "MPa" => [6, "Pa"],  "MS" => [6, "S"],
+  "MSt" => [6, "St"],  "MSv" => [6, "Sv"],  "MT" => [6, "T"],
+  "MV" => [6, "V"],  "MW" => [6, "W"],  "MWb" => [6, "Wb"],
+  "Ma" => [6, "a"],  "Mac" => [6, "ac"],  "Matm" => [6, "atm"],
+  "Mbar" => [6, "bar"],  "Mcal" => [6, "cal"],
+  "Mconventional_mercury" => [6, "conventional_mercury"],
+  "Md" => [6, "d"],  "MdegC" => [6, "degC"],  "MdegF" => [6, "degF"],
+  "Mdeg_C" => [6, "deg_C"],  "Mdeg_F" => [6, "deg_F"],
+  "MdegreeC" => [6, "degreeC"],  "MdegreeF" => [6, "degreeF"],
+  "Mdegree_C" => [6, "degree_C"],  "Mdegree_E" => [6, "degree_E"],
+  "Mdegree_F" => [6, "degree_F"],  "Mdegree_N" => [6, "degree_N"],
+  "Mdegree_R" => [6, "degree_R"],  "Mdegree_S" => [6, "degree_S"],
+  "Mdegree_W" => [6, "degree_W"],  "Mdegree_c" => [6, "degree_c"],
+  "Mdegree_east" => [6, "degree_east"],  "Mdegree_f" => [6, "degree_f"],
+  "Mdegree_north" => [6, "degree_north"],
+  "Mdegree_south" => [6, "degree_south"],
+  "Mdegree_west" => [6, "degree_west"],
+  "Mdegrees_east" => [6, "degrees_east"],
+  "Mdegrees_north" => [6, "degrees_north"],
+  "Mdegrees_south" => [6, "degrees_south"],
+  "Mdegrees_west" => [6, "degrees_west"],  "Mdyn" => [6, "dyn"],
+  "Merg" => [6, "erg"],  "Mforce" => [6, "force"],  "Mg" => [6, "g"],
+  "Mgravity" => [6, "gravity"],  "Mh" => [6, "h"],  "Mhg" => [6, "hg"],
+  "Mhr" => [6, "hr"],  "Min" => [6, "in"],  "Mkg" => [6, "kg"],
+  "Mkgf" => [6, "kgf"],  "Mkph" => [6, "kph"],  "Mlb" => [6, "lb"],
+  "Mlm" => [6, "lm"],  "Mlx" => [6, "lx"],  "Mly" => [6, "ly"],
+  "Mm" => [6, "m"],  "Mmb" => [6, "mb"],  "Mmercury" => [6, "mercury"],
+  "Mmgal" => [6, "mgal"],  "Mmin" => [6, "min"],  "Mmol" => [6, "mol"],
+  "Mmon" => [6, "mon"],  "Mmph" => [6, "mph"],  "Mohm" => [6, "ohm"],
+  "Moz" => [6, "oz"],  "Mpc" => [6, "pc"],
+  "Mpercent" => [6, "percent"],  "Mpermil" => [6, "permil"],
+  "Mpsi" => [6, "psi"],  "Mrad" => [6, "rad"],  "Ms" => [6, "s"],
+  "Msr" => [6, "sr"],  "Mt" => [6, "t"],  "Myr" => [6, "yr"],
+  "P%" => [15, "%"],  "PA" => [15, "A"],  "PAu" => [15, "Au"],
+  "PBq" => [15, "Bq"],  "PC" => [15, "C"],  "PF" => [15, "F"],
+  "PG" => [15, "G"],  "PGal" => [15, "Gal"],  "PGy" => [15, "Gy"],
+  "PH" => [15, "H"],  "PHg" => [15, "Hg"],  "PHz" => [15, "Hz"],
+  "PJ" => [15, "J"],  "PK" => [15, "K"],  "PL" => [15, "L"],
+  "PN" => [15, "N"],  "PP" => [15, "P"],  "PPa" => [15, "Pa"],
+  "PS" => [15, "S"],  "PSt" => [15, "St"],  "PSv" => [15, "Sv"],
+  "PT" => [15, "T"],  "PV" => [15, "V"],  "PW" => [15, "W"],
+  "PWb" => [15, "Wb"],  "Pa" => [15, "a"],  "Pac" => [15, "ac"],
+  "Pascals" => [0, "Pascal"],  "Patm" => [15, "atm"],
+  "Pbar" => [15, "bar"],  "Pcal" => [15, "cal"],
+  "Pconventional_mercury" => [15, "conventional_mercury"],
+  "Pd" => [15, "d"],  "PdegC" => [15, "degC"],  "PdegF" => [15, "degF"],
+  "Pdeg_C" => [15, "deg_C"],  "Pdeg_F" => [15, "deg_F"],
+  "PdegreeC" => [15, "degreeC"],  "PdegreeF" => [15, "degreeF"],
+  "Pdegree_C" => [15, "degree_C"],  "Pdegree_E" => [15, "degree_E"],
+  "Pdegree_F" => [15, "degree_F"],  "Pdegree_N" => [15, "degree_N"],
+  "Pdegree_R" => [15, "degree_R"],  "Pdegree_S" => [15, "degree_S"],
+  "Pdegree_W" => [15, "degree_W"],  "Pdegree_c" => [15, "degree_c"],
+  "Pdegree_east" => [15, "degree_east"],
+  "Pdegree_f" => [15, "degree_f"],
+  "Pdegree_north" => [15, "degree_north"],
+  "Pdegree_south" => [15, "degree_south"],
+  "Pdegree_west" => [15, "degree_west"],
+  "Pdegrees_east" => [15, "degrees_east"],
+  "Pdegrees_north" => [15, "degrees_north"],
+  "Pdegrees_south" => [15, "degrees_south"],
+  "Pdegrees_west" => [15, "degrees_west"],  "Pdyn" => [15, "dyn"],
+  "Perg" => [15, "erg"],  "Pforce" => [15, "force"],  "Pg" => [15, "g"],
+  "Pgravity" => [15, "gravity"],  "Ph" => [15, "h"],
+  "Phg" => [15, "hg"],  "Phr" => [15, "hr"],  "Pin" => [15, "in"],
+  "Pkg" => [15, "kg"],  "Pkgf" => [15, "kgf"],  "Pkph" => [15, "kph"],
+  "Plb" => [15, "lb"],  "Plm" => [15, "lm"],  "Plx" => [15, "lx"],
+  "Ply" => [15, "ly"],  "Pm" => [15, "m"],  "Pmb" => [15, "mb"],
+  "Pmercury" => [15, "mercury"],  "Pmgal" => [15, "mgal"],
+  "Pmin" => [15, "min"],  "Pmol" => [15, "mol"],  "Pmon" => [15, "mon"],
+  "Pmph" => [15, "mph"],  "Pohm" => [15, "ohm"],  "Poz" => [15, "oz"],
+  "Ppc" => [15, "pc"],  "Ppercent" => [15, "percent"],
+  "Ppermil" => [15, "permil"],  "Ppsi" => [15, "psi"],
+  "Prad" => [15, "rad"],  "Ps" => [15, "s"],  "Psr" => [15, "sr"],
+  "Pt" => [15, "t"],  "Pyr" => [15, "yr"],  "T%" => [12, "%"],
+  "TA" => [12, "A"],  "TAu" => [12, "Au"],  "TBq" => [12, "Bq"],
+  "TC" => [12, "C"],  "TF" => [12, "F"],  "TG" => [12, "G"],
+  "TGal" => [12, "Gal"],  "TGy" => [12, "Gy"],  "TH" => [12, "H"],
+  "THg" => [12, "Hg"],  "THz" => [12, "Hz"],  "TJ" => [12, "J"],
+  "TK" => [12, "K"],  "TL" => [12, "L"],  "TN" => [12, "N"],
+  "TP" => [12, "P"],  "TPa" => [12, "Pa"],  "TS" => [12, "S"],
+  "TSt" => [12, "St"],  "TSv" => [12, "Sv"],  "TT" => [12, "T"],
+  "TV" => [12, "V"],  "TW" => [12, "W"],  "TWb" => [12, "Wb"],
+  "Ta" => [12, "a"],  "Tac" => [12, "ac"],  "Tatm" => [12, "atm"],
+  "Tbar" => [12, "bar"],  "Tcal" => [12, "cal"],
+  "Tconventional_mercury" => [12, "conventional_mercury"],
+  "Td" => [12, "d"],  "TdegC" => [12, "degC"],  "TdegF" => [12, "degF"],
+  "Tdeg_C" => [12, "deg_C"],  "Tdeg_F" => [12, "deg_F"],
+  "TdegreeC" => [12, "degreeC"],  "TdegreeF" => [12, "degreeF"],
+  "Tdegree_C" => [12, "degree_C"],  "Tdegree_E" => [12, "degree_E"],
+  "Tdegree_F" => [12, "degree_F"],  "Tdegree_N" => [12, "degree_N"],
+  "Tdegree_R" => [12, "degree_R"],  "Tdegree_S" => [12, "degree_S"],
+  "Tdegree_W" => [12, "degree_W"],  "Tdegree_c" => [12, "degree_c"],
+  "Tdegree_east" => [12, "degree_east"],
+  "Tdegree_f" => [12, "degree_f"],
+  "Tdegree_north" => [12, "degree_north"],
+  "Tdegree_south" => [12, "degree_south"],
+  "Tdegree_west" => [12, "degree_west"],
+  "Tdegrees_east" => [12, "degrees_east"],
+  "Tdegrees_north" => [12, "degrees_north"],
+  "Tdegrees_south" => [12, "degrees_south"],
+  "Tdegrees_west" => [12, "degrees_west"],  "Tdyn" => [12, "dyn"],
+  "Terg" => [12, "erg"],  "Tforce" => [12, "force"],  "Tg" => [12, "g"],
+  "Tgravity" => [12, "gravity"],  "Th" => [12, "h"],
+  "Thg" => [12, "hg"],  "Thr" => [12, "hr"],  "Tin" => [12, "in"],
+  "Tkg" => [12, "kg"],  "Tkgf" => [12, "kgf"],  "Tkph" => [12, "kph"],
+  "Tlb" => [12, "lb"],  "Tlm" => [12, "lm"],  "Tlx" => [12, "lx"],
+  "Tly" => [12, "ly"],  "Tm" => [12, "m"],  "Tmb" => [12, "mb"],
+  "Tmercury" => [12, "mercury"],  "Tmgal" => [12, "mgal"],
+  "Tmin" => [12, "min"],  "Tmol" => [12, "mol"],  "Tmon" => [12, "mon"],
+  "Tmph" => [12, "mph"],  "Tohm" => [12, "ohm"],  "Toz" => [12, "oz"],
+  "Tpc" => [12, "pc"],  "Tpercent" => [12, "percent"],
+  "Tpermil" => [12, "permil"],  "Tpsi" => [12, "psi"],
+  "Trad" => [12, "rad"],  "Ts" => [12, "s"],  "Tsr" => [12, "sr"],
+  "Tt" => [12, "t"],  "Tyr" => [12, "yr"],  "a%" => [-18, "%"],
+  "aA" => [-18, "A"],  "aAu" => [-18, "Au"],  "aBq" => [-18, "Bq"],
+  "aC" => [-18, "C"],  "aF" => [-18, "F"],  "aG" => [-18, "G"],
+  "aGal" => [-18, "Gal"],  "aGy" => [-18, "Gy"],  "aH" => [-18, "H"],
+  "aHg" => [-18, "Hg"],  "aHz" => [-18, "Hz"],  "aJ" => [-18, "J"],
+  "aK" => [-18, "K"],  "aL" => [-18, "L"],  "aN" => [-18, "N"],
+  "aP" => [-18, "P"],  "aPa" => [-18, "Pa"],  "aS" => [-18, "S"],
+  "aSt" => [-18, "St"],  "aSv" => [-18, "Sv"],  "aT" => [-18, "T"],
+  "aV" => [-18, "V"],  "aW" => [-18, "W"],  "aWb" => [-18, "Wb"],
+  "aa" => [-18, "a"],  "aac" => [-18, "ac"],  "aatm" => [-18, "atm"],
+  "abar" => [-18, "bar"],  "acal" => [-18, "cal"],
+  "aconventional_mercury" => [-18, "conventional_mercury"],
+  "acres" => [0, "acre"],  "ad" => [-18, "d"],
+  "adegC" => [-18, "degC"],  "adegF" => [-18, "degF"],
+  "adeg_C" => [-18, "deg_C"],  "adeg_F" => [-18, "deg_F"],
+  "adegreeC" => [-18, "degreeC"],  "adegreeF" => [-18, "degreeF"],
+  "adegree_C" => [-18, "degree_C"],  "adegree_E" => [-18, "degree_E"],
+  "adegree_F" => [-18, "degree_F"],  "adegree_N" => [-18, "degree_N"],
+  "adegree_R" => [-18, "degree_R"],  "adegree_S" => [-18, "degree_S"],
+  "adegree_W" => [-18, "degree_W"],  "adegree_c" => [-18, "degree_c"],
+  "adegree_east" => [-18, "degree_east"],
+  "adegree_f" => [-18, "degree_f"],
+  "adegree_north" => [-18, "degree_north"],
+  "adegree_south" => [-18, "degree_south"],
+  "adegree_west" => [-18, "degree_west"],
+  "adegrees_east" => [-18, "degrees_east"],
+  "adegrees_north" => [-18, "degrees_north"],
+  "adegrees_south" => [-18, "degrees_south"],
+  "adegrees_west" => [-18, "degrees_west"],  "adyn" => [-18, "dyn"],
+  "aerg" => [-18, "erg"],  "aforce" => [-18, "force"],
+  "ag" => [-18, "g"],  "agravity" => [-18, "gravity"],
+  "ah" => [-18, "h"],  "ahg" => [-18, "hg"],  "ahr" => [-18, "hr"],
+  "ain" => [-18, "in"],  "akg" => [-18, "kg"],  "akgf" => [-18, "kgf"],
+  "akph" => [-18, "kph"],  "alb" => [-18, "lb"],  "alm" => [-18, "lm"],
+  "alx" => [-18, "lx"],  "aly" => [-18, "ly"],  "am" => [-18, "m"],
+  "amb" => [-18, "mb"],  "amercury" => [-18, "mercury"],
+  "amgal" => [-18, "mgal"],  "amin" => [-18, "min"],
+  "amol" => [-18, "mol"],  "amon" => [-18, "mon"],
+  "amperes" => [0, "ampere"],  "amph" => [-18, "mph"],
+  "angstroms" => [0, "angstrom"],
+  "angulars_degree" => [0, "angular_degree"],
+  "angulars_minute" => [0, "angular_minute"],
+  "angulars_second" => [0, "angular_second"],  "aohm" => [-18, "ohm"],
+  "aoz" => [-18, "oz"],  "apc" => [-18, "pc"],
+  "apercent" => [-18, "percent"],  "apermil" => [-18, "permil"],
+  "apsi" => [-18, "psi"],  "arad" => [-18, "rad"],
+  "ares" => [0, "are"],  "as" => [-18, "s"],  "asr" => [-18, "sr"],
+  "at" => [-18, "t"],  "atmospheres" => [0, "atmosphere"],
+  "attoCelsius" => [-18, "Celsius"],
+  "attoFahrenheit" => [-18, "Fahrenheit"],
+  "attoJulian_year" => [-18, "Julian_year"],
+  "attoPascal" => [-18, "Pascal"],  "attoacre" => [-18, "acre"],
+  "attoampere" => [-18, "ampere"],  "attoangstrom" => [-18, "angstrom"],
+  "attoangular_degree" => [-18, "angular_degree"],
+  "attoangular_minute" => [-18, "angular_minute"],
+  "attoangular_second" => [-18, "angular_second"],
+  "attoare" => [-18, "are"],  "attoatmosphere" => [-18, "atmosphere"],
+  "attocalorie" => [-18, "calorie"],  "attocelsius" => [-18, "celsius"],
+  "attocentigrade" => [-18, "centigrade"],
+  "attocentury" => [-18, "century"],  "attochain" => [-18, "chain"],
+  "attocommon_year" => [-18, "common_year"],
+  "attocoulomb" => [-18, "coulomb"],  "attoday" => [-18, "day"],
+  "attodegK" => [-18, "degK"],  "attodeg_K" => [-18, "deg_K"],
+  "attodegree" => [-18, "degree"],  "attodegreeK" => [-18, "degreeK"],
+  "attodyne" => [-18, "dyne"],  "attoerg" => [-18, "erg"],
+  "attofahrenheit" => [-18, "fahrenheit"],
+  "attofarad" => [-18, "farad"],  "attofermi" => [-18, "fermi"],
+  "attogal" => [-18, "gal"],  "attogauss" => [-18, "gauss"],
+  "attogram" => [-18, "gram"],  "attohectare" => [-18, "hectare"],
+  "attohertz" => [-18, "hertz"],  "attohour" => [-18, "hour"],
+  "attoinch" => [-18, "inch"],  "attojoule" => [-18, "joule"],
+  "attokelvin" => [-18, "kelvin"],  "attokilogram" => [-18, "kilogram"],
+  "attoknot" => [-18, "knot"],  "attolitre" => [-18, "litre"],
+  "attometer" => [-18, "meter"],  "attometre" => [-18, "metre"],
+  "attomicron" => [-18, "micron"],  "attomile" => [-18, "mile"],
+  "attomillibar" => [-18, "millibar"],  "attominute" => [-18, "minute"],
+  "attominute_angle" => [-18, "minute_angle"],
+  "attomole" => [-18, "mole"],  "attomonth" => [-18, "month"],
+  "attonewton" => [-18, "newton"],  "attoounce" => [-18, "ounce"],
+  "attoparsec" => [-18, "parsec"],  "attopascal" => [-18, "pascal"],
+  "attopentad" => [-18, "pentad"],  "attopoise" => [-18, "poise"],
+  "attopound" => [-18, "pound"],  "attoradian" => [-18, "radian"],
+  "attosecond" => [-18, "second"],
+  "attosecond_angle" => [-18, "second_angle"],
+  "attosteradian" => [-18, "steradian"],
+  "attostokes" => [-18, "stokes"],  "attotesla" => [-18, "tesla"],
+  "attoton" => [-18, "ton"],  "attotonne" => [-18, "tonne"],
+  "attotorr" => [-18, "torr"],  "attovolt" => [-18, "volt"],
+  "attowatt" => [-18, "watt"],  "attoweber" => [-18, "weber"],
+  "attoyard" => [-18, "yard"],  "attoyd" => [-18, "yd"],
+  "attoyear" => [-18, "year"],  "ayr" => [-18, "yr"],
+  "c%" => [-2, "%"],  "cA" => [-2, "A"],  "cAu" => [-2, "Au"],
+  "cBq" => [-2, "Bq"],  "cC" => [-2, "C"],  "cF" => [-2, "F"],
+  "cG" => [-2, "G"],  "cGal" => [-2, "Gal"],  "cGy" => [-2, "Gy"],
+  "cH" => [-2, "H"],  "cHg" => [-2, "Hg"],  "cHz" => [-2, "Hz"],
+  "cJ" => [-2, "J"],  "cK" => [-2, "K"],  "cL" => [-2, "L"],
+  "cN" => [-2, "N"],  "cP" => [-2, "P"],  "cPa" => [-2, "Pa"],
+  "cS" => [-2, "S"],  "cSt" => [-2, "St"],  "cSv" => [-2, "Sv"],
+  "cT" => [-2, "T"],  "cV" => [-2, "V"],  "cW" => [-2, "W"],
+  "cWb" => [-2, "Wb"],  "ca" => [-2, "a"],  "cac" => [-2, "ac"],
+  "calories" => [0, "calorie"],  "catm" => [-2, "atm"],
+  "cbar" => [-2, "bar"],  "ccal" => [-2, "cal"],
+  "cconventional_mercury" => [-2, "conventional_mercury"],
+  "cd" => [-2, "d"],  "cdegC" => [-2, "degC"],  "cdegF" => [-2, "degF"],
+  "cdeg_C" => [-2, "deg_C"],  "cdeg_F" => [-2, "deg_F"],
+  "cdegreeC" => [-2, "degreeC"],  "cdegreeF" => [-2, "degreeF"],
+  "cdegree_C" => [-2, "degree_C"],  "cdegree_E" => [-2, "degree_E"],
+  "cdegree_F" => [-2, "degree_F"],  "cdegree_N" => [-2, "degree_N"],
+  "cdegree_R" => [-2, "degree_R"],  "cdegree_S" => [-2, "degree_S"],
+  "cdegree_W" => [-2, "degree_W"],  "cdegree_c" => [-2, "degree_c"],
+  "cdegree_east" => [-2, "degree_east"],
+  "cdegree_f" => [-2, "degree_f"],
+  "cdegree_north" => [-2, "degree_north"],
+  "cdegree_south" => [-2, "degree_south"],
+  "cdegree_west" => [-2, "degree_west"],
+  "cdegrees_east" => [-2, "degrees_east"],
+  "cdegrees_north" => [-2, "degrees_north"],
+  "cdegrees_south" => [-2, "degrees_south"],
+  "cdegrees_west" => [-2, "degrees_west"],  "cdyn" => [-2, "dyn"],
+  "celsiuses" => [0, "celsius"],  "centiCelsius" => [-2, "Celsius"],
+  "centiFahrenheit" => [-2, "Fahrenheit"],
+  "centiJulian_year" => [-2, "Julian_year"],
+  "centiPascal" => [-2, "Pascal"],  "centiacre" => [-2, "acre"],
+  "centiampere" => [-2, "ampere"],  "centiangstrom" => [-2, "angstrom"],
+  "centiangular_degree" => [-2, "angular_degree"],
+  "centiangular_minute" => [-2, "angular_minute"],
+  "centiangular_second" => [-2, "angular_second"],
+  "centiare" => [-2, "are"],  "centiatmosphere" => [-2, "atmosphere"],
+  "centicalorie" => [-2, "calorie"],  "centicelsius" => [-2, "celsius"],
+  "centicentigrade" => [-2, "centigrade"],
+  "centicentury" => [-2, "century"],  "centichain" => [-2, "chain"],
+  "centicommon_year" => [-2, "common_year"],
+  "centicoulomb" => [-2, "coulomb"],  "centiday" => [-2, "day"],
+  "centidegK" => [-2, "degK"],  "centideg_K" => [-2, "deg_K"],
+  "centidegree" => [-2, "degree"],  "centidegreeK" => [-2, "degreeK"],
+  "centidyne" => [-2, "dyne"],  "centierg" => [-2, "erg"],
+  "centifahrenheit" => [-2, "fahrenheit"],
+  "centifarad" => [-2, "farad"],  "centifermi" => [-2, "fermi"],
+  "centigal" => [-2, "gal"],  "centigauss" => [-2, "gauss"],
+  "centigrades" => [0, "centigrade"],  "centigram" => [-2, "gram"],
+  "centihectare" => [-2, "hectare"],  "centihertz" => [-2, "hertz"],
+  "centihour" => [-2, "hour"],  "centiinch" => [-2, "inch"],
+  "centijoule" => [-2, "joule"],  "centikelvin" => [-2, "kelvin"],
+  "centikilogram" => [-2, "kilogram"],  "centiknot" => [-2, "knot"],
+  "centilitre" => [-2, "litre"],  "centimeter" => [-2, "meter"],
+  "centimetre" => [-2, "metre"],  "centimicron" => [-2, "micron"],
+  "centimile" => [-2, "mile"],  "centimillibar" => [-2, "millibar"],
+  "centiminute" => [-2, "minute"],
+  "centiminute_angle" => [-2, "minute_angle"],
+  "centimole" => [-2, "mole"],  "centimonth" => [-2, "month"],
+  "centinewton" => [-2, "newton"],  "centiounce" => [-2, "ounce"],
+  "centiparsec" => [-2, "parsec"],  "centipascal" => [-2, "pascal"],
+  "centipentad" => [-2, "pentad"],  "centipoise" => [-2, "poise"],
+  "centipound" => [-2, "pound"],  "centiradian" => [-2, "radian"],
+  "centisecond" => [-2, "second"],
+  "centisecond_angle" => [-2, "second_angle"],
+  "centisteradian" => [-2, "steradian"],
+  "centistokes" => [-2, "stokes"],  "centitesla" => [-2, "tesla"],
+  "centiton" => [-2, "ton"],  "centitonne" => [-2, "tonne"],
+  "centitorr" => [-2, "torr"],  "centivolt" => [-2, "volt"],
+  "centiwatt" => [-2, "watt"],  "centiweber" => [-2, "weber"],
+  "centiyard" => [-2, "yard"],  "centiyd" => [-2, "yd"],
+  "centiyear" => [-2, "year"],  "centuries" => [0, "century"],
+  "cerg" => [-2, "erg"],  "cforce" => [-2, "force"],  "cg" => [-2, "g"],
+  "cgravity" => [-2, "gravity"],  "ch" => [-2, "h"],
+  "chains" => [0, "chain"],  "chg" => [-2, "hg"],  "chr" => [-2, "hr"],
+  "cin" => [-2, "in"],  "ckg" => [-2, "kg"],  "ckgf" => [-2, "kgf"],
+  "ckph" => [-2, "kph"],  "clb" => [-2, "lb"],  "clm" => [-2, "lm"],
+  "clx" => [-2, "lx"],  "cly" => [-2, "ly"],  "cm" => [-2, "m"],
+  "cmb" => [-2, "mb"],  "cmercury" => [-2, "mercury"],
+  "cmgal" => [-2, "mgal"],  "cmin" => [-2, "min"],
+  "cmol" => [-2, "mol"],  "cmon" => [-2, "mon"],  "cmph" => [-2, "mph"],
+  "cohm" => [-2, "ohm"],  "commons_year" => [0, "common_year"],
+  "coulombs" => [0, "coulomb"],  "coz" => [-2, "oz"],
+  "cpc" => [-2, "pc"],  "cpercent" => [-2, "percent"],
+  "cpermil" => [-2, "permil"],  "cpsi" => [-2, "psi"],
+  "crad" => [-2, "rad"],  "cs" => [-2, "s"],  "csr" => [-2, "sr"],
+  "ct" => [-2, "t"],  "cyr" => [-2, "yr"],  "d%" => [-1, "%"],
+  "dA" => [-1, "A"],  "dAu" => [-1, "Au"],  "dBq" => [-1, "Bq"],
+  "dC" => [-1, "C"],  "dF" => [-1, "F"],  "dG" => [-1, "G"],
+  "dGal" => [-1, "Gal"],  "dGy" => [-1, "Gy"],  "dH" => [-1, "H"],
+  "dHg" => [-1, "Hg"],  "dHz" => [-1, "Hz"],  "dJ" => [-1, "J"],
+  "dK" => [-1, "K"],  "dL" => [-1, "L"],  "dN" => [-1, "N"],
+  "dP" => [-1, "P"],  "dPa" => [-1, "Pa"],  "dS" => [-1, "S"],
+  "dSt" => [-1, "St"],  "dSv" => [-1, "Sv"],  "dT" => [-1, "T"],
+  "dV" => [-1, "V"],  "dW" => [-1, "W"],  "dWb" => [-1, "Wb"],
+  "da" => [-1, "a"],  "da%" => [1, "%"],  "daA" => [1, "A"],
+  "daAu" => [1, "Au"],  "daBq" => [1, "Bq"],  "daC" => [1, "C"],
+  "daF" => [1, "F"],  "daG" => [1, "G"],  "daGal" => [1, "Gal"],
+  "daGy" => [1, "Gy"],  "daH" => [1, "H"],  "daHg" => [1, "Hg"],
+  "daHz" => [1, "Hz"],  "daJ" => [1, "J"],  "daK" => [1, "K"],
+  "daL" => [1, "L"],  "daN" => [1, "N"],  "daP" => [1, "P"],
+  "daPa" => [1, "Pa"],  "daS" => [1, "S"],  "daSt" => [1, "St"],
+  "daSv" => [1, "Sv"],  "daT" => [1, "T"],  "daV" => [1, "V"],
+  "daW" => [1, "W"],  "daWb" => [1, "Wb"],  "daa" => [1, "a"],
+  "daac" => [1, "ac"],  "daatm" => [1, "atm"],  "dabar" => [1, "bar"],
+  "dac" => [-1, "ac"],  "dacal" => [1, "cal"],
+  "daconventional_mercury" => [1, "conventional_mercury"],
+  "dad" => [1, "d"],  "dadegC" => [1, "degC"],  "dadegF" => [1, "degF"],
+  "dadeg_C" => [1, "deg_C"],  "dadeg_F" => [1, "deg_F"],
+  "dadegreeC" => [1, "degreeC"],  "dadegreeF" => [1, "degreeF"],
+  "dadegree_C" => [1, "degree_C"],  "dadegree_E" => [1, "degree_E"],
+  "dadegree_F" => [1, "degree_F"],  "dadegree_N" => [1, "degree_N"],
+  "dadegree_R" => [1, "degree_R"],  "dadegree_S" => [1, "degree_S"],
+  "dadegree_W" => [1, "degree_W"],  "dadegree_c" => [1, "degree_c"],
+  "dadegree_east" => [1, "degree_east"],
+  "dadegree_f" => [1, "degree_f"],
+  "dadegree_north" => [1, "degree_north"],
+  "dadegree_south" => [1, "degree_south"],
+  "dadegree_west" => [1, "degree_west"],
+  "dadegrees_east" => [1, "degrees_east"],
+  "dadegrees_north" => [1, "degrees_north"],
+  "dadegrees_south" => [1, "degrees_south"],
+  "dadegrees_west" => [1, "degrees_west"],  "dadyn" => [1, "dyn"],
+  "daerg" => [1, "erg"],  "daforce" => [1, "force"],  "dag" => [1, "g"],
+  "dagravity" => [1, "gravity"],  "dah" => [1, "h"],
+  "dahg" => [1, "hg"],  "dahr" => [1, "hr"],  "dain" => [1, "in"],
+  "dakg" => [1, "kg"],  "dakgf" => [1, "kgf"],  "dakph" => [1, "kph"],
+  "dalb" => [1, "lb"],  "dalm" => [1, "lm"],  "dalx" => [1, "lx"],
+  "daly" => [1, "ly"],  "dam" => [1, "m"],  "damb" => [1, "mb"],
+  "damercury" => [1, "mercury"],  "damgal" => [1, "mgal"],
+  "damin" => [1, "min"],  "damol" => [1, "mol"],  "damon" => [1, "mon"],
+  "damph" => [1, "mph"],  "daohm" => [1, "ohm"],  "daoz" => [1, "oz"],
+  "dapc" => [1, "pc"],  "dapercent" => [1, "percent"],
+  "dapermil" => [1, "permil"],  "dapsi" => [1, "psi"],
+  "darad" => [1, "rad"],  "das" => [1, "s"],  "dasr" => [1, "sr"],
+  "dat" => [1, "t"],  "datm" => [-1, "atm"],  "dayr" => [1, "yr"],
+  "days" => [0, "day"],  "dbar" => [-1, "bar"],  "dcal" => [-1, "cal"],
+  "dconventional_mercury" => [-1, "conventional_mercury"],
+  "dd" => [-1, "d"],  "ddegC" => [-1, "degC"],  "ddegF" => [-1, "degF"],
+  "ddeg_C" => [-1, "deg_C"],  "ddeg_F" => [-1, "deg_F"],
+  "ddegreeC" => [-1, "degreeC"],  "ddegreeF" => [-1, "degreeF"],
+  "ddegree_C" => [-1, "degree_C"],  "ddegree_E" => [-1, "degree_E"],
+  "ddegree_F" => [-1, "degree_F"],  "ddegree_N" => [-1, "degree_N"],
+  "ddegree_R" => [-1, "degree_R"],  "ddegree_S" => [-1, "degree_S"],
+  "ddegree_W" => [-1, "degree_W"],  "ddegree_c" => [-1, "degree_c"],
+  "ddegree_east" => [-1, "degree_east"],
+  "ddegree_f" => [-1, "degree_f"],
+  "ddegree_north" => [-1, "degree_north"],
+  "ddegree_south" => [-1, "degree_south"],
+  "ddegree_west" => [-1, "degree_west"],
+  "ddegrees_east" => [-1, "degrees_east"],
+  "ddegrees_north" => [-1, "degrees_north"],
+  "ddegrees_south" => [-1, "degrees_south"],
+  "ddegrees_west" => [-1, "degrees_west"],  "ddyn" => [-1, "dyn"],
+  "decaCelsius" => [1, "Celsius"],
+  "decaFahrenheit" => [1, "Fahrenheit"],
+  "decaJulian_year" => [1, "Julian_year"],
+  "decaPascal" => [1, "Pascal"],  "decaacre" => [1, "acre"],
+  "decaampere" => [1, "ampere"],  "decaangstrom" => [1, "angstrom"],
+  "decaangular_degree" => [1, "angular_degree"],
+  "decaangular_minute" => [1, "angular_minute"],
+  "decaangular_second" => [1, "angular_second"],
+  "decaare" => [1, "are"],  "decaatmosphere" => [1, "atmosphere"],
+  "decacalorie" => [1, "calorie"],  "decacelsius" => [1, "celsius"],
+  "decacentigrade" => [1, "centigrade"],
+  "decacentury" => [1, "century"],  "decachain" => [1, "chain"],
+  "decacommon_year" => [1, "common_year"],
+  "decacoulomb" => [1, "coulomb"],  "decaday" => [1, "day"],
+  "decadegK" => [1, "degK"],  "decadeg_K" => [1, "deg_K"],
+  "decadegree" => [1, "degree"],  "decadegreeK" => [1, "degreeK"],
+  "decadyne" => [1, "dyne"],  "decaerg" => [1, "erg"],
+  "decafahrenheit" => [1, "fahrenheit"],  "decafarad" => [1, "farad"],
+  "decafermi" => [1, "fermi"],  "decagal" => [1, "gal"],
+  "decagauss" => [1, "gauss"],  "decagram" => [1, "gram"],
+  "decahectare" => [1, "hectare"],  "decahertz" => [1, "hertz"],
+  "decahour" => [1, "hour"],  "decainch" => [1, "inch"],
+  "decajoule" => [1, "joule"],  "decakelvin" => [1, "kelvin"],
+  "decakilogram" => [1, "kilogram"],  "decaknot" => [1, "knot"],
+  "decalitre" => [1, "litre"],  "decameter" => [1, "meter"],
+  "decametre" => [1, "metre"],  "decamicron" => [1, "micron"],
+  "decamile" => [1, "mile"],  "decamillibar" => [1, "millibar"],
+  "decaminute" => [1, "minute"],
+  "decaminute_angle" => [1, "minute_angle"],  "decamole" => [1, "mole"],
+  "decamonth" => [1, "month"],  "decanewton" => [1, "newton"],
+  "decaounce" => [1, "ounce"],  "decaparsec" => [1, "parsec"],
+  "decapascal" => [1, "pascal"],  "decapentad" => [1, "pentad"],
+  "decapoise" => [1, "poise"],  "decapound" => [1, "pound"],
+  "decaradian" => [1, "radian"],  "decasecond" => [1, "second"],
+  "decasecond_angle" => [1, "second_angle"],
+  "decasteradian" => [1, "steradian"],  "decastokes" => [1, "stokes"],
+  "decatesla" => [1, "tesla"],  "decaton" => [1, "ton"],
+  "decatonne" => [1, "tonne"],  "decatorr" => [1, "torr"],
+  "decavolt" => [1, "volt"],  "decawatt" => [1, "watt"],
+  "decaweber" => [1, "weber"],  "decayard" => [1, "yard"],
+  "decayd" => [1, "yd"],  "decayear" => [1, "year"],
+  "deciCelsius" => [-1, "Celsius"],
+  "deciFahrenheit" => [-1, "Fahrenheit"],
+  "deciJulian_year" => [-1, "Julian_year"],
+  "deciPascal" => [-1, "Pascal"],  "deciacre" => [-1, "acre"],
+  "deciampere" => [-1, "ampere"],  "deciangstrom" => [-1, "angstrom"],
+  "deciangular_degree" => [-1, "angular_degree"],
+  "deciangular_minute" => [-1, "angular_minute"],
+  "deciangular_second" => [-1, "angular_second"],
+  "deciare" => [-1, "are"],  "deciatmosphere" => [-1, "atmosphere"],
+  "decicalorie" => [-1, "calorie"],  "decicelsius" => [-1, "celsius"],
+  "decicentigrade" => [-1, "centigrade"],
+  "decicentury" => [-1, "century"],  "decichain" => [-1, "chain"],
+  "decicommon_year" => [-1, "common_year"],
+  "decicoulomb" => [-1, "coulomb"],  "deciday" => [-1, "day"],
+  "decidegK" => [-1, "degK"],  "decideg_K" => [-1, "deg_K"],
+  "decidegree" => [-1, "degree"],  "decidegreeK" => [-1, "degreeK"],
+  "decidyne" => [-1, "dyne"],  "decierg" => [-1, "erg"],
+  "decifahrenheit" => [-1, "fahrenheit"],  "decifarad" => [-1, "farad"],
+  "decifermi" => [-1, "fermi"],  "decigal" => [-1, "gal"],
+  "decigauss" => [-1, "gauss"],  "decigram" => [-1, "gram"],
+  "decihectare" => [-1, "hectare"],  "decihertz" => [-1, "hertz"],
+  "decihour" => [-1, "hour"],  "deciinch" => [-1, "inch"],
+  "decijoule" => [-1, "joule"],  "decikelvin" => [-1, "kelvin"],
+  "decikilogram" => [-1, "kilogram"],  "deciknot" => [-1, "knot"],
+  "decilitre" => [-1, "litre"],  "decimeter" => [-1, "meter"],
+  "decimetre" => [-1, "metre"],  "decimicron" => [-1, "micron"],
+  "decimile" => [-1, "mile"],  "decimillibar" => [-1, "millibar"],
+  "deciminute" => [-1, "minute"],
+  "deciminute_angle" => [-1, "minute_angle"],
+  "decimole" => [-1, "mole"],  "decimonth" => [-1, "month"],
+  "decinewton" => [-1, "newton"],  "deciounce" => [-1, "ounce"],
+  "deciparsec" => [-1, "parsec"],  "decipascal" => [-1, "pascal"],
+  "decipentad" => [-1, "pentad"],  "decipoise" => [-1, "poise"],
+  "decipound" => [-1, "pound"],  "deciradian" => [-1, "radian"],
+  "decisecond" => [-1, "second"],
+  "decisecond_angle" => [-1, "second_angle"],
+  "decisteradian" => [-1, "steradian"],  "decistokes" => [-1, "stokes"],
+  "decitesla" => [-1, "tesla"],  "deciton" => [-1, "ton"],
+  "decitonne" => [-1, "tonne"],  "decitorr" => [-1, "torr"],
+  "decivolt" => [-1, "volt"],  "deciwatt" => [-1, "watt"],
+  "deciweber" => [-1, "weber"],  "deciyard" => [-1, "yard"],
+  "deciyd" => [-1, "yd"],  "deciyear" => [-1, "year"],
+  "degKs" => [0, "degK"],  "degreeKs" => [0, "degreeK"],
+  "degrees" => [0, "degree"],  "degs_K" => [0, "deg_K"],
+  "derg" => [-1, "erg"],  "dforce" => [-1, "force"],  "dg" => [-1, "g"],
+  "dgravity" => [-1, "gravity"],  "dh" => [-1, "h"],
+  "dhg" => [-1, "hg"],  "dhr" => [-1, "hr"],  "din" => [-1, "in"],
+  "dkg" => [-1, "kg"],  "dkgf" => [-1, "kgf"],  "dkph" => [-1, "kph"],
+  "dlb" => [-1, "lb"],  "dlm" => [-1, "lm"],  "dlx" => [-1, "lx"],
+  "dly" => [-1, "ly"],  "dm" => [-1, "m"],  "dmb" => [-1, "mb"],
+  "dmercury" => [-1, "mercury"],  "dmgal" => [-1, "mgal"],
+  "dmin" => [-1, "min"],  "dmol" => [-1, "mol"],  "dmon" => [-1, "mon"],
+  "dmph" => [-1, "mph"],  "dohm" => [-1, "ohm"],  "doz" => [-1, "oz"],
+  "dpc" => [-1, "pc"],  "dpercent" => [-1, "percent"],
+  "dpermil" => [-1, "permil"],  "dpsi" => [-1, "psi"],
+  "drad" => [-1, "rad"],  "ds" => [-1, "s"],  "dsr" => [-1, "sr"],
+  "dt" => [-1, "t"],  "dynes" => [0, "dyne"],  "dyr" => [-1, "yr"],
+  "ergs" => [0, "erg"],  "exaCelsius" => [18, "Celsius"],
+  "exaFahrenheit" => [18, "Fahrenheit"],
+  "exaJulian_year" => [18, "Julian_year"],
+  "exaPascal" => [18, "Pascal"],  "exaacre" => [18, "acre"],
+  "exaampere" => [18, "ampere"],  "exaangstrom" => [18, "angstrom"],
+  "exaangular_degree" => [18, "angular_degree"],
+  "exaangular_minute" => [18, "angular_minute"],
+  "exaangular_second" => [18, "angular_second"],
+  "exaare" => [18, "are"],  "exaatmosphere" => [18, "atmosphere"],
+  "exacalorie" => [18, "calorie"],  "exacelsius" => [18, "celsius"],
+  "exacentigrade" => [18, "centigrade"],
+  "exacentury" => [18, "century"],  "exachain" => [18, "chain"],
+  "exacommon_year" => [18, "common_year"],
+  "exacoulomb" => [18, "coulomb"],  "exaday" => [18, "day"],
+  "exadegK" => [18, "degK"],  "exadeg_K" => [18, "deg_K"],
+  "exadegree" => [18, "degree"],  "exadegreeK" => [18, "degreeK"],
+  "exadyne" => [18, "dyne"],  "exaerg" => [18, "erg"],
+  "exafahrenheit" => [18, "fahrenheit"],  "exafarad" => [18, "farad"],
+  "exafermi" => [18, "fermi"],  "exagal" => [18, "gal"],
+  "exagauss" => [18, "gauss"],  "exagram" => [18, "gram"],
+  "exahectare" => [18, "hectare"],  "exahertz" => [18, "hertz"],
+  "exahour" => [18, "hour"],  "exainch" => [18, "inch"],
+  "exajoule" => [18, "joule"],  "exakelvin" => [18, "kelvin"],
+  "exakilogram" => [18, "kilogram"],  "exaknot" => [18, "knot"],
+  "exalitre" => [18, "litre"],  "exameter" => [18, "meter"],
+  "exametre" => [18, "metre"],  "examicron" => [18, "micron"],
+  "examile" => [18, "mile"],  "examillibar" => [18, "millibar"],
+  "examinute" => [18, "minute"],
+  "examinute_angle" => [18, "minute_angle"],  "examole" => [18, "mole"],
+  "examonth" => [18, "month"],  "exanewton" => [18, "newton"],
+  "exaounce" => [18, "ounce"],  "exaparsec" => [18, "parsec"],
+  "exapascal" => [18, "pascal"],  "exapentad" => [18, "pentad"],
+  "exapoise" => [18, "poise"],  "exapound" => [18, "pound"],
+  "exaradian" => [18, "radian"],  "exasecond" => [18, "second"],
+  "exasecond_angle" => [18, "second_angle"],
+  "exasteradian" => [18, "steradian"],  "exastokes" => [18, "stokes"],
+  "exatesla" => [18, "tesla"],  "exaton" => [18, "ton"],
+  "exatonne" => [18, "tonne"],  "exatorr" => [18, "torr"],
+  "exavolt" => [18, "volt"],  "exawatt" => [18, "watt"],
+  "exaweber" => [18, "weber"],  "exayard" => [18, "yard"],
+  "exayd" => [18, "yd"],  "exayear" => [18, "year"],
+  "f%" => [-15, "%"],  "fA" => [-15, "A"],  "fAu" => [-15, "Au"],
+  "fBq" => [-15, "Bq"],  "fC" => [-15, "C"],  "fF" => [-15, "F"],
+  "fG" => [-15, "G"],  "fGal" => [-15, "Gal"],  "fGy" => [-15, "Gy"],
+  "fH" => [-15, "H"],  "fHg" => [-15, "Hg"],  "fHz" => [-15, "Hz"],
+  "fJ" => [-15, "J"],  "fK" => [-15, "K"],  "fL" => [-15, "L"],
+  "fN" => [-15, "N"],  "fP" => [-15, "P"],  "fPa" => [-15, "Pa"],
+  "fS" => [-15, "S"],  "fSt" => [-15, "St"],  "fSv" => [-15, "Sv"],
+  "fT" => [-15, "T"],  "fV" => [-15, "V"],  "fW" => [-15, "W"],
+  "fWb" => [-15, "Wb"],  "fa" => [-15, "a"],  "fac" => [-15, "ac"],
+  "fahrenheits" => [0, "fahrenheit"],  "farads" => [0, "farad"],
+  "fatm" => [-15, "atm"],  "fbar" => [-15, "bar"],
+  "fcal" => [-15, "cal"],
+  "fconventional_mercury" => [-15, "conventional_mercury"],
+  "fd" => [-15, "d"],  "fdegC" => [-15, "degC"],
+  "fdegF" => [-15, "degF"],  "fdeg_C" => [-15, "deg_C"],
+  "fdeg_F" => [-15, "deg_F"],  "fdegreeC" => [-15, "degreeC"],
+  "fdegreeF" => [-15, "degreeF"],  "fdegree_C" => [-15, "degree_C"],
+  "fdegree_E" => [-15, "degree_E"],  "fdegree_F" => [-15, "degree_F"],
+  "fdegree_N" => [-15, "degree_N"],  "fdegree_R" => [-15, "degree_R"],
+  "fdegree_S" => [-15, "degree_S"],  "fdegree_W" => [-15, "degree_W"],
+  "fdegree_c" => [-15, "degree_c"],
+  "fdegree_east" => [-15, "degree_east"],
+  "fdegree_f" => [-15, "degree_f"],
+  "fdegree_north" => [-15, "degree_north"],
+  "fdegree_south" => [-15, "degree_south"],
+  "fdegree_west" => [-15, "degree_west"],
+  "fdegrees_east" => [-15, "degrees_east"],
+  "fdegrees_north" => [-15, "degrees_north"],
+  "fdegrees_south" => [-15, "degrees_south"],
+  "fdegrees_west" => [-15, "degrees_west"],  "fdyn" => [-15, "dyn"],
+  "femtoCelsius" => [-15, "Celsius"],
+  "femtoFahrenheit" => [-15, "Fahrenheit"],
+  "femtoJulian_year" => [-15, "Julian_year"],
+  "femtoPascal" => [-15, "Pascal"],  "femtoacre" => [-15, "acre"],
+  "femtoampere" => [-15, "ampere"],
+  "femtoangstrom" => [-15, "angstrom"],
+  "femtoangular_degree" => [-15, "angular_degree"],
+  "femtoangular_minute" => [-15, "angular_minute"],
+  "femtoangular_second" => [-15, "angular_second"],
+  "femtoare" => [-15, "are"],  "femtoatmosphere" => [-15, "atmosphere"],
+  "femtocalorie" => [-15, "calorie"],
+  "femtocelsius" => [-15, "celsius"],
+  "femtocentigrade" => [-15, "centigrade"],
+  "femtocentury" => [-15, "century"],  "femtochain" => [-15, "chain"],
+  "femtocommon_year" => [-15, "common_year"],
+  "femtocoulomb" => [-15, "coulomb"],  "femtoday" => [-15, "day"],
+  "femtodegK" => [-15, "degK"],  "femtodeg_K" => [-15, "deg_K"],
+  "femtodegree" => [-15, "degree"],  "femtodegreeK" => [-15, "degreeK"],
+  "femtodyne" => [-15, "dyne"],  "femtoerg" => [-15, "erg"],
+  "femtofahrenheit" => [-15, "fahrenheit"],
+  "femtofarad" => [-15, "farad"],  "femtofermi" => [-15, "fermi"],
+  "femtogal" => [-15, "gal"],  "femtogauss" => [-15, "gauss"],
+  "femtogram" => [-15, "gram"],  "femtohectare" => [-15, "hectare"],
+  "femtohertz" => [-15, "hertz"],  "femtohour" => [-15, "hour"],
+  "femtoinch" => [-15, "inch"],  "femtojoule" => [-15, "joule"],
+  "femtokelvin" => [-15, "kelvin"],
+  "femtokilogram" => [-15, "kilogram"],  "femtoknot" => [-15, "knot"],
+  "femtolitre" => [-15, "litre"],  "femtometer" => [-15, "meter"],
+  "femtometre" => [-15, "metre"],  "femtomicron" => [-15, "micron"],
+  "femtomile" => [-15, "mile"],  "femtomillibar" => [-15, "millibar"],
+  "femtominute" => [-15, "minute"],
+  "femtominute_angle" => [-15, "minute_angle"],
+  "femtomole" => [-15, "mole"],  "femtomonth" => [-15, "month"],
+  "femtonewton" => [-15, "newton"],  "femtoounce" => [-15, "ounce"],
+  "femtoparsec" => [-15, "parsec"],  "femtopascal" => [-15, "pascal"],
+  "femtopentad" => [-15, "pentad"],  "femtopoise" => [-15, "poise"],
+  "femtopound" => [-15, "pound"],  "femtoradian" => [-15, "radian"],
+  "femtosecond" => [-15, "second"],
+  "femtosecond_angle" => [-15, "second_angle"],
+  "femtosteradian" => [-15, "steradian"],
+  "femtostokes" => [-15, "stokes"],  "femtotesla" => [-15, "tesla"],
+  "femtoton" => [-15, "ton"],  "femtotonne" => [-15, "tonne"],
+  "femtotorr" => [-15, "torr"],  "femtovolt" => [-15, "volt"],
+  "femtowatt" => [-15, "watt"],  "femtoweber" => [-15, "weber"],
+  "femtoyard" => [-15, "yard"],  "femtoyd" => [-15, "yd"],
+  "femtoyear" => [-15, "year"],  "ferg" => [-15, "erg"],
+  "fermis" => [0, "fermi"],  "fforce" => [-15, "force"],
+  "fg" => [-15, "g"],  "fgravity" => [-15, "gravity"],
+  "fh" => [-15, "h"],  "fhg" => [-15, "hg"],  "fhr" => [-15, "hr"],
+  "fin" => [-15, "in"],  "fkg" => [-15, "kg"],  "fkgf" => [-15, "kgf"],
+  "fkph" => [-15, "kph"],  "flb" => [-15, "lb"],  "flm" => [-15, "lm"],
+  "flx" => [-15, "lx"],  "fly" => [-15, "ly"],  "fm" => [-15, "m"],
+  "fmb" => [-15, "mb"],  "fmercury" => [-15, "mercury"],
+  "fmgal" => [-15, "mgal"],  "fmin" => [-15, "min"],
+  "fmol" => [-15, "mol"],  "fmon" => [-15, "mon"],
+  "fmph" => [-15, "mph"],  "fohm" => [-15, "ohm"],
+  "foz" => [-15, "oz"],  "fpc" => [-15, "pc"],
+  "fpercent" => [-15, "percent"],  "fpermil" => [-15, "permil"],
+  "fpsi" => [-15, "psi"],  "frad" => [-15, "rad"],  "fs" => [-15, "s"],
+  "fsr" => [-15, "sr"],  "ft" => [-15, "t"],  "fyr" => [-15, "yr"],
+  "gals" => [0, "gal"],  "gausses" => [0, "gauss"],
+  "gigaCelsius" => [9, "Celsius"],
+  "gigaFahrenheit" => [9, "Fahrenheit"],
+  "gigaJulian_year" => [9, "Julian_year"],
+  "gigaPascal" => [9, "Pascal"],  "gigaacre" => [9, "acre"],
+  "gigaampere" => [9, "ampere"],  "gigaangstrom" => [9, "angstrom"],
+  "gigaangular_degree" => [9, "angular_degree"],
+  "gigaangular_minute" => [9, "angular_minute"],
+  "gigaangular_second" => [9, "angular_second"],
+  "gigaare" => [9, "are"],  "gigaatmosphere" => [9, "atmosphere"],
+  "gigacalorie" => [9, "calorie"],  "gigacelsius" => [9, "celsius"],
+  "gigacentigrade" => [9, "centigrade"],
+  "gigacentury" => [9, "century"],  "gigachain" => [9, "chain"],
+  "gigacommon_year" => [9, "common_year"],
+  "gigacoulomb" => [9, "coulomb"],  "gigaday" => [9, "day"],
+  "gigadegK" => [9, "degK"],  "gigadeg_K" => [9, "deg_K"],
+  "gigadegree" => [9, "degree"],  "gigadegreeK" => [9, "degreeK"],
+  "gigadyne" => [9, "dyne"],  "gigaerg" => [9, "erg"],
+  "gigafahrenheit" => [9, "fahrenheit"],  "gigafarad" => [9, "farad"],
+  "gigafermi" => [9, "fermi"],  "gigagal" => [9, "gal"],
+  "gigagauss" => [9, "gauss"],  "gigagram" => [9, "gram"],
+  "gigahectare" => [9, "hectare"],  "gigahertz" => [9, "hertz"],
+  "gigahour" => [9, "hour"],  "gigainch" => [9, "inch"],
+  "gigajoule" => [9, "joule"],  "gigakelvin" => [9, "kelvin"],
+  "gigakilogram" => [9, "kilogram"],  "gigaknot" => [9, "knot"],
+  "gigalitre" => [9, "litre"],  "gigameter" => [9, "meter"],
+  "gigametre" => [9, "metre"],  "gigamicron" => [9, "micron"],
+  "gigamile" => [9, "mile"],  "gigamillibar" => [9, "millibar"],
+  "gigaminute" => [9, "minute"],
+  "gigaminute_angle" => [9, "minute_angle"],  "gigamole" => [9, "mole"],
+  "gigamonth" => [9, "month"],  "giganewton" => [9, "newton"],
+  "gigaounce" => [9, "ounce"],  "gigaparsec" => [9, "parsec"],
+  "gigapascal" => [9, "pascal"],  "gigapentad" => [9, "pentad"],
+  "gigapoise" => [9, "poise"],  "gigapound" => [9, "pound"],
+  "gigaradian" => [9, "radian"],  "gigasecond" => [9, "second"],
+  "gigasecond_angle" => [9, "second_angle"],
+  "gigasteradian" => [9, "steradian"],  "gigastokes" => [9, "stokes"],
+  "gigatesla" => [9, "tesla"],  "gigaton" => [9, "ton"],
+  "gigatonne" => [9, "tonne"],  "gigatorr" => [9, "torr"],
+  "gigavolt" => [9, "volt"],  "gigawatt" => [9, "watt"],
+  "gigaweber" => [9, "weber"],  "gigayard" => [9, "yard"],
+  "gigayd" => [9, "yd"],  "gigayear" => [9, "year"],
+  "grams" => [0, "gram"],  "h%" => [2, "%"],  "hA" => [2, "A"],
+  "hAu" => [2, "Au"],  "hBq" => [2, "Bq"],  "hC" => [2, "C"],
+  "hF" => [2, "F"],  "hG" => [2, "G"],  "hGal" => [2, "Gal"],
+  "hGy" => [2, "Gy"],  "hH" => [2, "H"],  "hHg" => [2, "Hg"],
+  "hHz" => [2, "Hz"],  "hJ" => [2, "J"],  "hK" => [2, "K"],
+  "hL" => [2, "L"],  "hN" => [2, "N"],  "hP" => [2, "P"],
+  "hPa" => [2, "Pa"],  "hS" => [2, "S"],  "hSt" => [2, "St"],
+  "hSv" => [2, "Sv"],  "hT" => [2, "T"],  "hV" => [2, "V"],
+  "hW" => [2, "W"],  "hWb" => [2, "Wb"],  "ha" => [2, "a"],
+  "hac" => [2, "ac"],  "hatm" => [2, "atm"],  "hbar" => [2, "bar"],
+  "hcal" => [2, "cal"],
+  "hconventional_mercury" => [2, "conventional_mercury"],
+  "hd" => [2, "d"],  "hdegC" => [2, "degC"],  "hdegF" => [2, "degF"],
+  "hdeg_C" => [2, "deg_C"],  "hdeg_F" => [2, "deg_F"],
+  "hdegreeC" => [2, "degreeC"],  "hdegreeF" => [2, "degreeF"],
+  "hdegree_C" => [2, "degree_C"],  "hdegree_E" => [2, "degree_E"],
+  "hdegree_F" => [2, "degree_F"],  "hdegree_N" => [2, "degree_N"],
+  "hdegree_R" => [2, "degree_R"],  "hdegree_S" => [2, "degree_S"],
+  "hdegree_W" => [2, "degree_W"],  "hdegree_c" => [2, "degree_c"],
+  "hdegree_east" => [2, "degree_east"],  "hdegree_f" => [2, "degree_f"],
+  "hdegree_north" => [2, "degree_north"],
+  "hdegree_south" => [2, "degree_south"],
+  "hdegree_west" => [2, "degree_west"],
+  "hdegrees_east" => [2, "degrees_east"],
+  "hdegrees_north" => [2, "degrees_north"],
+  "hdegrees_south" => [2, "degrees_south"],
+  "hdegrees_west" => [2, "degrees_west"],  "hdyn" => [2, "dyn"],
+  "hectares" => [0, "hectare"],  "hectoCelsius" => [2, "Celsius"],
+  "hectoFahrenheit" => [2, "Fahrenheit"],
+  "hectoJulian_year" => [2, "Julian_year"],
+  "hectoPascal" => [2, "Pascal"],  "hectoacre" => [2, "acre"],
+  "hectoampere" => [2, "ampere"],  "hectoangstrom" => [2, "angstrom"],
+  "hectoangular_degree" => [2, "angular_degree"],
+  "hectoangular_minute" => [2, "angular_minute"],
+  "hectoangular_second" => [2, "angular_second"],
+  "hectoare" => [2, "are"],  "hectoatmosphere" => [2, "atmosphere"],
+  "hectocalorie" => [2, "calorie"],  "hectocelsius" => [2, "celsius"],
+  "hectocentigrade" => [2, "centigrade"],
+  "hectocentury" => [2, "century"],  "hectochain" => [2, "chain"],
+  "hectocommon_year" => [2, "common_year"],
+  "hectocoulomb" => [2, "coulomb"],  "hectoday" => [2, "day"],
+  "hectodegK" => [2, "degK"],  "hectodeg_K" => [2, "deg_K"],
+  "hectodegree" => [2, "degree"],  "hectodegreeK" => [2, "degreeK"],
+  "hectodyne" => [2, "dyne"],  "hectoerg" => [2, "erg"],
+  "hectofahrenheit" => [2, "fahrenheit"],  "hectofarad" => [2, "farad"],
+  "hectofermi" => [2, "fermi"],  "hectogal" => [2, "gal"],
+  "hectogauss" => [2, "gauss"],  "hectogram" => [2, "gram"],
+  "hectohectare" => [2, "hectare"],  "hectohertz" => [2, "hertz"],
+  "hectohour" => [2, "hour"],  "hectoinch" => [2, "inch"],
+  "hectojoule" => [2, "joule"],  "hectokelvin" => [2, "kelvin"],
+  "hectokilogram" => [2, "kilogram"],  "hectoknot" => [2, "knot"],
+  "hectolitre" => [2, "litre"],  "hectometer" => [2, "meter"],
+  "hectometre" => [2, "metre"],  "hectomicron" => [2, "micron"],
+  "hectomile" => [2, "mile"],  "hectomillibar" => [2, "millibar"],
+  "hectominute" => [2, "minute"],
+  "hectominute_angle" => [2, "minute_angle"],
+  "hectomole" => [2, "mole"],  "hectomonth" => [2, "month"],
+  "hectonewton" => [2, "newton"],  "hectoounce" => [2, "ounce"],
+  "hectoparsec" => [2, "parsec"],  "hectopascal" => [2, "pascal"],
+  "hectopentad" => [2, "pentad"],  "hectopoise" => [2, "poise"],
+  "hectopound" => [2, "pound"],  "hectoradian" => [2, "radian"],
+  "hectosecond" => [2, "second"],
+  "hectosecond_angle" => [2, "second_angle"],
+  "hectosteradian" => [2, "steradian"],  "hectostokes" => [2, "stokes"],
+  "hectotesla" => [2, "tesla"],  "hectoton" => [2, "ton"],
+  "hectotonne" => [2, "tonne"],  "hectotorr" => [2, "torr"],
+  "hectovolt" => [2, "volt"],  "hectowatt" => [2, "watt"],
+  "hectoweber" => [2, "weber"],  "hectoyard" => [2, "yard"],
+  "hectoyd" => [2, "yd"],  "hectoyear" => [2, "year"],
+  "herg" => [2, "erg"],  "hertzes" => [0, "hertz"],
+  "hforce" => [2, "force"],  "hg" => [2, "g"],
+  "hgravity" => [2, "gravity"],  "hh" => [2, "h"],  "hhg" => [2, "hg"],
+  "hhr" => [2, "hr"],  "hin" => [2, "in"],  "hkg" => [2, "kg"],
+  "hkgf" => [2, "kgf"],  "hkph" => [2, "kph"],  "hlb" => [2, "lb"],
+  "hlm" => [2, "lm"],  "hlx" => [2, "lx"],  "hly" => [2, "ly"],
+  "hm" => [2, "m"],  "hmb" => [2, "mb"],  "hmercury" => [2, "mercury"],
+  "hmgal" => [2, "mgal"],  "hmin" => [2, "min"],  "hmol" => [2, "mol"],
+  "hmon" => [2, "mon"],  "hmph" => [2, "mph"],  "hohm" => [2, "ohm"],
+  "hours" => [0, "hour"],  "hoz" => [2, "oz"],  "hpc" => [2, "pc"],
+  "hpercent" => [2, "percent"],  "hpermil" => [2, "permil"],
+  "hpsi" => [2, "psi"],  "hrad" => [2, "rad"],  "hs" => [2, "s"],
+  "hsr" => [2, "sr"],  "ht" => [2, "t"],  "hyr" => [2, "yr"],
+  "inchs" => [0, "inch"],  "joules" => [0, "joule"],  "k%" => [3, "%"],
+  "kA" => [3, "A"],  "kAu" => [3, "Au"],  "kBq" => [3, "Bq"],
+  "kC" => [3, "C"],  "kF" => [3, "F"],  "kG" => [3, "G"],
+  "kGal" => [3, "Gal"],  "kGy" => [3, "Gy"],  "kH" => [3, "H"],
+  "kHg" => [3, "Hg"],  "kHz" => [3, "Hz"],  "kJ" => [3, "J"],
+  "kK" => [3, "K"],  "kL" => [3, "L"],  "kN" => [3, "N"],
+  "kP" => [3, "P"],  "kPa" => [3, "Pa"],  "kS" => [3, "S"],
+  "kSt" => [3, "St"],  "kSv" => [3, "Sv"],  "kT" => [3, "T"],
+  "kV" => [3, "V"],  "kW" => [3, "W"],  "kWb" => [3, "Wb"],
+  "ka" => [3, "a"],  "kac" => [3, "ac"],  "katm" => [3, "atm"],
+  "kbar" => [3, "bar"],  "kcal" => [3, "cal"],
+  "kconventional_mercury" => [3, "conventional_mercury"],
+  "kd" => [3, "d"],  "kdegC" => [3, "degC"],  "kdegF" => [3, "degF"],
+  "kdeg_C" => [3, "deg_C"],  "kdeg_F" => [3, "deg_F"],
+  "kdegreeC" => [3, "degreeC"],  "kdegreeF" => [3, "degreeF"],
+  "kdegree_C" => [3, "degree_C"],  "kdegree_E" => [3, "degree_E"],
+  "kdegree_F" => [3, "degree_F"],  "kdegree_N" => [3, "degree_N"],
+  "kdegree_R" => [3, "degree_R"],  "kdegree_S" => [3, "degree_S"],
+  "kdegree_W" => [3, "degree_W"],  "kdegree_c" => [3, "degree_c"],
+  "kdegree_east" => [3, "degree_east"],  "kdegree_f" => [3, "degree_f"],
+  "kdegree_north" => [3, "degree_north"],
+  "kdegree_south" => [3, "degree_south"],
+  "kdegree_west" => [3, "degree_west"],
+  "kdegrees_east" => [3, "degrees_east"],
+  "kdegrees_north" => [3, "degrees_north"],
+  "kdegrees_south" => [3, "degrees_south"],
+  "kdegrees_west" => [3, "degrees_west"],  "kdyn" => [3, "dyn"],
+  "kelvins" => [0, "kelvin"],  "kerg" => [3, "erg"],
+  "kforce" => [3, "force"],  "kgravity" => [3, "gravity"],
+  "kh" => [3, "h"],  "khg" => [3, "hg"],  "khr" => [3, "hr"],
+  "kiloCelsius" => [3, "Celsius"],
+  "kiloFahrenheit" => [3, "Fahrenheit"],
+  "kiloJulian_year" => [3, "Julian_year"],
+  "kiloPascal" => [3, "Pascal"],  "kiloacre" => [3, "acre"],
+  "kiloampere" => [3, "ampere"],  "kiloangstrom" => [3, "angstrom"],
+  "kiloangular_degree" => [3, "angular_degree"],
+  "kiloangular_minute" => [3, "angular_minute"],
+  "kiloangular_second" => [3, "angular_second"],
+  "kiloare" => [3, "are"],  "kiloatmosphere" => [3, "atmosphere"],
+  "kilocalorie" => [3, "calorie"],  "kilocelsius" => [3, "celsius"],
+  "kilocentigrade" => [3, "centigrade"],
+  "kilocentury" => [3, "century"],  "kilochain" => [3, "chain"],
+  "kilocommon_year" => [3, "common_year"],
+  "kilocoulomb" => [3, "coulomb"],  "kiloday" => [3, "day"],
+  "kilodegK" => [3, "degK"],  "kilodeg_K" => [3, "deg_K"],
+  "kilodegree" => [3, "degree"],  "kilodegreeK" => [3, "degreeK"],
+  "kilodyne" => [3, "dyne"],  "kiloerg" => [3, "erg"],
+  "kilofahrenheit" => [3, "fahrenheit"],  "kilofarad" => [3, "farad"],
+  "kilofermi" => [3, "fermi"],  "kilogal" => [3, "gal"],
+  "kilogauss" => [3, "gauss"],  "kilogram" => [3, "gram"],
+  "kilograms" => [0, "kilogram"],  "kilohectare" => [3, "hectare"],
+  "kilohertz" => [3, "hertz"],  "kilohour" => [3, "hour"],
+  "kiloinch" => [3, "inch"],  "kilojoule" => [3, "joule"],
+  "kilokelvin" => [3, "kelvin"],  "kilokilogram" => [3, "kilogram"],
+  "kiloknot" => [3, "knot"],  "kilolitre" => [3, "litre"],
+  "kilometer" => [3, "meter"],  "kilometre" => [3, "metre"],
+  "kilomicron" => [3, "micron"],  "kilomile" => [3, "mile"],
+  "kilomillibar" => [3, "millibar"],  "kilominute" => [3, "minute"],
+  "kilominute_angle" => [3, "minute_angle"],  "kilomole" => [3, "mole"],
+  "kilomonth" => [3, "month"],  "kilonewton" => [3, "newton"],
+  "kiloounce" => [3, "ounce"],  "kiloparsec" => [3, "parsec"],
+  "kilopascal" => [3, "pascal"],  "kilopentad" => [3, "pentad"],
+  "kilopoise" => [3, "poise"],  "kilopound" => [3, "pound"],
+  "kiloradian" => [3, "radian"],  "kilosecond" => [3, "second"],
+  "kilosecond_angle" => [3, "second_angle"],
+  "kilosteradian" => [3, "steradian"],  "kilostokes" => [3, "stokes"],
+  "kilotesla" => [3, "tesla"],  "kiloton" => [3, "ton"],
+  "kilotonne" => [3, "tonne"],  "kilotorr" => [3, "torr"],
+  "kilovolt" => [3, "volt"],  "kilowatt" => [3, "watt"],
+  "kiloweber" => [3, "weber"],  "kiloyard" => [3, "yard"],
+  "kiloyd" => [3, "yd"],  "kiloyear" => [3, "year"],
+  "kin" => [3, "in"],  "kkg" => [3, "kg"],  "kkgf" => [3, "kgf"],
+  "kkph" => [3, "kph"],  "klb" => [3, "lb"],  "klm" => [3, "lm"],
+  "klx" => [3, "lx"],  "kly" => [3, "ly"],  "km" => [3, "m"],
+  "kmb" => [3, "mb"],  "kmercury" => [3, "mercury"],
+  "kmgal" => [3, "mgal"],  "kmin" => [3, "min"],  "kmol" => [3, "mol"],
+  "kmon" => [3, "mon"],  "kmph" => [3, "mph"],  "knots" => [0, "knot"],
+  "kohm" => [3, "ohm"],  "koz" => [3, "oz"],  "kpc" => [3, "pc"],
+  "kpercent" => [3, "percent"],  "kpermil" => [3, "permil"],
+  "kpsi" => [3, "psi"],  "krad" => [3, "rad"],  "ks" => [3, "s"],
+  "ksr" => [3, "sr"],  "kt" => [3, "t"],  "kyr" => [3, "yr"],
+  "litres" => [0, "litre"],  "m%" => [-3, "%"],  "mA" => [-3, "A"],
+  "mAu" => [-3, "Au"],  "mBq" => [-3, "Bq"],  "mC" => [-3, "C"],
+  "mF" => [-3, "F"],  "mG" => [-3, "G"],  "mGal" => [-3, "Gal"],
+  "mGy" => [-3, "Gy"],  "mH" => [-3, "H"],  "mHg" => [-3, "Hg"],
+  "mHz" => [-3, "Hz"],  "mJ" => [-3, "J"],  "mK" => [-3, "K"],
+  "mL" => [-3, "L"],  "mN" => [-3, "N"],  "mP" => [-3, "P"],
+  "mPa" => [-3, "Pa"],  "mS" => [-3, "S"],  "mSt" => [-3, "St"],
+  "mSv" => [-3, "Sv"],  "mT" => [-3, "T"],  "mV" => [-3, "V"],
+  "mW" => [-3, "W"],  "mWb" => [-3, "Wb"],  "ma" => [-3, "a"],
+  "mac" => [-3, "ac"],  "matm" => [-3, "atm"],  "mbar" => [-3, "bar"],
+  "mcal" => [-3, "cal"],
+  "mconventional_mercury" => [-3, "conventional_mercury"],
+  "md" => [-3, "d"],  "mdegC" => [-3, "degC"],  "mdegF" => [-3, "degF"],
+  "mdeg_C" => [-3, "deg_C"],  "mdeg_F" => [-3, "deg_F"],
+  "mdegreeC" => [-3, "degreeC"],  "mdegreeF" => [-3, "degreeF"],
+  "mdegree_C" => [-3, "degree_C"],  "mdegree_E" => [-3, "degree_E"],
+  "mdegree_F" => [-3, "degree_F"],  "mdegree_N" => [-3, "degree_N"],
+  "mdegree_R" => [-3, "degree_R"],  "mdegree_S" => [-3, "degree_S"],
+  "mdegree_W" => [-3, "degree_W"],  "mdegree_c" => [-3, "degree_c"],
+  "mdegree_east" => [-3, "degree_east"],
+  "mdegree_f" => [-3, "degree_f"],
+  "mdegree_north" => [-3, "degree_north"],
+  "mdegree_south" => [-3, "degree_south"],
+  "mdegree_west" => [-3, "degree_west"],
+  "mdegrees_east" => [-3, "degrees_east"],
+  "mdegrees_north" => [-3, "degrees_north"],
+  "mdegrees_south" => [-3, "degrees_south"],
+  "mdegrees_west" => [-3, "degrees_west"],  "mdyn" => [-3, "dyn"],
+  "megaCelsius" => [6, "Celsius"],
+  "megaFahrenheit" => [6, "Fahrenheit"],
+  "megaJulian_year" => [6, "Julian_year"],
+  "megaPascal" => [6, "Pascal"],  "megaacre" => [6, "acre"],
+  "megaampere" => [6, "ampere"],  "megaangstrom" => [6, "angstrom"],
+  "megaangular_degree" => [6, "angular_degree"],
+  "megaangular_minute" => [6, "angular_minute"],
+  "megaangular_second" => [6, "angular_second"],
+  "megaare" => [6, "are"],  "megaatmosphere" => [6, "atmosphere"],
+  "megacalorie" => [6, "calorie"],  "megacelsius" => [6, "celsius"],
+  "megacentigrade" => [6, "centigrade"],
+  "megacentury" => [6, "century"],  "megachain" => [6, "chain"],
+  "megacommon_year" => [6, "common_year"],
+  "megacoulomb" => [6, "coulomb"],  "megaday" => [6, "day"],
+  "megadegK" => [6, "degK"],  "megadeg_K" => [6, "deg_K"],
+  "megadegree" => [6, "degree"],  "megadegreeK" => [6, "degreeK"],
+  "megadyne" => [6, "dyne"],  "megaerg" => [6, "erg"],
+  "megafahrenheit" => [6, "fahrenheit"],  "megafarad" => [6, "farad"],
+  "megafermi" => [6, "fermi"],  "megagal" => [6, "gal"],
+  "megagauss" => [6, "gauss"],  "megagram" => [6, "gram"],
+  "megahectare" => [6, "hectare"],  "megahertz" => [6, "hertz"],
+  "megahour" => [6, "hour"],  "megainch" => [6, "inch"],
+  "megajoule" => [6, "joule"],  "megakelvin" => [6, "kelvin"],
+  "megakilogram" => [6, "kilogram"],  "megaknot" => [6, "knot"],
+  "megalitre" => [6, "litre"],  "megameter" => [6, "meter"],
+  "megametre" => [6, "metre"],  "megamicron" => [6, "micron"],
+  "megamile" => [6, "mile"],  "megamillibar" => [6, "millibar"],
+  "megaminute" => [6, "minute"],
+  "megaminute_angle" => [6, "minute_angle"],  "megamole" => [6, "mole"],
+  "megamonth" => [6, "month"],  "meganewton" => [6, "newton"],
+  "megaounce" => [6, "ounce"],  "megaparsec" => [6, "parsec"],
+  "megapascal" => [6, "pascal"],  "megapentad" => [6, "pentad"],
+  "megapoise" => [6, "poise"],  "megapound" => [6, "pound"],
+  "megaradian" => [6, "radian"],  "megasecond" => [6, "second"],
+  "megasecond_angle" => [6, "second_angle"],
+  "megasteradian" => [6, "steradian"],  "megastokes" => [6, "stokes"],
+  "megatesla" => [6, "tesla"],  "megaton" => [6, "ton"],
+  "megatonne" => [6, "tonne"],  "megatorr" => [6, "torr"],
+  "megavolt" => [6, "volt"],  "megawatt" => [6, "watt"],
+  "megaweber" => [6, "weber"],  "megayard" => [6, "yard"],
+  "megayd" => [6, "yd"],  "megayear" => [6, "year"],
+  "merg" => [-3, "erg"],  "meters" => [0, "meter"],
+  "metres" => [0, "metre"],  "mforce" => [-3, "force"],
+  "mg" => [-3, "g"],  "mgravity" => [-3, "gravity"],  "mh" => [-3, "h"],
+  "mhg" => [-3, "hg"],  "mhr" => [-3, "hr"],
+  "microCelsius" => [-6, "Celsius"],
+  "microFahrenheit" => [-6, "Fahrenheit"],
+  "microJulian_year" => [-6, "Julian_year"],
+  "microPascal" => [-6, "Pascal"],  "microacre" => [-6, "acre"],
+  "microampere" => [-6, "ampere"],  "microangstrom" => [-6, "angstrom"],
+  "microangular_degree" => [-6, "angular_degree"],
+  "microangular_minute" => [-6, "angular_minute"],
+  "microangular_second" => [-6, "angular_second"],
+  "microare" => [-6, "are"],  "microatmosphere" => [-6, "atmosphere"],
+  "microcalorie" => [-6, "calorie"],  "microcelsius" => [-6, "celsius"],
+  "microcentigrade" => [-6, "centigrade"],
+  "microcentury" => [-6, "century"],  "microchain" => [-6, "chain"],
+  "microcommon_year" => [-6, "common_year"],
+  "microcoulomb" => [-6, "coulomb"],  "microday" => [-6, "day"],
+  "microdegK" => [-6, "degK"],  "microdeg_K" => [-6, "deg_K"],
+  "microdegree" => [-6, "degree"],  "microdegreeK" => [-6, "degreeK"],
+  "microdyne" => [-6, "dyne"],  "microerg" => [-6, "erg"],
+  "microfahrenheit" => [-6, "fahrenheit"],
+  "microfarad" => [-6, "farad"],  "microfermi" => [-6, "fermi"],
+  "microgal" => [-6, "gal"],  "microgauss" => [-6, "gauss"],
+  "microgram" => [-6, "gram"],  "microhectare" => [-6, "hectare"],
+  "microhertz" => [-6, "hertz"],  "microhour" => [-6, "hour"],
+  "microinch" => [-6, "inch"],  "microjoule" => [-6, "joule"],
+  "microkelvin" => [-6, "kelvin"],  "microkilogram" => [-6, "kilogram"],
+  "microknot" => [-6, "knot"],  "microlitre" => [-6, "litre"],
+  "micrometer" => [-6, "meter"],  "micrometre" => [-6, "metre"],
+  "micromicron" => [-6, "micron"],  "micromile" => [-6, "mile"],
+  "micromillibar" => [-6, "millibar"],  "microminute" => [-6, "minute"],
+  "microminute_angle" => [-6, "minute_angle"],
+  "micromole" => [-6, "mole"],  "micromonth" => [-6, "month"],
+  "micronewton" => [-6, "newton"],  "microns" => [0, "micron"],
+  "microounce" => [-6, "ounce"],  "microparsec" => [-6, "parsec"],
+  "micropascal" => [-6, "pascal"],  "micropentad" => [-6, "pentad"],
+  "micropoise" => [-6, "poise"],  "micropound" => [-6, "pound"],
+  "microradian" => [-6, "radian"],  "microsecond" => [-6, "second"],
+  "microsecond_angle" => [-6, "second_angle"],
+  "microsteradian" => [-6, "steradian"],
+  "microstokes" => [-6, "stokes"],  "microtesla" => [-6, "tesla"],
+  "microton" => [-6, "ton"],  "microtonne" => [-6, "tonne"],
+  "microtorr" => [-6, "torr"],  "microvolt" => [-6, "volt"],
+  "microwatt" => [-6, "watt"],  "microweber" => [-6, "weber"],
+  "microyard" => [-6, "yard"],  "microyd" => [-6, "yd"],
+  "microyear" => [-6, "year"],  "miles" => [0, "mile"],
+  "milliCelsius" => [-3, "Celsius"],
+  "milliFahrenheit" => [-3, "Fahrenheit"],
+  "milliJulian_year" => [-3, "Julian_year"],
+  "milliPascal" => [-3, "Pascal"],  "milliacre" => [-3, "acre"],
+  "milliampere" => [-3, "ampere"],  "milliangstrom" => [-3, "angstrom"],
+  "milliangular_degree" => [-3, "angular_degree"],
+  "milliangular_minute" => [-3, "angular_minute"],
+  "milliangular_second" => [-3, "angular_second"],
+  "milliare" => [-3, "are"],  "milliatmosphere" => [-3, "atmosphere"],
+  "millibars" => [0, "millibar"],  "millicalorie" => [-3, "calorie"],
+  "millicelsius" => [-3, "celsius"],
+  "millicentigrade" => [-3, "centigrade"],
+  "millicentury" => [-3, "century"],  "millichain" => [-3, "chain"],
+  "millicommon_year" => [-3, "common_year"],
+  "millicoulomb" => [-3, "coulomb"],  "milliday" => [-3, "day"],
+  "millidegK" => [-3, "degK"],  "millideg_K" => [-3, "deg_K"],
+  "millidegree" => [-3, "degree"],  "millidegreeK" => [-3, "degreeK"],
+  "millidyne" => [-3, "dyne"],  "millierg" => [-3, "erg"],
+  "millifahrenheit" => [-3, "fahrenheit"],
+  "millifarad" => [-3, "farad"],  "millifermi" => [-3, "fermi"],
+  "milligal" => [-3, "gal"],  "milligauss" => [-3, "gauss"],
+  "milligram" => [-3, "gram"],  "millihectare" => [-3, "hectare"],
+  "millihertz" => [-3, "hertz"],  "millihour" => [-3, "hour"],
+  "milliinch" => [-3, "inch"],  "millijoule" => [-3, "joule"],
+  "millikelvin" => [-3, "kelvin"],  "millikilogram" => [-3, "kilogram"],
+  "milliknot" => [-3, "knot"],  "millilitre" => [-3, "litre"],
+  "millimeter" => [-3, "meter"],  "millimetre" => [-3, "metre"],
+  "millimicron" => [-3, "micron"],  "millimile" => [-3, "mile"],
+  "millimillibar" => [-3, "millibar"],  "milliminute" => [-3, "minute"],
+  "milliminute_angle" => [-3, "minute_angle"],
+  "millimole" => [-3, "mole"],  "millimonth" => [-3, "month"],
+  "millinewton" => [-3, "newton"],  "milliounce" => [-3, "ounce"],
+  "milliparsec" => [-3, "parsec"],  "millipascal" => [-3, "pascal"],
+  "millipentad" => [-3, "pentad"],  "millipoise" => [-3, "poise"],
+  "millipound" => [-3, "pound"],  "milliradian" => [-3, "radian"],
+  "millisecond" => [-3, "second"],
+  "millisecond_angle" => [-3, "second_angle"],
+  "millisteradian" => [-3, "steradian"],
+  "millistokes" => [-3, "stokes"],  "millitesla" => [-3, "tesla"],
+  "milliton" => [-3, "ton"],  "millitonne" => [-3, "tonne"],
+  "millitorr" => [-3, "torr"],  "millivolt" => [-3, "volt"],
+  "milliwatt" => [-3, "watt"],  "milliweber" => [-3, "weber"],
+  "milliyard" => [-3, "yard"],  "milliyd" => [-3, "yd"],
+  "milliyear" => [-3, "year"],  "min" => [-3, "in"],
+  "minutes" => [0, "minute"],  "minutes_angle" => [0, "minute_angle"],
+  "mkg" => [-3, "kg"],  "mkgf" => [-3, "kgf"],  "mkph" => [-3, "kph"],
+  "mlb" => [-3, "lb"],  "mlm" => [-3, "lm"],  "mlx" => [-3, "lx"],
+  "mly" => [-3, "ly"],  "mm" => [-3, "m"],  "mmb" => [-3, "mb"],
+  "mmercury" => [-3, "mercury"],  "mmgal" => [-3, "mgal"],
+  "mmin" => [-3, "min"],  "mmol" => [-3, "mol"],  "mmon" => [-3, "mon"],
+  "mmph" => [-3, "mph"],  "mohm" => [-3, "ohm"],
+  "moles" => [0, "mole"],  "months" => [0, "month"],
+  "moz" => [-3, "oz"],  "mpc" => [-3, "pc"],
+  "mpercent" => [-3, "percent"],  "mpermil" => [-3, "permil"],
+  "mpsi" => [-3, "psi"],  "mrad" => [-3, "rad"],  "ms" => [-3, "s"],
+  "msr" => [-3, "sr"],  "mt" => [-3, "t"],  "myr" => [-3, "yr"],
+  "n%" => [-9, "%"],  "nA" => [-9, "A"],  "nAu" => [-9, "Au"],
+  "nBq" => [-9, "Bq"],  "nC" => [-9, "C"],  "nF" => [-9, "F"],
+  "nG" => [-9, "G"],  "nGal" => [-9, "Gal"],  "nGy" => [-9, "Gy"],
+  "nH" => [-9, "H"],  "nHg" => [-9, "Hg"],  "nHz" => [-9, "Hz"],
+  "nJ" => [-9, "J"],  "nK" => [-9, "K"],  "nL" => [-9, "L"],
+  "nN" => [-9, "N"],  "nP" => [-9, "P"],  "nPa" => [-9, "Pa"],
+  "nS" => [-9, "S"],  "nSt" => [-9, "St"],  "nSv" => [-9, "Sv"],
+  "nT" => [-9, "T"],  "nV" => [-9, "V"],  "nW" => [-9, "W"],
+  "nWb" => [-9, "Wb"],  "na" => [-9, "a"],  "nac" => [-9, "ac"],
+  "nanoCelsius" => [-9, "Celsius"],
+  "nanoFahrenheit" => [-9, "Fahrenheit"],
+  "nanoJulian_year" => [-9, "Julian_year"],
+  "nanoPascal" => [-9, "Pascal"],  "nanoacre" => [-9, "acre"],
+  "nanoampere" => [-9, "ampere"],  "nanoangstrom" => [-9, "angstrom"],
+  "nanoangular_degree" => [-9, "angular_degree"],
+  "nanoangular_minute" => [-9, "angular_minute"],
+  "nanoangular_second" => [-9, "angular_second"],
+  "nanoare" => [-9, "are"],  "nanoatmosphere" => [-9, "atmosphere"],
+  "nanocalorie" => [-9, "calorie"],  "nanocelsius" => [-9, "celsius"],
+  "nanocentigrade" => [-9, "centigrade"],
+  "nanocentury" => [-9, "century"],  "nanochain" => [-9, "chain"],
+  "nanocommon_year" => [-9, "common_year"],
+  "nanocoulomb" => [-9, "coulomb"],  "nanoday" => [-9, "day"],
+  "nanodegK" => [-9, "degK"],  "nanodeg_K" => [-9, "deg_K"],
+  "nanodegree" => [-9, "degree"],  "nanodegreeK" => [-9, "degreeK"],
+  "nanodyne" => [-9, "dyne"],  "nanoerg" => [-9, "erg"],
+  "nanofahrenheit" => [-9, "fahrenheit"],  "nanofarad" => [-9, "farad"],
+  "nanofermi" => [-9, "fermi"],  "nanogal" => [-9, "gal"],
+  "nanogauss" => [-9, "gauss"],  "nanogram" => [-9, "gram"],
+  "nanohectare" => [-9, "hectare"],  "nanohertz" => [-9, "hertz"],
+  "nanohour" => [-9, "hour"],  "nanoinch" => [-9, "inch"],
+  "nanojoule" => [-9, "joule"],  "nanokelvin" => [-9, "kelvin"],
+  "nanokilogram" => [-9, "kilogram"],  "nanoknot" => [-9, "knot"],
+  "nanolitre" => [-9, "litre"],  "nanometer" => [-9, "meter"],
+  "nanometre" => [-9, "metre"],  "nanomicron" => [-9, "micron"],
+  "nanomile" => [-9, "mile"],  "nanomillibar" => [-9, "millibar"],
+  "nanominute" => [-9, "minute"],
+  "nanominute_angle" => [-9, "minute_angle"],
+  "nanomole" => [-9, "mole"],  "nanomonth" => [-9, "month"],
+  "nanonewton" => [-9, "newton"],  "nanoounce" => [-9, "ounce"],
+  "nanoparsec" => [-9, "parsec"],  "nanopascal" => [-9, "pascal"],
+  "nanopentad" => [-9, "pentad"],  "nanopoise" => [-9, "poise"],
+  "nanopound" => [-9, "pound"],  "nanoradian" => [-9, "radian"],
+  "nanosecond" => [-9, "second"],
+  "nanosecond_angle" => [-9, "second_angle"],
+  "nanosteradian" => [-9, "steradian"],  "nanostokes" => [-9, "stokes"],
+  "nanotesla" => [-9, "tesla"],  "nanoton" => [-9, "ton"],
+  "nanotonne" => [-9, "tonne"],  "nanotorr" => [-9, "torr"],
+  "nanovolt" => [-9, "volt"],  "nanowatt" => [-9, "watt"],
+  "nanoweber" => [-9, "weber"],  "nanoyard" => [-9, "yard"],
+  "nanoyd" => [-9, "yd"],  "nanoyear" => [-9, "year"],
+  "natm" => [-9, "atm"],  "nbar" => [-9, "bar"],  "ncal" => [-9, "cal"],
+  "nconventional_mercury" => [-9, "conventional_mercury"],
+  "nd" => [-9, "d"],  "ndegC" => [-9, "degC"],  "ndegF" => [-9, "degF"],
+  "ndeg_C" => [-9, "deg_C"],  "ndeg_F" => [-9, "deg_F"],
+  "ndegreeC" => [-9, "degreeC"],  "ndegreeF" => [-9, "degreeF"],
+  "ndegree_C" => [-9, "degree_C"],  "ndegree_E" => [-9, "degree_E"],
+  "ndegree_F" => [-9, "degree_F"],  "ndegree_N" => [-9, "degree_N"],
+  "ndegree_R" => [-9, "degree_R"],  "ndegree_S" => [-9, "degree_S"],
+  "ndegree_W" => [-9, "degree_W"],  "ndegree_c" => [-9, "degree_c"],
+  "ndegree_east" => [-9, "degree_east"],
+  "ndegree_f" => [-9, "degree_f"],
+  "ndegree_north" => [-9, "degree_north"],
+  "ndegree_south" => [-9, "degree_south"],
+  "ndegree_west" => [-9, "degree_west"],
+  "ndegrees_east" => [-9, "degrees_east"],
+  "ndegrees_north" => [-9, "degrees_north"],
+  "ndegrees_south" => [-9, "degrees_south"],
+  "ndegrees_west" => [-9, "degrees_west"],  "ndyn" => [-9, "dyn"],
+  "nerg" => [-9, "erg"],  "newtons" => [0, "newton"],
+  "nforce" => [-9, "force"],  "ng" => [-9, "g"],
+  "ngravity" => [-9, "gravity"],  "nh" => [-9, "h"],
+  "nhg" => [-9, "hg"],  "nhr" => [-9, "hr"],  "nin" => [-9, "in"],
+  "nkg" => [-9, "kg"],  "nkgf" => [-9, "kgf"],  "nkph" => [-9, "kph"],
+  "nlb" => [-9, "lb"],  "nlm" => [-9, "lm"],  "nlx" => [-9, "lx"],
+  "nly" => [-9, "ly"],  "nm" => [-9, "m"],  "nmb" => [-9, "mb"],
+  "nmercury" => [-9, "mercury"],  "nmgal" => [-9, "mgal"],
+  "nmin" => [-9, "min"],  "nmol" => [-9, "mol"],  "nmon" => [-9, "mon"],
+  "nmph" => [-9, "mph"],  "nohm" => [-9, "ohm"],  "noz" => [-9, "oz"],
+  "npc" => [-9, "pc"],  "npercent" => [-9, "percent"],
+  "npermil" => [-9, "permil"],  "npsi" => [-9, "psi"],
+  "nrad" => [-9, "rad"],  "ns" => [-9, "s"],  "nsr" => [-9, "sr"],
+  "nt" => [-9, "t"],  "nyr" => [-9, "yr"],  "ounces" => [0, "ounce"],
+  "p%" => [-12, "%"],  "pA" => [-12, "A"],  "pAu" => [-12, "Au"],
+  "pBq" => [-12, "Bq"],  "pC" => [-12, "C"],  "pF" => [-12, "F"],
+  "pG" => [-12, "G"],  "pGal" => [-12, "Gal"],  "pGy" => [-12, "Gy"],
+  "pH" => [-12, "H"],  "pHg" => [-12, "Hg"],  "pHz" => [-12, "Hz"],
+  "pJ" => [-12, "J"],  "pK" => [-12, "K"],  "pL" => [-12, "L"],
+  "pN" => [-12, "N"],  "pP" => [-12, "P"],  "pPa" => [-12, "Pa"],
+  "pS" => [-12, "S"],  "pSt" => [-12, "St"],  "pSv" => [-12, "Sv"],
+  "pT" => [-12, "T"],  "pV" => [-12, "V"],  "pW" => [-12, "W"],
+  "pWb" => [-12, "Wb"],  "pa" => [-12, "a"],  "pac" => [-12, "ac"],
+  "parsecs" => [0, "parsec"],  "pascals" => [0, "pascal"],
+  "patm" => [-12, "atm"],  "pbar" => [-12, "bar"],
+  "pcal" => [-12, "cal"],
+  "pconventional_mercury" => [-12, "conventional_mercury"],
+  "pd" => [-12, "d"],  "pdegC" => [-12, "degC"],
+  "pdegF" => [-12, "degF"],  "pdeg_C" => [-12, "deg_C"],
+  "pdeg_F" => [-12, "deg_F"],  "pdegreeC" => [-12, "degreeC"],
+  "pdegreeF" => [-12, "degreeF"],  "pdegree_C" => [-12, "degree_C"],
+  "pdegree_E" => [-12, "degree_E"],  "pdegree_F" => [-12, "degree_F"],
+  "pdegree_N" => [-12, "degree_N"],  "pdegree_R" => [-12, "degree_R"],
+  "pdegree_S" => [-12, "degree_S"],  "pdegree_W" => [-12, "degree_W"],
+  "pdegree_c" => [-12, "degree_c"],
+  "pdegree_east" => [-12, "degree_east"],
+  "pdegree_f" => [-12, "degree_f"],
+  "pdegree_north" => [-12, "degree_north"],
+  "pdegree_south" => [-12, "degree_south"],
+  "pdegree_west" => [-12, "degree_west"],
+  "pdegrees_east" => [-12, "degrees_east"],
+  "pdegrees_north" => [-12, "degrees_north"],
+  "pdegrees_south" => [-12, "degrees_south"],
+  "pdegrees_west" => [-12, "degrees_west"],  "pdyn" => [-12, "dyn"],
+  "pentads" => [0, "pentad"],  "perg" => [-12, "erg"],
+  "petaCelsius" => [15, "Celsius"],
+  "petaFahrenheit" => [15, "Fahrenheit"],
+  "petaJulian_year" => [15, "Julian_year"],
+  "petaPascal" => [15, "Pascal"],  "petaacre" => [15, "acre"],
+  "petaampere" => [15, "ampere"],  "petaangstrom" => [15, "angstrom"],
+  "petaangular_degree" => [15, "angular_degree"],
+  "petaangular_minute" => [15, "angular_minute"],
+  "petaangular_second" => [15, "angular_second"],
+  "petaare" => [15, "are"],  "petaatmosphere" => [15, "atmosphere"],
+  "petacalorie" => [15, "calorie"],  "petacelsius" => [15, "celsius"],
+  "petacentigrade" => [15, "centigrade"],
+  "petacentury" => [15, "century"],  "petachain" => [15, "chain"],
+  "petacommon_year" => [15, "common_year"],
+  "petacoulomb" => [15, "coulomb"],  "petaday" => [15, "day"],
+  "petadegK" => [15, "degK"],  "petadeg_K" => [15, "deg_K"],
+  "petadegree" => [15, "degree"],  "petadegreeK" => [15, "degreeK"],
+  "petadyne" => [15, "dyne"],  "petaerg" => [15, "erg"],
+  "petafahrenheit" => [15, "fahrenheit"],  "petafarad" => [15, "farad"],
+  "petafermi" => [15, "fermi"],  "petagal" => [15, "gal"],
+  "petagauss" => [15, "gauss"],  "petagram" => [15, "gram"],
+  "petahectare" => [15, "hectare"],  "petahertz" => [15, "hertz"],
+  "petahour" => [15, "hour"],  "petainch" => [15, "inch"],
+  "petajoule" => [15, "joule"],  "petakelvin" => [15, "kelvin"],
+  "petakilogram" => [15, "kilogram"],  "petaknot" => [15, "knot"],
+  "petalitre" => [15, "litre"],  "petameter" => [15, "meter"],
+  "petametre" => [15, "metre"],  "petamicron" => [15, "micron"],
+  "petamile" => [15, "mile"],  "petamillibar" => [15, "millibar"],
+  "petaminute" => [15, "minute"],
+  "petaminute_angle" => [15, "minute_angle"],
+  "petamole" => [15, "mole"],  "petamonth" => [15, "month"],
+  "petanewton" => [15, "newton"],  "petaounce" => [15, "ounce"],
+  "petaparsec" => [15, "parsec"],  "petapascal" => [15, "pascal"],
+  "petapentad" => [15, "pentad"],  "petapoise" => [15, "poise"],
+  "petapound" => [15, "pound"],  "petaradian" => [15, "radian"],
+  "petasecond" => [15, "second"],
+  "petasecond_angle" => [15, "second_angle"],
+  "petasteradian" => [15, "steradian"],  "petastokes" => [15, "stokes"],
+  "petatesla" => [15, "tesla"],  "petaton" => [15, "ton"],
+  "petatonne" => [15, "tonne"],  "petatorr" => [15, "torr"],
+  "petavolt" => [15, "volt"],  "petawatt" => [15, "watt"],
+  "petaweber" => [15, "weber"],  "petayard" => [15, "yard"],
+  "petayd" => [15, "yd"],  "petayear" => [15, "year"],
+  "pforce" => [-12, "force"],  "pg" => [-12, "g"],
+  "pgravity" => [-12, "gravity"],  "ph" => [-12, "h"],
+  "phg" => [-12, "hg"],  "phr" => [-12, "hr"],
+  "picoCelsius" => [-12, "Celsius"],
+  "picoFahrenheit" => [-12, "Fahrenheit"],
+  "picoJulian_year" => [-12, "Julian_year"],
+  "picoPascal" => [-12, "Pascal"],  "picoacre" => [-12, "acre"],
+  "picoampere" => [-12, "ampere"],  "picoangstrom" => [-12, "angstrom"],
+  "picoangular_degree" => [-12, "angular_degree"],
+  "picoangular_minute" => [-12, "angular_minute"],
+  "picoangular_second" => [-12, "angular_second"],
+  "picoare" => [-12, "are"],  "picoatmosphere" => [-12, "atmosphere"],
+  "picocalorie" => [-12, "calorie"],  "picocelsius" => [-12, "celsius"],
+  "picocentigrade" => [-12, "centigrade"],
+  "picocentury" => [-12, "century"],  "picochain" => [-12, "chain"],
+  "picocommon_year" => [-12, "common_year"],
+  "picocoulomb" => [-12, "coulomb"],  "picoday" => [-12, "day"],
+  "picodegK" => [-12, "degK"],  "picodeg_K" => [-12, "deg_K"],
+  "picodegree" => [-12, "degree"],  "picodegreeK" => [-12, "degreeK"],
+  "picodyne" => [-12, "dyne"],  "picoerg" => [-12, "erg"],
+  "picofahrenheit" => [-12, "fahrenheit"],
+  "picofarad" => [-12, "farad"],  "picofermi" => [-12, "fermi"],
+  "picogal" => [-12, "gal"],  "picogauss" => [-12, "gauss"],
+  "picogram" => [-12, "gram"],  "picohectare" => [-12, "hectare"],
+  "picohertz" => [-12, "hertz"],  "picohour" => [-12, "hour"],
+  "picoinch" => [-12, "inch"],  "picojoule" => [-12, "joule"],
+  "picokelvin" => [-12, "kelvin"],  "picokilogram" => [-12, "kilogram"],
+  "picoknot" => [-12, "knot"],  "picolitre" => [-12, "litre"],
+  "picometer" => [-12, "meter"],  "picometre" => [-12, "metre"],
+  "picomicron" => [-12, "micron"],  "picomile" => [-12, "mile"],
+  "picomillibar" => [-12, "millibar"],  "picominute" => [-12, "minute"],
+  "picominute_angle" => [-12, "minute_angle"],
+  "picomole" => [-12, "mole"],  "picomonth" => [-12, "month"],
+  "piconewton" => [-12, "newton"],  "picoounce" => [-12, "ounce"],
+  "picoparsec" => [-12, "parsec"],  "picopascal" => [-12, "pascal"],
+  "picopentad" => [-12, "pentad"],  "picopoise" => [-12, "poise"],
+  "picopound" => [-12, "pound"],  "picoradian" => [-12, "radian"],
+  "picosecond" => [-12, "second"],
+  "picosecond_angle" => [-12, "second_angle"],
+  "picosteradian" => [-12, "steradian"],
+  "picostokes" => [-12, "stokes"],  "picotesla" => [-12, "tesla"],
+  "picoton" => [-12, "ton"],  "picotonne" => [-12, "tonne"],
+  "picotorr" => [-12, "torr"],  "picovolt" => [-12, "volt"],
+  "picowatt" => [-12, "watt"],  "picoweber" => [-12, "weber"],
+  "picoyard" => [-12, "yard"],  "picoyd" => [-12, "yd"],
+  "picoyear" => [-12, "year"],  "pin" => [-12, "in"],
+  "pkg" => [-12, "kg"],  "pkgf" => [-12, "kgf"],
+  "pkph" => [-12, "kph"],  "plb" => [-12, "lb"],  "plm" => [-12, "lm"],
+  "plx" => [-12, "lx"],  "ply" => [-12, "ly"],  "pm" => [-12, "m"],
+  "pmb" => [-12, "mb"],  "pmercury" => [-12, "mercury"],
+  "pmgal" => [-12, "mgal"],  "pmin" => [-12, "min"],
+  "pmol" => [-12, "mol"],  "pmon" => [-12, "mon"],
+  "pmph" => [-12, "mph"],  "pohm" => [-12, "ohm"],
+  "poises" => [0, "poise"],  "pounds" => [0, "pound"],
+  "poz" => [-12, "oz"],  "ppc" => [-12, "pc"],
+  "ppercent" => [-12, "percent"],  "ppermil" => [-12, "permil"],
+  "ppsi" => [-12, "psi"],  "prad" => [-12, "rad"],  "ps" => [-12, "s"],
+  "psr" => [-12, "sr"],  "pt" => [-12, "t"],  "pyr" => [-12, "yr"],
+  "radians" => [0, "radian"],  "seconds" => [0, "second"],
+  "seconds_angle" => [0, "second_angle"],
+  "steradians" => [0, "steradian"],  "stokeses" => [0, "stokes"],
+  "telaCelsius" => [12, "Celsius"],
+  "telaFahrenheit" => [12, "Fahrenheit"],
+  "telaJulian_year" => [12, "Julian_year"],
+  "telaPascal" => [12, "Pascal"],  "telaacre" => [12, "acre"],
+  "telaampere" => [12, "ampere"],  "telaangstrom" => [12, "angstrom"],
+  "telaangular_degree" => [12, "angular_degree"],
+  "telaangular_minute" => [12, "angular_minute"],
+  "telaangular_second" => [12, "angular_second"],
+  "telaare" => [12, "are"],  "telaatmosphere" => [12, "atmosphere"],
+  "telacalorie" => [12, "calorie"],  "telacelsius" => [12, "celsius"],
+  "telacentigrade" => [12, "centigrade"],
+  "telacentury" => [12, "century"],  "telachain" => [12, "chain"],
+  "telacommon_year" => [12, "common_year"],
+  "telacoulomb" => [12, "coulomb"],  "teladay" => [12, "day"],
+  "teladegK" => [12, "degK"],  "teladeg_K" => [12, "deg_K"],
+  "teladegree" => [12, "degree"],  "teladegreeK" => [12, "degreeK"],
+  "teladyne" => [12, "dyne"],  "telaerg" => [12, "erg"],
+  "telafahrenheit" => [12, "fahrenheit"],  "telafarad" => [12, "farad"],
+  "telafermi" => [12, "fermi"],  "telagal" => [12, "gal"],
+  "telagauss" => [12, "gauss"],  "telagram" => [12, "gram"],
+  "telahectare" => [12, "hectare"],  "telahertz" => [12, "hertz"],
+  "telahour" => [12, "hour"],  "telainch" => [12, "inch"],
+  "telajoule" => [12, "joule"],  "telakelvin" => [12, "kelvin"],
+  "telakilogram" => [12, "kilogram"],  "telaknot" => [12, "knot"],
+  "telalitre" => [12, "litre"],  "telameter" => [12, "meter"],
+  "telametre" => [12, "metre"],  "telamicron" => [12, "micron"],
+  "telamile" => [12, "mile"],  "telamillibar" => [12, "millibar"],
+  "telaminute" => [12, "minute"],
+  "telaminute_angle" => [12, "minute_angle"],
+  "telamole" => [12, "mole"],  "telamonth" => [12, "month"],
+  "telanewton" => [12, "newton"],  "telaounce" => [12, "ounce"],
+  "telaparsec" => [12, "parsec"],  "telapascal" => [12, "pascal"],
+  "telapentad" => [12, "pentad"],  "telapoise" => [12, "poise"],
+  "telapound" => [12, "pound"],  "telaradian" => [12, "radian"],
+  "telasecond" => [12, "second"],
+  "telasecond_angle" => [12, "second_angle"],
+  "telasteradian" => [12, "steradian"],  "telastokes" => [12, "stokes"],
+  "telatesla" => [12, "tesla"],  "telaton" => [12, "ton"],
+  "telatonne" => [12, "tonne"],  "telatorr" => [12, "torr"],
+  "telavolt" => [12, "volt"],  "telawatt" => [12, "watt"],
+  "telaweber" => [12, "weber"],  "telayard" => [12, "yard"],
+  "telayd" => [12, "yd"],  "telayear" => [12, "year"],
+  "teslas" => [0, "tesla"],  "tonnes" => [0, "tonne"],
+  "tons" => [0, "ton"],  "torrs" => [0, "torr"],  "u%" => [-6, "%"],
+  "uA" => [-6, "A"],  "uAu" => [-6, "Au"],  "uBq" => [-6, "Bq"],
+  "uC" => [-6, "C"],  "uF" => [-6, "F"],  "uG" => [-6, "G"],
+  "uGal" => [-6, "Gal"],  "uGy" => [-6, "Gy"],  "uH" => [-6, "H"],
+  "uHg" => [-6, "Hg"],  "uHz" => [-6, "Hz"],  "uJ" => [-6, "J"],
+  "uK" => [-6, "K"],  "uL" => [-6, "L"],  "uN" => [-6, "N"],
+  "uP" => [-6, "P"],  "uPa" => [-6, "Pa"],  "uS" => [-6, "S"],
+  "uSt" => [-6, "St"],  "uSv" => [-6, "Sv"],  "uT" => [-6, "T"],
+  "uV" => [-6, "V"],  "uW" => [-6, "W"],  "uWb" => [-6, "Wb"],
+  "ua" => [-6, "a"],  "uac" => [-6, "ac"],  "uatm" => [-6, "atm"],
+  "ubar" => [-6, "bar"],  "ucal" => [-6, "cal"],
+  "uconventional_mercury" => [-6, "conventional_mercury"],
+  "ud" => [-6, "d"],  "udegC" => [-6, "degC"],  "udegF" => [-6, "degF"],
+  "udeg_C" => [-6, "deg_C"],  "udeg_F" => [-6, "deg_F"],
+  "udegreeC" => [-6, "degreeC"],  "udegreeF" => [-6, "degreeF"],
+  "udegree_C" => [-6, "degree_C"],  "udegree_E" => [-6, "degree_E"],
+  "udegree_F" => [-6, "degree_F"],  "udegree_N" => [-6, "degree_N"],
+  "udegree_R" => [-6, "degree_R"],  "udegree_S" => [-6, "degree_S"],
+  "udegree_W" => [-6, "degree_W"],  "udegree_c" => [-6, "degree_c"],
+  "udegree_east" => [-6, "degree_east"],
+  "udegree_f" => [-6, "degree_f"],
+  "udegree_north" => [-6, "degree_north"],
+  "udegree_south" => [-6, "degree_south"],
+  "udegree_west" => [-6, "degree_west"],
+  "udegrees_east" => [-6, "degrees_east"],
+  "udegrees_north" => [-6, "degrees_north"],
+  "udegrees_south" => [-6, "degrees_south"],
+  "udegrees_west" => [-6, "degrees_west"],  "udyn" => [-6, "dyn"],
+  "uerg" => [-6, "erg"],  "uforce" => [-6, "force"],  "ug" => [-6, "g"],
+  "ugravity" => [-6, "gravity"],  "uh" => [-6, "h"],
+  "uhg" => [-6, "hg"],  "uhr" => [-6, "hr"],  "uin" => [-6, "in"],
+  "ukg" => [-6, "kg"],  "ukgf" => [-6, "kgf"],  "ukph" => [-6, "kph"],
+  "ulb" => [-6, "lb"],  "ulm" => [-6, "lm"],  "ulx" => [-6, "lx"],
+  "uly" => [-6, "ly"],  "um" => [-6, "m"],  "umb" => [-6, "mb"],
+  "umercury" => [-6, "mercury"],  "umgal" => [-6, "mgal"],
+  "umin" => [-6, "min"],  "umol" => [-6, "mol"],  "umon" => [-6, "mon"],
+  "umph" => [-6, "mph"],  "uohm" => [-6, "ohm"],  "uoz" => [-6, "oz"],
+  "upc" => [-6, "pc"],  "upercent" => [-6, "percent"],
+  "upermil" => [-6, "permil"],  "upsi" => [-6, "psi"],
+  "urad" => [-6, "rad"],  "us" => [-6, "s"],  "usr" => [-6, "sr"],
+  "ut" => [-6, "t"],  "uyr" => [-6, "yr"],  "volts" => [0, "volt"],
+  "watts" => [0, "watt"],  "webers" => [0, "weber"],
+  "yards" => [0, "yard"],  "yds" => [0, "yd"],  "years" => [0, "year"],
+}
+UPLURALS = {
+  "Celsiuses" => "Celsius",  "Fahrenheits" => "Fahrenheit",
+  "Julians_year" => "Julian_year",  "Pascals" => "Pascal",
+  "acres" => "acre",  "amperes" => "ampere",  "angstroms" => "angstrom",
+  "angulars_degree" => "angular_degree",
+  "angulars_minute" => "angular_minute",
+  "angulars_second" => "angular_second",  "ares" => "are",
+  "atmospheres" => "atmosphere",  "calories" => "calorie",
+  "celsiuses" => "celsius",  "centigrades" => "centigrade",
+  "centuries" => "century",  "chains" => "chain",
+  "commons_year" => "common_year",  "coulombs" => "coulomb",
+  "days" => "day",  "degKs" => "degK",  "degreeKs" => "degreeK",
+  "degrees" => "degree",  "degs_K" => "deg_K",  "dynes" => "dyne",
+  "ergs" => "erg",  "fahrenheits" => "fahrenheit",  "farads" => "farad",
+  "fermis" => "fermi",  "gals" => "gal",  "gausses" => "gauss",
+  "grams" => "gram",  "hectares" => "hectare",  "hertzes" => "hertz",
+  "hours" => "hour",  "inchs" => "inch",  "joules" => "joule",
+  "kelvins" => "kelvin",  "kilograms" => "kilogram",  "knots" => "knot",
+  "litres" => "litre",  "meters" => "meter",  "metres" => "metre",
+  "microns" => "micron",  "miles" => "mile",  "millibars" => "millibar",
+  "minutes" => "minute",  "minutes_angle" => "minute_angle",
+  "moles" => "mole",  "months" => "month",  "newtons" => "newton",
+  "ounces" => "ounce",  "parsecs" => "parsec",  "pascals" => "pascal",
+  "pentads" => "pentad",  "poises" => "poise",  "pounds" => "pound",
+  "radians" => "radian",  "seconds" => "second",
+  "seconds_angle" => "second_angle",  "steradians" => "steradian",
+  "stokeses" => "stokes",  "teslas" => "tesla",  "tonnes" => "tonne",
+  "tons" => "ton",  "torrs" => "torr",  "volts" => "volt",
+  "watts" => "watt",  "webers" => "weber",  "yards" => "yard",
+  "yds" => "yd",  "years" => "year",
+}
+end

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-numru-units.git



More information about the Pkg-ruby-extras-commits mailing list