/**
\page otoo From ODEM to ODEMx
In this chapter we describe differences between 
ODEMx and its predecessor ODEM and features they have in common. \n

<ol>
<li>\ref oview
</li>
<li>\ref nfeatures
</li>
<li>\ref lfeatures
</li>
<li>\ref changes
</li>
</ol>

\section oview Overview
The following table lists all classes from ODEM and ODEMx and
their status in ODEMx. This Table is not supposed to be
a documentation for ODEMx. \n

<table>
<tr>
<td><b>Class</b></td><td><b>Status</b></td>
<td><b>Description</b></td><td><b>Comment</b></td>
</tr>

<tr>
<td>Accumulate</td> <td>changed</td> <td>Statistics</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>Bin</td> <td>changed</td> <td>Ressource-like synchronisation</td> <td>\ref synchi1</td> 
</tr>

<tr>
<td>BinObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>Buff_head</td> <td>lost</td> <td>Buffered communication</td> <td>not transferred to ODEMx</td> 
</tr>

<tr>
<td>Buff_tab</td> <td>lost</td> <td>Buffered communication</td> <td>not transferred to ODEMx</td> 
</tr>

<tr>
<td>Buff_tail</td> <td>lost</td> <td>Buffered communication</td> <td>not transferred to ODEMx</td> 
</tr>

<tr>
<td>CondQ</td> <td>changed</td> <td>Condition queue</td> <td>\ref synchi1</td> 
</tr>

<tr>
<td>CondQObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>Continuous</td> <td>changed</td> <td>Time-continuous process</td> <td>\ref continu1</td> 
</tr>

<tr>
<td>ContinuousObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>ContuTrace</td> <td>new</td> <td>Trace for Continuous</td> <td>\ref continu1</td> 
</tr>

<tr>
<td>Coroutine</td> <td>new</td> <td>Portable coroutine implementation</td> <td>\ref corout1</td> 
</tr>

<tr>
<td>CoroutineContext</td> <td>new</td> <td>Portable coroutine implementation</td> <td>\ref corout1</td> 
</tr>

<tr>
<td>CoroutineContextObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>CoroutineObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>Count</td> <td>changed</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>DebugTrace</td> <td>lost</td> <td>Text-logfile</td> <td>replaced by HtmlTrace</td> 
</tr>

<tr>
<td>DefaultContext</td> <td>new</td> <td>Portable coroutine implementation</td> <td>\ref corout1</td> 
</tr>

<tr>
<td>DefaultOrder</td> <td>new</td> <td>Process sorting scheme</td> <td>\ref proque1</td> 
</tr>

<tr>
<td>DefaultSimulation</td> <td>new</td> <td>Default implementation of Simulation</td> <td>\ref encaps1</td> 
</tr>

<tr>
<td>DefaultTimeIO</td> <td>lost</td> <td>Time to string to time</td> <td>not transferred</td> 
</tr>

<tr>
<td>DefLabeledObject</td> <td>new</td> <td>Object labels</td> <td>\ref label1</td> 
</tr>

<tr>
<td>Discrete</td> <td>lost</td> <td>Time-discrete process</td> <td>replaced by Process</td> 
</tr>

<tr>
<td>Dist</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>DistContext</td> <td>new</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Draw</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>dynTableDefinition</td> <td>new</td> <td>Report</td> <td>\ref report1</td> 
</tr>

<tr>
<td>Elem</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Empirical</td> <td>lost</td> <td>Random number generator</td> <td>not transferred</td> 
</tr>

<tr>
<td>Entity</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Entry</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Erlang</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Event</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>ExecutionList</td> <td>new</td> <td>Process scheduling</td> <td>\ref proce2</td> 
</tr>

<tr>
<td>ExecutionListObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>File_list</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>FormatedTimeInput</td> <td>lost</td> <td>String to time</td> <td>not transferred</td> 
</tr>

<tr>
<td>FormatedTimeOutput</td> <td>lost</td> <td>Time to string</td> <td>not transferred</td> 
</tr>

<tr>
<td>Graph</td> <td>lost</td> <td>ODEM trace for Continuous</td> <td>not transferred</td> 
</tr>

<tr>
<td>Head</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Histo</td> <td>changed</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>HtmlReport</td> <td>new</td> <td>Report</td> <td>\ref report1</td> 
</tr>

<tr>
<td>HtmlTrace</td> <td>new</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>Iconst</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Idist</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>LabeledObject</td> <td>new</td> <td>Object labels</td> <td>\ref label1</td> 
</tr>

<tr>
<td>LabelScope</td> <td>new</td> <td>Unique object labels</td> <td>label1</td> 
</tr>

<tr>
<td>Link</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>MarkType</td> <td>new</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>Memo</td> <td>lost</td> <td>ODEM object linking</td> <td>replaced by \ref observat1</td> 
</tr>

<tr>
<td>Msg</td> <td>lost</td> <td>Buffered communication</td> <td>not transferred</td> 
</tr>

<tr>
<td>Negexp</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Normal</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>NoQueue</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>NoTally</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Observable</td> <td>new</td> <td>Observation of individual objects</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>Object_names</td> <td>lost</td> <td>Object labels</td> <td>replaced by LabeledObject</td> 
</tr>

<tr>
<td>Odem</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Poisson</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Port</td> <td>lost</td> <td>Port synchronisation</td> <td>not transferred</td> 
</tr>

<tr>
<td>Port_head</td> <td>lost</td> <td>Port synchronisation</td> <td>not transferred</td> 
</tr>

<tr>
<td>Port_tail</td> <td>lost</td> <td>Port synchronisation</td> <td>not transferred</td> 
</tr>

<tr>
<td>PriorityOrder</td> <td>new</td> <td>Process sorting scheme</td> <td>\ref proque1</td> 
</tr>

<tr>
<td>Process</td> <td>changed</td> <td>Process</td> <td>\ref proce2</td> 
</tr>

<tr>
<td>Process_clock</td> <td>lost</td> <td>Time event</td> <td>not transferred</td> 
</tr>

<tr>
<td>ProcessObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>ProcessOrder</td> <td>new</td> <td>Process sorting scheme</td> <td>\ref proque1</td> 
</tr>

<tr>
<td>ProcessQueue</td> <td>new</td> <td>Process list</td> <td>\ref proque1</td> 
</tr>

<tr>
<td>Queue</td> <td>changed</td> <td>Process synchronisation queue</td> <td>\ref synchi1</td> 
</tr>

<tr>
<td>Randint</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Rconst</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Rdist</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>Regression</td> <td>changed</td> <td>Statistics</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>Report</td> <td>new</td> <td>Report</td> <td>\ref report1</td> 
</tr>

<tr>
<td>ReportProducer</td> <td>new</td> <td>Report</td> <td>\ref report1</td> 
</tr>

<tr>
<td>Reportq</td> <td>changed</td> <td>Report</td> <td>replaced by Report</td> 
</tr>

<tr>
<td>Res</td> <td>changed</td> <td>Ressource-like synchronisation</td> <td>\ref synchi1</td> 
</tr>

<tr>
<td>ResObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>Resource</td> <td>lost</td> <td>Ressource-like synchronisation</td> <td>not transferred</td> 
</tr>

<tr>
<td>Sched</td> <td>lost</td> <td>Scheduling</td> <td>replaced by ExecutionList</td> 
</tr>

<tr>
<td>ShortGermanTF1</td> <td>lost</td> <td>Time to string</td> <td>not transferred</td> 
</tr>

<tr>
<td>Simulation</td> <td>new</td> <td>Simulation</td> <td>\ref encaps1</td> 
</tr>

<tr>
<td>SimulationObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>

<tr>
<td>Stackdir</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>Starter</td> <td>lost</td> <td>ODEM-internal</td> <td>not transferred</td> 
</tr>

<tr>
<td>StatisticManager</td> <td>new</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>StatisticObject</td> <td>new</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>Sum</td> <td>changed</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>Tab</td> <td>changed</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>Table</td> <td>new</td> <td>Report data table</td> <td>\ref report1</td> 
</tr>

<tr>
<td>TableDefinition</td> <td>new</td> <td>Report table structure</td> <td>\ref report1</td> 
</tr>

<tr>
<td>Tag</td> <td>new</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>Tally</td> <td>changed</td> <td>Statistic</td> <td>\ref stati1</td> 
</tr>

<tr>
<td>Timer</td> <td>lost</td> <td>Time events</td> <td>not transferred</td> 
</tr>

<tr>
<td>Trace</td> <td>changed</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>TraceClient</td> <td>lost</td> <td>Trace</td> <td>replaced by TraceConsumer</td> 
</tr>

<tr>
<td>TraceConsumer</td> <td>new</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>TraceFilter</td> <td>new</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>TraceProducer</td> <td>new</td> <td>Trace</td> <td>\ref trace1</td> 
</tr>

<tr>
<td>TraceServer</td> <td>lost</td> <td>Trace</td> <td>replaced by Trace</td> 
</tr>

<tr>
<td>TypedObject</td> <td>new</td> <td>C++ RTTI</td> <td>Interface to standard C++ RTTI</td> 
</tr>

<tr>
<td>Unifrom</td> <td>changed</td> <td>Random number generator</td> <td>\ref randi1</td> 
</tr>

<tr>
<td>utTableDef</td> <td>new</td> <td>Report</td> <td>\ref report1</td> 
</tr>

<tr>
<td>Version</td> <td>new</td> <td>ODEMx version information</td> <td>no comment</td> 
</tr>

<tr>
<td>Wait</td> <td>new</td> <td>Synchronization with child-processes</td> <td>\ref synchi1</td> 
</tr>

<tr>
<td>WaitQ</td> <td>changed</td> <td>Master-Slave synchronisation</td> <td>\ref synchi1</td> 
</tr>

<tr>
<td>WaitQObserver</td> <td>new</td> <td>Observer</td> <td>\ref observat1</td> 
</tr>
</tr>

</table>


\section nfeatures New features
\subsection observat1 Observation
ODEMx introduces a system for observing individual objects. Observable
objects provide an interface with call-back-functions for the events of that
object. Observers implement this interface to handle selected events. An
observable object inherits an observer management from the template class Observable. Observable objects also have an optional
constructor parameter, which allows to register an initial observer.
\par Documentation:
\li \ref odemx::data::Observable
\li \ref odemx::base::ProcessObserver

\subsection encaps1 Encapsulation
In contrast to ODEM, ODEMx does encapsulate simulations. While in ODEM the main
program is always made a part of the simulation, ODEMx separates the simulation
from its environment. Simulation specific data and services are put into
the class Simulation instead of being placed in the global scope. For many objects
of ODEMx this requires a link to the Simulation class, which is in general
handed over during construction. \n
The separation is often realised by the introduction of context-objects.
Simulation for instance is the context-object for processes. Due to multiple
inheritance Simulation also serves as a context-object for other types of
objects, like random number generators, labelled objects and trace producers. \n
The advantage of the encapsulation is that a simulation can be programmed
as an independent component without side-effects on its environment. It is
for instance possible to run a simulation in a simulation.
\par Documentation:
\li \ref odemx::base::Simulation
\li \ref odemx::base::Process

\subsection corout1 Coroutines
ODEMx separates the implementation of coroutines from the implementation of
processes for process-simulation. ODEM on the other hand implements the 
coroutine functionality inside its process implementation. The coroutine
implementation of ODEMx is apart from a few concepts in the Utilities module
independent from the rest of ODEMx. It is designed to be portable and already
ported to Windows higher than Windows 95 (x86 architecture) as well as Unix and
Linux (Sparc, and x86 architecture). Though in some compiler-os-platform
configurations there could be problems. \n
The techniques used to realise coroutines are based on ODEM which in turn has
used previous works from HANSEN and others. ODEMx however introduces the
encapsulation of coroutines in separate contexts.

\subsection proque1 Process queue
While in ODEM processes are itself designed to be part of a linked list, ODEMx
uses STL containers to manage object collections. ProcessQueue is introduced
in ODEMx to manage such collections. ProcessQueue allows different sorting
schemes like considering the priority or the execution time of a process.
Derived from ProcessQueue is the class Queue designed for synchronisation
objects like Res, Bin, and WaitQ.


\section lfeatures Lost features
\subsection memo1 Memo
In ODEM many classes include the functionality to be part of a linked list.
The Memo concept of ODEM uses this property to provide a synchronisation
technique. A Process object can wait in a Memo object until the Memo object
is alerted or becomes 'available'. From Memo derived classes can override
a function to redefine the 'available' condition. Process from ODEM for
instance is also a Memo object which redefines 'available'. A Process in
ODEM is 'available' if it is terminated. \n
ODEMx does not include the Memo
feature. But it is possible to realise Memo-like synchronisation with the
\ref observat1 feature. The ODEMx class Wait in the module Synchronisation is
an example for this.

\subsection port1 Port
In the HU-Release of ODEMx there is no concept for a buffered process-communication.
A user will have to develop its own classes for this purpose. ODEM had such
a concept in its Port mechanism.

\subsection timioq Time translation
In the later versions of ODEM a simtime to string to simtime translation
was introduced to allow human readable time strings other than simple
floating point numbers. This feature was introduced for a special application
of ODEM. ODEMx has not yet such a feature, but is likely to get it in
a future version.

\subsection gl1 OpenGL visualisation
ODEM had an experimental 3D visualisation of simulation events. Experiences
from this 3D-project had lead to changes in the trace-mechanism which finally
concluded the current Trace concept of ODEMx. A visualisation might be
available in ODEMx in a future version. But the old 3D-Trace of ODEM is not
transferable without a redesign.

\subsection graph1 Continuous Graph
ODEM provides the class Graph which logs Continuous state changes in a text
format used by external visualisation tools. A similar tool is already
present in ODEMx (\ref odemx::base::ContuTrace). But at the moment there is no
component in ODEMx that generates output in the exact text-format like Graph.

\subsection buffer1 Buffer
Like the missing \ref port1 mechanism the simplified Buffer system is not
transferred to ODEMx.

\subsection empiri1 Empirical
Empirical from ODEM is not available in ODEMx. 


\section changes Changes
\subsection synchi1 Synchronisation
ODEMx provides the following synchronisation components: \ref odemx::synchronization::Res,
\ref odemx::synchronization::Bin, \ref odemx::synchronization::WaitQ, \ref
odemx::synchronization::CondQ and 
\ref odemx::synchronization::Wait.
The first four components are transferred from ODEM but are changed.
Res and Bin for instance are not derived from a common base class Resource.
The constructors of both classes have additional parameters compared to
Res and Bin from ODEM which reflect the \ref encaps1 and the \ref observat1
feature. Both classes have more get* methods to receive information about
the statistic. Both classes have a report function according to the \ref report1
changes. The basic synchronisation functions however are not changed. \n
Similar things can be said about WaitQ and CondQ. The general meaning has not
changed while the classes have been adjusted to reflect the ODEMx features.
In WaitQ and CondQ however, small changes have been applied to the classic
synchronisation functions as well.
\par Documentation:
\li \ref odemx::synchronization::Res
\li \ref odemx::synchronization::Bin
\li \ref odemx::synchronization::WaitQ
\li \ref odemx::synchronization::CondQ

\subsection stati1 Statistics
Many of the statistic components from ODEM have been transferred to ODEMx.
The components in ODEMx share the update() function with their predecessors
as well as the used algorithms. They 
were also changed to match the \ref encaps1 and the \ref report1
feature. Furthermore, several get* methods for
the statistical data were added.
\par Documentation:
\li \ref odemx::statistics::Accumulate
\li \ref odemx::statistics::Count
\li \ref odemx::statistics::Histogram
\li \ref odemx::statistics::Regression
\li \ref odemx::statistics::Sum
\li \ref odemx::statistics::Tally

\subsection randi1 Random
The random number generators in ODEMx were taken from ODEM and changed
to match the features of ODEMx. They have additional get* methods for
statistical information, and require a pointer to a DistContext
object during construction. They also provide a report function for the
report feature of ODEMx. \n
The DistContext class was introduced to support the \ref encaps1 feature.
All random number generators linked to one DistContext are
independent from each other, while the RNGs in different DistContext
produce the same sequence of numbers (unless the seed is changed).
\par Documentation:
\li \ref odemx::statistics::Accumulate
\li \ref odemx::statistics::Count
\li \ref odemx::statistics::Histogram
\li \ref odemx::statistics::Regression
\li \ref odemx::statistics::Sum
\li \ref odemx::statistics::Tally

\subsection proce2 Process
The Process class of ODEMx replaces the Process class and the Discrete
class of ODEM. Its interface is more like the interface of Discrete
than of Process. The following table matches the different scheduling
functions of Discrete to the functions of ODEMx Process: \n

<table>
<tr><td><b>Discrete</b></td>			<td><b>odemx::base::Process</b></td></tr>
<tr><td>start(NOW)</td>					<td>hold()</td></tr>
<tr><td>start(AT, t)</td>				<td>holdUntil(t)</td></tr>
<tr><td>start(AT, t, PRIOR)</td>		<td>activateAt(t)</td></tr>
<tr><td>start(DELAY, t)</td>			<td>holdFor(t)</td></tr>
<tr><td>start(DELAY, t, PRIOR)</td>		<td>activateIn(t)</td></tr>
<tr><td>activate(NOW)</td>				<td>hold() or activate() (FIFO or LIFO)</td></tr>
<tr><td>activate(AT, t)</td>			<td>holdUntil(t)</td></tr>
<tr><td>activate(AT, t, PRIOR)</td>		<td>activateAt(t)</td></tr>
<tr><td>activate(DELAY, t)</td>			<td>holdFor(t)</td></tr>
<tr><td>activate(DELAY, t, PRIOR)</td>	<td>activateIn(t)</td></tr>
<tr><td>activate(BEFORE, q)</td>		<td>activateBefore(q)</td></tr>
<tr><td>activate(AFTER, q)</td>			<td>activateAfter(q)</td></tr>
<tr><td>hold(t)</td>					<td>holdFor(t)</td></tr>
<tr><td>passivate()</td>				<td>sleep()</td></tr>
<tr><td>e_interrupt()</td>				<td>interrupt() (!see documentation!)</td></tr>
<tr><td>cancel()</td>					<td>cancel()</td></tr>
</table> \n
ODEMx Process has only one priority attribute which is used in scheduling
as well as in synchronisation queues. The \c interrupt function in ODEMx has
a different effect than the \c e_interrupt of Discrete. In ODEMx an interrupt
causes an immediate activation (activate). The interrupted process is
responsible to handle the interrupt.
\par Documentation:
\li \ref odemx::base::Process

\subsection continu1 Continuous
The Continuous class of ODEMx is derived from Process. The algorithm used
to compute the state changes is taken from ODEM. Some of the Continuous
functions in ODEM are also transferred to ODEMx. Other than the ODEM version
of Continuous, the ODEMx version does not log the state changes on its own.
If a user wants this service he/she has to use the ODEMx class ContuTrace.
\par Documentation:
\li \ref odemx::base::Continuous
\li \ref odemx::base::ContuTrace

\subsection label1 Object labels
The support of object labels has changed in ODEMx. It is now provided
by the classes \ref odemx::LabeledObject, \ref odemx::LabelScope and
\ref odemx::DefLabeledObject. In contrast to ODEM labels are no longer
unique to the program but to a certain LabelScope. Each simulation has
of course its own scope.
\par Documentation:
\li \ref odemx::LabeledObject
\li \ref odemx::LabelScope
\li \ref odemx::DefLabeledObject

\subsection trace1 Trace
\warning 
The current implementation (as of Mi 16. Mär 15:54:28 CET 2011) differs from
    the following description. An example on the default trace functionality is given in Example_Shop.cpp
        

\p
ODEMx introduces the class HtmlTrace. Objects of this class generate Html
output from simulation events. HtmlTrace also provides a simple filter
for events to reduce the generated output. The trace control is implemented
in the ODEMx Trace class which is a base class of Simulation.
\par Documentation:
\li \ref odemx::HtmlTrace

\subsection report1 Report
ODEMx supports several reports in one simulation. A report is generated by
an object of the HtmlReport class. In contrast to ODEM a user has to register
model components to the report. The final report is triggered manually by the function call
'generateReport()'. 
\par Documentation:
\li \ref odemx::HtmlReport


*/
