Re: JDBCException "next" Exception would be nice to output to screen

"David Saff [email protected] [junit]" <[email protected]> Tue, 15 Sep 2015 11:57:37 -0400
Newsgroups gmane.comp.java.junit.user
Message-ID <CALrw-Pzp0e+t+99QrEE25W9pit7t=gwNG-6u5ixhjk7nh2N50g@mail.gmail.com>
--089e011767bfd6deaf051fcb3ea8
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

This would be a great use for a Rule:

class ShowNextExceptions extends TestRule {
  Statement apply(Statement s, Description d) {
    try {
      s.evaluate();
    } catch (SQLException e) {
      // FullSQLException does whatever is needed to get all the
getNextException's
      throw FullSQLException(e);
    }
  }
}

public class MyTest {
   @Rule public TestRule t =3D new ShowNextExceptions();

   ...
}

David Saff

On Mon, Sep 14, 2015 at 5:49 PM, Roger Pack [email protected] [junit] <
[email protected]> wrote:

>
>
> Hello.
>
> Feature request with regard to uncaught exceptions:
>
> Today with certain junit failures, you might get this output to the scree=
n:
>
> org.hibernate.exception.ConstraintViolationException: could not perform
> addBatch
> at
> org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLSt=
ateConversionDelegate.java:129)
> at
> org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(St=
andardSQLExceptionConverter.java:49)
> at
> org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelp=
er.java:125)
> at
> org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(B=
atchingBatch.java:114)
> at
> org.hibernate.engine.jdbc.batch.internal.BatchingBatch.doExecuteBatch(Bat=
chingBatch.java:101)
> at
> org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.execute(Abstra=
ctBatchImpl.java:149)
> at
> org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.getBatch(JdbcCoord=
inatorImpl.java:187)
> at
> org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEnt=
ityPersister.java:3059)
> at
> org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEnt=
ityPersister.java:3523)
> at
> org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertActi=
on.java:88)
> at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:393)
> at
> org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:385)
> at
> org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:301)
> at
> org.hibernate.event.internal.AbstractFlushingEventListener.performExecuti=
ons(AbstractFlushingEventListener.java:339)
> at
> org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlu=
shEventListener.java:52)
> at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1240)
> at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
> at
> org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTran=
sactionCommit(JdbcTransaction.java:101)
> at
> org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(Abstr=
actTransactionImpl.java:175)
> at
> org.familysearch.digitalarchive.presdb.TapeDB.commitAndClose(TapeDB.java:=
439)
> at
> org.familysearch.digitalarchive.presdb.TapeDB.saveOrUpdateMigrationTapeTr=
ansfer(TapeDB.java:144)
> at
> org.familysearch.digitalarchive.presdb.TapeDBTest.canSaveTapeTransferWith=
GroupDones(TapeDBTest.java:899)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java=
:57)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorI=
mpl.java:43)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMeth=
od.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallabl=
e.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod=
.java:47)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.=
java:17)
> at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java=
:26)
> at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:2=
7)
> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.=
java:78)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.=
java:57)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java=
:26)
> at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:2=
7)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> at
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTe=
stRunner.java:78)
> at
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnit=
Starter.java:212)
> at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68=
)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java=
:57)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
> Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into
> MigrationGroups (XXX) values ('YYY') was aborted. Call
> getNextException to see the cause.
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleErro=
r(AbstractJdbc2Statement.java:2740)
> at
> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl=
.java:1891)
> at
> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:4=
05)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Sta=
tement.java:2889)
> at
> com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyP=
reparedStatement.java:2465)
> at
> org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(B=
atchingBatch.java:110)
> ... 48 more
>
> This is OK, but it would be nice to (in the case of SQLException)
> iterate over the "next" exceptions as well, so we could see the cause
> more easily:
>
> http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/SQLException.html#g=
etNextException()
> (So basically iterate over both causes and "next" exceptions, in this
> particular case).
> Cheers!
> -roger-
> related:
> http://stackoverflow.com/questions/15848359/call-getnextexception-to-see-=
the-cause-how-to-make-hibernate-jpa-show-the-db
>
> PS yahoo groups for the mailing list? That is pretty hard to join for
> those not using yahoo accounts, you may want to consider an
> alternative...
>=20
>

--089e011767bfd6deaf051fcb3ea8
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable





<head>

<style type=3D"text/css">
<!--

/* start of attachment style */
       .ygrp-photo-title{
         clear: both;
         font-size: smaller;
         height: 15px;
         overflow: hidden;
         text-align: center;
         width: 75px;
       }
       div.ygrp-photo{
         background-position: center;
         background-repeat: no-repeat;
         background-color: white;
         border: 1px solid black;
         height: 62px;
         width: 62px;
       }

       div.photo-title=20
         a,
         div.photo-title a:active,
         div.photo-title a:hover,
         div.photo-title a:visited {
           text-decoration: none;=20
       }

       div.attach-table div.attach-row {
         clear: both;
       }

       div.attach-table div.attach-row div {
         float: left;
         /* margin: 2px;*/
       }

       p {
         clear: both;
         padding: 15px 0 3px 0;
	 overflow: hidden;
       }

       div.ygrp-file {
         width: 30px;
         valign: middle;
       }
       div.attach-table div.attach-row div div a {
         text-decoration: none;
       }

       div.attach-table div.attach-row div div span {
         font-weight: normal;
       }

       div.ygrp-file-title {
         font-weight: bold;
       }
 /* end of attachment style */
        -->
        </style>
        </head>
<html>
<head>
<style type=3D"text/css">
<!--
#ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
-->
</style>
</head>
<body>



<!-- |**|begin egp html banner|**| -->

<br><br>

<!-- |**|end egp html banner|**| -->


<div dir=3D"ltr">This would be a great use for a Rule:<div><br></div><div>c=
lass ShowNextExceptions extends TestRule {</div><div>=C2=A0 Statement apply=
(Statement s, Description d) {<br></div><div>=C2=A0 =C2=A0 try {</div><div>=
=C2=A0 =C2=A0 =C2=A0 s.evaluate();</div><div>=C2=A0 =C2=A0 } catch (SQLExce=
ption e) {</div><div>=C2=A0 =C2=A0 =C2=A0 // FullSQLException does whatever=
 is needed to get all the=C2=A0<span style=3D"font-size:12.8px">getNextExce=
ption&#39;s</span></div><div>=C2=A0 =C2=A0 =C2=A0 throw FullSQLException(e)=
;</div><div>=C2=A0 =C2=A0 }</div><div>=C2=A0 }</div><div>}</div><div><br></=
div><div>public class MyTest {</div><div>=C2=A0 =C2=A0@Rule public TestRule=
 t =3D new ShowNextExceptions();</div><div><br></div><div>=C2=A0 =C2=A0...<=
/div><div>}</div><div><br></div><div>David Saff</div></div><div class=3D"gm=
ail_extra"><br><div class=3D"gmail_quote">On Mon, Sep 14, 2015 at 5:49 PM, =
Roger Pack <a href=3D"mailto:[email protected]">[email protected]</=
a> [junit] <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" t=
arget=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote=
 class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex">


<u></u>









=20
<div style=3D"background-color:#fff">
<span>=C2=A0</span>


<div>
  <div>


    <div>
=20=20=20=20=20=20
=20=20=20=20=20=20
      <p>Hello.<br>
<br>
Feature request with regard to uncaught exceptions:<br>
<br>
Today with certain junit failures, you might get this output to the screen:=
<br>
<br>
org.hibernate.exception.ConstraintViolationException: could not perform add=
Batch<br>
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLS=
tateConversionDelegate.java:129)<br>
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(S=
tandardSQLExceptionConverter.java:49)<br>
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHel=
per.java:125)<br>
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(=
BatchingBatch.java:114)<br>
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.doExecuteBatch(Ba=
tchingBatch.java:101)<br>
at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.execute(Abstr=
actBatchImpl.java:149)<br>
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.getBatch(JdbcCoor=
dinatorImpl.java:187)<br>
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEn=
tityPersister.java:3059)<br>
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEn=
tityPersister.java:3523)<br>
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAct=
ion.java:88)<br>
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:393)<br>
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:385=
)<br>
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:301=
)<br>
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecut=
ions(AbstractFlushingEventListener.java:339)<br>
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFl=
ushEventListener.java:52)<br>
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1240)<br>
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)<br=
>
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTra=
nsactionCommit(JdbcTransaction.java:101)<br>
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(Abst=
ractTransactionImpl.java:175)<br>
at org.familysearch.digitalarchive.presdb.TapeDB.commitAndClose(TapeDB.java=
:439)<br>
at org.familysearch.digitalarchive.presdb.TapeDB.saveOrUpdateMigrationTapeT=
ransfer(TapeDB.java:144)<br>
at org.familysearch.digitalarchive.presdb.TapeDBTest.canSaveTapeTransferWit=
hGroupDones(TapeDBTest.java:899)<br>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav=
a:57)<br>
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor=
Impl.java:43)<br>
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMet=
hod.java:50)<br>
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallab=
le.java:12)<br>
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMetho=
d.java:47)<br>
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod=
.java:17)<br>
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.jav=
a:26)<br>
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:=
27)<br>
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)<br>
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner=
.java:78)<br>
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner=
.java:57)<br>
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)<br>
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)<br>
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)<br>
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)<br>
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)<br>
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.jav=
a:26)<br>
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:=
27)<br>
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)<br>
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)<br>
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaT=
estRunner.java:78)<br>
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUni=
tStarter.java:212)<br>
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)<=
br>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav=
a:57)<br>
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)<br>
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into<br>
MigrationGroups (XXX) values (&#39;YYY&#39;) was aborted.  Call<br>
getNextException to see the cause.<br>
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleErr=
or(AbstractJdbc2Statement.java:2740)<br>
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImp=
l.java:1891)<br>
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:=
405)<br>
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2St=
atement.java:2889)<br>
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxy=
PreparedStatement.java:2465)<br>
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(=
BatchingBatch.java:110)<br>
... 48 more<br>
<br>
This is OK, but it would be nice to (in the case of SQLException)<br>
iterate over the &quot;next&quot; exceptions as well, so we could see the c=
ause<br>
more easily:<br>
<a href=3D"http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/SQLExcepti=
on.html#getNextException()" target=3D"_blank">http://docs.oracle.com/javase=
/1.5.0/docs/api/java/sql/SQLException.html#getNextException()</a><br>
(So basically iterate over both causes and &quot;next&quot; exceptions, in =
this<br>
particular case).<br>
Cheers!<br>
-roger-<br>
related: <a href=3D"http://stackoverflow.com/questions/15848359/call-getnex=
texception-to-see-the-cause-how-to-make-hibernate-jpa-show-the-db" target=
=3D"_blank">http://stackoverflow.com/questions/15848359/call-getnextexcepti=
on-to-see-the-cause-how-to-make-hibernate-jpa-show-the-db</a><br>
<br>
PS yahoo groups for the mailing list? That is pretty hard to join for<br>
those not using yahoo accounts, you may want to consider an<br>
alternative...<br>
</p>

    </div>
=20=20=20=20=20

=20=20=20=20
    <div style=3D"color:#fff;min-height:0"></div>


</div>



=20=20






</blockquote></div><br></div>




<!-- |**|begin egp html banner|**| -->

<br>


<br>

<!-- |**|end egp html banner|**| -->


<div width=3D"1" style=3D"color: white; clear: both;"/>__._,_.___</div>

=20=20=20=20=20=20
=20=20

=20=20=20=20
    <div id=3D"fromDMARC" style=3D"clear:both; margin-top: 10px;">
         <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; backgroun=
d-color:#E3E3E3;">
         Posted by: David Saff &lt;[email protected]&gt;         <hr style=3D=
"height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
    </div>
<!-- Start Recommendations -->
<!-- End Recommendations -->



<!-- |**|begin egp html banner|**| -->

  <img src=3D"http://geo.yahoo.com/serv?s=3D97476590/grpId=3D2423328/grpspI=
d=3D1705006905/msgId=3D24695/stime=3D1442332679" width=3D"1" height=3D"1"> =
<br>

<!-- |**|end egp html banner|**| -->

=20=20
<!-- |**|begin egp html banner|**| -->

<br>



=20=20=20
=20=20=20=20=20
=20
        <!-- |**|begin egp html banner|**| -->
        <div id=3D"ygrp-vital" style=3D"background-color: #f2f2f2; font-fam=
ily: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

        <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-tr=
ansform: uppercase; "><a href=3D"https://groups.yahoo.com/neo/groups/junit/=
info;_ylc=3DX3oDMTJlaDN1ajk0BF9TAzk3MzU5NzE0BGdycElkAzI0MjMzMjgEZ3Jwc3BJZAM=
xNzA1MDA2OTA1BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTQ0MjMzMjY3OQ--" style=3D"tex=
t-decoration: none;">Visit Your Group</a></span>

     <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: in=
line;">
            <li style=3D"border-right: 1px solid #000; font-weight: 700; di=
splay: inline; padding: 0 5px; margin-left: 0;">
      <span class=3D"cat"><a href=3D"https://groups.yahoo.com/neo/groups/ju=
nit/members/all;_ylc=3DX3oDMTJmbWR2OTc0BF9TAzk3MzU5NzE0BGdycElkAzI0MjMzMjgE=
Z3Jwc3BJZAMxNzA1MDA2OTA1BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzE0NDIzMzI2Nzk-" s=
tyle=3D"text-decoration: none;">New Members</a></span>
      <span class=3D"ct" style=3D"color: #ff7900;">1</span>
    </li>
                                              </ul>
  </div>


<div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p=
x; padding: 0 2px 0 0; clear: both;">
  <a href=3D"https://groups.yahoo.com/neo;_ylc=3DX3oDMTJkbDR2ZDc1BF9TAzk3ND=
c2NTkwBGdycElkAzI0MjMzMjgEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlYwNmdHIEc2xrA2dmcARzd=
GltZQMxNDQyMzMyNjc5" style=3D"float: left;"><img src=3D"http://l.yimg.com/r=
u/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height=3D"15"=
 width=3D"137" alt=3D"Yahoo! Groups" style=3D"border: 0;"/></a>
  <div style=3D"color: #747575; float: right;"> &bull; <a href=3D"https://i=
nfo.yahoo.com/privacy/us/yahoo/groups/details.html" style=3D"text-decoratio=
n: none;">Privacy</a> &bull; <a href=3D"mailto:junit-unsubscribe@yahoogroup=
s.com?subject=3DUnsubscribe" style=3D"text-decoration: none;">Unsubscribe</=
a> &bull; <a href=3D"https://info.yahoo.com/legal/us/yahoo/utos/terms/" sty=
le=3D"text-decoration: none;">Terms of Use</a> </div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

=20=20=20


  <br>

<!-- |**|end egp html banner|**| -->


<div style=3D"color: white; clear: both;"/>__,_._,___</div>
</body>

</html>

--089e011767bfd6deaf051fcb3ea8--