Details
-
Bug
-
Status: Resolved
-
Critical
-
Resolution: Cannot Reproduce
-
2.3
-
None
-
None
-
Operating System: Windows 9x
Platform: PC
-
8879
Description
Our application is an SGML to HTML rendering tool. We validate the SGML,
convert to XML and transform to XML using XSLT.
A significant portion of the data is CALS tables and we have borrowed from Norm
Walsh's DocBook code to perform these conversions.
When processing large tables, Xalan crashes with a java.lang.OutOfMemoryError
and no further information.
When I isolated which tables were causing the crash, I processed them
individually. By removing some rows and entries I finally got the table to
render but as soon as I add one entry back in, the crash will reoccur.
This data is rendered successfully and properly using other XSLT processors
such as Saxon. In a comparison (admittedly not complete) of Saxon and Xalan,
both seemed to be returning exactly the same values and iterating the same
number of times right up to the point where Xalan crashed.
Our client is already using Xalan for other purposes and wishes to remain
consistent in their toolset but will be unable to unless this problem is
remedied. They don't seem to receptive to the 'If tables crash it, don't use
tables!' solution.
Below is the xslt code for processing the tables followed by the XML to be
processed. Simply using the XML as your input with this xslt code will
reproduce our error.
Thanks
---------------------- cals_table.xsl
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version='1.0'>
<xsl:param name="default.table.width" select="'80%'"/>
<!-- ************************************************* -->
<!-- ************************************************* -->
<!-- Most of the following code was borrowed from Norm Walsh -->
<xsl:template name="OUTPUT-ENTRY-ATTRIBUTES"/>
<xsl:template match="table">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="tgroup">
<table>
<xsl:if test="../@pgwide=1">
<xsl:attribute name="width">100%</xsl:attribute>
</xsl:if>
<xsl:attribute name="cellpadding">6</xsl:attribute>
<xsl:choose>
<xsl:when test="../@frame='all'">
<xsl:attribute name="border">1</xsl:attribute>
</xsl:when>
<xsl:when test="../@frame='none'">
<xsl:attribute name="border">0</xsl:attribute>
</xsl:when>
<xsl:when test="../@frame='bottom'">
<xsl:attribute name="border">1</xsl:attribute>
</xsl:when>
<xsl:when test="../@frame='top'">
<xsl:attribute name="border">1</xsl:attribute>
</xsl:when>
<xsl:when test="../@frame='sides'">
<xsl:attribute name="border">border</xsl:attribute>
</xsl:when>
<xsl:when test="../@frame='topbot'">
<xsl:attribute name="border">1</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="border">1</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:variable name="colgroup">
<colgroup>
<xsl:call-template name="generate.colgroup">
<xsl:with-param name="cols" select="@cols"/>
</xsl:call-template>
</colgroup>
</xsl:variable>
<xsl:variable name="table.width">
<xsl:choose>
<xsl:when test="$default.table.width = ''">
<xsl:text>100%</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$default.table.width"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:attribute name="width">
<xsl:value-of select="$table.width"/>
</xsl:attribute>
<xsl:copy-of select="$colgroup"/>
<xsl:apply-templates/>
</table>
<xsl:text disable-output-escaping="yes"><br/></xsl:text>
<xsl:text disable-output-escaping="yes"><br/></xsl:text>
</xsl:template>
<xsl:template match="colspec"></xsl:template>
<xsl:template match="spanspec"></xsl:template>
<xsl:template match="thead|tfoot">
<xsl:element name="
">
<xsl:if test="@align">
<xsl:attribute name="align">
<xsl:value-of select="@align"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@char">
<xsl:attribute name="char">
<xsl:value-of select="@char"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@charoff">
<xsl:attribute name="charoff">
<xsl:value-of select="@charoff"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@valign">
<xsl:attribute name="valign">
<xsl:value-of select="@valign"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="tbody">
<tbody>
<xsl:if test="@align">
<xsl:attribute name="align">
<xsl:value-of select="@align"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@char">
<xsl:attribute name="char">
<xsl:value-of select="@char"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@charoff">
<xsl:attribute name="charoff">
<xsl:value-of select="@charoff"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@valign">
<xsl:attribute name="valign">
<xsl:value-of select="@valign"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</tbody>
</xsl:template>
<xsl:template match="row">
<tr>
<xsl:if test="@align">
<xsl:attribute name="align">
<xsl:value-of select="@align"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@char">
<xsl:attribute name="char">
<xsl:value-of select="@char"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@charoff">
<xsl:attribute name="charoff">
<xsl:value-of select="@charoff"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@valign">
<xsl:attribute name="valign">
<xsl:value-of select="@valign"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="thead/row/entry">
<xsl:call-template name="process.cell">
<xsl:with-param name="cellgi">th</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="tbody/row/entry">
<xsl:call-template name="process.cell">
<xsl:with-param name="cellgi">td</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="tfoot/row/entry">
<xsl:call-template name="process.cell">
<xsl:with-param name="cellgi">th</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="process.cell">
<xsl:param name="cellgi">td</xsl:param>
<xsl:variable name="empty.cell" select="count(node()) = 0"/>
<xsl:variable name="entry.colnum">
<xsl:call-template name="entry.colnum"/>
</xsl:variable>
<xsl:if test="$entry.colnum != ''">
<xsl:variable name="prev.entry" select="preceding-sibling::*[1]"/>
<xsl:variable name="prev.ending.colnum">
<xsl:choose>
<xsl:when test="$prev.entry">
<xsl:call-template name="entry.ending.colnum">
<xsl:with-param name="entry" select="$prev.entry"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="add-empty-entries">
<xsl:with-param name="number">
<xsl:choose>
<xsl:when test="$prev.ending.colnum = ''">0</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$entry.colnum - $prev.ending.colnum - 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:element name="{$cellgi}">
<xsl:if test="@spanname">
<xsl:variable name="namest"
select="ancestor::tgroup/spanspec[@spanname=./@spanname]/@namest"/>
<xsl:variable name="nameend"
select="ancestor::tgroup/spanspec[@spanname=./@spanname]/@nameend"/>
<xsl:variable name="colst"
select="ancestor::*[colspec/@colname=$namest]/colspec
[@colname=$namest]/@colnum"/>
<xsl:variable name="colend"
select="ancestor::*[colspec/@colname=$nameend]/colspec
[@colname=$nameend]/@colnum"/>
<xsl:attribute name="colspan"><xsl:value-of select="number($colend) -
number($colst) + 1"/></xsl:attribute>
</xsl:if>
<xsl:if test="@morerows">
<xsl:attribute name="rowspan">
<xsl:value-of select="@morerows+1"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@namest">
<xsl:attribute name="colspan">
<xsl:call-template name="calculate.colspan"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@align">
<xsl:attribute name="align">
<xsl:value-of select="@align"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@char">
<xsl:attribute name="char">
<xsl:value-of select="@char"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@charoff">
<xsl:attribute name="charoff">
<xsl:value-of select="@charoff"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@valign">
<xsl:attribute name="valign">
<xsl:value-of select="@valign"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@rowsep='1'">
<xsl:attribute name="style">border-bottom:thin solid
black</xsl:attribute>
</xsl:if>
<xsl:if test="not(preceding-sibling::*)
and ancestor::row/@id">
<a name="
"/>
</xsl:if>
<xsl:if test="@id">
<a name="
"/>
</xsl:if>
<xsl:choose>
<xsl:when test="$empty.cell">
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template name="add-empty-entries">
<xsl:param name="number" select="'0'"/>
<xsl:choose>
<xsl:when test="$number <= 0"></xsl:when>
<xsl:otherwise>
<td> </td>
<xsl:call-template name="add-empty-entries">
<xsl:with-param name="number" select="$number - 1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="entry.colnum">
<xsl:param name="entry" select="."/>
<xsl:choose>
<xsl:when test="$entry/@colname">
<xsl:variable name="colname" select="$entry/@colname"/>
<xsl:variable name="colspec"
select="$entry/ancestor::tgroup/colspec[@colname=$colname]"/>
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$entry/@namest">
<xsl:variable name="namest" select="$entry/@namest"/>
<xsl:variable name="colspec"
select="$entry/ancestor::tgroup/colspec[@colname=$namest]"/>
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="count($entry/preceding-sibling::*) = 0">1</xsl:when>
<xsl:otherwise>
<xsl:variable name="pcol">
<xsl:call-template name="entry.ending.colnum">
<xsl:with-param name="entry" select="$entry/preceding-sibling::*[1]"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$pcol + 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="entry.ending.colnum">
<xsl:param name="entry" select="."/>
<xsl:choose>
<xsl:when test="$entry/@colname">
<xsl:variable name="colname" select="$entry/@colname"/>
<xsl:variable name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$colname]"/>
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$entry/@nameend">
<xsl:variable name="nameend" select="$entry/@nameend"/>
<xsl:variable name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$nameend]"/>
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="count($entry/preceding-sibling::*) = 0">1</xsl:when>
<xsl:otherwise>
<xsl:variable name="pcol">
<xsl:call-template name="entry.ending.colnum">
<xsl:with-param name="entry" select="$entry/preceding-sibling::*[1]"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$pcol + 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="colspec.colnum">
<xsl:param name="colspec" select="."/>
<xsl:choose>
<xsl:when test="$colspec/@colnum">
<xsl:value-of select="$colspec/@colnum"/>
</xsl:when>
<xsl:when test="$colspec/preceding-sibling::colspec">
<!--
<xsl:variable name="prec.colspec.colnum">
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$colspec/preceding-
sibling::colspec[1]"/>
</xsl:call-template>
</xsl:variable>
-->
<xsl:value-of select="count($colspec/preceding-sibling::colspec) + 1"/>
</xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="generate.colgroup">
<xsl:param name="cols" select="1"/>
<xsl:param name="count" select="1"/>
<xsl:choose>
<xsl:when test="$count>$cols"></xsl:when>
<xsl:otherwise>
<xsl:call-template name="generate.col">
<xsl:with-param name="countcol" select="$count"/>
</xsl:call-template>
<xsl:call-template name="generate.colgroup">
<xsl:with-param name="cols" select="$cols"/>
<xsl:with-param name="count" select="$count+1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="generate.col">
<xsl:param name="countcol">1</xsl:param>
<xsl:param name="colspecs" select="./colspec"/>
<xsl:param name="count">1</xsl:param>
<xsl:param name="colnum">1</xsl:param>
<xsl:choose>
<xsl:when test="$count>count($colspecs)">
<xsl:text disable-output-escaping="yes"><col/></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
<xsl:variable name="colspec.colnum">
<xsl:choose>
<xsl:when test="$colspec/@colnum">
<xsl:value-of select="$colspec/@colnum"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$colnum"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$colspec.colnum=$countcol">
<col>
<xsl:if test="$colspec/@align">
<xsl:attribute name="align">
<xsl:value-of select="$colspec/@align"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$colspec/@char">
<xsl:attribute name="char">
<xsl:value-of select="$colspec/@char"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$colspec/@charoff">
<xsl:attribute name="charoff">
<xsl:value-of select="$colspec/@charoff"/>
</xsl:attribute>
</xsl:if>
</col>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="generate.col">
<xsl:with-param name="countcol" select="$countcol"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="count" select="$count+1"/>
<xsl:with-param name="colnum">
<xsl:choose>
<xsl:when test="$colspec/@colnum">
<xsl:value-of select="$colspec/@colnum + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$colnum + 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="colspec.colwidth">
<!-- when this macro is called, the current context must be an entry -->
<xsl:param name="colname"></xsl:param>
<!-- .. = row, ../.. = thead|tbody, ../../.. = tgroup -->
<xsl:param name="colspecs" select="../../../../tgroup/colspec"/>
<xsl:param name="count">1</xsl:param>
<xsl:choose>
<xsl:when test="$count>count($colspecs)"></xsl:when>
<xsl:otherwise>
<xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
<xsl:choose>
<xsl:when test="$colspec/@colname=$colname">
<xsl:value-of select="$colspec/@colwidth"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="colspec.colwidth">
<xsl:with-param name="colname" select="$colname"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="count" select="$count+1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="calculate.colspan">
<xsl:param name="entry" select="."/>
<xsl:variable name="namest" select="$entry/@namest"/>
<xsl:variable name="nameend" select="$entry/@nameend"/>
<xsl:variable name="scol">
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$namest]"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="ecol">
<xsl:call-template name="colspec.colnum">
<xsl:with-param name="colspec" select="$entry/ancestor::tgroup/colspec
[@colname=$nameend]"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$ecol - $scol + 1"/>
</xsl:template>
</xsl:stylesheet>
----------------------- table1.xml
<?xml version="1.0"?>
<!DOCTYPE erf[
]>
<table
frame="none"
tabstyle="squeeze5"
><tgroup
cols="19"
rowsep="0"
align="left"
colsep="0"
><colspec
colname="1"
colwidth="50pt"
align="left"
></colspec><colspec
colname="2"
colwidth="50pt"
align="left"
></colspec><colspec
colname="3"
colwidth="50pt"
align="left"
></colspec><colspec
colname="4"
colwidth="50pt"
align="left"
></colspec><colspec
colname="5"
colwidth="50pt"
align="left"
></colspec><colspec
colname="6"
colwidth="50pt"
align="left"
></colspec><colspec
colname="7"
colwidth="50pt"
align="left"
></colspec><colspec
colname="8"
colwidth="50pt"
align="left"
></colspec><colspec
colname="9"
colwidth="50pt"
align="left"
></colspec><colspec
colname="10"
colwidth="50pt"
align="left"
></colspec><colspec
colname="11"
colwidth="50pt"
align="left"
></colspec><colspec
colname="12"
colwidth="50pt"
align="left"
></colspec><colspec
colname="13"
colwidth="50pt"
align="left"
></colspec><colspec
colname="14"
colwidth="50pt"
align="left"
></colspec><colspec
colname="15"
colwidth="50pt"
align="left"
></colspec><colspec
colname="16"
colwidth="50pt"
align="left"
></colspec><colspec
colname="17"
colwidth="50pt"
align="left"
></colspec><colspec
colname="18"
colwidth="50pt"
align="left"
></colspec><colspec
colname="19"
colwidth="79pt"
align="left"
></colspec><tbody
valign="top"
><row
><entry
align="right"
></entry><entry
align="right"
>1989</entry><entry
align="right"
>1990</entry><entry
align="right"
>1991</entry><entry
align="right"
>1992</entry><entry
align="right"
>1993</entry><entry
align="right"
>1994</entry><entry
align="right"
>1995</entry><entry
align="right"
>1996</entry><entry
align="right"
>1997</entry><entry
align="right"
>1998</entry><entry
align="right"
>1999</entry><entry
align="right"
>2000</entry><entry
align="right"
>2001</entry><entry
align="right"
>2002</entry><entry
align="right"
>2003</entry><entry
align="right"
>2004</entry><entry
align="right"
>2005</entry><entry
align="right"
>Total</entry></row><row
><entry
align="justify"
>January</entry><entry
align="right"
>532</entry><entry
align="right"
>35345</entry><entry
align="right"
>3454</entry><entry
align="right"
>6436</entry><entry
align="right"
>153</entry><entry
align="right"
>63474</entry><entry
align="right"
>23423</entry><entry
align="right"
>84564</entry><entry
align="right"
>3543</entry><entry
align="right"
>3573</entry><entry
align="right"
>534</entry><entry
align="right"
>886</entry><entry
align="right"
>453</entry><entry
align="right"
>899567</entry><entry
align="right"
>6442</entry><entry
align="right"
>6442</entry><entry
align="right"
>234</entry><entry
align="right"
>1139055</entry></row><row
><entry
align="justify"
>February</entry><entry
align="right"
>54245</entry><entry
align="right"
>3453</entry><entry
align="right"
>345</entry><entry
align="right"
>670</entry><entry
align="right"
>14452</entry><entry
align="right"
>57</entry><entry
align="right"
>2432</entry><entry
align="right"
>234</entry><entry
align="right"
>357</entry><entry
align="right"
>3543</entry><entry
align="right"
>625</entry><entry
align="right"
>864</entry><entry
align="right"
>2432</entry><entry
align="right"
>234</entry><entry
align="right"
>234634</entry><entry
align="right"
>234634</entry><entry
align="right"
>4564</entry><entry
align="right"
>557775</entry></row><row
><entry
align="justify"
>March</entry><entry
align="right"
>45224</entry><entry
align="right"
>453</entry><entry
align="right"
>34543</entry><entry
align="right"
>470</entry><entry
align="right"
>15232</entry><entry
align="right"
>575</entry><entry
align="right"
>2432</entry><entry
align="right"
>4564</entry><entry
align="right"
>453</entry><entry
align="right"
>357</entry><entry
align="right"
>3534</entry><entry
align="right"
>3543</entry><entry
align="right"
>2465</entry><entry
align="right"
>4564</entry><entry
align="right"
>1234</entry><entry
align="right"
>1234</entry><entry
align="right"
>453</entry><entry
align="right"
>121330</entry></row><row
><entry
align="justify"
>April</entry><entry
align="right"
>245</entry><entry
align="right"
>770</entry><entry
align="right"
>7652</entry><entry
align="right"
>886</entry><entry
align="right"
>1400</entry><entry
align="right"
>7565</entry><entry
align="right"
>2432</entry><entry
align="right"
>435</entry><entry
align="right"
>2432</entry><entry
align="right"
>453</entry><entry
align="right"
>3543</entry><entry
align="right"
>357</entry><entry
align="right"
>243</entry><entry
align="right"
>453</entry><entry
align="right"
>1452</entry><entry
align="right"
>1452</entry><entry
align="right"
>2432</entry><entry
align="right"
>34202</entry></row><row
><entry
align="justify"
>May</entry><entry
align="right"
>534</entry><entry
align="right"
>64564</entry><entry
align="right"
>175</entry><entry
align="right"
>864</entry><entry
align="right"
>1234</entry><entry
align="right"
>5645</entry><entry
align="right"
>2465</entry><entry
align="right"
>6442</entry><entry
align="right"
>2465</entry><entry
align="right"
>2432</entry><entry
align="right"
>357</entry><entry
align="right"
>99567</entry><entry
align="right"
>84564</entry><entry
align="right"
>2432</entry><entry
align="right"
>234</entry><entry
align="right"
>234</entry><entry
align="right"
>2465</entry><entry
align="right"
>276673</entry></row><row
><entry
align="justify"
>June</entry><entry
align="right"
>5498</entry><entry
align="right"
>987</entry><entry
align="right"
>1457</entry><entry
align="right"
>3543</entry><entry
align="right"
>1452</entry><entry
align="right"
>576</entry><entry
align="right"
>243</entry><entry
align="right"
>234634</entry><entry
align="right"
>243</entry><entry
align="right"
>2465</entry><entry
align="right"
>453</entry><entry
align="right"
>3543</entry><entry
align="right"
>34635</entry><entry
align="right"
>2465</entry><entry
align="right"
>4564</entry><entry
align="right"
>4564</entry><entry
align="right"
>243</entry><entry
align="right"
>301565</entry></row><row
><entry
align="justify"
>July</entry><entry
align="right"
>885</entry><entry
align="right"
>453</entry><entry
align="right"
>6473</entry><entry
align="right"
>357</entry><entry
align="right"
>232</entry><entry
align="right"
>3456</entry><entry
align="right"
>84564</entry><entry
align="right"
>1234</entry><entry
align="right"
>84564</entry><entry
align="right"
>243</entry><entry
align="right"
>3535</entry><entry
align="right"
>357</entry><entry
align="right"
>6442</entry><entry
align="right"
>243</entry><entry
align="right"
>453</entry><entry
align="right"
>234</entry><entry
align="right"
>84564</entry><entry
align="right"
>278289</entry></row><row
><entry
align="justify"
>August</entry><entry
align="right"
>4543</entry><entry
align="right"
>6546</entry><entry
align="right"
>273</entry><entry
align="right"
>453</entry><entry
align="right"
>3535</entry><entry
align="right"
>5399</entry><entry
align="right"
>234</entry><entry
align="right"
>1452</entry><entry
align="right"
>2432</entry><entry
align="right"
>84564</entry><entry
align="right"
>4564</entry><entry
align="right"
>453</entry><entry
align="right"
>234634</entry><entry
align="right"
>84564</entry><entry
align="right"
>2432</entry><entry
align="right"
>4564</entry><entry
align="right"
>34635</entry><entry
align="right"
>475277</entry></row><row
><entry
align="justify"
>September</entry><entry
align="right"
>7454</entry><entry
align="right"
>6346</entry><entry
align="right"
>27438</entry><entry
align="right"
>34563</entry><entry
align="right"
>3532</entry><entry
align="right"
>3534</entry><entry
align="right"
>4564</entry><entry
align="right"
>232</entry><entry
align="right"
>2465</entry><entry
align="right"
>34635</entry><entry
align="right"
>3543</entry><entry
align="right"
>2432</entry><entry
align="right"
>1234</entry><entry
align="right"
>34635</entry><entry
align="right"
>2465</entry><entry
align="right"
>6442</entry><entry
align="right"
>6442</entry><entry
align="right"
>181956</entry></row><row
><entry
align="justify"
>October</entry><entry
align="right"
>858</entry><entry
align="right"
>3453</entry><entry
align="right"
>366</entry><entry
align="right"
>345</entry><entry
align="right"
>23411</entry><entry
align="right"
>3454</entry><entry
align="right"
>435</entry><entry
align="right"
>3543</entry><entry
align="right"
>243</entry><entry
align="right"
>23446</entry><entry
align="right"
>357</entry><entry
align="right"
>2465</entry><entry
align="right"
>1452</entry><entry
align="right"
>234</entry><entry
align="right"
>243</entry><entry
align="right"
>234634</entry><entry
align="right"
>234634</entry><entry
align="right"
>533573</entry></row><row
><entry
align="justify"
>November</entry><entry
align="right"
>9058</entry><entry
align="right"
>432</entry><entry
align="right"
>46452</entry><entry
align="right"
>367</entry><entry
align="right"
>1352</entry><entry
align="right"
>2432</entry><entry
align="right"
>6442</entry><entry
align="right"
>357</entry><entry
align="right"
>84564</entry><entry
align="right"
>776453</entry><entry
align="right"
>453</entry><entry
align="right"
>243</entry><entry
align="right"
>234</entry><entry
align="right"
>4564</entry><entry
align="right"
>84564</entry><entry
align="right"
>1234</entry><entry
align="right"
>1234</entry><entry
align="right"
>1020435</entry></row><row
><entry
align="justify"
>December</entry><entry
align="right"
>9585</entry><entry
align="right"
>543</entry><entry
align="right"
>235</entry><entry
align="right"
>867</entry><entry
align="right"
>32444</entry><entry
align="right"
>23423</entry><entry
align="right"
>234634</entry><entry
align="right"
>453</entry><entry
align="right"
>3452</entry><entry
align="right"
>54646</entry><entry
align="right"
>353</entry><entry
align="right"
>84564</entry><entry
align="right"
>4564</entry><entry
align="right"
>99576</entry><entry
align="right"
>34635</entry><entry
align="right"
>1452</entry><entry
align="right"
>1452</entry><entry
align="right"
>586878</entry></row><row
><entry
align="justify"
>Total</entry><entry
align="right"
>140650</entry><entry
align="right"
>125335</entry><entry
align="right"
>130854</entry><entry
align="right"
>51813</entry><entry
align="right"
>100422</entry><entry
align="right"
>121584</entry><entry
align="right"
>366295</entry><entry
align="right"
>340140</entry><entry
align="right"
>189210</entry><entry
align="right"
>988808</entry><entry
align="right"
>23850</entry><entry
align="right"
>201274</entry><entry
align="right"
>375353</entry><entry
align="right"
>1135533</entry><entry
align="right"
>375355</entry><entry
align="right"
>499124</entry><entry
align="right"
>375357</entry><entry
align="right"
>5507008</entry></row></tbody></tgroup></table>