<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">LPP-6705 (cleanup declarations of _dbg_name and _dbg_type). &nbsp;&nbsp;I put it as a P1 on eclair (4.3).<div><br><div><div>On Jul 22, 2008, at 4:59 PM, P T Withington wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div bgcolor="#FFFFFF"><div>Yes, please.&nbsp;<br><br>On Jul 22, 2008, at 14:49, Donald Anderson &lt;<a href="mailto:dda@ddanderson.com">dda@ddanderson.com</a>> wrote:<br><br></div><div></div><blockquote type="cite"><div>If you don't mind, I'll commit and open a separate JIRA to track this mod.<div>I think the implementation in the changeset is equivalent to current code</div><div>for non-swf9 platforms (modulo the bugfix).</div><div><br></div><div>- Don</div><div><br><div><div>On Jul 21, 2008, at 3:04 PM, P T Withington wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>What about declaring _dbg_name and _dbg_type as `var` (or, `prototype var`, which is the JS2 way of saying this is a dynamic attribute, not a fixed class attribute)? &nbsp;Because, as originally formulated, _dbg_name and _dbg_type were allowed to be either functions _or_ strings and the debugger is supposed to use the string if it is a string, or invoke the function if it is a function (and use the returned string). &nbsp;That should solve the mixin/override problem too, shouldn't it? &nbsp;Because these functions don't make super calls.<br><br>Thank you to the flex compiler for discovering the bogus call to functionName. &nbsp;:)<br><br>Otherwise, approved!<br><br>On 2008-07-21, at 14:28EDT, Donald Anderson wrote:<br><br><blockquote type="cite">I would appreciate a close review of the small changes to .lzs files.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Change 20080721-dda-7 by <a href="mailto:dda@lester.local"></a><a href="mailto:dda@lester.local">dda@lester.local</a> on 2008-07-21 13:55:52 EDT<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;in /Users/dda/laszlo/src/svn/openlaszlo/trunk-a<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;for <a href="http://svn.openlaszlo.org/openlaszlo/trunk"></a><a href="http://svn.openlaszlo.org/openlaszlo/trunk">http://svn.openlaszlo.org/openlaszlo/trunk</a><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Summary: Enable -debug options for LFC and applications<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">New Features:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Bugs Fixed: LPP-6686 (create debug lfc for swf9), LPP-6687 (makes sure lzc works properly for swf 9 w/ and w/out debug)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Technical Reviewer: ptw (pending)<br></blockquote><blockquote type="cite">QA Reviewer: promanik (pending)<br></blockquote><blockquote type="cite">Doc Reviewer: (pending)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Documentation:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Release Notes:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Details:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Creates a LFC9-debug.swc during LFC build. &nbsp;Uses this when<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;lzc is invoked with -g or --options debug=true or<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;when debug attribute used (&lt;canvas debug="true">) or URL ...&amp;debug=true<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Note: The -g/debug option for swf9 means that:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a special 'debugSWF9' option is turned on internally - this<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;causes -debug=true to be given to the external compiler.<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It also turns *off* the sc compiler's typical actions for<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG and DEBUG_BACKTRACE (that is, generating inline code to<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;support a debugging window in the browser). &nbsp;So debugging on<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWF9 means using fdb.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;lfc/build.xml:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For swf9, build debug LFC in addition to regular LFC.<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assume no backtrace library needed for swf9.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;lfc/events/LaszloEvents.lzs:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Declared _dbg_* variables, they are used conditionally<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in this class (when $debug or $profile are on).<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;lfc/debugger/LzMemory.lzs:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marked _dbg_name as override.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;lfc/data/LzDataElement.lzs:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'_dbg_name' in a mixin exposes a problem. &nbsp;If the usage of the<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mixin inherits from LzNode, then the method *must* be declared<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override in the mixin (without some extra compiler smarts). &nbsp;If<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the usage does not inherit from LzNode, then the method *cannot*<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be declared as override in the mixin. &nbsp;LzDataElementMixin is<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used in both ways so there is no right way to declare the<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method. &nbsp;But in this situation (LzDataSet extends LzNode with<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LzDataElementMixin), _dbg_name is overridden again. &nbsp;Therefore<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this method is not currently even being used. &nbsp;In case it would<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be used in the future, I renamed it, any user class can override<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_dbg_name and call the renamed method.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;lfc/compiler/LzFormatter.lzs<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Changed call from (nonexistent method) this.functionName<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to Debug.functionName().<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;sc/SWF9External.java<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Use LFC9-debug.swc when appropriate<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Tests:<br></blockquote><blockquote type="cite"> &nbsp;0) Regression:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smokecheck (swf8,dhtml)<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weather (swf8,dhtml,swf9,swf9) &nbsp;also swf9 with debug=true<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWF9 hello (with and without &amp;debug=true)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;1) Small test xx.lzx illustrates lzc and debug option (-g), with fdb. &nbsp;Note the<br></blockquote><blockquote type="cite"> &nbsp;use of -debug=true flag in the external compiler output and the use of LFC9-debug.swc.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;dda@lester$ lzc --runtime=swf9 xx.lzx<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Compiling: xx.lzx to xx.lzr=swf9.swf<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Executing compiler: (cd /tmp/lzswf9/lzgen25931; /Users/clients/laszlo/src/svn/openlaszlo/trunk-a/WEB-INF/bin/mxmlc -compiler.show-actionscript-warnings=false -compiler.source-path+=/tmp/lzswf9/lzgen25931 -output /tmp/lzswf9/lzgen25931/app.swf -default-size 500 400 -library-path+=/Users/clients/laszlo/src/svn/openlaszlo/trunk-a/lps/includes/lfc/LFC9.swc /tmp/lzswf9/lzgen25931/LzApplication.as)<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;compiler output:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Loading configuration file /Users/clients/laszlo/src/svn/openlaszlo/trunk-a/WEB-INF/frameworks/flex-config.xml<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;/tmp/lzswf9/lzgen25931/app.swf (93937 bytes)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Done executing compiler<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;dda@lester$ lzc -g --runtime=swf9 xx.lzx<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Compiling: xx.lzx to xx.lzr=swf9.swf<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Executing compiler: (cd /tmp/lzswf9/lzgen16082; /Users/clients/laszlo/src/svn/openlaszlo/trunk-a/WEB-INF/bin/mxmlc -compiler.show-actionscript-warnings=false -compiler.source-path+=/tmp/lzswf9/lzgen16082 -debug=true -output /tmp/lzswf9/lzgen16082/app.swf -default-size 500 400 -library-path+=/Users/clients/laszlo/src/svn/openlaszlo/trunk-a/lps/includes/lfc/LFC9-debug.swc /tmp/lzswf9/lzgen16082/LzApplication.as)<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;compiler output:<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Loading configuration file /Users/clients/laszlo/src/svn/openlaszlo/trunk-a/WEB-INF/frameworks/flex-config.xml<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;/tmp/lzswf9/lzgen16082/app.swf (157592 bytes)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Done executing compiler<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;dda@lester$ fdb /tmp/lzswf9/lzgen25931/app.swf<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Adobe fdb (Flash Player Debugger) [build 3.0.0.477]<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Copyright (c) 2004-2007 Adobe, Inc. All rights reserved.<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Attempting to launch and connect to Player using URL<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;/tmp/lzswf9/lzgen25931/app.swf<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;(DEBUGGER HANGS while program runs)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;&nbsp;dda@lester$ fdb /tmp/lzswf9/lzgen16082/app.swf<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Adobe fdb (Flash Player Debugger) [build 3.0.0.477]<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Copyright (c) 2004-2007 Adobe, Inc. All rights reserved.<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Attempting to launch and connect to Player using URL<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;/tmp/lzswf9/lzgen16082/app.swf<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Player connected; session starting.<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Set breakpoints and then type 'continue' to resume the session.<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;[SWF] private:tmp:lzswf9:lzgen16082:app.swf - 311,941 bytes after decompression<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;(fdb) break LzNode:construct<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Breakpoint 1 at 0x24016: file LzNode.as, line 284<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;(fdb) c<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;Breakpoint 1, LzNode.as:284<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;284 &nbsp;&nbsp;}}}}}}function construct ($1_parent, $2_args) {<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;(fdb) n<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;286 &nbsp;&nbsp;this.__LZdelayedSetters = LzNode.__LZdelayedSetters;<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;(fdb) p this<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;$1 = [Object 27603121, class='LzModeManagerService']<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;(fdb) p *this<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;$2 = this = [Object 27603121, class='LzModeManagerService']<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;$cfn = 0 (0x0)<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;$isstate = false<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;$lzc$bind_id = null<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;$lzc$bind_name = null<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;....<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;2) Verified that &lt;canvas debug="true"> also compiles the same way.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"> &nbsp;3) In the browser, verified that hello.lzx with &amp;debug=true uses the debug LFC<br></blockquote><blockquote type="cite"> &nbsp;&nbsp;&nbsp;&nbsp;by doing 'ls -lu' on lps/includes/lfc, showing the time of access.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Files:<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/lfc/debugger/LzMemory.lzs<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/lfc/build.xml<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/lfc/events/LaszloEvents.lzs<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/lfc/data/LzDataElement.lzs<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/lfc/compiler/LzFormatter.lzs<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/server/src/org/openlaszlo/sc/SWF9External.java<br></blockquote><blockquote type="cite">M &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Changeset: <a href="http://svn.openlaszlo.org/openlaszlo/patches/20080721-dda-7.tar"></a><a href="http://svn.openlaszlo.org/openlaszlo/patches/20080721-dda-7.tar">http://svn.openlaszlo.org/openlaszlo/patches/20080721-dda-7.tar</a><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">--<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Don Anderson<br></blockquote><blockquote type="cite">Java/C/C++, Berkeley DB, systems consultant<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">voice: 617-547-7881<br></blockquote><blockquote type="cite">email: <a href="mailto:dda@ddanderson.com"></a><a href="mailto:dda@ddanderson.com">dda@ddanderson.com</a><br></blockquote><blockquote type="cite">www: <a href="http://www.ddanderson.com"></a><a href="http://www.ddanderson.com">http://www.ddanderson.com</a><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><br></div></blockquote></div><br><div> <span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br class="Apple-interchange-newline">--</div><div><br>Don Anderson<br>Java/C/C++, Berkeley DB, systems consultant<br><br>voice: 617-547-7881<br>email:&nbsp;<a href="mailto:dda@ddanderson.com"></a><a href="mailto:dda@ddanderson.com">dda@ddanderson.com</a><br>www:&nbsp;<a href="http://www.ddanderson.com/"></a><a href="http://www.ddanderson.com">http://www.ddanderson.com</a><br></div></div></span></span><br class="Apple-interchange-newline"></div></span></div></span><br class="Apple-interchange-newline"> </div><br></div></div></blockquote></div></blockquote></div><br><div> <span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br class="Apple-interchange-newline">--</div><div><br>Don Anderson<br>Java/C/C++, Berkeley DB, systems consultant<br><br>voice: 617-547-7881<br>email:&nbsp;<a href="mailto:dda@ddanderson.com">dda@ddanderson.com</a><br>www:&nbsp;<a href="http://www.ddanderson.com/">http://www.ddanderson.com</a><br></div></div></span></span><br class="Apple-interchange-newline"></div></span></div></span><br class="Apple-interchange-newline"> </div><br></div></body></html>