Commit 6b1d834
Changed files (38)
trunk
build
tools
ncover
ncover.explorer
psake
trunk/build/tools/ncover/Coverage.xsl
@@ -0,0 +1,339 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
+ <!-- saved from url=(0022)http://www.ncover.org/ -->
+ <!-- created by Yves Lorphelin, largely inspired by the nunitsumary.xsl (see nantcontrib.sourceforge.net)-->
+ <xsl:template match="coverage">
+ <html>
+ <head>
+ <title>NCover Code Coverage Report</title>
+ <style>
+ BODY {
+ font: small verdana, arial, helvetica;
+ color:#000000;
+ }
+
+ P {
+ line-height:1.5em;
+ margin-top:0.5em; margin-bottom:1.0em;
+ }
+ H1 {
+ MARGIN: 0px 0px 5px;
+ FONT: bold larger arial, verdana, helvetica;
+
+ }
+ H2 {
+ MARGIN-TOP: 1em; MARGIN-BOTTOM: 0.5em;
+ FONT: larger verdana,arial,helvetica
+ }
+ H3 {
+ MARGIN-BOTTOM: 0.5em; FONT: bold 13px verdana,arial,helvetica
+ }
+ H4 {
+ MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
+ }
+ H5 {
+ MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
+ }
+ H6 {
+ MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
+ }
+ .notVisited { background:red; }
+ .excluded { background: skyblue; }
+ .visited { background: #90ee90; }
+ .title { font-size: 12px; font-weight: bold; }
+ .assembly { font-size: normal; font-weight: bold; font-size: 11px}
+ .class {font-size:normal; cursor: hand; color: #444444; font-size: 11px}
+ .module { color: navy; font-size: 12px; }
+ .method {cursor: hand; color: ; font-size: 10px; font-weight: bold; }
+ .subtitle { color: black; font-size: 10px; font-weight: bold; }
+ .hdrcell {font-size:9px; background-color: #DDEEFF; }
+ .datacell {font-size:9px; background-color: #FFFFEE; text-align: right; }
+ .hldatacell {font-size:9px; background-color: #FFCCCC; text-align: right; }
+ .exdatacell {font-size:9px; background-color: #DDEEFF; text-align: right; }
+ .detailPercent { font-size: 9px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; padding-left: 3px; padding-right: 3px;}
+ </style>
+ <script language="JavaScript"><![CDATA[
+ function toggle (field)
+ { field.style.display = (field.style.display == "block") ? "none" : "block"; }
+
+ function SwitchAll(how)
+ { var len = document.all.length-1;
+ for(i=0;i!=len;i++) {
+ var block = document.all[i];
+ if (block != null && block.id != '')
+ { block.style.display=how;}
+ }
+ }
+
+
+ function ExpandAll()
+ {SwitchAll('block');}
+
+ function CollapseAll()
+ {SwitchAll('none');}
+ ]]></script>
+ </head>
+ <body>
+ <a name="#top"></a>
+ <xsl:call-template name="header" />
+ <xsl:call-template name="ModuleSummary" />
+ <xsl:call-template name="module" />
+ <xsl:call-template name="footer" />
+ <script language="JavaScript">CollapseAll();</script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="module">
+ <xsl:for-each select="//module">
+ <xsl:sort select="@assembly" />
+ <xsl:variable name="module" select="./@assembly" />
+ <div class="assembly">
+ <a name="#{generate-id($module)}">Module
+ <xsl:value-of select="$module" />
+ </a>
+ </div>
+ <xsl:for-each select="./method[not(./@class = preceding-sibling::method/@class)]">
+ <xsl:sort select="@class" />
+ <xsl:sort select="@name" />
+ <xsl:call-template name="ClassSummary">
+ <xsl:with-param name="module" select="$module" />
+ <xsl:with-param name="class" select="./@class" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ <xsl:variable name="totalMod" select="count(./method/seqpnt[@excluded='false'])" />
+ <xsl:variable name="notvisitedMod" select="count( ./method/seqpnt[ @visitcount='0'][@excluded='false'] ) div $totalMod * 100 " />
+ <xsl:variable name="visitedMod" select="count(./method/seqpnt[not(@visitcount='0')] ) div $totalMod * 100" />
+ </xsl:template>
+ <xsl:template name="Methods">
+ <xsl:param name="module" />
+ <xsl:param name="class" />
+ <xsl:for-each select="//method[(@class = $class) and (parent::module/@assembly=$module)]">
+ <xsl:sort select="@name" />
+ <xsl:variable name="total" select="count(./seqpnt[@excluded='false'])" />
+ <xsl:variable name="notvisited" select="count(./seqpnt[@visitcount='0'][@excluded='false'] ) " />
+ <xsl:variable name="visited" select="count(./seqpnt[not(@visitcount='0')])" />
+ <xsl:variable name="methid" select="generate-id(.)" />
+ <table cellpadding="3" cellspacing="0" width="90%">
+ <tr>
+ <td width="45%" class='method'>
+ <xsl:attribute name="onclick">javascript:toggle(
+ <xsl:value-of select="$methid" />)
+ </xsl:attribute>
+ <xsl:value-of select="@name" />
+ </td>
+ <td width="55%">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="visited" select="$visited" />
+ <xsl:with-param name="notVisited" select="$notvisited" />
+ <xsl:with-param name="total" select="$total" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ <xsl:call-template name="seqpnt">
+ <xsl:with-param name="module" select="$module" />
+ <xsl:with-param name="class" select="$class" />
+ <xsl:with-param name="id" select="$methid" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template name="seqpnt">
+ <xsl:param name="module" />
+ <xsl:param name="class" />
+ <xsl:param name="id" />
+ <table cellpadding="3" cellspacing="0" border='1' width="90%" bordercolor="black" style="display: block;">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$id" />
+ </xsl:attribute>
+ <tr>
+ <td class="hdrcell">Visits</td>
+ <td class="hdrcell">Line</td>
+ <td class="hdrcell">End</td>
+ <td class="hdrcell">Column</td>
+ <td class="hdrcell">End</td>
+ <td class="hdrcell">Document</td>
+ </tr>
+ <xsl:for-each select="./seqpnt">
+ <xsl:sort select="@line" />
+ <tr>
+ <td class="datacell">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="@excluded = 'true'">exdatacell</xsl:when>
+ <xsl:when test="@visitcount = 0">hldatacell</xsl:when>
+ <xsl:otherwise>datacell</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="@excluded = 'true'">---</xsl:when>
+ <xsl:otherwise><xsl:value-of select="@visitcount" /></xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td class="datacell">
+ <xsl:value-of select="@line" />
+ </td>
+ <td class="datacell">
+ <xsl:value-of select="@endline" />
+ </td>
+ <td class="datacell">
+ <xsl:value-of select="@column" />
+ </td>
+ <td class="datacell">
+ <xsl:value-of select="@endcolumn" />
+ </td>
+ <td class="datacell">
+ <xsl:value-of select="@document" />
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:template>
+ <!-- Class Summary -->
+ <xsl:template name="ClassSummary">
+ <xsl:param name="module" />
+ <xsl:param name="class" />
+ <xsl:variable name="total" select="count(//seqpnt[(parent::method/parent::module/@assembly=$module) and (parent::method/@class=$class) and (@excluded='false') ])" />
+ <xsl:variable name="notvisited" select="count(//seqpnt[(parent::method/parent::module/@assembly=$module)and (parent::method/@class=$class) and (@visitcount='0') and (@excluded='false')] )" />
+ <xsl:variable name="visited" select="count(//seqpnt[(parent::method/parent::module/@assembly=$module) and (parent::method/@class=$class) and (not(@visitcount='0'))] )" />
+ <xsl:variable name="newid" select="concat (generate-id(), 'class')" />
+ <table width='90%'>
+ <tr>
+ <td width="40%" class="class">
+ <xsl:attribute name="onclick">javascript:toggle(
+ <xsl:value-of select="$newid" />)
+ </xsl:attribute>
+ <xsl:value-of select="$class" />
+ </td>
+ <td width="60%">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="visited" select="$visited" />
+ <xsl:with-param name="notVisited" select="$notvisited" />
+ <xsl:with-param name="total" select="$total" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ <tr>
+ <table style="display: block;" width="100%">
+ <tr>
+ <td>
+ <xsl:attribute name="id">
+ <xsl:value-of select="$newid" />
+ </xsl:attribute>
+ <xsl:call-template name="Methods">
+ <xsl:with-param name="module" select="$module" />
+ <xsl:with-param name="class" select="$class" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ </tr>
+ </table>
+ <hr size="1" width='90%' align='left' style=" border-bottom: 1px dotted #999;" />
+ </xsl:template>
+ <xsl:template name="ClassSummaryDetail">
+ <xsl:param name="module" />
+ <xsl:variable name="total" select="count(./method/seqpnt[ @excluded='false' ])" />
+ <xsl:variable name="notVisited" select="count( ./method/seqpnt[ @visitcount='0'][ @excluded='false' ] )" />
+ <xsl:variable name="visited" select="count(./method/seqpnt[not(@visitcount='0')] )" />
+ <td width="35%">
+ <div class="assembly">
+ <a href="#{generate-id($module)}">
+ <xsl:value-of select="$module" />
+ </a>
+ </div>
+ </td>
+ <td width="65%">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="visited" select="$visited" />
+ <xsl:with-param name="notVisited" select="$notVisited" />
+ <xsl:with-param name="total" select="$total" />
+ </xsl:call-template>
+ </td>
+ </xsl:template>
+ <!-- Modules Summary -->
+ <xsl:template name="ModuleSummary">
+ <H2>Modules summary</H2>
+ <xsl:for-each select="//module">
+ <xsl:sort select="@assembly" />
+ <table width='90%'>
+ <tr>
+ <xsl:call-template name="ModuleSummaryDetail">
+ <xsl:with-param name="module" select="./@assembly" />
+ </xsl:call-template>
+ </tr>
+ </table>
+ </xsl:for-each>
+ <hr size="1" />
+ </xsl:template>
+ <xsl:template name="ModuleSummaryDetail">
+ <xsl:param name="module" />
+ <xsl:variable name="total" select="count(./method/seqpnt[@excluded='false'])" />
+ <xsl:variable name="notVisited" select="count( ./method/seqpnt[ @visitcount='0' ][ @excluded='false' ] )" />
+ <xsl:variable name="visited" select="count(./method/seqpnt[not(@visitcount='0')] )" />
+ <td width="30%">
+ <div class="assembly">
+ <a href="#{generate-id($module)}">
+ <xsl:value-of select="$module" />
+ </a>
+ </div>
+ </td>
+ <td width="70%">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="visited" select="$visited" />
+ <xsl:with-param name="notVisited" select="$notVisited" />
+ <xsl:with-param name="total" select="$total" />
+ </xsl:call-template>
+ </td>
+ </xsl:template>
+ <!-- General Header -->
+ <xsl:template name="header">
+ <h1>
+ <b>NCover</b> Code Coverage Report
+ </h1>
+ <table>
+ <tr>
+ <td class="class">
+ <a onClick="ExpandAll();">Expand</a>
+ </td>
+ <td> | </td>
+ <td class="class">
+ <a onClick="CollapseAll();">Collapse</a>
+ </td>
+ </tr>
+ </table>
+ <hr size="1" />
+ </xsl:template>
+ <xsl:template name="footer">
+ <hr size="1" />
+ <a class="detailPercent" href="#{top}">Top</a>
+ </xsl:template>
+ <!-- draw % table-->
+ <xsl:template name="detailPercent">
+ <xsl:param name="visited" />
+ <xsl:param name="notVisited" />
+ <xsl:param name="total" />
+ <table width="100%" class="detailPercent">
+ <tr>
+ <xsl:if test="($notVisited=0) and ($visited=0)">
+ <td class="excluded" width="100%">Excluded</td>
+ </xsl:if>
+ <xsl:if test="not($notVisited=0)">
+ <td class="notVisited">
+ <xsl:attribute name="width">
+ <xsl:value-of select="concat($notVisited div $total * 100,'%')" />
+ </xsl:attribute>
+ <xsl:value-of select="concat (format-number($notVisited div $total * 100,'#.##'),'%')" />
+ </td>
+ </xsl:if>
+ <xsl:if test="not ($visited=0)">
+ <td class="visited">
+ <xsl:attribute name="width">
+ <xsl:value-of select="concat($visited div $total * 100,'%')" />
+ </xsl:attribute>
+ <xsl:value-of select="concat (format-number($visited div $total * 100,'#.##'), '%')" />
+ </td>
+ </xsl:if>
+ </tr>
+ </table>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
trunk/build/tools/ncover/CoverLib.dll
Binary file
trunk/build/tools/ncover/Microsoft.VC80.CRT.manifest
@@ -0,0 +1,8 @@
+๏ปฟ<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <noInheritable></noInheritable>
+ <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
+ <file name="msvcr80.dll" hash="10f4cb2831f1e9288a73387a8734a8b604e5beaa" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>n9On8FItNsK/DmT8UQxu6jYDtWQ=</dsig:DigestValue></asmv2:hash></file>
+ <file name="msvcp80.dll" hash="b2082dfd3009365c5b287448dcb3b4e2158a6d26" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>0KJ/VTwP4OUHx98HlIW2AdW1kuY=</dsig:DigestValue></asmv2:hash></file>
+ <file name="msvcm80.dll" hash="542490d0fcf8615c46d0ca487033ccaeb3941f0b" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>YJuB+9Os2oxW4mY+2oC/r8lICZE=</dsig:DigestValue></asmv2:hash></file>
+</assembly>
\ No newline at end of file
trunk/build/tools/ncover/MSVCP80.dll
Binary file
trunk/build/tools/ncover/MSVCR80.dll
Binary file
trunk/build/tools/ncover/NCover.Console.exe
Binary file
trunk/build/tools/ncover/NCover.Console.exe.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+ <startup>
+ <supportedRuntime version="v2.0.50727"/>
+ </startup>
+</configuration>
\ No newline at end of file
trunk/build/tools/ncover/NCover.Framework.dll
Binary file
trunk/build/tools/ncover/NCoverFAQ.html
@@ -0,0 +1,429 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+ <head>
+ <!-- $Id: NCoverFAQ.html 247 2007-04-26 15:17:46Z peterwald $ -->
+ <title></title>
+ <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
+ <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
+ <style> body { font-size: 10pt; font-family: Verdana; }
+ p.title { font-size: 20pt; font-weight: bold; }
+ .subtitle { color: maroon; }
+ p.question { font-weight: bold; }
+ pre { font-size: 10pt; font-family: Courier; }
+ pre.usage { background-color: #F0F0F0; }
+ .quote { background-color: #F0F0F0; margin-left: 36pt;}
+ .method { color: maroon; font-size: 10pt; font-weight: bold; }
+ .hdrcell { background-color: #DDEEFF; font-size: 10pt; }
+ .datacell { background-color: #FFFFEE; text-align: right; font-size: 10pt; }
+ .hldatacell { background-color: #FFCCCC; text-align: right; font-size: 10pt; }
+ .box { border: 1px solid; padding: 10px; }
+ </style>
+ </head>
+ <body>
+ <P class="title">NCover FAQ</P>
+ <P>If you have questions that this document does not address, contact <A href="mailto:peter@waldschmidt.com">
+ Peter Waldschmidt</A> or try the <A href="http://ncover.org/">NCover Forums</A>.</P>
+ <P class="question">1. What is code coverage analysis?</P>
+ <P class="answer">A code coverage analyzer monitors your code at runtime and
+ records information about which lines of code were executed. NCover shows each
+ sequence point in your application along with the number of times that point
+ was executed. Sequence points are generated by the compiler and stored in the
+ debug information (.pdb) files. A sequence point basically corresponds to a
+ single program statement (often a line of code) in your high-level language.</P>
+ <P class="question">2. Why would I want to do code coverage analysis?</P>
+ <P class="answer">Unit test suites are often used as a quality tool during the
+ development process to keep the codebase stable as it changes and expands.
+ Tools such as <A href="http://nunit.org/">NUnit</A> are often used to run and
+ report on the test suites. However, when implementing unit testing in your
+ build process, you have no way of knowing how much of your code the unit tests
+ are actually testing. This is where code coverage comes in. You can run NUnit
+ within NCover and use the code coverage report to determine which code was not
+ tested by that particular test suite.</P>
+ <P class="question">3. What versions of the CLR does NCover support?</P>
+ <P class="answer">
+ NCover 1.5.x requires the .NET framework version 2.0.50727 to be installed; however,
+ the application being profiled can be written against any shipping version of the
+ framework. NCover
+ has been tested profiling coverage of .NET 2.0, .NET 1.1 and .NET 1.0 applications.</P>
+ <P class="question">4. Which version of NCover should I install?</p>
+ <P class="answer">
+ If you have the .NET 2.0 framework installed on your machine then you should use
+ the latest NCover version available. NCover as of version 1.5 can profile .NET 2.0, 1.1 and 1.0 applications.</p>
+ <p class="answer">
+ For development teams who do not have the .NET framework 2.0 installed but do have
+ the .NET framework version 1.1.4322, you can
+ try NCover 1.3.3. Note however that this version is no longer supported as
+ it has a number of known issues and limitations.</p>
+ <P class="question">5. What is the command line syntax for NCover?</P>
+ <P class="answer">Here is the usage info from the NCover command line (for NCover versions from 1.5.6
+ only):</P>
+ <pre class="usage">NCover.Console [<command line> [<command args>]]
+ [//svc <service name>]
+ [//iis]
+ [//a <assembly list>]
+ [//w <working directory>]
+ [//ea <exclusion list>]
+ [//reg]
+ [//x <xml output file>]
+ [//s [<settings file>]] [//r [<settings file>]]
+ [//v] [//q]
+ [//l <log file>]
+
+//svc For profiling windows services
+//iis For profiling web applications
+
+//a List of assemblies to profile separated by semi-colons i.e. "MyAssembly1;MyAssembly2". Do not include paths or suffixes.
+//w Working directory for profiled application
+//ea List of attributes marking classes or methods to exclude from coverage
+
+//reg Register profiler temporarily for user. (helps with xcopy deployment)
+//x Specify coverage output file. (default: coverage.xml).
+//pm Specify name of process to profile (i.e. myapp.exe)
+
+//s Save settings to a file (defaults: NCover.Settings)
+//r Use settings file, overriding other settings (default: NCover.Settings)
+
+//l Specify profiler log file (default: coverage.log).
+//q No logging (quiet)
+//v Enable verbose logging (show instrumented code)
+ </pre>
+ <UL>
+ <LI><command line> - This argument specifies the command-line of the .NET application
+ you want to analyze.
+ Any command line arguments not starting with // will be passed
+ through to that application. NCover will profile the running application until it has exited. See below for examples.<li>//svc - This option is an alternative to the <command line>
+ for profiling windows services, which cannot be run directly as executables. NCover
+ will start the service (stopping it first if already running) and profile coverage
+ until the windows service is stopped.</li>
+ <li>//iis - This option is an alternative to the <command line> for profiling
+ web applications. NCover will start the IISAdmin and W3C
+ services (stopping first if currently running) and profile coverage until the IISAdmin
+ service is stopped.<br />
+ </li>
+ <li>//a - This command-line argument specifies the assemblies that you want to analyze.
+ NCover can only analyze assemblies that have .pdb files included with them. If
+ you do not specify the //a argument, NCover will attempt to analyze every loaded
+ assembly that has debug information available. Note that the assembly name arguments are
+ the module name within the assembly, not the physical file name. e.g. "MyAssembly"
+ rather than "MyAssembly.dll".<li>//w - If the application being profiled requires the
+ working directory to be set to something other than the current directory you are
+ executing the command line from then you can override it with this argument.</li>
+ <li>//ea - You can choose to exclude classes and methods
+ from coverage statistics by defining .NET attribute(s) and applying it to the affected
+ code. When using this argument you must specify the full type namespace of these
+ attribute(s) separated by semi-colons. See below for an example.<br />
+ </li>
+ <li>//reg - NCover requires a COM registration of the CoverLib.dll assembly containing
+ the profiler, which is performed automatically by the default .msi installation.
+ If you require an xcopy style deployment of NCover like many other .NET tools, then
+ you can use this argument which will temporarily register the profiler while performing
+ coverage. This feature was added in NCover 1.5.6.</li>
+ <li>//x - The output of NCover is an xml file (example below). Use this argument to
+ specify an alternate filename to "coverage.xml" in the current directory.<br />
+ </li>
+ <li>//pm - This setting tells NCover to ignore processes that don't have the specified process module name.
+ This is the name of the executable (i.e. myapp.exe). This setting is useful in cases, where your NCover
+ command spawns a series of child processes. Using this setting will help NCover determine which process to profile.
+ </li>
+ <li>//s - You may find it more convenient to use a settings file rather than specifying
+ a long list of command line arguments for running NCover. If you get the NCover
+ command line working as you would like it and then use the //s argument it will
+ save the required arguments as an xml file that can then be used by the //r argument
+ below.</li>
+ <li>//r - For use when you have used //s to construct an NCover settings file containing
+ your command line arguments. e.g. "ncover.console.exe //r NCover.Settings"<br />
+ </li>
+ <li>//l - The coverage log file can provide an insight if the desired coverage output
+ is not obtained. Useful information you may find to assist you includes which assemblies
+ were loaded by NCover, their file paths and which of those it found the .pdb build
+ symbols for. Use this argument to specify an alternative log file name or location
+ to coverage.log in the current directory.</li>
+ <li>//q - Suppresses writing the coverage.log file.</li>
+ <li>//v - This command-line argument makes the profiler emit all the original IL and
+ modified IL instructions to the coverage log. This is useful for debugging
+ purposes. Beware that this can make your coverage log file very large!
+ </li>
+ </UL>
+ <P class="question">6. Does NCover required a special compilation step for my code?</P>
+ <P class="answer">No. Some code coverage tools change your source code and force
+ you to recompile it into a special build. NCover is designed to work
+ on shipping code. NCover uses the .NET Framework profiling API to monitor
+ your code. It does require build symbols, but can be run on release code
+ without any modifications.</P>
+ <P class="question">7. How does NCover work?</P>
+ <P class="answer">NCover uses the .NET Framework profiler API to monitor an
+ application's execution. When a method is loaded by the CLR, NCover retrieves
+ the IL and replaces it with instrumented IL code. NCover does not change
+ your original IL code, it simply inserts new code to update a visit
+ counter at each sequence point. Upon
+ request, (usually after the .NET process has shut down) the profiler outputs statistics
+ to the coverage file.
+ </P>
+ <P class="question">
+ 8. What is the output of NCover?</P>
+ <P class="answer">NCover generally writes out three files after analysis
+ completes.
+ <ul>
+ <li>
+ Coverage.log - This file is a log of the events and messages from the profiler
+ during the analysis process. Most of the time, error messages are recorded in
+ this log. If you enable verbose logging, the coverage log will contain
+ disassembly of the original and instrumented IL code. Verbose logging is not recommended for
+ normal use.<li>
+ Coverage.xml - This file is the analysis output of NCover. You can see an
+ example of the output below.
+ <LI>
+ Coverage.xsl - This file is a simple XML transformation that makes the XML
+ output easily readable.
+ </LI>
+ </ul>
+ <span class="subtitle">Example XML output</span>
+ <div class="box"><pre><method class="NCoverTest.ClassLoaded" name="HasDeadCode">
+ <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
+ column="13" line="48" endcolumn="58" endline="48" visitcount="1" />
+ <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
+ column="13" line="49" endcolumn="22" endline="49" visitcount="1" />
+ <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
+ column="17" line="50" endcolumn="24" endline="50" visitcount="1" />
+ <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
+ column="13" line="51" endcolumn="48" endline="51" visitcount="0" />
+ <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
+ column="9" line="52" endcolumn="10" endline="52" visitcount="0" />
+</method></pre>
+ </div>
+ <p></p>
+ <span class="subtitle">Example transformed output</span>
+ <div class="box">
+ <DIV class="method">NCoverTest.ClassLoaded.HasDeadCode</DIV>
+ <TABLE id="Table1" borderColor="black" cellSpacing="0" cellPadding="3" border="1">
+ <TBODY>
+ <TR>
+ <TD class="hdrcell">Visit Count</TD>
+ <TD class="hdrcell">Line</TD>
+ <TD class="hdrcell">Column</TD>
+ <TD class="hdrcell">End Line</TD>
+ <TD class="hdrcell">End Column</TD>
+ <TD class="hdrcell">Document</TD>
+ </TR>
+ <TR>
+ <TD class="datacell">1</TD>
+ <TD class="datacell">48</TD>
+ <TD class="datacell">13</TD>
+ <TD class="datacell">48</TD>
+ <TD class="datacell">58</TD>
+ <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
+ </TR>
+ <TR>
+ <TD class="datacell">1</TD>
+ <TD class="datacell">49</TD>
+ <TD class="datacell">13</TD>
+ <TD class="datacell">49</TD>
+ <TD class="datacell">22</TD>
+ <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
+ </TR>
+ <TR>
+ <TD class="datacell">1</TD>
+ <TD class="datacell">50</TD>
+ <TD class="datacell">17</TD>
+ <TD class="datacell">50</TD>
+ <TD class="datacell">24</TD>
+ <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
+ </TR>
+ <TR>
+ <TD class="hldatacell">0</TD>
+ <TD class="datacell">51</TD>
+ <TD class="datacell">13</TD>
+ <TD class="datacell">51</TD>
+ <TD class="datacell">48</TD>
+ <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
+ </TR>
+ <TR>
+ <TD class="hldatacell">0</TD>
+ <TD class="datacell">52</TD>
+ <TD class="datacell">9</TD>
+ <TD class="datacell">52</TD>
+ <TD class="datacell">10</TD>
+ <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
+ </TR>
+ </TBODY>
+ </TABLE>
+ </div>
+ <P>Suggested usages of the coverage.xml output are to display it in the <a href="http://ncoverexplorer.org/">
+ NCoverExplorer</a> gui with the source
+ code highlighted, to generate html reports, or to include it in your continuous build server reports such as CruiseControl.Net.
+ For more information on these options see below in the FAQ.</P>
+ <P></P>
+ <P class="question">
+ 9. How do I use coverage exclusions?</P>
+ <p>
+ First you should define an attribute to markup your excluded code with. You will
+ likely want to put this in a common assembly to make it reusable, or indeed within
+ a "CommonAssemblyInfo.cs" that you include in all your application assemblies.</p>
+ <P></P>
+ <pre class="usage">namespace MyNamespace {
+ class CoverageExcludeAttribute : System.Attribute { }
+}</pre>
+ <p>
+ Apply the attribute to the C# classes and/or methods you wish to mark as excluded
+ from code coverage statistics:</p>
+ <P></P>
+ <pre class="usage"> [CoverageExclude]
+ private void SomeMethodToExclude() {} </pre>
+ <p>
+ Finally, ensure you pass the full qualified attribute information in the NCover command line:</p>
+ <P></P>
+ <pre class="usage"> NCover.Console MyApplication.exe //ea MyNamespace.CoverageExcludeAttribute </pre>
+ <p>
+ Note that if you are using the <a href="http://testdriven.net/">TestDriven.Net</a>
+ VS.Net add-in to "Test with Coverage" it will automatically
+ pass through "//ea CoverageExcludeAttribute"
+ which you should define without a namespace like above. For further information refer to this
+ <a href="http://weblogs.asp.net/nunitaddin/archive/2006/10/04/CoverageExclude.aspx">
+ blog entry</a>.</p>
+ <P class="question">
+ 10. Examples</P>
+ <p>
+ Coverage while running a simple executable until it exits:</p>
+ <P></P>
+ <pre class="usage"> NCover.Console MyApplication.exe</pre>
+ <p>
+ Coverage while running all the unit tests in an assembly using NUnit, profiling
+ all loaded assemblies with .pdb build symbols:</p>
+ <P></P>
+ <pre class="usage"> NCover.Console nunit-console.exe MyApplication.Tests.dll</pre>
+ <p>
+ Coverage of only a subset of loaded assemblies while running unit tests:</p>
+ <P></P>
+ <pre class="usage"> NCover.Console nunit-console.exe MyApplication.Tests.dll //a MyApplication.Core;MyApplication.Utilities</pre>
+ <p>
+ Coverage of a windows service. Stop the service to generate the coverage output:</p>
+ <P></P>
+ <pre class="usage"> NCover.Console //svc MyServiceName</pre>
+ <p>
+ Coverage of an ASP.Net application. Stop the IIS service to generate the coverage
+ output:</p>
+ <P></P>
+ <pre class="usage"> NCover.Console //iis</pre>
+ <P class="question">
+ 11. Where can I get help or support?</P>
+ <P class="answer">
+ Your best approach is to browse the <a href="http://ncover.org/site/forums/default.aspx">
+ NCover forums</a> as well as the <a href="http://ncover.org/SITE/blogs/default.aspx">
+ blog</a> by the author Peter Waldschmidt. If you cannot find a similar issue
+ mentioned feel free to post your query and perhaps someone can help.</P>
+ <P class="question">
+ 12. How do I "xcopy deploy" NCover like my other build tools?</P>
+ <P class="answer">
+ Many developers prefer to have their build tools such as NUnit, NAnt etc stored
+ in source control in a Tools folder along with the source code. This ensures that
+ a new developer can obtain and build the application without having to install additional
+ tools on their own machines.</P>
+ <p>
+ NCover can also be deployed in this fashion. However the one gotcha with NCover
+ versus other tools is that the profiler within CoverLib.dll must be COM registered
+ on the local machine before you execute it. Prior to NCover 1.5.6 this was usually
+ achieved as part of your build script, which would call regsvr32 with the path to
+ the CoverLib.dll in your Tools folder. Alternatively the <ncover> NAnt and
+ MSBuild tasks described below will do this for you. As of NCover 1.5.6 you can also
+ use the //reg option in the command line arguments which will temporarily register
+ the profiler. Note that the //reg option will not work for IIS or Windows Service
+ profiling unless you are running NCover under the same Windows login account as
+ the IIS worker process, or your Windows Service.</p>
+ <P class="question">
+ 13. How do I see my source code highlighted with the coverage results?</P>
+ <P class="answer">
+ <a href="http://ncoverexplorer.org/">NCoverExplorer</a> is a gui and console-based
+ .NET application developed by <a href="http://www.kiwidude.com/blog/">Grant Drake</a>. NCoverExplorer
+ parses the coverage.xml files output from NCover and displays the results integrated
+ with your source code. It also includes a number of additional features to merge,
+ filter, sort and generate html reports. The console version is
+ designed to be used as part of an automated build process. The support forums for
+ NCoverExplorer are located with the NCover ones at <a href="http://ncover.org">http://ncover.org/</a>.<strong> </strong></P>
+ <P class="question">
+ 14. How do I run NCover from within the Visual Studio.Net IDE?</P>
+ <P class="answer">
+ The <a href="http://testdriven.net/">TestDriven.Net</a> add-in by <a href="http://weblogs.asp.net/nunitaddin/">
+ Jamie Cansdale</a> offers a right-click capability within the IDE to execute
+ your unit tests with code coverage. The results of the NCover code coverage are
+ displayed with the bundled NCoverExplorer gui for analysis and reporting.</P>
+ <P class="question">
+ 15. How do I run NCover from a NAnt or MSBuild task?</P>
+ <P class="answer">
+ You can use an <exec> task with <a href="http://nant.sourceforge.net/">NAnt</a>
+ or an <Exec> task with MSBuild. Alternatively you may want to use the custom
+ <ncover> task for NAnt or <NCover> task for MSBuild developed by Grant
+ Drake for a more developer friendly syntax. The source code, compiled assemblies
+ and documentation are located in the NCoverExplorer.Extras.zip available from <a
+ href="http://ncoverexplorer.org/">http://ncoverexplorer.org/</a>.</P>
+ <P class="question">
+ 16. How do I include NCover output in my CruiseControl.Net build reports?</P>
+ <P class="answer">
+ <a href="http://ccnet.thoughtworks.com/">CruiseControl.Net</a> is a continuous integration
+ build server which offers web-based reporting of the outputs of a build such as
+ unit test results and code coverage reporting. The default CruiseControl.Net installation
+ includes a basic stylesheet which works in combination with the standard coverage.xml
+ formatted output. So all you need to do is include the execution of NCover as part
+ of your build, then add a CruiseControl.Net merge file publisher task to integrate
+ the coverage.xml results into the build output.</P>
+ <p class="answer">
+ An improvement on the above to display more attractive and powerful reports as well
+ as minimize the build log size is to use NCoverExplorer. The NCoverExplorer.Console.exe
+ is designed to produce a more concise xml report summary that is combined with an
+ alternate xsl stylesheet for CruiseControl.Net. You can find more information and
+ screenshots in this <a href="http://www.kiwidude.com/blog/2006/04/ncoverexplorer-v133.html">
+ blog entry</a> - all the necessary tasks, examples and documentation are located
+ within NCoverExplorer.Extras.zip available from <a href="http://ncoverexplorer.org/">
+ http://ncoverexplorer.org/</a>. </p>
+ <P class="question">
+ 17. How do I merge multiple NCover coverage.xml results?</P>
+ <P class="answer">
+ You can can use NCoverExplorer to merge the results of multiple coverage runs. For
+ more information refer to this <a href="http://www.kiwidude.com/blog/2006/10/ncoverexplorer-merging-ncover-reports.html">
+ blog entry</a>.</P>
+ <P class="question">
+ 18. Troubleshooting: Why is my coverage.xml file empty?</P>
+ <ul>
+ <li>If using the command-line, did you COM register CoverLib.dll (or use the //reg option
+ from NCover 1.5.6)?</li>
+ <li>Did you generate build symbol files (.pdbs) for the profiled application?</li>
+ <li>If using the //a option, did you correctly list just the assembly names without
+ paths or .dll suffixes?</li>
+ </ul>
+ <P class="question">
+ 19. Troubleshooting: I have coverage.xml output but my XYZ assembly is not included in it?</P>
+ <ul>
+ <li>NCover will only profile loaded assemblies - did your code execution path while
+ under coverage force that assembly to be loaded (e.g. by loading a type or calling
+ a method in that assembly)? </li>
+ <li>Did you generate build symbol files (.pdb files) for the missing assembly? </li>
+ <li>If using the //a option, did you correctly list the assembly names including the
+ one that is missing?</li>
+ <li>Can you see information about the assembly being loaded within the coverage.log?
+ Is the correct assembly being loaded (check the path) - if you have a version in
+ the GAC it may possibly prevent the .pdb file from being loaded.</li><li>If using the NCoverExplorer gui, have you got a coverage exclusion defined which
+ is hiding it from the display?</li>
+ </ul>
+ <P class="question">
+ 20. Troubleshooting: After running NCover my coverage.log says "Failed to load symbols for module XYZ"?</P>
+ <ul>
+ <li>This message means that no .pdb build symbol file was found for that assembly so
+ it cannot be profiled for code coverage. If that assembly is part of the .NET framework
+ for instance like System.Data.dll, then this is an expected message and should not
+ cause concern. </li><li>If however the assembly belongs to your application, did you generate the
+ build symbol files (.pdb files) for it? </li>
+ </ul>
+ <P class="question">
+ 21. Troubleshooting: I get a "Profiled process terminated. Profiler connection not
+ established" message?</P>
+ <ul>
+ <li>If using the command-line, did you COM register CoverLib.dll (or use the //reg option
+ from NCover 1.5.6)?</li><li>Are you running Windows XP 64-bit? You may want to take a look at
+ <a href="http://ncover.org/SITE/forums/thread/43.aspx">this thread</a></li></ul>
+ <P class="question">
+ 22. Troubleshooting: My coverage exclusions are not working?</P>
+ <ul>
+ <li>Have you put the full namespace type name to the exclusion including the Attribute suffix in the //ea argument? See the "How
+ do I use coverage exclusions?" question above.</li></ul>
+
+ </body>
+</html>
trunk/build/tools/ncover/VC80CRT.MAN
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- Copyright ยฉ 1981-2001 Microsoft Corporation -->
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <noInheritable/>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.VC80.CRT"
+ version="8.0.50608.0"
+ processorArchitecture="x86"
+ publicKeyToken="1fc8b3b9a1e18e3b"
+ />
+ <file name="msvcr80.dll"/>
+ <file name="msvcp80.dll"/>
+ <file name="msvcm80.dll"/>
+</assembly>
trunk/build/tools/ncover.explorer/ActiproEULA.html
@@ -0,0 +1,287 @@
+<html>
+<head>
+ <title>End-User License Agreement (EULA)</title>
+ <style>
+ BODY { font-family: Verdana, sans-serif; }
+ LI { margin-top: 10pt; }
+ </style>
+</head>
+<body>
+
+
+<h2>END-USER LICENSE AGREEMENT FOR ACTIPRO SOFTWARE LLC SOFTWARE</h2>
+
+<hr><b>
+IMPORTANT - READ CAREFULLY: This Actipro Software LLC ("Actipro") End-User License Agreement ("EULA")
+is a legal agreement between you (๏ฟฝLicensee๏ฟฝ), a developer of software applications, and Actipro for the Actipro software product
+accompanying this EULA, which includes computer software and may include associated source code, media, printed materials,
+and "on-line" or electronic documentation ("SOFTWARE PRODUCT"). By installing, copying, or otherwise using the SOFTWARE PRODUCT,
+you agree to be bound by the terms of this EULA. If you do not agree to the terms of this EULA, do not install, use, distribute
+in any manner, or replicate in any manner, any part, file or portion of the SOFTWARE PRODUCT.
+</b><hr>
+
+<p>
+The SOFTWARE PRODUCT is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE PRODUCT is licensed, not sold.
+</p>
+
+<p>
+The Licensee is considered to be an authorized licensee (๏ฟฝAuthorized๏ฟฝ) if the Licensee has legitimately obtained a registered license for the SOFTWARE PRODUCT from Actipro or an authorized Actipro reseller.
+</p>
+
+<p>
+<b>RIGOROUS ENFORCEMENT OF INTELLECTUAL PROPERTY RIGHTS.</b>
+If the licensed right of use for this SOFTWARE PRODUCT is purchased by the Licensee with any intent to reverse engineer,
+decompile, create derivative works, and the exploitation or unauthorized transfer of, any Actipro intellectual property and
+trade secrets, to include any exposed methods or source code where provided, no licensed right of use shall exist, and any products
+created as a result shall be judged illegal by definition of all applicable law. Any sale or resale of intellectual property or
+created derivatives so obtained will be prosecuted to the fullest extent of all local, federal and international law.
+</p>
+
+<p>
+<b>GRANT OF LICENSE.</b> This EULA, if legally executed as defined herein, licenses and so grants the Licensee the following rights:
+</p>
+
+<p>
+<b>Evaluation.</b> If the downloaded SOFTWARE PRODUCT is designated as an Evaluation Release (๏ฟฝEvaluation Release๏ฟฝ),
+the Licensee is granted a license for a period of only fifteen (15) days after installation of the Evaluation Release
+of the SOFTWARE PRODUCT ("Evaluation Period"). After the Evaluation Period, the Licensee must either:
+<ol>
+<li>Delete the SOFTWARE PRODUCT and all related files from ALL computers onto which it was installed or copied, or</li>
+<li>Contact Actipro or one of its authorized resellers to purchase the SOFTWARE PRODUCT.</li>
+</ol>
+</p>
+
+<p>
+The Licensee may use the Evaluation Release of the SOFTWARE PRODUCT for evaluation purposes only.
+The Licensee may not distribute ANY of the files, in any form or manner, provided with the Evaluation Release of the
+SOFTWARE PRODUCT to ANY PARTIES.
+</p>
+
+<p>
+<b>Development.</b> Actipro grants the Licensee the non-exclusive license to install and use multiple copies of the
+SOFTWARE PRODUCT or any prior version for the sole purpose of developing any number of end user applications that
+operate in conjunction with the SOFTWARE PRODUCT. If the Licensee is not Authorized, the Licensee may not use the
+SOFTWARE PRODUCT beyond the Evaluation Period.
+</p>
+
+<p>
+If the Licensee has purchased a single developer license (๏ฟฝSingle Developer License๏ฟฝ), the Licensee is Authorized
+to use the SOFTWARE PRODUCT indefinitely beyond the Evaluation Period. A Single Developer License for the SOFTWARE PRODUCT
+may not be shared or used concurrently by more than one individual developer. In a project that uses the SOFTWARE PRODUCT,
+each individual developer on the project requires a separate Single Developer License, regardless of whether they directly
+use the component or not. Single Developer Licenses may also be obtained in team discount packs.
+</p>
+
+<p>
+If the Licensee has purchased a site license (๏ฟฝSite License๏ฟฝ), each of the developers at a single physical location is
+considered Authorized according to the terms and conditions of the Single Developer License. Each additional physical
+location requires an additional Site License to be considered Authorized.
+</p>
+
+<p>
+If the Licensee has purchased an enterprise license (๏ฟฝEnterprise License๏ฟฝ), all developers in the Licensee's organization,
+regardless of location, are considered Authorized according to the terms and conditions of the Single Developer License.
+</p>
+
+<p>
+If the Licensee has purchased a blueprint license (๏ฟฝBlueprint License๏ฟฝ), each of the Authorized developers for the SOFTWARE PRODUCT is
+considered Authorized to access source code for the SOFTWARE PRODUCT ("Source Code").
+The Blueprint License must be purchased at the same time as a Site License or Enterprise License.
+Source Code may exclude Actipro proprietary licensing code.
+The sale of Blueprint Licenses is considered final and neither the SOFTWARE PRODUCT nor Source Code may be returned under any circumstances.
+</p>
+
+<p>
+<b>Duplication and Distribution.</b> The SOFTWARE PRODUCT may include certain files ("Redistributables") intended for distribution
+by the Licensee to the users of programs the Licensee creates. Redistributables include, for example, those files identified in
+printed or electronic documentation as redistributable files, or those files pre-selected for deployment by an install utility
+provided with the SOFTWARE PRODUCT (if any). In any event, the Redistributables for the SOFTWARE PRODUCT are only those files
+specifically designated as such by Actipro.
+</p>
+
+<p>
+Subject to all of the terms and conditions in this EULA, if the Licensee is Authorized, Actipro grants the Licensee the non-exclusive,
+royalty-free license to duplicate the Redistributables and to distribute them solely in conjunction with software products
+developed by the Licensee that use them. The Licensee may not supply any means by which end users could incorporate the
+SOFTWARE PRODUCT or portions thereof into their own products.
+</p>
+
+<p>
+<b>Source Code.</b> If the Licensee has purchased a Blueprint License and is Authorized, the Licensee is provided Source Code
+for the SOFTWARE PRODUCT. The following stipulations and restrictions apply to Source Code:
+<ol>
+<li>Source Code shall be considered as part the SOFTWARE PRODUCT and all requirements stated above still apply,
+ meaning that developers at a separate site from the one which purchased the Blueprint License are NOT able to work on
+ any project created that uses the Source Code, unless that site has also purchased a Blueprint License.
+ The only exception is when an Enterprise License has been purchased along with the Blueprint License,
+ in which case the Source Code may be used by developers at any site.</li>
+<li>Actipro grants the Licensee the non-exclusive license to view and modify the Source Code for the sole purposes of education and troubleshooting.
+ If the Licensee troubleshoots the Source Code, the Licensee may compile the corrected source code and use and distribute the
+ resulting object code solely as a replacement for the corresponding Redistributables the Source Code compiles into.</li>
+<li>The Licensee may NOT distribute or sell the Source Code, or portions or modifications or derivative works thereof, to any third party
+ not Authorized by the Licensee๏ฟฝs Blueprint License(s), without explicit permission by Actipro.</li>
+<li>The Licensee may not compete against Actipro by repackaging, recompiling, or renaming the SOFTWARE PRODUCT for which the
+ Licensee purchased Source Code. Any derivative works based on the Source Code are illegal to be created or sold if they compete
+ in any way with the SOFTWARE PRODUCT or other Actipro products.</li>
+<li>Any object code that is created by using the Source Code or derivative code based on the Source Code must be obfuscated.</li>
+<li>Any object code that is created by using the Source Code or derivative code based on the Source Code may NOT bear "ActiproSoftware"
+ or the name of the SOFTWARE PRODUCT in the object code assembly name.</li>
+<li>All Source Code must be kept in its proper "ActiproSoftware" namespace.</li>
+<li>Actipro shall retain all rights, title and interest in and to all corrections, modifications and derivative works of the Source Code
+ created by the Licensee, including all copyrights subsisting therein, to the extent such corrections, modifications or
+ derivative works contain copyrightable code or expression derived from the Source Code.</li>
+<li>The Licensee acknowledges that the Source Code contains valuable and proprietary trade secrets of Actipro, and agrees to expend
+ every effort to insure its confidentiality.</li>
+<li>Source Code may be obtained by coordinating with Actipro during the support period for the Blueprint License, typically one year
+ in duration, starting on the date of purchase of the Blueprint License.</li>
+</ol>
+</p>
+
+<p>
+<b>Storage/Network Use.</b> The Licensee may also store or install a copy of the SOFTWARE PRODUCT on a storage device,
+such as a network server, used only to install or run the SOFTWARE PRODUCT on the the Licensee๏ฟฝs other computers over an internal network;
+however, the Licensee must acquire and dedicate a Single Developer License for each separate individual developer who wishes to use
+the SOFTWARE PRODUCT.
+</p>
+
+<p>
+<b>DESCRIPTION OF OTHER RIGHTS AND LIMITATIONS.</b>
+</p>
+
+<p>
+<b>Not for Resale Software.</b> If the SOFTWARE PRODUCT is labeled and provided as "Not for Resale" or "NFR", then, notwithstanding
+other sections of this EULA, the Licensee may not resell, distribute, or otherwise transfer for value or benefit in any manner,
+the SOFTWARE PRODUCT or any derivative work using the SOFTWARE PRODUCT. The Licensee may not transfer, rent, lease, lend, copy,
+modify, translate, sublicense, time-share or electronically transmit the SOFTWARE PRODUCT, media or documentation.
+This also applies to any and all intermediate files, source code, and compiled executables.
+</p>
+
+<p>
+<b>Limitations on Reverse Engineering, Decompilation, and Disassembly.</b> The Licensee may not reverse engineer, decompile,
+create derivative works, modify, translate, or disassemble the SOFTWARE PRODUCT, and only to the extent that such activity is
+expressly permitted by applicable law notwithstanding this limitation. The Licensee agrees to take all reasonable, legal and
+appropriate measures to prohibit the illegal dissemination of the SOFTWARE PRODUCT or any of its constituent parts and redistributables
+to the fullest extent of all applicable local, US Codes and International Laws and Treaties regarding anti-circumvention, including
+but not limited to, the Geneva and Berne World Intellectual Property Organization (WIPO) Diplomatic Conferences.
+</p>
+
+<p>
+<b>Rental.</b> The Licensee may not rent, lease, or lend the SOFTWARE PRODUCT.
+</p>
+
+<p>
+<b>Separation of Components, Their Constituent Parts and Redistributables.</b> The SOFTWARE PRODUCT is licensed as a single product.
+The SOFTWARE PRODUCT and its constituent parts and any provided redistributables may not be reverse engineered, decompiled, disassembled,
+nor placed for distribution, sale, or resale as individual creations by the Licensee or any individual not expressly given
+such permission by Actipro. The provision of Source Code, if included with the SOFTWARE PRODUCT, does not constitute transfer of any
+legal rights to such code, and resale or distribution of all or any portion of all Source Code and intellectual property will be prosecuted
+to the fullest extent of all applicable local, federal and international laws. All Actipro libraries, Source Code, Redistributables and
+other files remain Actipro's exclusive property. The Licensee may not distribute any files, except those that Actipro has expressly
+designated as Redistributable.
+</p>
+
+<p>
+<b>Installation and Use.</b> The license granted in this EULA for the Licensee to create his/her own compiled programs and distribute
+the Licensee๏ฟฝs programs and the Redistributables (if any), is subject to all of the following conditions:
+<ol>
+<li>All copies of the programs the Licensee creates must bear a valid copyright notice, either their own or the Actipro copyright
+ notice that appears on the SOFTWARE PRODUCT.</li>
+<li>The Licensee may not remove or alter any Actipro copyright, trademark or other proprietary rights notice contained in any portion
+ of Actipro libraries, source code, Redistributables or other files that bear such a notice.</li>
+<li>Actipro provides no warranty at all to any person, and the Licensee will remain solely responsible to anyone receiving the
+ Licensee๏ฟฝs programs for support, service, upgrades, or technical or other assistance, and such recipients will have no right
+ to contact Actipro for such services or assistance.</li>
+<li>The Licensee will indemnify and hold Actipro, its related companies and its suppliers, harmless from and against any claims or
+ liabilities arising out of the use, reproduction or distribution of the Licensee๏ฟฝs programs.</li>
+<li>The Licensee๏ฟฝs programs containing the SOFTWARE PRODUCT must be written using a licensed, registered copy of the SOFTWARE PRODUCT.</li>
+<li>The Licensee๏ฟฝs programs must add primary and substantial functionality, and may not be merely a set or subset of any of the libraries,
+ Source Code, Redistributables or other files of the SOFTWARE PRODUCT.</li>
+<li>The Licensee may not use Actipro's or any of its suppliers' names, logos, or trademarks to market the Licensee๏ฟฝs programs,
+ unless expressly given such permission by Actipro.</li>
+</ol>
+</p>
+
+<p>
+<b>Support Services.</b> Actipro may provide the Licensee with support services related to the SOFTWARE PRODUCT ("Support Services").
+Use of Support Services is governed by Actipro policies and programs described in the user manual, in on-line documentation and/or other
+Actipro provided materials. Any supplemental software code provided to the Licensee as part of the Support Services shall be considered
+part of the SOFTWARE PRODUCT and subject to the terms and conditions of this EULA. With respect to technical information the Licensee
+provides to Actipro as part of the Support Services, Actipro may use such information for its business purposes, including for product
+support and development.
+</p>
+
+<p>
+<b>Software Transfer.</b> The Licensee may NOT permanently or temporarily transfer ANY of the Licensee๏ฟฝs rights under this EULA to any
+individual or entity. Regardless of any modifications which the Licensee makes and regardless of how the Licensee might compile, link,
+and/or package the Licensee๏ฟฝs programs, under no circumstances may the libraries, redistributables, and/or other files of the
+SOFTWARE PRODUCT (including any portions thereof) be used for developing programs by anyone other than the Licensee. Only the Licensee
+as the licensed end user has the right to use the libraries, redistributables, or other files of the SOFTWARE PRODUCT (or any portions thereof)
+for developing programs created with the SOFTWARE PRODUCT. In particular, the Licensee may not share copies of the Source Code or
+Redistributables with other co-developers.
+</p>
+
+<p>
+<b>Termination.</b> Without prejudice to any other rights or remedies, Actipro will terminate this EULA upon the Licensee๏ฟฝs failure to
+comply with all the terms and conditions of this EULA. In such event, the Licensee must destroy all copies of the SOFTWARE PRODUCT and
+all of its component parts including any related documentation, and must remove ANY and ALL use of such technology immediately from any
+applications using technology contained in the SOFTWARE PRODUCT developed by the Licensee, whether in native, altered or compiled state.
+</p>
+
+<p>
+<b>UPGRADES.</b> If the SOFTWARE PRODUCT is labeled as an upgrade, the Licensee must be properly licensed to use the SOFTWARE PRODUCT
+identified by Actipro as being eligible for the upgrade in order to use the SOFTWARE PRODUCT. A SOFTWARE PRODUCT labeled as an upgrade
+replaces and/or supplements the SOFTWARE PRODUCT that formed the basis for the Licensee๏ฟฝs eligibility for the upgrade, and together
+constitute a single SOFTWARE PRODUCT. The Licensee may use the resulting upgraded SOFTWARE PRODUCT only in accordance with all the
+terms of this EULA.
+</p>
+
+<p>
+<b>COPYRIGHT.</b> All title and copyrights in and to the SOFTWARE PRODUCT (including but not limited to any images, demos, source code,
+intermediate files, packages, photographs, animations, video, audio, music, text, and "applets" incorporated into the SOFTWARE PRODUCT),
+the accompanying printed materials, and any copies of the SOFTWARE PRODUCT are owned by Actipro or its subsidiaries.
+The SOFTWARE PRODUCT is protected by copyright laws and international treaty provisions. Therefore, the Licensee must treat the
+SOFTWARE PRODUCT like any other copyrighted material except that the Licensee may install the SOFTWARE PRODUCT for use by the Licensee.
+The Licensee may not copy any printed materials accompanying the SOFTWARE PRODUCT.
+</p>
+
+<p>
+<b>GENERAL PROVISIONS.</b> This EULA may only be modified in writing signed by the Licensee and an authorized officer of Actipro.
+If any provision of this EULA is found void or unenforceable, the remainder will remain valid and enforceable according to its terms.
+</p>
+
+<p>
+<b>MISCELLANEOUS.</b> If the Licensee acquired this product in the United States, this EULA is governed by the laws of the State of Ohio.
+</p>
+
+<p>
+If this SOFTWARE PRODUCT was acquired outside the United States, then the Licensee, agrees and ascends to the adherence to all
+applicable international treaties regarding copyright and intellectual property rights which shall also apply.
+In addition, the Licensee agrees that any local law(s) to the benefit and protection of Actipro ownership of, and interest in,
+its intellectual property and right of recovery for damages thereto will also apply.
+</p>
+
+<p>
+Should you have any questions concerning this EULA, or if you desire to contact Actipro for any reason, please contact us via our
+support web pages at <a href="http://www.actiprosoftware.com">http://www.actiprosoftware.com</a>.
+</p>
+
+<p><b>
+NO WARRANTIES. ACTIPRO EXPRESSLY DISCLAIMS ANY WARRANTY FOR THE SOFTWARE PRODUCT. THE PRODUCT AND ANY RELATED DOCUMENTATION IS PROVIDED
+"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE PRODUCT REMAINS WITH THE LICENSEE.
+</b></p>
+
+<p><b>
+LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL ACTIPRO OR ITS SUPPLIERS BE LIABLE
+FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
+BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR
+INABILITY TO USE THE SOFTWARE PRODUCT OR THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, EVEN IF ACTIPRO HAS BEEN ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.
+</b></p>
+
+<p>
+Copyright (c) 2002-2007 Actipro Software LLC. All rights reserved.
+</p>
+
+</body>
+</html>
trunk/build/tools/ncover.explorer/ActiproSoftware.SyntaxEditor.Net11.dll
Binary file
trunk/build/tools/ncover.explorer/ActiproSoftware.WinUICore.Net11.dll
Binary file
trunk/build/tools/ncover.explorer/CommandBars.dll
Binary file
trunk/build/tools/ncover.explorer/ConsoleConfig.xsd
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- NCoverExplorer (c) 2007 Grant Drake. -->
+<!-- Schema for configuration file to be passed to NCoverExplorer-Console.exe using /config: switch -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="ConsoleSetting">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- Title name to appear on the report (equivalent to /project:xx). Default is blank. -->
+ <xs:element name="ProjectName" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable coverage levels. Default is 95% -->
+ <xs:element name="SatisfactoryCoverageThreshold" type="xs:decimal" minOccurs="0" maxOccurs="1" />
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable coverage as #seqPts rather than %. Default is 0. -->
+ <xs:element name="SatisfactoryUnvisitedSequencePoints" type="xs:decimal" minOccurs="0" maxOccurs="1" />
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable function coverage levels. Default is 80% -->
+ <xs:element name="SatisfactoryFunctionThreshold" type="xs:decimal" minOccurs="0" maxOccurs="1" />
+ <!-- Filtering to be applied to the results. Use integer (starting from 0=None) or named value. Default is "None". -->
+ <xs:element name="TreeFilterStyle" minOccurs="0" maxOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="None" />
+ <xs:enumeration value="HideUnvisited" />
+ <xs:enumeration value="HideFullyCovered" />
+ <xs:enumeration value="HideThresholdCovered" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <!-- Sorting to be applied to the results. Use integer (starting from 0=Name) or named value. Default is "Name". -->
+ <xs:element name="TreeSortStyle" minOccurs="0" maxOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Name" />
+ <xs:enumeration value="ClassLine" />
+ <xs:enumeration value="CoveragePercentageAscending" />
+ <xs:enumeration value="CoveragePercentageDescending" />
+ <xs:enumeration value="UnvisitedSequencePointsAscending" />
+ <xs:enumeration value="UnvisitedSequencePointsDescending" />
+ <xs:enumeration value="VisitCountAscending" />
+ <xs:enumeration value="VisitCountDescending" />
+ <xs:enumeration value="FunctionCoverageAscending" />
+ <xs:enumeration value="FunctionCoverageDescending" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <!-- Coverage exclusions to exclude specified assemblies, namespaces, classes and/or methods. -->
+ <xs:element name="CoverageExclusions" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="CoverageExclusion" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- Module specific coverage thresholds if wanting more granular coverage tolerances. -->
+ <xs:element name="ModuleThresholds" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="ModuleThreshold" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- Names of the coverage files to merge/report on. Wildcards can be used. -->
+ <xs:element name="CoverageFileNames" minOccurs="1" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="CoverageFileName" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- Report to be generated by running NCoverExplorer.Console. Default is "None". -->
+ <xs:element name="ReportType" minOccurs="0" maxOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="None" />
+ <xs:enumeration value="ModuleSummary" />
+ <xs:enumeration value="ModuleNamespaceSummary" />
+ <xs:enumeration value="ModuleClassSummary" />
+ <xs:enumeration value="ModuleClassFunctionSummary" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <!-- File name for the output HTML report if wanting to generate one. -->
+ <xs:element name="HtmlReportFileName" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <!-- File name for the output XML report if wanting to generate one. -->
+ <xs:element name="XmlReportFileName" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <!-- File name for the output merged coverage.xml file if any resulting from merging the inputs. -->
+ <xs:element name="MergeFileName" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <!-- Whether to show the excluded elements in the footer of the output report if being generated. Default is false. -->
+ <xs:element name="ShowExcludedFooter" type="xs:boolean" minOccurs="0" maxOccurs="1" />
+ <!-- Whether to return a failure exit code if any module is below the minimum coverage threshold. Default is false. -->
+ <xs:element name="FailIfBelowMinimum" type="xs:boolean" minOccurs="0" maxOccurs="1" />
+ <!-- Whether to return a failure exit code if total coverage is below the minimum coverage threshold. Default is false. -->
+ <xs:element name="FailIfBelowCombinedMinimum" type="xs:boolean" minOccurs="0" maxOccurs="1" />
+ <!-- For use with the FailIfXXX options - the minimum coverage threshold if not specifying at the module level. -->
+ <xs:element name="MinimumCoverage" type="xs:decimal" minOccurs="0" maxOccurs="1" />
+ <!-- Whether to suppress virtually all console output when running. Default is false. -->
+ <xs:element name="NoLog" type="xs:boolean" minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="CoverageExclusion">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ExclusionType" minOccurs="1" maxOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Assembly" />
+ <xs:enumeration value="Namespace" />
+ <xs:enumeration value="Class" />
+ <xs:enumeration value="Method" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Pattern" type="xs:string" minOccurs="1" maxOccurs="1" />
+ <xs:element name="IsRegex" type="xs:boolean" minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ModuleThreshold">
+ <xs:complexType>
+ <xs:attribute name="ModuleName" use="required" type="xs:string" />
+ <xs:attribute name="SatisfactoryCoverage" use="required" type="xs:decimal" />
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
\ No newline at end of file
trunk/build/tools/ncover.explorer/ConsoleExample.config
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Example configuration file to be passed to NCoverExplorer-Console.exe using /config: switch -->
+<!-- If not supplied, then the same defaults will be used as the NCoverExplorer GUI. -->
+<ConsoleSetting xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <!-- Name attribute is title to appear on the report (equivalent to /project:xx). Default is blank. -->
+ <ProjectName>Example.Project</ProjectName>
+
+ <!-- Names of the coverage files to merge/report on. Wildcards can be used. -->
+ <CoverageFileNames>
+ <CoverageFileName>*.Coverage.xml</CoverageFileName>
+ </CoverageFileNames>
+
+ <!-- Report to be generated by running NCoverExplorer.Console. Default is "None". Other possible values are:
+ "ModuleSummary", "ModuleNamespaceSummary",
+ "ModuleClassSummary", "ModuleClassFunctionSummary"
+ -->
+ <ReportType>ModuleClassSummary</ReportType>
+ <!-- Filename for the output html report if wanting to generate one. -->
+ <HtmlReportFileName>C:\MyCoverageReport.html</HtmlReportFileName>
+ <!-- Filename for the output xml report (for use by cc.net) if wanting to generate one. -->
+ <XmlReportFileName>C:\MyCoverageReport.xml</XmlReportFileName>
+
+ <!-- File name for the output merged coverage.xml file if any resulting from merging the inputs. -->
+ <!--<MergeFileName>C:\MyCoverageMerged.xml</MergeFileName>-->
+
+ <!-- Whether to show the excluded elements in the footer of the output report if being generated. Default is false. -->
+ <!--<ShowExcludedFooter>True</ShowExcludedFooter>-->
+
+ <!-- Whether to suppress virtually all console output when running. Default is false. -->
+ <!--<NoLog>True</NoLog>-->
+
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable coverage levels. Default is 95% -->
+ <!--<SatisfactoryCoverageThreshold>95</SatisfactoryCoverageThreshold>-->
+
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable coverage as #seqPts rather than %. Default is 0. -->
+ <!--<SatisfactoryUnvisitedSequencePoints>2</SatisfactoryUnvisitedSequencePoints> -->
+
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable function coverage levels. Default is 80% -->
+ <!--<SatisfactoryFunctionThreshold>80</SatisfactoryFunctionThreshold> -->
+
+ <!-- Threshold for acceptance criteria for coverage reports detailing acceptable function coverage levels. Default is 80% -->
+ <!--<SatisfactoryFunctionThreshold>80</SatisfactoryFunctionThreshold> -->
+
+ <!-- Filtering to be applied to the results. Use integer or named value. Default is "None". Possible values:
+ "None" (0),
+ "HideUnvisited" (1),
+ "HideFullyCovered" (2),
+ "HideThresholdCovered" (3)
+ -->
+ <TreeFilterStyle>None</TreeFilterStyle>
+
+ <!-- Sorting to be applied to the results. Use integer or named value. Default is "Name". Possible values:
+ "Name" (0),
+ "ClassLine" (1),
+ "CoveragePercentageAscending" (2), "CoveragePercentageDescending" (3),
+ "UnvisitedSequencePointsAscending" (4), "UnvisitedSequencePointsDescending" (5),
+ "VisitCountAscending" (6), "VisitCountDescending" (7)
+ "FunctionCoverageAscending" (8), "FunctionCoverageDescending" (9),
+ -->
+ <TreeSortStyle>Name</TreeSortStyle>
+
+ <!-- Coverage exclusions to exclude specified assemblies, namespaces and/or classes. -->
+ <CoverageExclusions>
+ <CoverageExclusion>
+ <ExclusionType>Assembly</ExclusionType>
+ <!-- Valid values are [Assembly], [Namespace] and [Class]. -->
+ <Pattern>*.Tests</Pattern>
+ <IsRegex>false</IsRegex>
+ <!-- Only required with a value of "true" if you do have a regular expression based pattern -->
+ </CoverageExclusion>
+ <CoverageExclusion>
+ <ExclusionType>Namespace</ExclusionType>
+ <Pattern>*.My*</Pattern>
+ </CoverageExclusion>
+ </CoverageExclusions>
+
+ <!-- Module specific coverage thresholds if any, -->
+ <!--<ModuleThresholds>
+ <ModuleThreshold ModuleName="NCoverExplorer.Core.dll" SatisfactoryCoverage="30" />
+ </ModuleThresholds>-->
+
+ <!-- Whether to return a failure exit code if any module is below the minimum coverage threshold. Default is false. -->
+ <!--<FailIfBelowMinimum>True</FailIfBelowMinimum> -->
+
+ <!-- Whether to return a failure exit code if total coverage is below the minimum coverage threshold. Default is false. -->
+ <!--<FailIfBelowCombinedMinimum>True</FailIfBelowCombinedMinimum> -->
+
+ <!-- For use with the FailIfXXX options - the minimum coverage threshold if not specifying at the module level. -->
+ <!--<MinimumCoverage>True</MinimumCoverage> -->
+
+ <!-- Whether to suppress virtually all console output when running. Default is false. -->
+ <!--<NoLog>True</NoLog> -->
+
+</ConsoleSetting>
\ No newline at end of file
trunk/build/tools/ncover.explorer/CoverageReport.xsl
@@ -0,0 +1,463 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
+ <!-- Created for NCoverExplorer by Grant Drake (see http://www.kiwidude.com/blog/) -->
+ <xsl:output method="html" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>
+
+ <xsl:template match="/">
+ <html>
+ <head>
+ <xsl:comment>Generated by NCoverExplorer (see http://www.kiwidude.com/blog/)</xsl:comment>
+ <title>NCoverExplorer - Merged Report</title>
+ <style>
+ body { font: small verdana, arial, helvetica; color:#000000; }
+ .coverageReportTable { font-size: 9px; }
+ .reportHeader { padding: 5px 8px 5px 8px; font-size: 12px; border: 1px solid; margin: 0px; }
+ .titleText { font-weight: bold; font-size: 12px; white-space: nowrap; padding: 0px; margin: 1px; }
+ .subtitleText { font-size: 9px; font-weight: normal; padding: 0px; margin: 1px; white-space: nowrap; }
+ .projectStatistics { font-size: 10px; border-left: #649cc0 1px solid; white-space: nowrap; width: 40%; }
+ .heading { font-weight: bold; }
+ .mainTableHeaderLeft { border: #dcdcdc 1px solid; font-weight: bold; padding-left: 5px; }
+ .mainTableHeader { border-bottom: 1px solid; border-top: 1px solid; border-right: 1px solid; text-align: center; }
+ .mainTableGraphHeader { border-bottom: 1px solid; border-top: 1px solid; border-right: 1px solid; text-align: left; font-weight: bold; }
+ .mainTableCellItem { background: #ffffff; border-left: #dcdcdc 1px solid; border-right: #dcdcdc 1px solid; padding-left: 10px; padding-right: 10px; font-weight: bold; font-size: 10px; }
+ .mainTableCellData { background: #ffffff; border-right: #dcdcdc 1px solid; text-align: center; white-space: nowrap; }
+ .mainTableCellPercent { background: #ffffff; font-weight: bold; white-space: nowrap; text-align: right; padding-left: 10px; }
+ .mainTableCellGraph { background: #ffffff; border-right: #dcdcdc 1px solid; padding-right: 5px; }
+ .mainTableCellBottom { border-bottom: #dcdcdc 1px solid; }
+ .childTableHeader { border-top: 1px solid; border-bottom: 1px solid; border-left: 1px solid; border-right: 1px solid; font-weight: bold; padding-left: 10px; }
+ .childTableCellIndentedItem { background: #ffffff; border-left: #dcdcdc 1px solid; border-right: #dcdcdc 1px solid; padding-right: 10px; font-size: 10px; }
+ .exclusionTableCellItem { background: #ffffff; border-left: #dcdcdc 1px solid; border-right: #dcdcdc 1px solid; padding-left: 10px; padding-right: 10px; }
+ .projectTable { background: #a9d9f7; border-color: #649cc0; }
+ .primaryTable { background: #d7eefd; border-color: #a4dafc; }
+ .secondaryTable { background: #f9e9b7; border-color: #f6d376; }
+ .secondaryChildTable { background: #fff6df; border-color: #f5e1b1; }
+ .exclusionTable { background: #fadada; border-color: #f37f7f; }
+ .graphBarNotVisited { font-size: 2px; border:#9c9c9c 1px solid; background:#df0000; }
+ .graphBarSatisfactory { font-size: 2px; border:#9c9c9c 1px solid; background:#f4f24e; }
+ .graphBarVisited { background: #00df00; font-size: 2px; border-left:#9c9c9c 1px solid; border-top:#9c9c9c 1px solid; border-bottom:#9c9c9c 1px solid; }
+ .graphBarVisitedFully { background: #00df00; font-size: 2px; border:#9c9c9c 1px solid; }
+ </style>
+ </head>
+ <body>
+ <table class="coverageReportTable" cellpadding="2" cellspacing="0">
+ <tbody>
+ <xsl:apply-templates select="//coverageReport" />
+ </tbody>
+ </table>
+ </body>
+ </html>
+ </xsl:template>
+
+ <!-- Main Project Section -->
+ <xsl:template match="//coverageReport">
+ <xsl:variable name="reportType" select="./@reportTitle" />
+ <xsl:variable name="threshold">
+ <xsl:choose>
+ <xsl:when test="$reportType = 'Module Class Function Summary'"><xsl:value-of select="./project/@acceptableFunction" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="./project/@acceptable" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="unvisitedTitle">
+ <xsl:choose>
+ <xsl:when test="$reportType = 'Module Class Function Summary'">Unvisited Functions</xsl:when>
+ <xsl:otherwise>Unvisited SeqPts</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="coverageTitle">
+ <xsl:choose>
+ <xsl:when test="$reportType = 'Module Class Function Summary'">Function Coverage</xsl:when>
+ <xsl:otherwise>Coverage</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="header" />
+
+ <xsl:call-template name="projectSummary">
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="unvisitedTitle" select="$unvisitedTitle" />
+ <xsl:with-param name="coverageTitle" select="$coverageTitle" />
+ <xsl:with-param name="reportType" select="$reportType" />
+ </xsl:call-template>
+
+ <xsl:call-template name="moduleSummary">
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="unvisitedTitle" select="$unvisitedTitle" />
+ <xsl:with-param name="coverageTitle" select="$coverageTitle" />
+ </xsl:call-template>
+
+ <xsl:if test="$reportType = 'Module Namespace Summary'">
+ <xsl:call-template name="moduleNamespaceSummary">
+ <xsl:with-param name="threshold" select="$threshold" />
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="($reportType = 'Module Class Summary') or ($reportType = 'Module Class Function Summary')">
+ <xsl:call-template name="classModuleSummary">
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="unvisitedTitle" select="$unvisitedTitle" />
+ <xsl:with-param name="coverageTitle" select="$coverageTitle" />
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="count(./exclusions/exclusion) != 0">
+ <xsl:call-template name="exclusionsSummary" />
+ </xsl:if>
+
+ <xsl:call-template name="footer" />
+ </xsl:template>
+
+
+ <!-- Report Header -->
+ <xsl:template name="header">
+ <tr>
+ <td class="projectTable reportHeader" colspan="5">
+ <table width="100%">
+ <tbody>
+ <tr>
+ <td valign="top">
+ <h1 class="titleText">NCoverExplorer Coverage Report - <xsl:value-of select="./project/@name" />  </h1>
+ <table cellpadding="1" class="subtitleText">
+ <tbody>
+ <tr>
+ <td class="heading">Report generated on:</td>
+ <td><xsl:value-of select="./@date" /> at <xsl:value-of select="./@time" /></td>
+ </tr>
+ <tr>
+ <td class="heading">NCoverExplorer version:</td>
+ <td><xsl:value-of select="./@version" /></td>
+ </tr>
+ <tr>
+ <td class="heading">Filtering / Sorting:</td>
+ <td><xsl:value-of select="./project/@filteredBy" /> / <xsl:value-of select="./project/@sortedBy" /></td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td class="projectStatistics" align="right" valign="top">
+ <table cellpadding="1">
+ <tbody>
+ <tr>
+ <td rowspan="4" valign="top" nowrap="true" class="heading">Project Statistics:</td>
+ <td align="right" class="heading">Files:</td>
+ <td align="right"><xsl:value-of select="./project/@files" /></td>
+ <td rowspan="4"> </td>
+ <td align="right" class="heading">NCLOC:</td>
+ <td align="right"><xsl:value-of select="./project/@nonCommentLines" /></td>
+ </tr>
+ <tr>
+ <td align="right" class="heading">Classes:</td>
+ <td align="right"><xsl:value-of select="./project/@classes" /></td>
+ <td align="right" class="heading"> </td>
+ <td align="right"> </td>
+ </tr>
+ <tr>
+ <td align="right" class="heading">Functions:</td>
+ <td align="right"><xsl:value-of select="./project/@members" /></td>
+ <td align="right" class="heading">Unvisited:</td>
+ <td align="right"><xsl:value-of select="./project/@unvisitedFunctions" /></td>
+ </tr>
+ <tr>
+ <td align="right" class="heading">Seq Pts:</td>
+ <td align="right"><xsl:value-of select="./project/@sequencePoints" /></td>
+ <td align="right" class="heading">Unvisited:</td>
+ <td align="right"><xsl:value-of select="./project/@unvisitedPoints" /></td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <!-- Project Summary -->
+ <xsl:template name="projectSummary">
+ <xsl:param name="threshold" />
+ <xsl:param name="unvisitedTitle" />
+ <xsl:param name="coverageTitle" />
+ <xsl:param name="reportType" />
+ <tr>
+ <td colspan="5"> </td>
+ </tr>
+ <tr>
+ <td class="projectTable mainTableHeaderLeft">Project</td>
+ <td class="projectTable mainTableHeader">Acceptable</td>
+ <td class="projectTable mainTableHeader"><xsl:value-of select="$unvisitedTitle" /></td>
+ <td class="projectTable mainTableGraphHeader" colspan="2"><xsl:value-of select="$coverageTitle" /></td>
+ </tr>
+ <xsl:call-template name="coverageDetail">
+ <xsl:with-param name="name" select="./project/@name" />
+ <xsl:with-param name="unvisitedPoints">
+ <xsl:choose>
+ <xsl:when test="$reportType = 'Module Class Function Summary'"><xsl:value-of select="./project/@unvisitedFunctions" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="./project/@unvisitedPoints" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="sequencePoints">
+ <xsl:choose>
+ <xsl:when test="$reportType = 'Module Class Function Summary'"><xsl:value-of select="./project/@members" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="./project/@sequencePoints" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="coverage">
+ <xsl:choose>
+ <xsl:when test="$reportType = 'Module Class Function Summary'"><xsl:value-of select="./project/@functionCoverage" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="./project/@coverage" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="showThreshold">True</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Modules Summary -->
+ <xsl:template name="moduleSummary">
+ <xsl:param name="threshold" />
+ <xsl:param name="unvisitedTitle" />
+ <xsl:param name="coverageTitle" />
+ <tr>
+ <td colspan="5"> </td>
+ </tr>
+ <tr>
+ <td class="primaryTable mainTableHeaderLeft">Modules</td>
+ <td class="primaryTable mainTableHeader">Acceptable</td>
+ <td class="primaryTable mainTableHeader"><xsl:value-of select="$unvisitedTitle" /></td>
+ <td class="primaryTable mainTableGraphHeader" colspan="2"><xsl:value-of select="$coverageTitle" /></td>
+ </tr>
+ <xsl:for-each select="./modules/module">
+ <xsl:call-template name="coverageDetail">
+ <xsl:with-param name="name" select="./@name" />
+ <xsl:with-param name="unvisitedPoints" select="./@unvisitedPoints" />
+ <xsl:with-param name="sequencePoints" select="./@sequencePoints" />
+ <xsl:with-param name="coverage" select="./@coverage" />
+ <xsl:with-param name="threshold" select="./@acceptable" />
+ <xsl:with-param name="showThreshold">True</xsl:with-param>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- Namespaces per Module Summary -->
+ <xsl:template name="moduleNamespaceSummary">
+ <xsl:param name="threshold" />
+ <xsl:for-each select="./modules/module">
+ <tr>
+ <td colspan="5"> </td>
+ </tr>
+ <tr>
+ <td class="secondaryTable mainTableHeaderLeft">Module</td>
+ <td class="secondaryTable mainTableHeader">Acceptable</td>
+ <td class="secondaryTable mainTableHeader">Unvisited SeqPts</td>
+ <td class="secondaryTable mainTableGraphHeader" colspan="2">Coverage</td>
+ </tr>
+ <xsl:call-template name="coverageDetailSecondary">
+ <xsl:with-param name="name" select="./@name" />
+ <xsl:with-param name="unvisitedPoints" select="./@unvisitedPoints" />
+ <xsl:with-param name="sequencePoints" select="./@sequencePoints" />
+ <xsl:with-param name="coverage" select="./@coverage" />
+ <xsl:with-param name="threshold" select="./@acceptable" />
+ </xsl:call-template>
+ <tr>
+ <td class="secondaryChildTable childTableHeader" colspan="5">Namespaces</td>
+ </tr>
+ <xsl:for-each select="./namespace">
+ <xsl:call-template name="coverageIndentedDetail">
+ <xsl:with-param name="name" select="./@name" />
+ <xsl:with-param name="unvisitedPoints" select="./@unvisitedPoints" />
+ <xsl:with-param name="sequencePoints" select="./@sequencePoints" />
+ <xsl:with-param name="coverage" select="./@coverage" />
+ <xsl:with-param name="threshold" select="./../@acceptable" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- Classes per Namespace per Module Summary -->
+ <xsl:template name="classModuleSummary">
+ <xsl:param name="threshold" />
+ <xsl:param name="unvisitedTitle" />
+ <xsl:param name="coverageTitle" />
+ <xsl:for-each select="./modules/module">
+ <tr>
+ <td colspan="5"> </td>
+ </tr>
+ <tr>
+ <td class="secondaryTable mainTableHeaderLeft">Module</td>
+ <td class="secondaryTable mainTableHeader">Acceptable</td>
+ <td class="secondaryTable mainTableHeader"><xsl:value-of select="$unvisitedTitle" /></td>
+ <td class="secondaryTable mainTableGraphHeader" colspan="2"><xsl:value-of select="$coverageTitle" /></td>
+ </tr>
+ <xsl:call-template name="coverageDetailSecondary">
+ <xsl:with-param name="name" select="./@name" />
+ <xsl:with-param name="unvisitedPoints" select="./@unvisitedPoints" />
+ <xsl:with-param name="sequencePoints" select="./@sequencePoints" />
+ <xsl:with-param name="coverage" select="./@coverage" />
+ <xsl:with-param name="threshold" select="./@acceptable" />
+ </xsl:call-template>
+ <tr>
+ <td class="secondaryChildTable childTableHeader" colspan="5">Namespace / Classes</td>
+ </tr>
+ <xsl:for-each select="./namespace">
+ <xsl:call-template name="coverageIndentedDetail">
+ <xsl:with-param name="name" select="./@name" />
+ <xsl:with-param name="unvisitedPoints" select="./@unvisitedPoints" />
+ <xsl:with-param name="sequencePoints" select="./@sequencePoints" />
+ <xsl:with-param name="coverage" select="./@coverage" />
+ <xsl:with-param name="threshold" select="../@acceptable" />
+ <xsl:with-param name="styleTweak">padding-left:20px;font-weight:bold</xsl:with-param>
+ </xsl:call-template>
+ <xsl:for-each select="./class">
+ <xsl:call-template name="coverageIndentedDetail">
+ <xsl:with-param name="name" select="./@name" />
+ <xsl:with-param name="unvisitedPoints" select="./@unvisitedPoints" />
+ <xsl:with-param name="sequencePoints" select="./@sequencePoints" />
+ <xsl:with-param name="coverage" select="./@coverage" />
+ <xsl:with-param name="threshold" select="../../@acceptable" />
+ <xsl:with-param name="styleTweak">padding-left:30px</xsl:with-param>
+ <xsl:with-param name="scale">160</xsl:with-param>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- Coverage detail row in main grid displaying a name, statistics and graph bar -->
+ <xsl:template name="coverageDetail">
+ <xsl:param name="name" />
+ <xsl:param name="unvisitedPoints" />
+ <xsl:param name="sequencePoints" />
+ <xsl:param name="coverage" />
+ <xsl:param name="threshold" />
+ <xsl:param name="showThreshold" />
+ <tr>
+ <xsl:choose>
+ <xsl:when test="$showThreshold='True'">
+ <td class="mainTableCellBottom mainTableCellItem"><xsl:value-of select="$name" /></td>
+ <td class="mainTableCellBottom mainTableCellData"><xsl:value-of select="concat(format-number($threshold,'#0.0'), ' %')" /></td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td class="mainTableCellBottom mainTableCellItem" colspan="2"><xsl:value-of select="$name" /></td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td class="mainTableCellBottom mainTableCellData"><xsl:value-of select="$unvisitedPoints" /></td>
+ <td class="mainTableCellBottom mainTableCellPercent"><xsl:value-of select="concat(format-number($coverage,'#0.0'), ' %')" /></td>
+ <td class="mainTableCellBottom mainTableCellGraph">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="notVisited" select="$unvisitedPoints" />
+ <xsl:with-param name="total" select="$sequencePoints" />
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="scale" select="200" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <!-- Coverage detail row in secondary grid header displaying a name, statistics and graph bar -->
+ <xsl:template name="coverageDetailSecondary">
+ <xsl:param name="name" />
+ <xsl:param name="unvisitedPoints" />
+ <xsl:param name="sequencePoints" />
+ <xsl:param name="coverage" />
+ <xsl:param name="threshold" />
+ <tr>
+ <td class="mainTableCellItem"><xsl:value-of select="$name" /></td>
+ <td class="mainTableCellData"><xsl:value-of select="concat(format-number($threshold,'#0.0'), ' %')" /></td>
+ <td class="mainTableCellData"><xsl:value-of select="$unvisitedPoints" /></td>
+ <td class="mainTableCellPercent"><xsl:value-of select="concat(format-number($coverage,'#0.0'), ' %')" /></td>
+ <td class="mainTableCellGraph">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="notVisited" select="$unvisitedPoints" />
+ <xsl:with-param name="total" select="$sequencePoints" />
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="scale" select="200" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <!-- Coverage detail row with indented item name and shrunk graph bar -->
+ <xsl:template name="coverageIndentedDetail">
+ <xsl:param name="name" />
+ <xsl:param name="unvisitedPoints" />
+ <xsl:param name="sequencePoints" />
+ <xsl:param name="coverage" />
+ <xsl:param name="threshold" />
+ <xsl:param name="styleTweak">padding-left:20px</xsl:param>
+ <xsl:param name="scale">180</xsl:param>
+ <tr>
+ <td class="mainTableCellBottom childTableCellIndentedItem" colspan="2"><xsl:attribute name="style"><xsl:value-of select="$styleTweak"/></xsl:attribute><xsl:value-of select="$name" /></td>
+ <td class="mainTableCellBottom mainTableCellData"><xsl:value-of select="$unvisitedPoints" /></td>
+ <td class="mainTableCellBottom mainTableCellPercent"><xsl:value-of select="concat(format-number($coverage,'#0.0'), ' %')" /></td>
+ <td class="mainTableCellBottom mainTableCellGraph">
+ <xsl:call-template name="detailPercent">
+ <xsl:with-param name="notVisited" select="$unvisitedPoints" />
+ <xsl:with-param name="total" select="$sequencePoints" />
+ <xsl:with-param name="threshold" select="$threshold" />
+ <xsl:with-param name="scale" select="$scale" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <!-- Exclusions Summary -->
+ <xsl:template name="exclusionsSummary">
+ <tr>
+ <td colspan="5"> </td>
+ </tr>
+ <tr>
+ <td class="exclusionTable mainTableHeaderLeft" colspan="3">Excluded From Coverage Results</td>
+ <td class="exclusionTable mainTableGraphHeader" colspan="2">All Code Within</td>
+ </tr>
+ <xsl:for-each select="./exclusions/exclusion">
+ <tr>
+ <td class="mainTableCellBottom exclusionTableCellItem" colspan="3"><xsl:value-of select="@name" /></td>
+ <td class="mainTableCellBottom mainTableCellGraph" colspan="2"><xsl:value-of select="@category" /></td>
+ </tr>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- Footer -->
+ <xsl:template name="footer">
+ <tr>
+ <td colspan="5"> </td>
+ </tr>
+ </xsl:template>
+
+ <!-- Draw % Green/Red/Yellow Bar -->
+ <xsl:template name="detailPercent">
+ <xsl:param name="notVisited" />
+ <xsl:param name="total" />
+ <xsl:param name="threshold" />
+ <xsl:param name="scale" />
+ <xsl:variable name="visited" select="$total - $notVisited" />
+ <xsl:variable name="coverage" select="$visited div $total * 100"/>
+ <table cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <xsl:if test="$notVisited = 0">
+ <td class="graphBarVisitedFully" height="14">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scale" />
+ </xsl:attribute>.</td>
+ </xsl:if>
+ <xsl:if test="($visited != 0) and ($notVisited != 0)">
+ <td class="graphBarVisited" height="14">
+ <xsl:attribute name="width">
+ <xsl:value-of select="format-number($coverage div 100 * $scale, '0') - 1" />
+ </xsl:attribute>.</td>
+ </xsl:if>
+ <xsl:if test="$notVisited != 0">
+ <td height="14">
+ <xsl:attribute name="class">
+ <xsl:if test="$coverage >= $threshold">graphBarSatisfactory</xsl:if>
+ <xsl:if test="$coverage < $threshold">graphBarNotVisited</xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="width">
+ <xsl:value-of select="format-number($notVisited div $total * $scale, '0')" />
+ </xsl:attribute>.</td>
+ </xsl:if>
+ </tr>
+ </tbody>
+ </table>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
trunk/build/tools/ncover.explorer/ICSharpCode.TextEditor.dll
Binary file
trunk/build/tools/ncover.explorer/LicencePersonal.rtf
@@ -0,0 +1,334 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2057{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
+{\f36\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f37\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Verdana;}{\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}{\f42\froman\fcharset162\fprq2 Times New Roman Tur;}{\f43\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f48\fswiss\fcharset238\fprq2 Arial CE;}{\f49\fswiss\fcharset204\fprq2 Arial Cyr;}{\f51\fswiss\fcharset161\fprq2 Arial Greek;}
+{\f52\fswiss\fcharset162\fprq2 Arial Tur;}{\f53\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f54\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f55\fswiss\fcharset186\fprq2 Arial Baltic;}{\f56\fswiss\fcharset163\fprq2 Arial (Vietnamese);}
+{\f398\fswiss\fcharset238\fprq2 Tahoma CE;}{\f399\fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f401\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f402\fswiss\fcharset162\fprq2 Tahoma Tur;}{\f403\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}
+{\f404\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f405\fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f406\fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f407\fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f408\fswiss\fcharset238\fprq2 Verdana CE;}
+{\f409\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f411\fswiss\fcharset161\fprq2 Verdana Greek;}{\f412\fswiss\fcharset162\fprq2 Verdana Tur;}{\f415\fswiss\fcharset186\fprq2 Verdana Baltic;}{\f416\fswiss\fcharset163\fprq2 Verdana (Vietnamese);}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
+\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
+\af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\qc \li0\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs20\alang1025
+\ltrch\fcs0 \b\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1;}{\s2\qj \li0\ri0\sa120\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs20\alang1025
+\ltrch\fcs0 \b\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 2;}{\s7\ql \fi-720\li720\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel6\adjustright\rin0\lin720\itap0 \rtlch\fcs1
+\ab\af1\afs24\alang1025 \ltrch\fcs0 \b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 7;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\qj \li0\ri0\sa220\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext15 \ssemihidden footnote text;}{\*\cs16
+\additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden footnote reference;}{
+\s17\qj \li2880\ri0\widctlpar\phpg\posxc\posyb\absh-1980\absw7920\dxfrtext180\dfrmtxtx180\dfrmtxty0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2880\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 envelope address;}{\s18\qj \li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af0\afs16\alang1025 \ltrch\fcs0
+\scaps\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext18 envelope return;}{\s19\qj \li0\ri0\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025
+\ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext19 header;}{\s20\qj \li0\ri0\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext20 footer;}{\*\cs21 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 page number;}{\s22\qj \li0\ri0\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
+\rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon23 \snext22 Num Continue;}{\s23\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
+\af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext23 Body Text;}{\s24\qj \li0\ri0\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls3\outlinelevel0\adjustright\rin0\lin0\itap0
+\rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext22 Legal2_L1;}{\s25\qj \fi720\li0\ri0\sa120\widctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl1\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon24 \snext22 Legal2_L2;}{
+\s26\qj \fi1440\li0\ri0\sa120\widctlpar\jclisttab\tx1800\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
+\sbasedon25 \snext22 Legal2_L3;}{\s27\qj \fi2160\li0\ri0\sa120\widctlpar\jclisttab\tx2880\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl3\outlinelevel3\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon26 \snext22 Legal2_L4;}{\s28\qj \fi2880\li0\ri0\sa120\widctlpar\jclisttab\tx3600\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl4\outlinelevel4\adjustright\rin0\lin0\itap0 \rtlch\fcs1
+\af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon27 \snext22 Legal2_L5;}{\s29\qj \fi3600\li0\ri0\sa120\widctlpar
+\jclisttab\tx4320\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl5\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon28 \snext22 Legal2_L6;}{
+\s30\qj \fi4320\li0\ri0\sa120\widctlpar\jclisttab\tx5040\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl6\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
+\sbasedon29 \snext22 Legal2_L7;}{\s31\qj \fi720\li0\ri0\sa120\widctlpar\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl7\outlinelevel7\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon30 \snext22 Legal2_L8;}{\s32\qj \fi1440\li0\ri0\sa120\widctlpar\jclisttab\tx2160\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl8\outlinelevel8\adjustright\rin0\lin0\itap0 \rtlch\fcs1
+\af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon31 \snext22 Legal2_L9;}{\*\cs33 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\caps\cf2 \sbasedon10 zzmpTCEntryL1;}{\*\cs34 \additive \rtlch\fcs1 \ab\af0
+\ltrch\fcs0 \b\cf2 \sbasedon10 zzmpTCEntryL2;}{\*\cs35 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf2 \sbasedon10 zzmpTCEntryL3;}{\*\cs36 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf2 \sbasedon10 zzmpTCEntryL4;}{\*\cs37 \additive \rtlch\fcs1 \af0
+\ltrch\fcs0 \cf2 \sbasedon10 zzmpTCEntryL5;}{\*\cs38 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \cf2 \sbasedon10 zzmpTCEntryL6;}{\*\cs39 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \cf2 \sbasedon10 zzmpTCEntryL7;}{\*\cs40 \additive \rtlch\fcs1 \af0 \ltrch\fcs0
+\cf2 \sbasedon10 zzmpTCEntryL8;}{\*\cs41 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \cf2 \sbasedon10 zzmpTCEntryL9;}{\s42\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext42 Normal (Web);}{\*\cs43 \additive \rtlch\fcs1 \af37\afs17 \ltrch\fcs0 \f37\fs17 \sbasedon10 bodytext1;}{\*\cs44 \additive \rtlch\fcs1 \af0
+\ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink;}{\s45\qj \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs20\alang1025 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
+\sbasedon0 \snext45 Body Text 2;}{\*\cs46 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf12 \sbasedon10 FollowedHyperlink;}{\*\cs47 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\cf0 \sbasedon10 text1;}{\*\cs48 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b
+\sbasedon10 \styrsid684987 Strong;}{\s49\qj \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 \f36\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
+\sbasedon0 \snext49 \slink50 \ssemihidden \styrsid4745031 Balloon Text;}{\*\cs50 \additive \rtlch\fcs1 \af36\afs16 \ltrch\fcs0 \f36\fs16\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \slink49 \slocked \styrsid4745031 Balloon Text Char;}}
+{\*\latentstyles\lsdstimax156\lsdlockeddef0{\lsdlockedexcept Normal;heading 1;heading 2;heading 3;heading 4;heading 5;heading 6;heading 7;heading 8;heading 9;toc 1;toc 2;toc 3;toc 4;toc 5;toc 6;toc 7;toc 8;toc 9;caption;Title;Subtitle;Strong;Emphasis;}}
+{\*\listtable{\list\listtemplateid1586421402{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li360
+\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1260\jclisttab\tx1260\lin1260
+}{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li2520\jclisttab\tx2520\lin2520 }{\listlevel
+\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li3420\jclisttab\tx3420\lin3420 }{\listlevel
+\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \loch\af1\hich\af1\dbch\af0\fbias0 \fi-1080\li4680\jclisttab\tx4680\lin4680 }{\listlevel
+\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li5580
+\jclisttab\tx5580\lin5580 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d;}\rtlch\fcs1 \af0 \ltrch\fcs0
+\fbias0 \fi-1440\li6840\jclisttab\tx6840\lin6840 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers
+\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li7740\jclisttab\tx7740\lin7740 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1800\li9000\jclisttab\tx9000\lin9000 }{\listname Legal22;}\listid187183174}{\list\listtemplateid-1494708814
+{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af1\afs22 \ltrch\fcs0
+\b\i0\strike0\outl0\shad0\embo0\impr0\caps\v0\f1\fs22\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s24\jclisttab\tx360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \ab0\ai0\af1\afs22 \ltrch\fcs0 \b0\i0\strike0\outl0\shad0\embo0\impr0\caps0\v0\f1\fs22\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s25\fi720\jclisttab\tx1080 }{\listlevel\levelnfc4\levelnfcn4
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'02);}{\levelnumbers\'02;}\rtlch\fcs1 \ab0\ai0\af0\afs20 \ltrch\fcs0
+\b0\i0\strike0\outl0\shad0\embo0\impr0\caps0\v0\f0\fs20\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s26\fi1440\jclisttab\tx1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \ab0\ai0\af0\afs20 \ltrch\fcs0 \b0\i0\strike0\outl0\shad0\embo0\impr0\caps0\v0\f0\fs20\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s27\fi2160\jclisttab\tx2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \ab0\ai0\af0\afs24 \ltrch\fcs0
+\b0\i0\strike0\outl0\shad0\embo0\impr0\scaps0\caps0\v0\f0\fs24\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s28\fi2880\jclisttab\tx3600 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af0\afs24 \ltrch\fcs0 \b0\i0\strike0\outl0\shad0\embo0\impr0\scaps0\caps0\v0\f0\fs24\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s29\fi3600\jclisttab\tx4320 }{\listlevel\levelnfc2\levelnfcn2
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af0\afs24 \ltrch\fcs0
+\b0\i0\strike0\outl0\shad0\embo0\impr0\scaps0\caps0\v0\f0\fs24\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s30\fi4320\jclisttab\tx5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'03(\'07);}{\levelnumbers\'02;}\rtlch\fcs1 \ab0\ai0\af0\afs24 \ltrch\fcs0 \b0\i0\strike0\outl0\shad0\embo0\impr0\scaps0\caps0\v0\f0\fs24\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s31\fi720\jclisttab\tx1440 }{\listlevel\levelnfc2\levelnfcn2
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'08);}{\levelnumbers\'02;}\rtlch\fcs1 \ab0\ai0\af0\afs24 \ltrch\fcs0
+\b0\i0\strike0\outl0\shad0\embo0\impr0\scaps0\caps0\v0\f0\fs24\ulnone\cf0\nosupersub\animtext0\striked0\fbias0 \s32\fi1440\jclisttab\tx2160 }{\listname Legal2;}\listid589778925}{\list\listtemplateid1095382408{\listlevel\levelnfc0\levelnfcn0\leveljc0
+\leveljcn0\levelfollow0\levelstartat3\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-405\li405\jclisttab\tx405\lin405 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0
+\levelstartat2\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-405\li688\jclisttab\tx688\lin688 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1286\jclisttab\tx1286\lin1286 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1569\jclisttab\tx1569\lin1569 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'09\'00.\'01.\'02.\'03.\'04;}{\levelnumbers\'01\'03\'05\'07\'09;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1852\jclisttab\tx1852\lin1852 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li2495\jclisttab\tx2495\lin2495 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li2778\jclisttab\tx2778\lin2778 }{\listlevel\levelnfc0\levelnfcn0\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li3421\jclisttab\tx3421\lin3421 }
+{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0
+\fi-1440\li3704\jclisttab\tx3704\lin3704 }{\listname ;}\listid899175523}{\list\listtemplateid-53593918{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat4\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;}
+\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \af0
+\ltrch\fcs0 \fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\rtlch\fcs1 \af0 \ltrch\fcs0
+\fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0
+\fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'09\'00.\'01.\'02.\'03.\'04;}{\levelnumbers\'01\'03\'05\'07\'09;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0
+\fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\rtlch\fcs1 \af0
+\ltrch\fcs0 \fbias0 \fi-1080\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers
+\'01\'03\'05\'07\'09\'0b\'0d;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li1440\jclisttab\tx1440\lin1440 }{\listname ;}\listid1303119334}
+{\list\listtemplateid-1282876056{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat6\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\fbias0 \fi-360\li360\jclisttab\tx360\lin360
+}{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0
+\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'09\'00.\'01.\'02.\'03.\'04;}{\levelnumbers\'01\'03\'05\'07\'09;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0
+\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\jclisttab\tx1080\lin1080
+}{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0
+\fi-1440\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers
+\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li1440\jclisttab\tx1440\lin1440 }{\listname ;}\listid1717701764}}{\*\listoverridetable{\listoverride\listid589778925\listoverridecount0\ls1}{\listoverride\listid899175523
+\listoverridecount0\ls2}{\listoverride\listid589778925\listoverridecount0\ls3}{\listoverride\listid1303119334\listoverridecount0\ls4}{\listoverride\listid1717701764\listoverridecount0\ls5}}{\*\rsidtbl \rsid11936\rsid88914\rsid265398\rsid684987\rsid1250516
+\rsid1846192\rsid2128574\rsid2506696\rsid3227523\rsid3348545\rsid3741615\rsid3868789\rsid3882300\rsid4082071\rsid4201573\rsid4354079\rsid4739009\rsid4745031\rsid5123650\rsid5189883\rsid5206122\rsid5249949\rsid5272592\rsid5397688\rsid5708036\rsid5796271
+\rsid5834546\rsid5907843\rsid5924216\rsid6182972\rsid6253249\rsid6776828\rsid6902420\rsid7296646\rsid7562558\rsid7621291\rsid7692188\rsid7735196\rsid7879489\rsid8065525\rsid8198028\rsid8260678\rsid8284163\rsid8537681\rsid8550639\rsid8985796\rsid9054116
+\rsid9119910\rsid9445259\rsid9722996\rsid9767071\rsid9795825\rsid9837062\rsid9900246\rsid9908984\rsid9969717\rsid10094441\rsid10252196\rsid10296700\rsid10425897\rsid10430804\rsid10703085\rsid10712577\rsid10769984\rsid10892103\rsid11489578\rsid11875457
+\rsid11883158\rsid12134897\rsid12517589\rsid12536041\rsid12598188\rsid12654351\rsid13001579\rsid13334799\rsid13654851\rsid13966861\rsid13969160\rsid14229932\rsid14902293\rsid14902778\rsid15223633\rsid15497150\rsid16004039\rsid16137090\rsid16201318
+\rsid16217207\rsid16322833\rsid16322878\rsid16406037}{\*\generator Microsoft Word 11.0.8134;}{\info{\title iKNOWLEDGE, INC}{\author Palmer & Dodge LLP}{\operator Grant Drake}{\creatim\yr2007\mo1\dy28\hr18\min29}{\revtim\yr2007\mo7\dy22\hr20}
+{\printim\yr2006\mo5\dy31\hr11\min1}{\version5}{\edmins35}{\nofpages4}{\nofwords1407}{\nofchars8024}{\*\company Palmer & Dodge LLP}{\nofcharsws9413}{\vern24611}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word
+ml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
+\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin
+\dghspace100\dgvspace180\dghorigin1440\dgvorigin1440\dghshow0\dgvshow0\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\nolnhtadjtbl\nojkernpunct\rsidroot3741615 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0{\*\docvar {Document}{DOCUMENT}}
+{\*\docvar {zzmpFixedCurrentTOCScheme}{Legal2}}{\*\docvar {zzmpFixedCurScheme}{Legal2}}{\*\ftnsep \ltrpar \pard\plain \ltrpar\qj \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025
+\ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16322878 \chftnsep
+\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0
+\ltrch\fcs0 \insrsid16322878 \chftnsep
+\par (continued...)
+\par }}{\*\ftncn \ltrpar \pard\plain \ltrpar\qr \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0
+\ltrch\fcs0 \insrsid16322878 (continued...)
+\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0
+\ltrch\fcs0 \insrsid16322878 \chftnsep
+\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0
+\ltrch\fcs0 \insrsid16322878 \chftnsepc
+\par }}\ltrpar \sectd \ltrsect\binfsxn261\binsxn261\psz1\sbknone\linex0\footery432\endnhere\sectlinegrid272\sectdefaultcl\sectrsid3868789\sftnbj {\footerr \ltrpar \pard\plain \ltrpar\s20\qc \li0\ri0\widctlpar
+\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3868789 -}{\field{\*\fldinst {
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \cs21\f1\fs22\insrsid3868789\charrsid16004039 PAGE }}{\fldrslt {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \cs21\f1\fs22\lang1024\langfe1024\noproof\insrsid1846192 1}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1
+\af0 \ltrch\fcs0 \insrsid3868789 -
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}
+{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8
+\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar
+\s2\qc \li0\ri0\sa120\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid684987 \rtlch\fcs1 \ab\af0\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid15497150 KIWI}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid1846192 NOVA }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid9767071\charrsid9767071 LTD
+\par }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid5272592 PERSONAL}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid13001579 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid9767071 LICENCE}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\ul\insrsid9767071\charrsid9767071 AND SUPPORT AGREEMENT}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\ul\insrsid13966861\charrsid9767071
+\par }\pard\plain \ltrpar\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9767071 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\lang2057\langfe1033\langnp2057\insrsid9767071\charrsid9767071
+\par }\pard\plain \ltrpar\s45\qj \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14229932 \rtlch\fcs1 \ab\af1\afs20\alang1025 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 NOTICE TO USER: PLEASE READ THIS }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid4739009 AGREEMENT}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 CAREFULLY. }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid12598188 BY CLICKING \'93I ACCEPT\'94 AND/OR }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 BY DOWNLOADING AND/OR USING ALL OR ANY PORTION OF THE SOFTWARE }{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \fs22\insrsid12598188 YOU }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9969717\charrsid9767071 (\'93LICEN}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9969717 S}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9969717\charrsid9767071
+EE\'94)}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9969717 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid12598188 ACCEPT}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 THE FOLLOWING TERMS FROM }{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \fs22\insrsid1846192 KIWINOVA }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 LTD OF }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid1846192 24 AEGEAN APARTMENTS}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\fs22\insrsid9767071\charrsid9767071 ,}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid1846192 19 WESTERN GATEWAY,}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 LONDON }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\fs22\insrsid15497150 E16 1}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid1846192 AR}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 (\'93}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid1846192 KIWINOVA}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \fs22\insrsid12598188 \'94). }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid11489578 YOU}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid12598188 AGREE TO BE BOUND}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\fs22\insrsid9767071\charrsid9767071 BY ALL THE TERMS AND CONDITIONS OF THIS }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid4739009 AGREEMENT}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071
+. YOU AGREE THAT IT IS ENFORCEABLE AS IF IT WERE A WRITTEN NEGOTIATED }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid4739009 AGREEMENT}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9969717 SIGNED BY}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\fs22\insrsid16406037 YOU}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 . IF }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9969717 YOU}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071
+ DO NOT AGREE TO THE TERMS OF THIS }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid4739009 AGREEMENT}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 DO NOT }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid11489578 CLICK \'93
+I ACCEPT\'94 AND DO NOT DOWNLOAD OR }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid9767071\charrsid9767071 USE THE SOFTWARE. }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid14229932\charrsid9767071
+\par }\pard \ltrpar\s45\qj \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \fs22\insrsid12598188\charrsid9767071
+\par {\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\caps\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 1.\tab}}\pard\plain \ltrpar
+\s24\qj \fi-567\li567\ri0\sa120\keepn\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls3\outlinelevel0\adjustright\rin0\lin567\itap0\pararsid6776828 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid9767071 DEFINITIONS}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid14902293 \hich\af1\dbch\af0\loch\f1 1.1\tab}}\pard\plain \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls1\ilvl1\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid14902293 \'93Agreement\'94 means this Licence and Support Agreement.
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 1.2\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid9767071 \'93Documentation\'94 means the electronic user information }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902778\charrsid9767071 supplied }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid9767071 with the Software}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10252196 .
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid10252196\charrsid9767071 \hich\af1\dbch\af0\loch\f1 1.3\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10252196\charrsid9767071 \'93Effective Date\'94 means the date }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16406037 on which the Licensee accepts this Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7562558 .
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid10252196\charrsid9767071 \hich\af1\dbch\af0\loch\f1 1.4\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10252196\charrsid9767071 \'93Minimum Requirements\'94 means a min}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188 imum technical specification of}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10252196\charrsid9767071
+ the PC or laptop on which the Software is used which is required to enable the Software to function}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188 , as set out in the Documentation}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10252196\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10252196
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid12598188\charrsid9767071 \hich\af1\dbch\af0\loch\f1 1.5\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid12598188\charrsid9767071 \'93Software\'94 means the }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188 object code form }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188\charrsid9767071 of }{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid12598188 the }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 personal}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188 version of the software product entitled Testdriven.net}{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid12598188\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188
+\par }\pard\plain \ltrpar\s22\qj \li0\ri0\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5907843 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0
+\ltrch\fcs0 \insrsid5907843\charrsid5907843
+\par {\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\caps\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 2.\tab}}\pard\plain \ltrpar
+\s24\qj \li0\ri0\sa120\keepn\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls3\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid6776828 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid9767071 GRANT OF RIGHTS; RESTRICTIONS
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 2.1\tab}}\pard\plain \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls1\ilvl1\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 Subject to all the terms and conditions of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 , }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 hereby grants Licensee a}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid12598188 perpetual}{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 , worldwide, none}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid9767071 xclusive, nontransferable licenc}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid9767071 e to install and use the Software on }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid265398 one}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 PC or laptop for}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid265398 Licensee\rquote s}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 own use only. This licen}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid9767071 c}{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 e is in respect of use of the Software by the Licensee only and no subsidiaries or holding company of the Licensee may use the Software.
+\par {\*\bkmkstart OEMS_OBLIGATIONS}{\*\bkmkstart OEM_SYSTEM_SUPPORT}{\*\bkmkstart TECHNICAL_SUPPORT_SERVICES}{\*\bkmkend OEMS_OBLIGATIONS}{\*\bkmkend OEM_SYSTEM_SUPPORT}{\*\bkmkend TECHNICAL_SUPPORT_SERVICES}{\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 2.2\tab}Except as expressly permitted in this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 , Licensee shall not, and shall not permit others to: (i)\~
+modify, translate, create derivative copies of or copy the Software (other than one backup copy which reproduces all proprietary notices), in whole or in part; (ii)\~
+reverse engineer, decompile, disassemble or otherwise reduce the Software to source code form; (iii)\~distribute, sublicense, assign, share, timeshare, sell, rent, lease, grant a security interest in, use for service bureau purposes, or othe
+rwise transfer the Software or Licensee\rquote s right to use the Software; (iv)\~remove or modify any copyright, trademark, or other proprietary notices of }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid15497150\charrsid9767071 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 affixed to the media containing the Software or contained within the Software; or (v) use
+ the Software in any manner not expressly authorised by this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 . }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861
+\par }\pard\plain \ltrpar\s22\qj \li0\ri0\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid265398 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0
+\ltrch\fcs0 \insrsid265398\charrsid265398
+\par {\*\bkmkstart TERM_AND_TERMINATION}{\*\bkmkend TERM_AND_TERMINATION}{\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid10425897\charrsid9767071 \hich\af1\dbch\af0\loch\f1 3
+\tab}}\pard\plain \ltrpar\s24\qj \fi-567\li567\ri0\sa120\keepn\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin0\lin567\itap0\pararsid10425897 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid10425897\charrsid9767071 PROPRIETARY RIGHTS{\*\bkmkstart _REF426272673}{\*\bkmkend _REF426272673}
+\par }\pard\plain \ltrpar\s23\qj \fi-567\li567\ri0\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid10425897 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 4.1\tab }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid15497150\charrsid9767071 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10425897\charrsid9767071 has sole and exclusive ownership of all right, title, and interest in and to the Software, including all copyright and any other intellectual property rights therein. This }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10425897 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897\charrsid9767071 conveys a limited }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 licence}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10425897\charrsid9767071 to use the Software and shall not be construed to convey title to or ownership of the Software to Licensee. All rights in and to the Software not expressly granted to Licensee are reserved by }{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897
+\par }\pard\plain \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid10425897 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 4.2\tab For the avoidance of doubt, the Software does not include:
+\par }\pard \ltrpar\s25\qj \fi-1276\li1276\ri0\sa120\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin1276\itap0\pararsid10425897 {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 \tab 4.2.1\tab }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16137090 Actipro Software}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid15497150 which }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16137090 is}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid15497150 provided }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 by }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196\charrsid7735196 http://}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16137090
+actiprosoftware.com}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196\charrsid7735196 /}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897
+on the terms and conditions set out at: }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16137090 ActiproEULA}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16137090 html}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897
+\par }\pard\plain \ltrpar\s22\qj \fi-1276\li1276\ri0\sa240\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1276\itap0\pararsid10425897 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10425897 \tab }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 4.2.4}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897\charrsid16322833
+\tab }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid15497150 CommandBars}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897 which is distributed with permission from }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid15497150
+Lutz Roeder }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897\charrsid13969160 <}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid15497150 roeder}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897\charrsid13969160 @}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid15497150 aisto}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7692188\charrsid7692188 .com}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897\charrsid13969160 >}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid10425897
+\par }\pard\plain \ltrpar\s23\qj \fi-567\li567\ri0\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid11489578 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid10425897
+\par {\*\bkmkstart TRADEMARK}{\*\bkmkstart CALCULATION_OF_FEES}{\*\bkmkend TRADEMARK}{\*\bkmkend CALCULATION_OF_FEES}{\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0
+\b\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid4082071 \hich\af1\dbch\af0\loch\f1 4\tab}}\pard\plain \ltrpar\s24\qj \fi-567\li567\ri0\sa120\keepn\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin0\lin567\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs22
+\ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid4082071 TERM AND TERMINATION{\*\bkmkstart _REF426272235}{\*\bkmkend _REF426272235}
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid4082071 \hich\af1\dbch\af0\loch\f1 4.1\tab}}\pard\plain \ltrpar\s25\qj \fi-600\li600\ri0\sa120\widctlpar
+\jclisttab\tx600\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin600\itap0\pararsid5907843 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid4082071 This }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293\charrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid4082071
+ shall commence on the Effective Date and continue in effect for consecutive annual periods, unless and until terminated in accordance with clause }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 4}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid4082071 .2}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid9969717 , or unless terminated by Mutant on the provision of not less than thirty (30) days notice to the Licensee}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid9908984 , such notice to be provided to the Licensee via }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid9908984 \rquote s website}{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid4082071 .
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 4.2\tab}}\pard \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid5189883 {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 If either party breaches this }{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 in any material respect, the other party may give written notice to the breaching party of its intent to terminate,
+ and if such breach is not cured within thirty (30) days after the breaching party\rquote s receipt of such notice, this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid9767071 shall terminate without any further notice required (but no cure period is required for any breach that cannot be cured).
+\par {\*\bkmkstart OBLIGATIONS_ON_TERMINATION}{\*\bkmkend OBLIGATIONS_ON_TERMINATION}{\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071
+\hich\af1\dbch\af0\loch\f1 4.3\tab}Upon any termination of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 , (a)\~the rights and }{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid9767071 licence}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 s granted to Licensee herein shall terminate; (b)\~Licensee shall cease all use of the Software; (c)\~Licensee shall }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16322833 delete }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 all copies of the Software and Documentation in Licensee\rquote s possession or under its control; and (d)\~
+Licensee shall certify in writing to }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 its compliance with the foregoing.{\*\bkmkstart _REF426272371}
+{\*\bkmkend _REF426272371} Clauses\~1, }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16406037 2.2, }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 3}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 , }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 4}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 .3, }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 5}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid9767071 , }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 6 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 and }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 7}{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 shall survive any termination of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861
+\par }\pard\plain \ltrpar\s24\qj \li0\ri0\sa120\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid5907843 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid5907843 {\*\bkmkstart OWNERSHIP_OF_RIGHTS}{\*\bkmkstart _REF426271959}{\*\bkmkstart CONFIDENTIALITY}{\*\bkmkend OWNERSHIP_OF_RIGHTS}{\*\bkmkend _REF426271959}{\*\bkmkend CONFIDENTIALITY}
+\par {\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 5\tab}}\pard \ltrpar\s24\qj \fi-360\li360\ri0\sa120\keepn\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid5189883 {\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid9767071 REPRESENTATIONS AND WARRANTIES
+\par }\pard\plain \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid6776828 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 5.1}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 \tab }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid5907843 LICENSEE ACKNOWLEDGES AND}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid5907843 AGREES THAT }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196 KIWI}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid1846192 NOVA}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid5907843 HAS PROVIDED NO EXPRESS OR IMPLIED WARRANTIES, ORAL OR WRITTEN, TO }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 LICENSEE }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid5907843 REGARDING THE SOFTWARE OR DOCUMENTATION AND THAT THEY ARE PROVIDED \'93AS IS\'94 WITHOUT WARRANTY OF ANY KIND. }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843
+TO THE MAXIMUM EXTENT PERMITTED BY LAW }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196 KIWI}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 NOVA}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid5907843 HEREBY }
+{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 EXCLUDES AND }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid5907843
+DISCLAIMS ALL WARRANTIES WITH REGARD TO THE SOFTWARE AND DOCUMENTATION, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid9767071 THE IMPLIED}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid5907843\charrsid5907843 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid9767071 AND ANY WARRANTIES ARISING BY STATUTE OR OTHERWISE IN LAW
+OR FROM COURSE OF DEALING, COURSE }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16406037 OF PERFORMANCE, OR USE OF TRADE}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843\charrsid5907843 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid5907843
+\par }\pard\plain \ltrpar\s22\qj \fi-567\li567\ri0\sa240\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid6776828 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid5907843 5.2}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 \tab
+The Licensee hereby represents that it shall (i) comply with all applicable local and foreign laws and regulations which may govern the use of the Software, and (ii) use the Software only for lawful purposes and in accordance with the terms of this }{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 .
+\par {\*\bkmkstart INDEMNIFICATION}{\*\bkmkstart NO_CONSEQUENTIAL_DAMAGES}{\*\bkmkend INDEMNIFICATION}{\*\bkmkend NO_CONSEQUENTIAL_DAMAGES}{\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0
+\b\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid9767071 \hich\af1\dbch\af0\loch\f1 6\tab}}\pard\plain \ltrpar\s24\qj \fi-360\li360\ri0\sa120\keepn\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs22
+\ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid9767071 LIMITATION OF LIABILITY}{\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid16004039 /INDEMNITY}{\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid9767071
+\par {\*\bkmkstart LIMITATION_ON_LIABILITY}{\*\bkmkstart EQUITABLE_REMEDIES}{\*\bkmkend LIMITATION_ON_LIABILITY}{\*\bkmkend EQUITABLE_REMEDIES}{\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid7296646 \hich\af1\dbch\af0\loch\f1 6.1\tab}}\pard\plain \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid7296646 SAVE IN RESPECT OF DEATH OR PERSONAL INJURY, FOR WHICH THE LIABILITY OF THE PARTIES SHALL BE UNLIMITED, }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16322833\charrsid9767071 IN NO EVENT SHALL }{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KIWINOVA}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16322833\charrsid9767071 BE LIABLE FOR ANY SPECIAL, }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7296646 DIRECT, }{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid16322833\charrsid9767071 INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOS
+S OF PROFITS AND GOODWILL, BUSINESS OR BUSINESS BENEFIT, OR THE COST OF PROCUREMENT OF SUBSTITUTE PRODUCTS BY LICENSEE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO CIRCUMSTANCES SHALL }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid1846192 KIWINOVA}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16322833\charrsid9767071 BE LIABLE FOR ANY FAILURE OF THE SOFTWARE
+ TO PERFORM IN ACCORDANCE WITH THE DOCUMENTATION, OR AT ALL, RESULTING FROM A FAILURE BY THE LICENSEE TO COMPLY WITH THE MINIMUM REQUIREMENTS. ADDITIONALLY, LICENSEE ACKNOWLEDGES TH}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid16322833\charrsid16004039 AT WHILST THE SOFTWARE MAY BE USED IN COMBINATION WITH THIRD PARTY SOFTWARE, }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KIWINOVA}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid16322833\charrsid16004039 BEARS NO LIABILITY, HOWSOEVER ARISING, FOR ANY LOSS, DAMAGE OR COST THAT ARISES FROM A FAILURE OF THE SOFTWARE TO INTEGRATE WITH LICENSEE OR THIRD PARTY SOFTWARE.}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid13966861\charrsid16004039
+\par }\pard\plain \ltrpar\s22\qj \fi-567\li567\ri0\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid16004039 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16004039\charrsid16004039 8.3\tab }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16004039 LICENSEE HEREBY INDEMNIFIES }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KIWINOVA}{
+\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid16004039 IN FULL AND ON DEMAND IN RESPECT OF ALL COSTS, DAMAGES AND LIABILITIES ARISING FROM ANY BREACH BY THE LICENSEE OF ANY TERM OF THIS AGREEMENT.}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid16004039\charrsid16004039
+\par {\listtext\pard\plain\ltrpar \s24 \rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid16004039 \hich\af1\dbch\af0\loch\f1 7\tab}}\pard\plain \ltrpar
+\s24\qj \fi-360\li360\ri0\sa120\keepn\widctlpar\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0
+\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid16004039 GENERAL}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid16004039
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid13966861\charrsid16004039 \hich\af1\dbch\af0\loch\f1 7.1\tab}}\pard\plain \ltrpar\s25\qj \fi-567\li567\ri0\sa120\widctlpar
+\jclisttab\tx567\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin567\itap0\pararsid5189883 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid16004039 Licensee shall not assign}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid14902293 Agreement}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 , in whole or in part, without the written consent of }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 .
+
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.2\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 Licensee consents to the use by }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 of Licensee\rquote
+s name in customer lists and other publicity, including interviews, case studies, and conference discussions, provided that such publicity accurately describes the nature of the relationship between Licensee and }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.3\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 This }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071
+ and its performance shall be governed by and construed in accordance with and the parties hereby submit to the exclusive jurisdiction of the laws of {\*\xmlopen\xmlns2{\factoidname country-region}}England{\*\xmlclose} and {\*\xmlopen\xmlns2{\factoidname
+place}}{\*\xmlopen\xmlns2{\factoidname country-region}}Wales{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.4\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 Licensee agrees that because of the unique nature of the Software and }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 \rquote s proprietary rights therein, a demonstrated breach of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071
+ by Licensee would irreparably harm }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 and monetary damages would be inadequate compensation.
+ Therefore, Licensee agrees that }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071
+ shall be entitled to preliminary and permanent injunctive relief, as determined by any court of competent jurisdiction to enforce the provisions of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.5\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 If any provision of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071
+ or the Software thereof is declared void, illegal, or unenforceable, the remainder of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071
+ will be valid and enforceable to the extent permitted by applicable law. In such event, the parties agree to use their best efforts to replace the invali
+d or unenforceable provision by a provision that, to the extent permitted by the applicable law, achieves the purposes intended under the invalid or unenforceable provision}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 .
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.6\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 Any failure by any party to this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071
+ to enforce at any time any term or condition under this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 will not be considered a waiver of that party
+\rquote s right thereafter to enforce each and every term and condition of this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement.
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.7\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 Neither party will be responsible for delays resulting from circumstances beyond the reasona
+ble control of such party, provided that the nonperforming party uses reasonable efforts to avoid or remove such causes of nonperformance and continues performance hereunder with reasonable dispatch whenever such causes are removed}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 .
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\langnp1033\langfenp1033\insrsid11883158 \hich\af1\dbch\af0\loch\f1 7.8\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid11883158 T}{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 his }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid11883158 }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071\charrsid9767071 (i)\~
+constitutes the entire agreement and understanding between the parties with respect to the subject matter hereof and supersedes all prior agreements, oral and written, made with respect to the subject matter hereof, and (ii)\~
+cannot be altered except by agreement in writing executed by an authorised representative of each party. No purchase order and/or standard terms of purchase provided by Licensee shall supersede this }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid4082071 Agreement}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid4082071
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\expnd0\expndtw-2\lang1033\langfe1033\langnp1033\langfenp1033\insrsid4082071\charrsid9767071 \hich\af1\dbch\af0\loch\f1 7.9\tab}}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\expnd0\expndtw-2\insrsid4082071\charrsid9767071 Nothing in this Agreement shall give, directly or indirectly, any third party any enforceable benefit or any right of action against }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\expnd0\expndtw-2\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\expnd0\expndtw-2\insrsid4082071\charrsid9767071 and such third parties shall not be entitled to enforce any term of this Agreement against }{\rtlch\fcs1
+\af1\afs22 \ltrch\fcs0 \f1\fs22\expnd0\expndtw-2\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\expnd0\expndtw-2\insrsid4082071\charrsid9767071 .}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid13966861\charrsid9767071 .
+\par }\pard\plain \ltrpar\qj \li0\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9767071 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid8065525\charrsid9767071 If you have any questions regarding this Licence and Support Agreement or if you wish to discuss the terms and conditions contained herein please contact }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid1846192 KiwiNova}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid9767071\charrsid9767071 Ltd}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid8065525\charrsid9767071 using the contact details at}{\rtlch\fcs1 \af1\afs22
+\ltrch\fcs0 \f1\fs22\insrsid9445259 http://www.}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196 kiwidude.com}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid8065525\charrsid9767071 or at }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0
+\f1\fs22\insrsid1846192 24 Aegean Apartments}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196 , }{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 19 Western Gateway}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid7735196
+, London E16 1}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid1846192 AR}{\rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f1\fs22\insrsid8065525\charrsid9767071 .
+\par }\pard \ltrpar\qj \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af1\afs22 \ltrch\fcs0 \b\f1\fs22\insrsid13966861\charrsid9767071
+\par }}
\ No newline at end of file
trunk/build/tools/ncover.explorer/license.txt
@@ -0,0 +1,299 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ EXCEPTION
+
+ 13. In addition, as a special exception, AlphaSierraPapa gives permission to
+link the code of this program with the Microsoft .NET library (or with
+modified versions of Microsoft .NET library that use the same license as the
+Microsoft .NET library), and distribute linked combinations including the
+two. As a second exception, AlphaSierraPapa gives permission to link the code
+of this program with the DockPanel Suite (or with modified versions of
+DockPanel Suite that use the same license as the DockPanel Suite), and
+distribute linked combinations including the two. You must obey the GNU
+General Public License in all respects for all of the code used other than
+the Microsoft .NET library and the DockPanel Suite.
+If you modify this file, you may extend this exception to your version of the
+file, but you are not obliged to do so. If you do not wish to do so, delete
+this exception statement from your version.
+
+
+
+ END OF TERMS AND CONDITIONS
+
trunk/build/tools/ncover.explorer/NCoverExplorer.Console.exe
Binary file
trunk/build/tools/ncover.explorer/NCoverExplorer.Core.dll
Binary file
trunk/build/tools/ncover.explorer/NCoverExplorer.exe
Binary file
trunk/build/tools/ncover.explorer/NCoverExplorer.exe.config
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+ <startup>
+ <supportedRuntime version="v2.0.50727" />
+ <supportedRuntime version="v1.1.4322" />
+ <requiredRuntime version="v1.1.4322" />
+ </startup>
+</configuration>
\ No newline at end of file
trunk/build/tools/ncover.explorer/NCoverExplorer.NCoverRunner.dll
Binary file
trunk/build/tools/ncover.explorer/NCoverExplorer.WinForms.dll
Binary file
trunk/build/tools/ncover.explorer/NCoverExplorerFAQ.html
@@ -0,0 +1,303 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+ <head>
+ <script type="text/javascript">
+ <!--
+ function Toggle(id)
+ {
+ var e = document.getElementById(id);
+ if(e.style.display == 'none')
+ e.style.display = 'block';
+ else
+ e.style.display = 'none';
+ }
+
+ function SwitchAll(how)
+ { var len = document.all.length-1;
+ for(i=0;i!=len;i++) {
+ var block = document.all[i];
+ if (block != null && block.id != '')
+ { block.style.display=how;}
+ }
+ }
+
+ function ExpandAll()
+ {SwitchAll('block');}
+
+ function CollapseAll()
+ {SwitchAll('none');}
+ // -->
+ </script>
+ <title>NCoverExplorer FAQ</title>
+ <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
+ <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
+ <style>
+ body { font-size: 10pt; font-family: Verdana; }
+ p.title { font-size: 20pt; font-weight: bold; }
+ .action { color: maroon; font-size: 10pt; font-weight: bold; cursor:pointer }
+ .question { font-weight: bold; cursor:pointer }
+ .answer { margin: 15px; }
+ pre { font-size: 10pt; font-family: Courier; }
+ pre.usage { background-color: #F0F0F0; }
+ .subtitle { color: maroon; font-weight: bold; }
+ .quote { background-color: #F0F0F0; margin-left: 36pt;}
+ .method { color: maroon; font-size: 10pt; font-weight: bold; }
+ .hdrcell { background-color: #DDEEFF; font-size: 10pt; }
+ .datacell { background-color: #FFFFEE; text-align: right; font-size: 10pt; }
+ .hldatacell { background-color: #FFCCCC; text-align: right; font-size: 10pt; }
+ .box { border: 1px solid; padding: 10px; }
+ .treeviewBlack { color: black; }
+ .treeviewGrey { color: grey; }
+ .treeviewRed { color: red; }
+ .treeviewBlue { color: blue; }
+ .sourceBlue { background-color: #E0EDFD; color: black; }
+ .sourceRed { background-color: #E6B0A5; color: black; }
+ </style>
+ </head>
+ <body>
+ <P class="title">NCoverExplorer FAQ</P>
+ <P>The latest version of this document is located <A href="http://www.kiwidude.com/dotnet/NCoverExplorerFAQ.html">here</A>.
+ <BR/>For the latest NCoverExplorer news and updates, visit my <A href="http://www.kiwidude.com/blog/">blog</A>.</P>
+ <P class="action"><a onClick="ExpandAll();">Expand All</a> | <a onClick="CollapseAll();">Collapse All</a></P>
+ <a class="question" onclick="return Toggle('answer1')">1. What is NCoverExplorer?</a><br/>
+ <div id="answer1" style="display:none">
+ <P class="answer">This tool allows you to open a coverage.xml file produced by
+ <A href="http://ncover.org"/>NCover</A> and navigate the source code. The
+ source code is highlighted to clearly show which statements were visited
+ and not visited. You can filter, sort and report on the coverage results.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer2')">2. What versions of the .NET Framework does it work with?</a><br/>
+ <div id="Div1" style="display:none">
+ <P class="answer">NCoverExplorer as of version 1.3.4 requires either .NET 1.1 or .Net 2.0 (it is compiled against
+ .Net 1.1).
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer2')">2. What versions of NCover does it work with?</a><br/>
+ <div id="answer2" style="display:none">
+ <P class="answer">NCoverExplorer has been tested with both NCover 1.3.3 and up to the latest NCover 1.5.7. It will NOT
+ work with NCover 1.4.6. Note that NCover 1.5.x only works with .NET 2.0 and requires at least NCoverExplorer 1.3.5
+ and/or a TestDriven.Net build > 2.0.1786 due to a limitation in NCover or else you will get duplicate nodes in your
+ coverage results.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer3')">3. Can I integrate it with my Visual Studio.Net version XXX IDE?</a><br/>
+ <div id="answer3" style="display:none">
+ <P class="answer">Jamie Cansdale now offers a "Test with... Coverage" feature
+ in the latest version of his excellent <A href="http://www.testdriven.net/">TestDriven.Net</A>
+ tool. This will automatically launch NCoverExplorer to display the results
+ of running unit test(s) under code coverage with NCover. Note that as of build 1341
+ TestDriven.Net now works using both the latest version of NCover (1.5.x) and the earlier NCover 1.3.3 version.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer4')">4. Can I integrate it without TestDriven.Net?</a><br/>
+ <div id="answer4" style="display:none">
+ <P class="answer">My solution I used at work was a combination of NAnt and NAntRunner
+ (the VS.Net add-in) to perform something similar. I have NAnt tasks to:
+ <UL>
+ <LI>
+ Perform the build.
+ </LI>
+ <LI>
+ Execute NCover while running unit tests (either all unit tests or those for
+ a specific fixture using the /fixture feature of <A href="http://nunit.org/">NUnit</A>).
+ </LI>
+ <LI>
+ Launch NCoverExplorer displaying the output coverage.xml file.
+ </LI>
+ </UL>
+ </P>
+ <P class="answer">As of NCoverExplorer 1.3.5 you now have another option. There is now an included GUI for
+ running NCover directly from within NCoverExplorer and displaying the results.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer5')">5. How does it compare to Visual Studio Team System?</a><br/>
+ <div id="answer5" style="display:none">
+ <P class="answer">VSTS features of unit testing and code coverage will only be included with the premium bundles
+ of the Visual Studio product range - and as such will most likely be priced above what many
+ developers and businesses are prepared to pay. For "everyone else" in the market it would seem likely
+ that they will continue to utilise open source alternatives.
+ </P>
+ <P class="answer">Even if you are one of the fortunate developers who can afford VSTS, it still must
+ be measured feature-wise against the open source alternatives which in a lot of cases have now been established
+ for many years. Developers and managers will weigh up for themselves how important those features are
+ as well as other factors such as Microsoft support etc. The nice thing for many of us is that we have a choice...
+ </P>
+ <P class="answer">We have had a number of people e-mail us and say they prefer TestDriven.Net and NCoverExplorer
+ over the VSTS alternative and want to switch off the VSTS ability - that's rather gratifying from our perspective!
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer6')">6. Why didn't you integrate NCoverExplorer directly into the IDE like VSTS or SharpDevelop?</a><br/>
+ <div id="answer6" style="display:none">
+ <P class="answer">A number of reasons. At first glance having your code colour coded within the VS.Net IDE may sound
+ great. However think about what we are trying to achieve - improving our <B>test</B> code to increase our coverage.
+ That means in many cases you want to be editing the unit tests themselves, not the pretty coloured code under test.
+ This then requires either a photographic memory or a penchant for continually resizing your IDE/tab groups, as well as an ability
+ to not find the colours distracting while editing and refactoring code... not my first choice.
+ </P>
+ <P class="answer">You may instead find it more convenient to have a separate application window which can be positioned
+ on a second screen (you all have at least two don't you?) or ALT-Tab switched between. As of release 1.3.1
+ NCoverExplorer allows direct code navigation from method coverage in NCoverExplorer to it's corresponding line
+ in the source code file within the VS.Net IDE.
+ </P>
+ <P class="answer">From a technical perspective an add-in is a non-trivial task - particularly if trying to support all
+ the variants of the VS.Net IDE. To do it natively requires VSIP skills which is a trip to the dark side.
+ I won't say "never" however and if I find some spare time (or you want to volunteer to help me!) then it might
+ happen one day...
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer7')">7. What do the tree node colours mean?</a><br/>
+ <div id="answer7" style="display:none">
+ <P class="answer">The default settings when NCoverExplorer is installed are as follows:
+ <UL>
+ <LI>
+ <SPAN class="treeviewGrey">Grey text</SPAN> - the namespace/class/method has zero coverage. (Icon will be greyed also)
+ </LI>
+ <LI>
+ <SPAN class="treeviewRed">Red text</SPAN> - the namespace/class/method has partial coverage.
+ </LI>
+ <LI>
+ <SPAN class="treeviewBlue">Blue text</SPAN> - the namespace/class/method coverage has partial coverage exceeding a satisfaction threshold (default 95%).
+ </LI>
+ <LI>
+ <SPAN class="treeviewBlack">Black text</SPAN> - the namespace/class/method has 100% coverage.
+ </LI>
+ </UL>
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer8')">8. What do the source code highlighting colours mean?<a><br/>
+ <div id="answer8" style="display:none">
+ <P class="answer">The default settings when NCoverExplorer is installed are as follows:
+ <UL>
+ <LI>
+ <SPAN class="sourceBlue">Blue background</SPAN> - this section of code was visited (a tooltip tells you how many times).
+ </LI>
+ <LI>
+ <SPAN class="sourceRed">Red background</SPAN> - this section of code was not visited.
+ </LI>
+ </UL>
+ You can change these settings in the View->Options dialog. For instance you may prefer to underline the unvisited code.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer9')">9. What is that "Satisfaction Threshold" all about?</a><br/>
+ <div id="answer9" style="display:none">
+ <P class="answer">Depending on your coverage strategy, the code being tested and the extent of your usage of reflection,
+ mock objects and/or dependency injection you may determine it unfeasible to try
+ to reach 100% coverage everywhere. Some teams readily accept the diminishing returns
+ that can apply and instead set a specific blanket coverage goal such as ๏ฟฝ85%๏ฟฝ.
+ </P>
+ <P class="answer">Assuming you have such a situation and there was no threshold capability,
+ you would be stuck forever looking at a "danger red" node in the tree every time you open NCoverExplorer.
+ With this feature enabled (by setting a threshold less than 100% in the View->Options dialog) you see
+ a more calming mellow ๏ฟฝblue๏ฟฝ instead...
+ </P>
+ <P class="answer">As of release 1.3.1 you can now also specify the tolerance as a number of unvisited lines.
+ If either of the two threshold conditions are met the node will be coloured appropriately. Note that
+ a visit count of zero will always show as uncovered regardless of your tolerance.
+ </P>
+ <P class="answer">Of course just because you exceed the percentage doesn't mean that the 5% of code unvisited
+ isn't the most critical!
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer10')">10. I have a killer idea for XYZ feature - can you add it for me?</a><br/>
+ <div id="answer10" style="display:none">
+ <P class="answer">Please leave a comment on my <A href="http://www.kiwidude.com/blog/">blog</A> or in the
+ <A href="http://ncover.org/SITE/forums/default.aspx">NCoverExplorer forums</A> and I will see what I can do.
+ NCoverExplorer is by no means my "day job" so no promises can be made but if the idea is indeed a good one which
+ will benefit many others I'm sure I can find time...
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer11')">11. Where can I download the latest version?</a><br/>
+ <div id="answer11" style="display:none">
+ <P class="answer">To download NCoverExplorer <b>without</b> TestDriven.Net, you can find it
+ <A href="http://www.kiwidude.com/dotnet/DownloadPage.html">here</A>.
+ </P>
+ <P class="answer">Download it as part of the install with TestDriven.Net from <A href="http://www.testdriven.net/">here</A>.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer12')">12. What are the keyboard shortcuts?</a><br/>
+ <div id="answer12" style="display:none">
+ <P class="answer">The following shortcuts exist currently:
+ <PRE class="usage">
+ <SPAN class="treeviewBlue">CTRL+A</SPAN> - Collapse all nodes recursively.
+ <SPAN class="treeviewBlue">CTRL+E</SPAN> - Edit in VS.Net at the current caret position.
+ <SPAN class="treeviewBlue">CTRL+F</SPAN> - Display the Find Class dialog.
+ <SPAN class="treeviewBlue">CTRL+L</SPAN> - Expand all nodes recursively.
+ <SPAN class="treeviewBlue">CTRL+N</SPAN> - Run NCover (via configuration dialog).
+ <SPAN class="treeviewBlue">CTRL+O</SPAN> - Open coverage xml file.
+ <SPAN class="treeviewBlue">CTRL+P</SPAN> - Print current source code class file.
+ <SPAN class="treeviewBlue">CTRL+Q</SPAN> - Expand all covered child nodes.
+ <SPAN class="treeviewBlue">CTRL+S</SPAN> - Save coverage xml file as displayed (without excluded nodes).
+ <SPAN class="treeviewBlue">F2</SPAN> - Display the options dialog.
+ <SPAN class="treeviewBlue">F4</SPAN> - Display the statistics summary dialog.
+ <SPAN class="treeviewBlue">F5</SPAN> - Reload the current source code file.
+ <SPAN class="treeviewBlue">F6</SPAN> - Display the reports dialog.
+ <SPAN class="treeviewBlue">DEL</SPAN> - Exclude node and children from coverage tree and recalculate coverage.
+ <SPAN class="treeviewBlue">INS</SPAN> - Include node and children into coverage tree and recalculate coverage.
+ <BR/>
+ <SPAN class="treeviewBlue">ALT+1</SPAN> - Filter (hide) all 100% coverage nodes.
+ <SPAN class="treeviewBlue">ALT+2</SPAN> - Filter (hide) all unvisited (0%) nodes.
+ <SPAN class="treeviewBlue">ALT+3</SPAN> - Filter (hide) all nodes exceeding satisfactory coverage threshold.
+ <SPAN class="treeviewBlue">ALT+0</SPAN> - Remove all filters.
+ <BR/>
+ <SPAN class="treeviewBlue">CTRL+1</SPAN> - Display sequence point coverage report (covered%).
+ <SPAN class="treeviewBlue">CTRL+2</SPAN> - Display sequence point coverage report (covered%) (unvisited seqpnt#).
+ <SPAN class="treeviewBlue">CTRL+3</SPAN> - Display sequence point coverage report (unvisited seqpnt#).
+ <SPAN class="treeviewBlue">CTRL+4</SPAN> - Display function coverage report (visits).
+ <SPAN class="treeviewBlue">CTRL+5</SPAN> - Display function coverage coverage report (covered%).
+ <SPAN class="treeviewBlue">CTRL+6</SPAN> - Display function coverage coverage report (covered%) (unvisited function#).
+ <SPAN class="treeviewBlue">CTRL+7</SPAN> - Display function coverage coverage report (unvisited function#).
+ <BR/>
+ <SPAN class="treeviewBlue">CTRL+SHIFT+1</SPAN> - Sort by name (default).
+ <SPAN class="treeviewBlue">CTRL+SHIFT+2</SPAN> - Sort by name down to class level, with methods sorted by line number.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+3</SPAN> - Sort by coverage percentage ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+4</SPAN> - Sort by coverage percentage ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+5</SPAN> - Sort by #unvisited sequence points ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+6</SPAN> - Sort by #unvisited sequence points ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+7</SPAN> - Sort by max function visit count ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+8</SPAN> - Sort by max function visit count ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+9</SPAN> - Sort by max function coverage percentage ascending.
+ <SPAN class="treeviewBlue">CTRL+SHIFT+0</SPAN> - Sort by max function coverage percentage descending.
+ <BR/>
+ <SPAN class="treeviewBlue">ALT+RIGHT</SPAN> - Next unvisited line in the current class.
+ <SPAN class="treeviewBlue">ALT+LEFT</SPAN> - Previous unvisited line in the current class.
+ <SPAN class="treeviewBlue">ALT+UP</SPAN> - Next unvisited class in the current namespace.
+ <SPAN class="treeviewBlue">ALT+DOWN</SPAN> - Previous unvisited class in the current namespace.
+ </PRE>
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer13')">13. Where are my personal settings stored?</a><br/>
+ <div id="answer13" style="display:none">
+ <P class="answer">C:\Documents and Settings\[User Name]\Application Data\KiwiNova\NCoverExplorer\NCoverExplorer.config
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer14')">14. Where can I download the custom NAnt/MSBuild tasks from?</a><br/>
+ <div id="answer14" style="display:none">
+ <P class="answer">A zip file containing the task source code, compiled assemblies and examples can be found
+ <A href="http://www.kiwidude.com/dotnet/DownloadPage.html">here</A>
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer15')">15. I get an "Illegal characters in path" exception - why?</a><br/>
+ <div id="answer15" style="display:none">
+ <P class="answer">NCover 1.4.6 has a bug whereby the filenames that it writes into the xml file contain
+ undesirable characters. Please use either NCover 1.3.3 or NCover 1.5.x. For more details refer to this blog entry
+ <A href="http://www.kiwidude.com/blog/2006/04/illegal-characters-ncover-versions.html">here</A>
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer16')">16. I get a "System.Format" exception - why?</a><br/>
+ <div id="answer16" style="display:none">
+ <P class="answer">One user reported a bizarre issue where on their machines a simple int.Parse("0") would not work.
+ The exact cause is unknown (they had uninstalled some components from their XP installation), however
+ switching region settings to something else and back again resolved the issue.
+ </P>
+ </div>
+ <a class="question" onclick="return Toggle('answer17')">17. My module thresholds are not working - why?</a><br/>
+ <div id="answer17" style="display:none">
+ <P class="answer">The module names included in the module thresholds should not include any path information,
+ and are currently case sensitive (must exactly match the module names you see on the NCoverExplorer report).
+ The case sensitivity constraint is fixed in NCoverExplorer 1.3.5.
+ </P>
+ </div>
+ <P class="subtitle">---------------------------------<BR/>FAQ last updated Jul 21st 2007.</P>
+ </body>
+</html>
trunk/build/tools/ncover.explorer/NCoverExplorerReleaseNotes.html
@@ -0,0 +1,867 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>NCoverExplorer Release Notes</title>
+ <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR" />
+ <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema" />
+ <style type="text/css">
+ body { font-size: 10pt; font-family: Verdana; }
+ p.title { font-size: 20pt; font-weight: bold; }
+ .subtitle { color: maroon; }
+ p.question { font-weight: bold; }
+ pre { font-size: 10pt; font-family: Courier; }
+ pre.usage { background-color: #F0F0F0; }
+ .quote { background-color: #F0F0F0; margin-left: 36pt;}
+ .method { color: maroon; font-size: 10pt; font-weight: bold; }
+ .hdrcell { background-color: #DDEEFF; font-size: 10pt; }
+ .datacell { background-color: #FFFFEE; text-align: right; font-size: 10pt; }
+ .hldatacell { background-color: #FFCCCC; text-align: right; font-size: 10pt; }
+ .box { border: 1px solid; padding: 10px; }
+ .treeviewBlack { color: black; }
+ .treeviewGrey { color: grey; }
+ .treeviewRed { color: red; }
+ .treeviewBlue { color: blue; }
+ .sourceBlue { background-color: #E0EDFD; color: black; }
+ .sourceRed { background-color: #E6B0A5; color: black; }
+ </style>
+ </head>
+ <body>
+ <p class="title">NCoverExplorer Release Notes</p>
+ <p>The latest version of this document is located <a href="http://www.kiwidude.com/dotnet/NCoverExplorerReleaseNotes.html">here</a>.
+ <br/>For the latest NCoverExplorer news and updates, visit my <a href="http://www.kiwidude.com/blog/">blog</a>.</p>
+ <hr/>
+
+ <p class="question">v1.4.0 - Aug 31st 2007</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Major rewrite of the underlying object design for future maintainability. Should improve treeview
+ performance for .NET 2.0 users (and load performance for all users) as well as make it easier to
+ add new features.
+ </li>
+ <li>
+ Changes to the project setting file format and location, both as used by the NCoverExplorer gui
+ and the NCoverExplorer.Console.exe application. If you use the /c argument supplying a configuration
+ file to NCoverExplorer then you must modify your project file format. See ConsoleExample.config
+ for details (replace the outer tag and move ProjectName to be a Name attribute).
+ </li>
+ <li>
+ Replaced ICSharpCode text editor with Actipro which offers far superior features, more attractive
+ appearance and provides a more flexible licensing model for the future of NCoverExplorer.
+ </li>
+ <li>
+ A new attribute added into the coverage report xml of "totalSeqPoints" which includes the
+ total of any excluded sequence points at that level. In response to a feature request in
+ <a href="http://ncover.org/SITE/forums/thread/697.aspx">this</a> NCover forum thread to allow
+ people to report how much code was excluded from coverage.
+ </li>
+ <li>
+ Add a copy command to the right-click menu for the source code area.
+ </li>
+ <li>
+ Add a print preview command to the File menu.
+ </li>
+ <li>
+ Add support for profiling a specific process module to the Run NCover dialog.
+ </li>
+ <li>
+ Add a /fc (failCombinedMinimum) option to NCoverExplorer.Console.exe for emulating the
+ original behaviour of failing based on total coverage to supplement the /f option which
+ fails if an individual module is below the coverage threshold.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ Rewrite the options dialog to use a VS.Net style property pages approach.
+ </li>
+ <li>
+ Exclusions tab in Options dialog - delete key is now a shortcut to removing an exclusion.
+ </li>
+ <li>
+ Reorder the file menu slightly so Run NCover is separated.
+ </li>
+ <li>
+ Source code window now has a splitter bar.
+ </li>
+ <li>
+ Command line generated for NCover 1.5.7+ in NCover Runner dialog includes the //reg
+ option if choosing to register coverlib.dll.
+ </li>
+ <li>
+ Statistics pane auto-sizes the last column to fill the width of the listview.
+ </li>
+ <li>
+ Coverage exclusions now support '?' and more complex wildcard expressions such
+ as Test.*.Something*.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ Line number foreground colour not displayed correctly in options dialog tab.
+ </li>
+ <li>
+ Directory not created if not existing when writing output report.
+ </li>
+ <li>
+ Corrected typo in full name of parameter when using /quiet option with NCoverExplorer.Console.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3.6 - Apr 5th 2007</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.5.2078.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Added a Find dialog (ctrl+F) to quickly navigate to a class. Wildcards are supported.
+ </li>
+ <li>
+ Added a /q or /quiet option to NCoverExplorer.Console.exe to minimise the output.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ Failing if less than a threshold now applies to any assembly not meeting the threshold
+ rather than comparing against the total coverage across all assemblies.
+ </li>
+ <li>
+ Add some examples to the NCoverExplorer.Console.exe output for the /help or /? (or no arguments).
+ </li>
+ <li>
+ Pressing ESC on the NCover Runner dialog will now close it.
+ </li>
+ <li>
+ Implement a workaround for poor treeview performance under .NET 2.0.
+ </li>
+ <li>
+ Rather than displaying validation errors automatically "fix" paths with matching trailing
+ slashes in the Change Source Path dialog.
+ </li>
+ <li>
+ Writing of coverage files should now match the schema for the relevant NCover version.
+ Later NCover versions like 1.5.7 have enhanced the schema, so the results of a merge or
+ save from NCoverExplorer should offer a comparative schema in the result.
+ </li>
+ <li>
+ Add a message indicating the return code to the output.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ NCover 1.5.5/6 produce duplicate sequence points. To workaround this fix Jamie Cansdale implemented
+ a change for me to the way the methods are identified uniquely. The longer term fix is NCover version 1.5.7
+ - this should keep things usable until that is released.
+ </li>
+ <li>
+ Another issue up to at least NCover 1.5.7 is that non-instrumented code does not have the sequence
+ points optimised. When merging multiple coverage files NCoverExplorer was incorrectly merging the noops with
+ valid instrumented sequence points, resulting in lower coverage information.
+ </li>
+ <li>
+ If CoverageReport.xsl stylesheet already exists in destination output folder for an xml report
+ and is marked as read-only then the replace would fail.
+ </li>
+ <li>
+ Drag/drop of coverage.xml files would add to the wrong end of the MRU menu once the maximum
+ number of items is reached.
+ </li>
+ <li>
+ If multiple classes in the same file then selecting a class node was not navigating to that
+ class in the source code tab. It will now jump to the first unvisited sequence point, or if
+ there are none of those the first sequence point in the class.
+ </li>
+ <li>
+ Wildcards for coverage exclusions were only working if placed at the ends, not in the middle
+ e.g. *.Tests or Testing.* would work, but xxx.*.yyy would not.
+ </li>
+ <li>
+ Prevent some of the nasty GDI errors in CommandBars code from disrupting the GUI. Longer
+ term will utilise another framework.
+ </li>
+ <li>
+ Replacing paths by typing them in had MaxLength set to 50 so impossible to edit long paths
+ in the Change Source Path dialog.
+ </li>
+ <li>
+ Merging property nodes under a parent in the tree has a dependency on the ordering of the coverage output
+ to ensure they appear properly.
+ </li>
+ <li>
+ When restoring form position from persisted values, ensure it appears on a visible screen,
+ catering for the user changing their display settings between sessions.
+ </li>
+ <li>
+ Ensure stylesheet cannot be copied over the top of itself.
+ </li>
+ <li>
+ Supplying a file pattern with no matches to NCoverExplorer.Console.exe was throwing an "Index was
+ outside the bounds of the array" exception.
+ </li>
+ <li>
+ Multiple coverage exclusion attributes not supplied correctly to NCover (build 26).
+ </li>
+ <li>
+ Check to make sure node is assigned to a TreeView before getting handle to set text (build 32).
+ </li>
+ <li>
+ Sort sequence point nodes when loading and handle merge case of multiple non-instrumented
+ sequence points becoming a single sequence point. (build 36).
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3.5 - Oct 23rd 2006</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.0.1921.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Added ability to run NCover from within NCoverExplorer (all versions). User Ctrl+N or
+ entries on File menu/toolbar to bring up configuration dialog. After successful
+ execution, the resultant coverage file is displayed in NCoverExplorer.
+ </li>
+ <li>
+ Added ability to generate MSBuild, NAnt and command-line scripts for running NCover
+ from within NCoverExplorer. See the NCover dialog above.
+ </li>
+ <li>
+ Added new function coverage viewing options and module/class coverage report.
+ Indicates the percentage of functions covered rather than the sequence points within each.
+ Supported by a new "satisfactory function threshold" and function % sorting options.
+ </li>
+ <li>
+ Background colours can now be customised for coverage nodes in the tree.
+ </li>
+ <li>
+ Reports will now have the current filtering applied, not just the sorting settings.
+ </li>
+ <li>
+ Reports using NCoverExplorer.Console can now have filtering and sorting applied. Use the
+ /sort: and /filter: command line arguments, or specify in a .config file (see example.config),
+ or use the sort/filter arguments to the NAnt/MSBuild tasks.
+ </li>
+ <li>
+ Sorting and filtering options applied are now persisted and reapplied to the next coverage
+ xml file loaded, both in this and future sessions.
+ </li>
+ <li>
+ Added ability to filter out all nodes exceeding coverage threshold.
+ </li>
+ <li>
+ Revamp to the NAnt/MSBuild tasks. Renamed assemblies and namespaces. Included new attribute of
+ "AssembliesList" as an alternative to the "Assemblies" group element to allow direct
+ specification of a list as you would on the command line. The "Version" attribute is now optional
+ - the task determines it from the NCover assembly instead if not specified. Tasks will automatically
+ register NCover coverlib.dll using the HKCU entry in the registry - no need for regsvr32 any more!
+ NCoverExplorer task now writes it's config file to temp folder for passing to the executable.
+ </li>
+ <li>
+ Added documentation for the NAnt and MSBuild tasks. This is included both in the NCoverExplorer.Extras.zip
+ file, as well as being available online for the custom <a href="http://www.kiwidude.com/dotnet/doc/NCoverExplorer.MSBuildTasks/index.html">MSBuild Task Help</a>
+ and <a href="http://www.kiwidude.com/dotnet/doc/NCoverExplorer.NAntTasks/index.html">NAnt Task Help</a>.
+ Links also available off the Help menu for NCoverExplorer.
+ </li>
+ <li>
+ Added a schema file ConsoleConfig.xsd to the distribution for people wanting to know the exact syntax
+ options for creating .config files to pass to NCoverExplorer.Console using the /config switch.
+ </li>
+ <li>
+ Added regular expression support to the coverage exclusions dialog for people wanting more complex queries.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ <span style="color:red">Configuration file change - the ModuleThresholds section in .config files passed to NCoverExplorer.Console now
+ uses propercase attribute names to be consistent with the rest of the configuration file.
+ i.e. "ModuleName" instead of "moduleName", and "SatisfactoryCoverage" instead of "satisfactoryCoverage".</span> You must update
+ your NAnt/MSBuild tasks for NCoverExplorer if you use these. If you instead use the <exec> task with a .config
+ file then you should update the case of the entries in this file. This only affects people who have setup coverage exclusions
+ at the module level for reporting purposes.
+ </li>
+ <li>
+ If source code is out of date compared to the coverage results, the user is prompted with
+ the change source path dialog.
+ </li>
+ <li>
+ If the user chooses a new source code location, the tab is now automatically opened for
+ that location rather than requiring the user to click on the tree node again.
+ </li>
+ <li>
+ Added Help->NCoverExplorer Forum menu option to link to the NCover website. Also included
+ forum link information on the exception dialog.
+ </li>
+ <li>
+ Added a toolbar button for turning off filtering.
+ </li>
+ <li>
+ <span style="color:red">Keyboard shortcut change - Changed the keyboard shortcuts for next/previous unvisited class (ALT+UP/DOWN) and
+ next/previous unvisited line in class (ALT+LEFT/RIGHT).</span>
+ </li>
+ <li>
+ Remember which tab was last opened in the NCoverExplorer options dialog during an NCoverExplorer session.
+ </li>
+ <li>
+ Replaced references to "transparent.gif" with "shim.gif" in the NCoverExplorerSummary.xsl. The "shim.gif"
+ file is a transparent 1x1 gif already distributed with CC.Net.
+ </li>
+ <li>
+ Coverage exclusions for assemblies are now case insensitive.
+ </li>
+ <li>
+ There are no longer two default coverage exclusions added of "*.Tests" and "*.My*" for first time users.
+ Intended for demo purposes only but stayed in until now. New users can manually add them if they desire them.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ Overloaded constructors with class level variable declarations were being merged into a single
+ constructor in the coverage results as they had the same "start line" of the variable. Now uses
+ end line as part of the identifying key for each method.
+ </li>
+ <li>
+ Memory leak from opening and closing tabs displaying source code.
+ </li>
+ <li>
+ .Net 2.0 performance is pretty dire due to crap Microsoft changes to the TreeView control.
+ Change to default to .Net 1.1 in NCoverExplorer.exe.config and wrap updates to the tree
+ in BeginUpdate/EndUpdate.
+ </li>
+ <li>
+ Parsing Java code would blow up if an accessor had the same name as a nested class (illegal in C#).
+ </li>
+ <li>
+ Bugfix in NCover task where multiple assemblies were specified for NCover 1.5.4, which requires
+ separate <assembly> nodes.
+ </li>
+ <li>
+ Bugfix in trying to restore selected node text after refreshing file could raise
+ null reference exception.
+ </li>
+ <li>
+ Bugfix so that module names specified in module thresholds when using NCoverExplorer.Console
+ are no longer case sensitive for matching.
+ </li>
+ <li>
+ Added support for NCover 1.5.5 - the //q bug is fixed in NCover. Also changed parsing code so that modules
+ with a blank assembly name (through using TestDriven.Net) are ignored from the coverage.
+ </li>
+ <li>
+ Bugfix for merge functionality for NCover.Console when wildcards were used with relative paths.
+ </li>
+ <li>
+ Bugfix for naming of xml/html arguments for NCover.Console with relative file paths.
+ </li>
+ <li>
+ Bugfix for drag/drop broken while making the memory usage optimisations during the 1.3.5 beta release.
+ </li>
+ <li>
+ Print button was enabled when no source code displayed resulting in exception.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3.4 - Jul 10th 2006</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.0.1702.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Added toolbar buttons which support moving to the next and previous unvisited code
+ within a class or namespace. Shortcut keys of N and P for next/previous unvisited line in the
+ current class (or mouse forward/back buttons). Use Ctrl+N and Ctrl+P to navigate to the
+ next/previous partially or unvisited class within the namespace (or Ctrl+forward/back mouse buttons).
+ </li>
+ <li>
+ NCoverExplorer.Console.exe now supports saving the merged results of the coverage xml file(s) with
+ a /s[ave] option. The NCoverExplorer NAnt and MSBuild tasks have also been enhanced to support this
+ with an optional "mergeFileName" attribute.
+ </li>
+ <li>
+ NCoverExplorer.Console.exe now supports wildcards for coverage xml filename(s).
+ </li>
+ <li>
+ NCoverExplorer.Console.exe now supports module level coverage thresholds, rather than just a project
+ coverage threshold. This feature allows finer tolerance for both output on the reports and to fail
+ a build. Specifying the module thresholds is done either through a .config file (see ConsoleExample.config)
+ or through parameters in the NAnt/MSBuild tasks.
+ </li>
+ <li>
+ Added a new summary report showing class coverage per namespace per module.
+ </li>
+ <li>
+ Enhanced the NCoverExplorerSummary.xsl to display summaries of each module.
+ </li>
+ <li>
+ Clicking on a class with non-existent source code displays a dialog allowing the user to specify an alternate
+ folder. For use when the source code location indicated within the coverage.xml file(s) loaded differs from
+ that on the local machine now (e.g. a different drive letter or folder path).
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ NCoverExplorer release is compiled against .Net 1.1 rather than .Net 1.0 due to a dependency on the
+ FolderBrowserDialog not available in .Net 1.0.
+ </li>
+ <li>
+ Coverage file stylesheet modified to show coverage column and NCoverExplorer version information with
+ numerous other cosmetic enhancements.
+ </li>
+ <li>
+ Enrich error environment information to include .Net framework version and operating system.
+ </li>
+ <li>
+ Classes without a namespace are now shown under a namespace node of "-" like in Reflector.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ Warnings about mismatches when merging xml files are no longer issued. NCover seems to inconsistently
+ produce xml file coverage of methods which caused some users problems when merging.
+ </li>
+ <li>
+ Nested classes without a namespace specified would cause the coverage.xml file to fail to load.
+ </li>
+ <li>
+ Parsing overloaded properties (overloads of this[]) would not show the separate overloads in the tree
+ and have incorrect coverage stats.
+ </li>
+ <li>
+ Fix memory leaks for when source code tabs are closed.
+ </li>
+ <li>
+ Minimum coverage threshold for NCoverExplorer.Console would sometimes be incorrect due to rounding.
+ </li>
+ <li>
+ Changed NCoverExplorerSummary.xsl to format to 1dp rather than rounding to 0.
+ </li>
+ <li>
+ Sorting by filename for a method then clicking on class node threw exception.
+ </li>
+ <li>
+ VB.Net source code keywords not highlighted with the correct ICSharpCode template.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3.3 - Apr 4th 2006</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.0.1578.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Added NCoverExplorer.Console.exe for utilising NCoverExplorer features with automated
+ coverage builds and NAnt tasks. By default will load up all the specified coverage file(s), apply
+ any coverage exclusion(s) specified in the NCoverExplorer configuration and display total
+ coverage statistics in the console output. If all items processed successfully returns an exit code of 0,
+ if an exception occurs returns an exit code of 2.
+ </li>
+ <li>
+ Added /m:xx (or /minCoverage:xx) argument to NCoverExplorer.Console.exe. When used in conjunction with
+ /f (or /failMinimum) an exit code of 3 is returned if the min coverage is not reached. Can act
+ as a trigger for failing an automated build such as with CruiseControl.Net.
+ </li>
+ <li>
+ Added module & namespace summary xml report generation to NCoverExplorer (both the GUI and Console versions).
+ In the GUI, this is available via the "View->Reports" menu. The three reports that are offered currently are:
+ <br/> - Module Summary (Coverage totals for the project and per module);
+ <br/> - Namespace Summary (Coverage totals for the project and per namespace);
+ <br/> - Module Namespace Summary (Coverage totals for the project, per module and per namespace);
+ </li>
+ <li>
+ Reports can be generated in xml or html format. Native html may be useful for directly attaching to e-mails.
+ If xml format is chosen a "CoverageReport.xsl" stylesheet is copied from the NCoverExplorer installation
+ folder to the report directory and linked to the xml file similar to coverage.xml/coverage.xsl by NCover.
+ </li>
+ <li>
+ Reports can contain an "excluded nodes" footer section. This lists at the topmost level all of the items
+ excluded from coverage at the time the report was run.
+ </li>
+ <li>
+ Added "View->Filter" main menu and context menus, offering the ability to filter out nodes. Filtered
+ nodes are simply moved under a new "Filtered" tree node and do not alter the coverage statistics
+ (unlike excluded nodes which are effectively removed from the tree). Filters offered are either to
+ hide all 100% covered nodes, or hide all unvisited (0%) nodes.
+ </li>
+ <li>
+ Added "Include in Results" context menu option for when clicking on either the "Excluded" bin or one
+ of it's immediate child nodes. Offers a way to "undo" an exclusion without reloading the file.
+ </li>
+ <li>
+ Added "View->Summary Statistics" menu option (shortcut F3) to show dialog of totals of files, classes, members,
+ NCLOC (non-commented lines of code) and sequence points. Statistics do not include excluded nodes
+ (but will include filtered nodes).
+ </li>
+ <li>
+ Created NAnt and MSBuild tasks for execution of NCoverExplorer.Console as an alternative to the <exec> task.
+ These tasks offer a more developer friendly alternative such as <fileset> for coverage files and creating a
+ .config file on the fly based on specified parameters such as <exclusions> within the .build/.proj file.
+ </li>
+ <li>
+ Replaced menus with a lightly tweaked variant of Lutz Roeder's excellent CommandBar code to give a more modern
+ look and assign icons on the menus.
+ </li>
+ <li>
+ Added a toolbar. If not wanted the toolbar can be hidden using the "View->Show Toolbar" menu option.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ Options dialog shortcut changed to F2.
+ </li>
+ <li>
+ Excluding a node will now select the node after by default rather than the one previous.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ Fix bug where delete key shortcut was active on the root coverage file node, causing an exception to be thrown.
+ </li>
+ <li>
+ Path was being truncated from the module name when saved.
+ </li>
+ <li>
+ Fix bug where changing theme without coverage file loaded caused error.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3.2 - Mar 14th 2006</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.0.1545.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Added support for merging multiple coverage files. This can be triggered through a variety of ways:
+ <br/> - Selecting multiple test classes/fixtures/projects in TestDriven.Net;
+ <br/> - Passing multiple files in the command line arguments;
+ <br/> - Selecting multiple files in the Open dialog;
+ <br/> - Using a new "File->Merge..." menu option;
+ <br/> - Drag/dropping onto the NCoverExplorer application.
+ </li>
+ <li>
+ Added tabs for each source code file you open to explore coverage on. If you click on a partial class
+ then tabs will be opened for each of the source code files making up the class.
+ </li>
+ <li>
+ Added the ability to exclude assemblies, namespaces or classes from the coverage results by a wildcard capable
+ case-sensitive match on the name. By default NCoverExplorer includes two exclusions:
+ <br/> - Exclude all assemblies with the name ending in ".Tests".
+ <br/> - Exclude all namespaces with the name containing ".My" (for VB.Net exclusions).
+ </li>
+ <li>
+ Added support for the NCover 1.5.4 "excluded" attribute which can be found in the coverage.xml files when
+ the appropriate NCover command-line attributes are used. Note that TestDriven.Net still does not as yet
+ support this attribute so you need to use the NCover.Console command line for this feature - for more information see
+ <a href=http://ncover.org/SITE/blogs/ncover_blog/archive/2006/01/29/103.aspx>here</a>. NCoverExplorer
+ will not include nodes marked as 'excluded' by NCover in it's totals but will still display them in the tree.
+ </li>
+ <li>
+ Added an "Excluded" child bin node containing all nodes that have been excluded by the options dialog, by NCover
+ attributes or by the "Exclude From Results" context menu option (see next point).
+ </li>
+ <li>
+ Replaced the "Remove from Results" context menu feature with "Exclude from Results" (shortcut of the DEL key).
+ Achieves a similar result of removing nodes from coverage calculations, however the nodes are "moved" to the
+ Excluded bin rather than being deleted from the tree.
+ </li>
+ <li>
+ Added a custom "theme" capability along with further colour and font customisation options for the coverage tree,
+ statistics and source code panes. A number of predefined "themes" are supplied and users can add their own.
+ Users can switch between themes either in the Options dialog or via the "View->Themes" menu.
+ </li>
+ <li>
+ Added a new "View->Coverage" menu which has sub-options related to "Sequence Point Coverage" and
+ "Function Coverage", assigned shortcut keys ctrl+(1-4):
+ <br/> - Choosing one of the "Sequence Point" variants will display the tree nodes with differing naming
+ combinations of coverage percentage and # unvisited sequence points.
+ <br/> - Choosing "Function Coverage" will alter the coverage tree display so that only methods/classes that were
+ invoked are highlighted. Method nodes show the number of visits to that method. Class, namespace and module nodes
+ show the maximum visit count by any of their children.
+ </li>
+ <li>
+ Added a "View->Sort By" menu option and context menu on the tree, with sub-options for "Name" (default),
+ "Class name/line number", "Coverage %" (ascending/descending), "Uncovered Sequence Points" (ascending/descending)
+ and "Visit Counts" (ascending/descending).
+ Assigned shortcut keys of ctrl+shift+(1-8). Note that reloading the coverage file will remove the current sort
+ and default back to by "Name".
+ </li>
+ <li>
+ Added "Save" and "Save As" options to the File menu. These give you the option of overwriting/creating a
+ new coverage.xml file with the current values loaded in NCoverExplorer. Any coverage exclusions/removed
+ nodes will not appear in the saved coverage file. Note that the methods are written in the same order as
+ the sort order specified above.
+ </li>
+ <li>
+ Added an "Explore Coverage Folder" menu option to the file menu.
+ </li>
+ <li>
+ Added an "Expand All" context menu option on the tree (shortcut ctrl+L).
+ </li>
+ <li>
+ Enhanced the statistics pane. When a class node is selected you will now see additional columns of
+ coverage %, unvisited sequence points and sequence points. When clicking on a method node you will
+ now see the filename.
+ </li>
+ <li>
+ Implemented "smart expansion" in the tree. If when you expand a node there is only one child node
+ then that node will also be expanded and so on. Increases speed of tree navigation particularly
+ if using a style of "Nested" namespaces with deep hierarchies.
+ </li>
+ <li>
+ Display class file name in tab page header bar when a method node is clicked on. Tooltip shows the path.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ Optimised when reloads of the coverage file so it is now only required if you change a coverage exclusion
+ or the tree grouping/nesting styles in the options dialog. Makes for a snappier UI.
+ </li>
+ <li>
+ Added a "Close" menu option to remove any loaded coverage file(s) from display.
+ </li>
+ <li>
+ Moved all the "Recent Files" into a submenu to tidy up the File menu.
+ </li>
+ <li>
+ Pressing Tab/shift-tab while focus is in the TextEditor pane of source code will now
+ move focus out of the TextEditor.
+ </li>
+ <li>
+ If a source code file contains multiple classes (not nested), then only the highlighting relevant
+ to that particular class will be displayed in the editor window as each class tree node is clicked.
+ </li>
+ <li>
+ Excluding the My namespace is now done through the Exclusions feature.
+ </li>
+ <li>
+ Options dialog can be displayed using the F4 shortcut key.
+ </li>
+ <li>
+ Removed last remnants of "non VS.Net standard colors" from the C# ICSharpCode TextEditor template.
+ </li>
+ <li>
+ Make the GUI naming consistent to correctly reference "sequence points" rather than "lines" and "unvisited"
+ rather than "uncovered".
+ </li>
+ <li>
+ Removed "Edit in VS.Net" from the View menu.
+ </li>
+ <li>
+ Changed NCoverExplorer main form icon to one that includes 32x32 sizes so Alt-Tab switching looks
+ better than upscaled 16x16 icon.
+ </li>
+ <li>
+ User is now prompted to remove a non-existent coverage file from the "Recent" files list rather than
+ automatically being removed.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ Serializing the configuration settings was not flushing the stream - resulting sometimes in a blank settings file
+ preventing people from loading NCoverExplorer. Will now revert to default settings if an error occurs.
+ </li>
+ <li>
+ Displaying a source code file that has been modified to have less lines of code than at the time of the coverage run
+ will now display a user friendly message box.
+ </li>
+ <li>
+ Compensation made for NCover not reporting column information when profiling C++ code. NCoverExplorer will now
+ highlight the entire line rather than throwing an error.
+ </li>
+ <li>
+ In some circumstances properties were not highlighted consistently due to a bug in the property node expansion.
+ </li>
+ <li>
+ Coverage greater than 99.5% will no longer be rounded up to 100% in the display. It is instead shown as ">99.5%".
+ </li>
+ <li>
+ Extremely high visit counts will no longer overflow the visit count.
+ </li>
+ <li>
+ Statistics pane for a class will now always consistently show the property nodes grouped, rather than only
+ after the class node has been expanded in the tree.
+ </li>
+ <li>
+ Recent file menu would display incorrectly for files numbered from 10 onwards truncating first character.
+ </li>
+ <li>
+ Release notes & FAQ were always directed to website rather than local versions when NCoverExplorer was started
+ from TestDriven.Net.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3.1 - Feb 15th 2006</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.0.1435.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Namespaces are now "flattened" by default in the tree. This looks like the ClassView
+ browser in VS.Net 2005 (or Lutz Roeder's Reflector). You can retain the nested look by changing it in the View->Options dialog.
+ </li>
+ <li>
+ If you use the original "nested" namespace style (like the VS.Net 2003 class browser), then inner namespaces will now be
+ listed at the top of each branch with the classes listed underneath which is less confusing to navigate.
+ </li>
+ <li>
+ Option to exclude the "My" namespace for VB.Net projects (for use with with BCL 2.0 & NCover 1.5.x).
+ </li>
+ <li>
+ Right-click menu option on coverage tree (shortcut ctrl+R) to "Remove From Results" that selected node
+ and all it's children. Will force the coverage values to be recalculated. Intended for use where
+ you have undesired assemblies, namespaces, classes or methods included in the report that are skewing your
+ coverage results and you want them removed.
+ </li>
+ <li>
+ Option to specify a satisfactory coverage threshold as a number of lines instead/as well as a percentage.
+ If either of the conditions are met the node is coloured differently (provided the coverage is not zero).
+ </li>
+ <li>
+ Colours can now be customised for both the source code highlighting and the nodes in the tree.
+ </li>
+ <li>
+ Collapse all nodes context menu option on the coverage tree control (shortcut ctrl-A). Equivalent to reloading
+ the coverage file (but would preserve any changes you have made such as removing nodes).
+ </li>
+ <li>
+ By default the NCoverExplorer now attempts to restore your currently selected node/caret position after
+ reloading a coverage.xml file (either F5 or by execution of another "Test With Coverage" command in TestDriven.Net).
+ You can turn off this behaviour in the View->Options dialog.
+ </li>
+ <li>
+ Statistics pane is now sortable by method name (default), visit count and line number.
+ </li>
+ <li>
+ Statistics pane now summarises all the methods and their visit counts when a class node is clicked.
+ Can be used as a basic form of method invocation counting for a fairly rudimentary level of profiling.
+ The colouring used is the same as that of the tree to visually assist in identifying methods invoked.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ Restructured the Options dialog to have a tabbed interface.
+ </li>
+ <li>
+ Renamed the "Show Visit Pane" menu option to "Show Statistics".
+ </li>
+ <li>
+ The statistics pane now includes the method name. Widths of the columns are remembered each time you close NCoverExplorer.
+ </li>
+ <li>
+ Statistics pane now has icons and colouring to match those of the associated nodes in the coverage tree.
+ </li>
+ <li>
+ Inner nested classes now nested internally in the tree under the parent class, sorted to the top.
+ </li>
+ <li>
+ Added FAQ, Release Notes and Blog website to the Help menu.
+ </li>
+ </ul>
+ <p class="answer">The following bug fixes were made:</p>
+ <ul>
+ <li>
+ Source code files now loading with "Encoding.Default" rather than previous default of UTF-8.
+ </li>
+ <li>
+ Coverage highlighting not working correctly on multiple line statements.
+ </li>
+ <li>
+ Now handles partial classes and yield statements correctly.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.3 - Feb 6th 2006</p>
+ <p class="answer">Bundled with TestDriven.Net from build 2.0.1373d.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Launching from VS.Net using TestDriven.Net will now re-use the NCoverExplorer instance
+ opened from a previous "Test with... Coverage" click. Each VS.Net instance has it's own
+ instance of NCoverExplorer.
+ </li>
+ <li>
+ Added "Edit in VS.Net" functionality (keyboard shortcut ctrl+ E) for classes and methods.
+ Will navigate to source code in your IDE at same point where your cursor resides in NCoverExplorer.
+ Replaces and enhances previous "Open File" right-click option which has been removed.
+ </li>
+ <li>
+ Added "Expand Covered" functionality (keyboard shortcut ctrl + Q) - recurses through the child
+ nodes of the current node and expands all those with partial or complete coverage. Useful when
+ using in conjunction with TestDriven.Net for isolated unit testing.
+ </li>
+ <li>
+ Added "coverage file" node at the top of the tree showing total coverage across all modules/namespaces.
+ </li>
+ <li>
+ Group by module option (default) to assist with navigating coverage for large solutions.
+ </li>
+ <li>
+ Configuration information for NCoverExplorer now written to Local Settings rather than registry.
+ </li>
+ <li>
+ Increase default number of "recent files" to 10, with ability to alter in the Options dialog.
+ </li>
+ <li>
+ Reload of the current coverage file now has a shortcut key of F5.
+ </li>
+ <li>
+ Display the path to the currently loaded coverage file in the title bar.
+ </li>
+ </ul>
+ <p class="answer">The following minor changes were made:</p>
+ <ul>
+ <li>
+ Performance enhancements to improve loading times further for large files.
+ </li>
+ <li>
+ Static constructors now renamed from "cctor" to ".cctor" so as to be sorted at the top.
+ </li>
+ <li>
+ Running NCoverExplorer for first time ever will use a better starting form position.
+ </li>
+ <li>
+ Removed configuration option for "nesting properties" - default remains the same of "true".
+ </li>
+ <li>
+ Source code refactoring into separate assemblies to facilitate unit testing.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.2 - Feb 1st 2006</p>
+ <p class="answer">First public release, bundled with TestDriven.Net from build 2.0.1341d.</p>
+ <p class="answer">The following new features were introduced:</p>
+ <ul>
+ <li>
+ Block style highlighting option for both visited and unvisited code.
+ </li>
+ <li>
+ Satisfactory coverage threshold.
+ </li>
+ <li>
+ Nesting of properties as nodes are expanded.
+ </li>
+ <li>
+ Further speed improvements for initial file parsing.
+ </li>
+ </ul>
+ <hr/>
+
+ <p class="question">v1.1 - Jan 1st 2006</p>
+ <p class="answer">Speed improvements.</p>
+ <hr/>
+
+ <p class="question">v1.0 - Dec 17th 2005</p>
+ <p class="answer">First version created.</p>
+ </body>
+</html>
trunk/build/tools/psake/build_utilities.ps1
@@ -0,0 +1,127 @@
+ function combine_paths($path1,$path2)
+ {
+ return [System.IO.Path]::Combine($path1,$path2)
+ }
+
+ function touch($file_path)
+{
+ new-item -path $file_path -force -itemtype File
+}
+
+ function drop_folder($path)
+ {
+ if (test-path $path)
+ {
+ remove-item $path -force -recurse
+ }
+ }
+
+ function make_folder($path)
+ {
+ new-item -path $path -type directory | out-null
+ }
+
+ function get_filename($full_path){
+ return [System.IO.Path]::GetFileName($full_path)
+ }
+
+ function process_sql_files($files,$sql_tool,$connection_string)
+ {
+ $files | foreach-object{ .$sql_tool $connection_string -i "$_" }
+ }
+
+ function copy_and_replace_tokens($template_file_path,$settings)
+ {
+ $contents = [System.IO.File]::ReadAllText($template_file_path)
+ $settings.keys | foreach-object{
+ $contents = $contents.Replace("@${_}@",$settings[$_])
+ }
+ $new_file = strip_template_extension $template_file_path
+ [System.IO.File]::WriteAllText($new_file,$contents)
+ }
+
+ function files_have_changed($files_to_check,[System.String]$timestamp_file_path){
+
+ $timestamp_exists = test-path $timestamp_file_path
+ if($timestamp_exists -eq $false){return $true}
+
+ $reference_file = get-item -path $timestamp_file_path
+ $last_write_time = $reference_file.LastWriteTime
+ $reference_file = $null
+
+ foreach($file in $files_to_check)
+ {
+ $actual_file = get-item -path $file
+ if($actual_file.LastWriteTime -gt $last_write_time)
+ {
+ $actual_file = $null
+ return $true
+ }
+ }
+ return $false
+ }
+
+ function get_file_names($files)
+ {
+ $file_names = new-object -typename System.Collections.ArrayList
+ foreach ($file in $files)
+ {
+ [void]$file_names.Add($file.FullName)
+ }
+ return $file_names.ToArray()
+ }
+
+ function strip_template_extension($path){
+ if ($path.EndsWith(".template"))
+ {
+ return $path.Replace(".template","")
+ }
+ return $path
+ }
+
+ function expand_all_template_files($files,$settings)
+ {
+ $files | foreach-object{ copy_and_replace_tokens $_ $settings}
+ }
+
+ function kill_exe($name){
+ taskkill "/f /im $name /fi 'STATUS eq RUNNING'"
+ }
+
+ function make_iis_dir($application_name,$path){
+ $directory_entry = new-object System.DirectoryServices.DirectoryEntry -argumentList "IIS://localhost/W3SVC/1/Root"
+ $child_directories = $directory_entry.psbase.Children
+ $child_directories | where {$_.psbase.path.contains($application_name)} |foreach-object {
+ $child_directories.remove($_)
+ }
+
+ $virtual_directory = $child_directories.Add($application_name,"IISWebVirtualDir")
+ $virtual_directory.psbase.CommitChanges()
+ $virtual_directory.psbase.Properties["Path"][0]= $path
+ $virtual_directory.AppFriendlyName = $application_name
+ $virtual_directory.psbase.CommitChanges()
+ $virtual_directory.psbase.Invoke("AppCreate",$false)
+ }
+
+ function add_iis_mapping($application_name,$check_file_exists,$extension,$verbs,$executable){
+ $mapping = "$extension,$executable,"
+
+ if ($check_file_exists)
+ {
+ $mapping = $mapping + "5"
+ }
+ else
+ {
+ $mapping = $mapping + "1"
+ }
+ $mapping = $mapping + ",$verbs"
+ $directory_entry = new-object System.DirectoryServices.DirectoryEntry -argumentList "IIS://localhost/W3SVC/1/Root/$application_name"
+
+ if ($directory_entry -ne $null)
+ {
+ $directory_entry.psbase.RefreshCache()
+ $directory_entry.ScriptMaps.Add($mapping)
+ $directory_entry.psbase.CommitChanges()
+ $directory_entry.psbase.Close()
+ }
+ }
trunk/build/tools/psake/psake.ps1
@@ -0,0 +1,186 @@
+# psake v0.11
+# Copyright ๏ฟฝ 2008 James Kovacs
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+param(
+ [string]$buildFile = 'default.ps1',
+ [string[]]$taskList = @(),
+ [string]$framework = '3.5',
+ [switch]$debug = $false,
+ [switch]$help = $false
+)
+
+
+
+if($help) {
+@"
+psake [buildFile] [tasks] [-framework ver] [-debug]
+ where buildFile is the name of the build file, (default: default.ps1)
+ tasks is a list of tasks to execute from the build file,
+ ver is the .NET Framework version to target - 1.0, 1.1, 2.0, 3.0, or 3.5
+ 3.5 is the default
+ debug dumps information the tasks.
+psake -help
+ Displays this message.
+"@
+ return
+}
+
+$global:tasks = @{}
+$global:properties = @()
+$script:executedTasks = New-Object System.Collections.Stack
+$script:callStack = New-Object System.Collections.Stack
+$originalEnvPath = $env:path
+$originalDirectory = Get-Location
+
+function task([string]$name, [scriptblock]$action = $null, [string[]]$depends = @()) {
+ if($name -eq 'default' -and $action -ne $null) {
+ throw "Error: default task cannot specify an action"
+ }
+ $newTask = @{
+ Name = $name
+ DependsOn = $depends
+ Action = $action
+ }
+ if($global:tasks.$name -ne $null) { throw "Error: Task, $name, has already been defined." }
+ $global:tasks.$name = $newTask
+}
+
+function properties([scriptblock]$propertyBlock) {
+ $global:properties += $propertyBlock
+}
+
+
+function AssertNotCircular([string]$name) {
+ if($script:callStack.Contains($name)) {
+ throw "Circular reference found for task, $name"
+ }
+}
+
+function ExecuteTask([string]$name) {
+ if($script:executedTasks.Contains($name)) { return }
+ AssertNotCircular $name
+ $script:callStack.Push($name)
+
+ $task = $global:tasks.$name
+ foreach($childTask in $task.DependsOn) {
+ ExecuteTask $childTask
+ }
+ if($name -ne 'default') {
+ Write-Host "Executing task, $name..."
+ if($task.Action -ne $null) {
+ & $task.Action
+ }
+ Write-Host "`n"
+ }
+
+ $poppedTask = $script:callStack.Pop()
+ if($poppedTask -ne $name) {
+ throw "CallStack was corrupt. Expected $name, but got $poppedTask."
+ }
+ $script:executedTasks.Push($name)
+}
+
+function DumpTasks {
+ Write-Host 'Dumping tasks:'
+ foreach($key in $global:tasks.Keys) {
+ $task = $global:tasks.$key;
+ $task.Name + " depends on " + $task.DependsOn.Length + " other tasks: " + $task.DependsOn;
+ }
+ Write-Host "`n"
+}
+
+function DumpProperties {
+ Write-Host 'Dumping properties:'
+ $global:properties
+}
+
+function ConfigureEnvForBuild {
+ $version = $null
+ switch ($framework) {
+ '1.0' { $version = 'v1.0.3705' }
+ '1.1' { $version = 'v1.1.4322' }
+ '2.0' { $version = 'v2.0.50727' }
+ '3.0' { $version = 'v2.0.50727' } # .NET 3.0 uses the .NET 2.0 compilers
+ '3.5' { $version = 'v3.5' }
+ default { throw "Error: Unknown .NET Framework version, $framework" }
+ }
+ $frameworkDir = "$env:windir\Microsoft.NET\Framework\$version\"
+ if(!(test-path $frameworkDir)) {
+ throw "Error: No .NET Framework installation directory found at $frameworkDir"
+ }
+ $env:path = "$frameworkDir;$env:path"
+}
+
+function Cleanup {
+ $env:path = $originalEnvPath
+ $global:tasks = $null
+ Set-Location $originalDirectory
+}
+
+function RunBuild {
+ # Faking a finally block
+ trap {
+ Write-Host -foregroundcolor Red $_
+ Cleanup
+ break
+ }
+
+ # Execute the build file to set up the tasks and defaults
+ if(test-path $buildFile) {
+ $buildFile = resolve-path $buildFile
+ set-location (split-path $buildFile)
+ & $buildFile
+ } else {
+ throw "Error: Could not find the build file, $buildFile."
+ }
+
+ if($debug) {
+ DumpProperties
+ DumpTasks
+ }
+
+ ConfigureEnvForBuild
+
+
+ foreach($propertyBlock in $global:properties) {
+ . $propertyBlock
+ }
+
+
+ # Execute the list of tasks or the default task
+ if($taskList.Length -ne 0) {
+ foreach($task in $taskList) {
+ ExecuteTask $task
+ }
+ } elseif ($global:tasks.default -ne $null) {
+ EXecuteTask default
+ }
+
+ # Clear out any global variables
+ Cleanup
+}
+
+# Avoids printing of error dump with line numbers
+trap {
+ # continue
+}
+
+RunBuild
+
trunk/build/assembly_build.ps1
@@ -0,0 +1,13 @@
+properties{#directories
+ $deploy_dir_bin = "$deploy_dir\bin"
+ $deploy_dir_images = "$deploy_dir\images"
+}
+
+
+task deploy_assembly -depends prep_for_distribution{
+#$result = .$build_tools_dir\ilmerge\ilmerge.exe /out:$deploy_dir\$project_name.dll $build_artifacts_dir\$project_lib $build_artifacts_dir\FirstAssemblyToMerge
+ get_file_names(get-childitem -path $build_artifacts_dir -filter $project_name*dll) | foreach-object{copy-item -path $_ $deploy_dir}
+
+ $result
+}
+
trunk/build/build.ps1
@@ -0,0 +1,155 @@
+properties{#misc
+ $framework_dir = "$env:windir\microsoft.net\framework\v2.0.50727"
+}
+
+properties{#directories
+ $base_dir = new-object System.IO.DirectoryInfo $pwd
+ $base_dir = $base_dir.Parent.FullName
+
+ $build_dir = "$base_dir\build"
+ $build_tools_dir = "$build_dir\tools"
+ $build_artifacts_dir = "$build_dir\artifacts"
+
+ $config_dir = "$build_dir\config"
+ $coverage_dir = "$build_artifacts_dir\coverage"
+ $coverage_file_name = "$coverage_dir\ncoverage.xml"
+
+ $deploy_dir = "$build_dir\deploy"
+
+ $product_dir = "$base_dir\product"
+
+ $sql_dir = "$build_dir\sql"
+ $sql_ddl_dir = "$sql_dir\ddl"
+ $sql_data_dir = "$sql_dir\data"
+ $third_party_dir = "$base_dir\thirdparty"
+ $third_party_tools_dir = "$third_party_dir\tools"
+ $third_party_lib_dir = "$third_party_dir\lib"
+}
+
+properties {#load in the build utilities file
+ . $build_dir\tools\psake\build_utilities.ps1
+}
+
+properties {#load in the file that contains the name for the project
+ . $build_dir\project_name.ps1
+}
+
+properties{#filesets
+ $all_template_files = get_file_names(get-childitem -path $build_dir -recurse -filter "*.template")
+ $third_party_libraries = get_file_names(get-childitem -path $third_party_lib_dir -recurse -filter *.dll)
+ $third_party_tools = get_file_names(get-childitem -path $third_party_tools_dir -recurse -filter "*.dll")
+ $third_party_exes = get_file_names(get-childitem -path $third_party_tools_dir -recurse -filter "*.exe")
+ $bdd_doc_resources = get_file_names(get-childitem -path $third_party_tools_dir\bdddoc -recurse -include @("*.css","*.jpg"))
+ $all_third_party_dependencies = $third_party_tools + $third_party_libraries + $third_party_exes + $bdd_doc_resources
+ $all_sql_ddl_template_files = get_file_names(get-childitem -path $sql_ddl_dir -recurse -filter *.sql.template)
+ $all_sql_data_template_files = get_file_names(get-childitem -path $sql_data_dir -recurse -filter *.sql.template)
+ $all_sql_template_files = $all_sql_ddl_template_files , $all_sql_data_template_files
+}
+
+properties{ #files
+ $studio_app_config = "$product_dir\$project_name\bin\debug\$project_name.dll.config"
+ $log4net_config = "$config_dir\log4net.config.xml"
+ $now = [System.DateTime]::Now
+ $project_lib = "$project_name.dll"
+ $project_test_lib = "$project_name.test.dll"
+ $db_timestamp = "$sql_dir\db.timestamp"
+ $nant_properties_file = "$build_dir\local_properties.xml"
+}
+
+properties{#logging
+ $log_dir = "$build_dir\logs"
+ $log_file_name = "${log_dir}\log.txt"
+ $log_level = "DEBUG"
+}
+
+
+properties{#transient folders for build process
+ $transient_folders = new-object -typename System.Collections.ArrayList
+ $transient_folders.add($build_artifacts_dir)
+ $transient_folders.add($coverage_dir)
+ $transient_folders.add($deploy_dir)
+}
+
+properties{#machine dependent external properties
+ . $build_dir\local_properties.ps1
+ $app_config = $local_settings.app_config_template.Replace(".template","");
+ $app_config = "$config_dir\$app_config"
+}
+
+properties{#other build files
+. .\studio_build.ps1
+. .\web_build.ps1
+. .\assembly_build.ps1
+}
+
+task default -depends init
+
+task build_db -depends init{
+ $files_changed = files_have_changed $all_sql_template_files $db_timestamp
+
+ if ($files_changed -eq $true)
+ {
+ process_sql_files $script:all_sql_ddl_files $local_settings.osql_exe "-E"
+ }
+ else
+ {
+ "DB is upto date"
+ }
+ touch $db_timestamp
+}
+
+task load_data -depends build_db {
+ process_sql_files $script:all_sql_data_files $local_settings.osql_exe "-E"
+}
+
+
+task init -depends clean{
+ $transient_folders | foreach-object{ make_folder $_ }
+ expand_all_template_files $all_template_files $local_settings
+ $script:all_sql_ddl_files = get_file_names(get-childitem -path $sql_ddl_dir -recurse -filter *.sql)
+ $script:all_sql_data_files = get_file_names(get-childitem -path $sql_data_dir -recurse -filter *.sql)
+}
+
+task clean{
+ $transient_folders | foreach-object{ remove-item $_ -recurse -ErrorAction SilentlyContinue}
+}
+
+task compile -depends init{
+ $result = MSBuild.exe "$base_dir\solution.sln" /t:Rebuild /p:Configuration=Debug
+ $script:product_outputs = get_file_names(get-childitem -path $product_dir -recurse -filter *.dll)
+ $script:product_debug_outputs = get_file_names(get-childitem -path $product_dir -recurse -filter *.pdb)
+
+ $result
+}
+
+task prep_for_distribution -depends compile{
+ $all_third_party_dependencies | foreach-object {copy-item -path $_ -destination $build_artifacts_dir}
+ $script:product_outputs | foreach-object {copy-item -path $_ -destination $build_artifacts_dir}
+}
+
+task setup_test -depends prep_for_distribution{
+ $script:product_outputs | foreach-object {copy-item -path $_ -destination $build_artifacts_dir}
+ $script:product_debug_outputs | foreach-object {copy-item -path $_ -destination $build_artifacts_dir}
+}
+
+task test -depends setup_test{
+ $xunit = "$third_party_tools_dir\mbunit\MbUnit.Cons.exe"
+ $result = .$xunit $build_artifacts_dir\$project_test_lib /rt:"$($local_settings.xunit_report_type)" /rnf:"$($local_settings.xunit_report_file_name)" /rf:"$($local_settings.xunit_report_file_dir)" /sr
+
+ $result
+}
+
+
+
+task run_ncover -depends setup_test{
+ $xunit_app_console_args = "$build_artifacts_dir\$project_test_lib $($local_settings.xunit_console_args)"
+
+ ."$build_tools_dir\ncover\ncover.console.exe" $build_artifacts_dir\MBUnit.Cons.exe $build_artifacts_dir\$project_test_lib //reg //x "$coverage_file_name" //a "$project_name"
+ ."$build_tools_dir\ncover.explorer\NCoverExplorer.Console.exe" "$coverage_file_name" /s:"$coverage_dir\merged_report.xml"
+ ."$build_tools_dir\ncover.explorer\NCoverExplorer.exe" "$coverage_dir\merged_report.xml"
+
+}
+
+task run_test_report -depends test{
+ $result = ."$build_artifacts_dir\bdddoc.console.exe" "$build_artifacts_dir\$project_test_lib" "ObservationAttribute" "$build_artifacts_dir\SpecReport.html" "$($local_settings.xunit_report_file_dir)\$($local_settings.xunit_report_file_name_with_extension)"
+}
trunk/build/local_properties.ps1.template
@@ -0,0 +1,27 @@
+$local_settings = @{
+ app_config_template = "app.config.xp.template" ;
+ #app_config_template = "app.config.vista.template" ;
+
+ osql_connectionstring = "-E";
+ path_to_runtime_log4net_config = "$build_artifacts_dir\log4net.config.xml";
+ initial_catalog = "$project_name";
+ database_provider = "System.Data.SqlClient" ;
+ database_path = "C:\databases" ;
+ asp_net_worker_process = "aspnet_wp.exe";
+ startup_page = "Default.aspx";
+ browser_exe = "C:\program files\mozilla firefox\firefox.exe";
+ log_file_name = "log";
+ log_level = "DEBUG";
+ xunit_report_file_dir = "$build_artifacts_dir" ;
+ xunit_report_file_name = "test_report";
+ xunit_report_type = "text";
+ xunit_show_test_report = $true;
+ debug = "TRUE";
+ }
+$local_settings.xunit_report_file_name_with_extension = "$($local_settings.xunit_report_file_name).$($local_settings.xunit_report_type)"
+$local_settings.sql_tools_path = "$env:SystemDrive\program files\microsoft sql server\100\tools\binn" ;
+$local_settings.osql_exe = "$($local_settings.sql_tools_path)\osql.exe"
+$local_settings.config_connectionstring = "data source=(local);Integrated Security=SSPI;Initial Catalog=$($local_settings.initial_catalog)"
+#$local_settings.db_account_sql = $($local_settings.asp_net_account)] WITH PASSWORD=N'$($local_settings.asp_net_account)', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF")
+$local_settings.asp_net_account = "$($env:computername)\ASPNet";
+$local_settings.db_account_sql = "$($local_settings.asp_net_account)', N'$($local_settings.asp_net_account)'"
trunk/build/project_name.ps1
@@ -0,0 +1,1 @@
+$project_name = "jpboodhoo.bdd"
trunk/build/ps.bat
@@ -0,0 +1,3 @@
+@echo off
+cls
+powershell .\tools\psake\psake.ps1 .\build.ps1 %*
trunk/build/studio_build.ps1
@@ -0,0 +1,6 @@
+task from_ide -depends init{
+ copy-item $app_config $studio_web_config
+ copy-item $log4net_config "$web_ui_dir\log4net.xml"
+ copy-item $app_config $studio_app_config
+ copy-item $log4net_config "$product_dir\$project_name\bin\debug\log4net.xml"
+}
trunk/build/web_build.ps1
@@ -0,0 +1,59 @@
+properties{#directories
+ $deploy_dir_bin = "$deploy_dir\bin"
+ $deploy_dir_images = "$deploy_dir\images"
+ $web_ui_dir = "$product_dir\web.ui"
+}
+
+properties{#filesets
+}
+
+properties{ #files
+}
+
+
+properties{#asp app mapping settings
+ $executable="$framework_dir\aspnet_isapi.dll"
+ $extension = ".oo"
+ $verbs = "GET,POST"
+}
+
+
+properties{#machine dependent external properties
+ $run_url = "http://$env:computername/$($local_settings.virtual_directory_name)/$($local_settings.startup_page)"
+}
+
+
+task copy_web_project{
+ remove-item $deploy_dir -recurse -ErrorAction SilentlyContinue
+ copy-item $web_ui_dir $deploy_dir -recurse
+
+ get-childitem $deploy_dir -include *.cs -recurse | foreach-object{remove-item $_ -force}
+
+ kill_subversion_files $deploy_dir
+
+ remove-item $deploy_dir\properties -recurse
+
+ remove-item $deploy_dir\obj -recurse
+
+ remove-item $deploy_dir\web.ui.csproj
+
+ remove-item $deploy_dir\web.ui.csproj.user
+}
+
+task make_iis_dir{
+ make_iis_dir "$($local_settings.virtual_directory_name)" "$deploy_dir"
+ add_iis_mapping "$($local_settings.virtual_directory_name)" $false $extension $verbs $executable
+}
+
+task deploy -depends compile,copy_web_project,make_iis_dir{
+ copy-item $log4net_config $deploy_dir
+ copy-item $app_config $deploy_dir\web.config
+
+ $result = .$build_tools_dir\winrar\rar.exe a $deploy_dir\dist.rar $deploy_dir
+
+ $result
+}
+
+task run -depends deploy{
+ .$local_settings.browser_exe $run_url
+}