Changeset 8026
- Timestamp:
- Dec 15, 2021, 8:39:09 AM (8 months ago)
- Location:
- trunk
- Files:
-
- 26 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/3.19-stable merged: 8014-8023 /tags/3.19.1 (added) merged: 8024
- Property svn:mergeinfo changed
-
trunk/credits.txt
r8013 r8026 1 1 $Id$ 2 2 3 The current BASE team is (at BASE 3.19 release)3 The current BASE team is (at BASE 3.19.1 release) 4 4 {{{ 5 5 Jari Häkkinen -
trunk/src/core/net/sf/basedb/core/File.java
r7889 r8026 55 55 import java.io.PipedInputStream; 56 56 import java.io.PipedOutputStream; 57 import java.net.SocketTimeoutException; 57 58 import java.net.URI; 58 59 import java.net.URISyntaxException; … … 1064 1065 if (cause instanceof InterruptedException || cause instanceof InterruptedIOException) 1065 1066 { 1066 Thread.currentThread().interrupt(); 1067 // Ignore timeouts 1068 if (!(cause instanceof SocketTimeoutException)) 1069 { 1070 Thread.currentThread().interrupt(); 1071 } 1067 1072 break; 1068 1073 } 1069 1074 cause = cause.getCause(); 1070 1075 } 1071 throw new BaseException("Could not load metadata for URL: " + data.getUrl(), ex);1076 throw new BaseException("Could not load metadata for URL: " + data.getUrl(), ex); 1072 1077 } 1073 1078 } -
trunk/src/core/net/sf/basedb/core/Project.java
r7605 r8026 124 124 return p; 125 125 } 126 127 /** 128 Get the currently active project if any. Return null 129 if no project is active. 130 @since 3.19.1 131 */ 132 public static Project getActive(DbControl dc) 133 { 134 int id = dc.getSessionControl().getActiveProjectId(); 135 return id == 0 ? null : getById(dc, id); 136 } 126 137 127 138 /** -
trunk/src/core/net/sf/basedb/core/Update.java
r7947 r8026 2360 2360 org.hibernate.query.Query<Long> countQuery = HibernateUtil.createQuery(session, countSql, Long.class); 2361 2361 long numItems = HibernateUtil.loadData(countQuery); 2362 int delta = (int)numItems / 50;2362 int delta = Math.max(50, (int)numItems / 50); 2363 2363 2364 2364 // Load all ChangeHistory entries … … 2400 2400 2401 2401 count++; 2402 if (progress != null && count % delta == 0) progress.append(".");2402 if (progress != null && delta > 0 && count % delta == 0) progress.append("."); 2403 2403 } 2404 2404 -
trunk/src/core/net/sf/basedb/util/excel/XlsxToCsvUtil.java
r7995 r8026 531 531 else if (cellType == CellType.ERROR) 532 532 { 533 value = "#ERR#";533 value = FormulaError.forInt(cell.getErrorCellValue()).getString()+"#"; 534 534 } 535 535 if (value == null) … … 602 602 { 603 603 ct.cellType = formulaEval.evaluateFormulaCell(cell); 604 if (ct.cellType == CellType.ERROR) ct.info = cell.getCellFormula(); 604 605 } 605 606 catch (NotImplementedException ex) … … 607 608 cell.setCellErrorValue(FormulaError.NAME.getCode()); 608 609 ct.cellType = CellType.ERROR; 610 ct.info = ex.getMessage(); 609 611 if (ex.getCause() instanceof NotImplementedFunctionException) 610 612 { -
trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/ExtractImporter.java
r7667 r8026 26 26 import java.util.Set; 27 27 28 import net.sf.basedb.core.BioMaterial;29 28 import net.sf.basedb.core.BioMaterialEvent; 30 29 import net.sf.basedb.core.BioMaterialEventSource; … … 37 36 import net.sf.basedb.core.ItemSubtype; 38 37 import net.sf.basedb.core.Kit; 38 import net.sf.basedb.core.MeasuredBioMaterial; 39 39 import net.sf.basedb.core.PluginParameter; 40 40 import net.sf.basedb.core.Protocol; … … 102 102 private Mapper parentTypeMapper; 103 103 private Mapper parentMapper; 104 private Mapper usedQuantityMapper;104 private UsedQuantityMapper usedQuantityMapper; 105 105 private Mapper bioPlateMapper; 106 106 private Mapper bioWellRowMapper; … … 195 195 parentTypeMapper = getMapper(ffp, (String)job.getValue("parentTypeColumnMapping"), null, null); 196 196 parentMapper = getMapper(ffp, (String)job.getValue("parentColumnMapping"), null, null); 197 usedQuantityMapper = getMapper(ffp, (String)job.getValue("usedQuantityColumnMapping"), null, null);197 usedQuantityMapper = UsedQuantityMapper.create(getMapper(ffp, (String)job.getValue("usedQuantityColumnMapping"), null, null)); 198 198 bioPlateMapper = getMapper(ffp, (String)job.getValue("bioPlateColumnMapping"), null, null); 199 199 bioWellRowMapper = getMapper(ffp, (String)job.getValue("bioWellRowColumnMapping"), null, null); … … 287 287 // Try to find either a sample or a biosource 288 288 String nameOrId = parentMapper.getString(data); 289 BioMaterial parent = null;289 MeasuredBioMaterial parent = null; 290 290 if (parentType == Item.EXTRACT) 291 291 { … … 301 301 if (evtSrc != null) 302 302 { 303 Float usedQuantity = usedQuantityMapper == null ? null : usedQuantityMapper.get Float(data);303 Float usedQuantity = usedQuantityMapper == null ? null : usedQuantityMapper.getUsedQuantity(data, evtSrc); 304 304 evtSrc.setUsedQuantity(usedQuantity); 305 305 } … … 322 322 if (parent != null) 323 323 { 324 BioMaterialEventSource evtSrc = extract.getCreationEvent().addSource(parent); 324 325 Float usedQuantity = usedQuantityMapper == null ? 325 null : usedQuantityMapper.get Float(data);326 e xtract.getCreationEvent().addSource(parent).setUsedQuantity(usedQuantity);326 null : usedQuantityMapper.getUsedQuantity(data, evtSrc); 327 evtSrc.setUsedQuantity(usedQuantity); 327 328 // Use same tag as parent if not yet set and not mapped in the file 328 329 if (tagMapper == null && parent.getTag() != null && extract.getTag() == null) -
trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/FileImporter.java
r7849 r8026 268 268 if (mimeTypeMapper != null) file.setMimeType(mimeTypeMapper.getString(data)); 269 269 if (file.getMimeType() == null) file.setMimeTypeAuto(null, null); 270 if (characterSetMapper != null) file.set MimeType(characterSetMapper.getString(data));270 if (characterSetMapper != null) file.setCharacterSet(characterSetMapper.getString(data)); 271 271 if (descriptionMapper != null) file.setDescription(descriptionMapper.getString(data)); 272 272 updateItemSubtype(dc, file, data); -
trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/PhysicalBioAssayImporter.java
r7667 r8026 148 148 private Mapper kitMapper; 149 149 private Mapper parentMapper; 150 private Mapper usedQuantityMapper;150 private UsedQuantityMapper usedQuantityMapper; 151 151 private Mapper extractPositionMapper; 152 152 private Mapper arraySlideMapper; … … 241 241 hardwareMapper = getMapper(ffp, (String)job.getValue("hardwareColumnMapping"), null, null, defaultHardwareFunction); 242 242 parentMapper = getMapper(ffp, (String)job.getValue("parentColumnMapping"), null, null); 243 usedQuantityMapper = getMapper(ffp, (String)job.getValue("usedQuantityColumnMapping"), null, null);243 usedQuantityMapper = UsedQuantityMapper.create(getMapper(ffp, (String)job.getValue("usedQuantityColumnMapping"), null, null)); 244 244 extractPositionMapper = getMapper(ffp, (String)job.getValue("extractPositionColumnMapping"), null, null); 245 245 arraySlideMapper = getMapper(ffp, (String)job.getValue("arraySlideColumnMapping"), null, null); … … 349 349 if (usedQuantityMapper != null) 350 350 { 351 eventSource.setUsedQuantity(usedQuantityMapper.get Float(data));351 eventSource.setUsedQuantity(usedQuantityMapper.getUsedQuantity(data, eventSource)); 352 352 } 353 353 if (extractPositionMapper != null) -
trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/SampleImporter.java
r7667 r8026 36 36 import net.sf.basedb.core.ItemSubtype; 37 37 import net.sf.basedb.core.Kit; 38 import net.sf.basedb.core.MeasuredBioMaterial; 38 39 import net.sf.basedb.core.PluginParameter; 39 40 import net.sf.basedb.core.Protocol; … … 120 121 "Used quantity from parent", 121 122 "Mapping that picks the used quantity (µg) of the parent item in the data columns. The " + 122 "values must be in the numeric format specified by the 'Number format' parameter." + 123 "values must be in the numeric format specified by the 'Number format' parameter or 'ALL' to "+ 124 "as a special case to use all remaining quantity from the parent." + 123 125 "Example: \\Used quantity\\", 124 126 optionalColumnMapping … … 201 203 private Mapper parentTypeMapper; 202 204 private Mapper parentMapper; 203 private Mapper usedQuantityMapper;205 private UsedQuantityMapper usedQuantityMapper; 204 206 private Mapper bioPlateMapper; 205 207 private Mapper bioWellRowMapper; … … 292 294 parentTypeMapper = getMapper(ffp, (String)job.getValue("parentTypeColumnMapping"), null, null); 293 295 parentMapper = getMapper(ffp, (String)job.getValue("parentColumnMapping"), null, null); 294 usedQuantityMapper = getMapper(ffp, (String)job.getValue("usedQuantityColumnMapping"), null, null);296 usedQuantityMapper = UsedQuantityMapper.create(getMapper(ffp, (String)job.getValue("usedQuantityColumnMapping"), null, null)); 295 297 bioPlateMapper = getMapper(ffp, (String)job.getValue("bioPlateColumnMapping"), null, null); 296 298 bioWellRowMapper = getMapper(ffp, (String)job.getValue("bioWellRowColumnMapping"), null, null); … … 386 388 { 387 389 BioMaterialEventSource evtSrc = sample.getCreationEvent().setSource(parent); 388 if (evtSrc != null )390 if (evtSrc != null && parent instanceof MeasuredBioMaterial) 389 391 { 390 Float usedQuantity = usedQuantityMapper == null ? null : usedQuantityMapper.get Float(data);392 Float usedQuantity = usedQuantityMapper == null ? null : usedQuantityMapper.getUsedQuantity(data, evtSrc); 391 393 evtSrc.setUsedQuantity(usedQuantity); 392 394 } … … 410 412 if (parent != null) 411 413 { 414 BioMaterialEventSource evtSrc = sample.getCreationEvent().addSource(parent); 412 415 Float usedQuantity = usedQuantityMapper == null ? 413 null : usedQuantityMapper.get Float(data);414 sample.getCreationEvent().addSource(parent).setUsedQuantity(usedQuantity);416 null : usedQuantityMapper.getUsedQuantity(data, evtSrc); 417 evtSrc.setUsedQuantity(usedQuantity); 415 418 } 416 419 } -
trunk/www/admin/hardware/list_hardware.jsp
r7982 r8026 29 29 import="net.sf.basedb.core.Item" 30 30 import="net.sf.basedb.core.Hardware" 31 import="net.sf.basedb.core.Project" 31 32 import="net.sf.basedb.core.ItemSubtype" 32 33 import="net.sf.basedb.core.Annotation" … … 116 117 cc.setMessage(t.getMessage()); 117 118 } 119 Project activeProject = Project.getActive(dc); 118 120 int numListed = 0; 119 121 ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext); … … 450 452 </div> 451 453 <div class="icons"> 454 <base:icon 455 image="star.png" 456 tooltip="This is a default item for the current project" 457 visible="<%=activeProject != null && activeProject.isDefaultItem(item)%>" 458 /> 452 459 <base:icon 453 460 image="deleted.png" -
trunk/www/admin/hardware/view_hardware.jsp
r7954 r8026 83 83 String title = null; 84 84 Hardware hardware = Hardware.getById(dc, itemId); 85 Project activeProject = Project.getActive(dc); 85 86 86 87 final boolean writePermission = hardware.hasPermission(Permission.WRITE); … … 116 117 <tr> 117 118 <th class="itemstatus"> 119 <base:icon 120 image="star.png" 121 tooltip="This is a default item for the current project" 122 visible="<%=activeProject != null && activeProject.isDefaultItem(hardware)%>" 123 /> 118 124 <base:icon 119 125 image="shared.png" -
trunk/www/admin/platforms/list_platforms.jsp
r7982 r8026 29 29 import="net.sf.basedb.core.Platform" 30 30 import="net.sf.basedb.core.PlatformVariant" 31 import="net.sf.basedb.core.Project" 31 32 import="net.sf.basedb.core.RawDataType" 32 33 import="net.sf.basedb.core.ItemQuery" … … 104 105 cc.setMessage(t.getMessage()); 105 106 } 107 Project activeProject = Project.getActive(dc); 106 108 int numListed = 0; 107 109 ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext); … … 384 386 </div> 385 387 <div class="icons"> 388 <base:icon 389 image="star.png" 390 tooltip="This is a default item for the current project" 391 visible="<%=activeProject != null && activeProject.isDefaultItem(item)%>" 392 /> 386 393 <base:icon 387 394 image="deleted.png" -
trunk/www/admin/platforms/variants/list_variants.jsp
r7982 r8026 31 31 import="net.sf.basedb.core.Platform" 32 32 import="net.sf.basedb.core.PlatformVariant" 33 import="net.sf.basedb.core.Project" 33 34 import="net.sf.basedb.core.RawDataType" 34 35 import="net.sf.basedb.core.ItemQuery" … … 97 98 cc.setMessage(t.getMessage()); 98 99 } 100 Project activeProject = Project.getActive(dc); 99 101 int numListed = 0; 100 102 ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext); … … 407 409 </div> 408 410 <div class="icons"> 411 <base:icon 412 image="star.png" 413 tooltip="This is a default item for the current project" 414 visible="<%=activeProject != null && activeProject.isDefaultItem(item)%>" 415 /> 409 416 <base:icon 410 417 image="deleted.png" -
trunk/www/admin/platforms/variants/view_variant.jsp
r7954 r8026 35 35 import="net.sf.basedb.core.PlatformFileType" 36 36 import="net.sf.basedb.core.DataFileType" 37 import="net.sf.basedb.core.Project" 37 38 import="net.sf.basedb.core.RawDataType" 38 39 import="net.sf.basedb.core.PermissionDeniedException" … … 82 83 final PlatformVariant variant = PlatformVariant.getById(dc, itemId); 83 84 final Platform platform = variant.getPlatform(); 85 Project activeProject = Project.getActive(dc); 84 86 final int platformId = platform.getId(); 85 87 … … 116 118 <tr> 117 119 <th class="itemstatus"> 120 <base:icon 121 image="star.png" 122 tooltip="This is a default item for the current project" 123 visible="<%=activeProject != null && activeProject.isDefaultItem(variant)%>" 124 /> 118 125 <base:icon 119 126 id="btnDeletePermanently" -
trunk/www/admin/platforms/view_platform.jsp
r7954 r8026 36 36 import="net.sf.basedb.core.DataFileType" 37 37 import="net.sf.basedb.core.RawDataType" 38 import="net.sf.basedb.core.Project" 38 39 import="net.sf.basedb.core.ItemQuery" 39 40 import="net.sf.basedb.core.ItemResultList" … … 82 83 String title = null; 83 84 Platform platform = Platform.getById(dc, itemId); 85 Project activeProject = Project.getActive(dc); 84 86 85 87 final boolean writePermission = platform.hasPermission(Permission.WRITE); … … 112 114 <tr> 113 115 <th class="itemstatus"> 116 <base:icon 117 image="star.png" 118 tooltip="This is a default item for the current project" 119 visible="<%=activeProject != null && activeProject.isDefaultItem(platform)%>" 120 /> 114 121 <base:icon 115 122 id="btnDeletePermanently" -
trunk/www/admin/protocols/list_protocol.jsp
r7982 r8026 30 30 import="net.sf.basedb.core.Protocol" 31 31 import="net.sf.basedb.core.ItemSubtype" 32 import="net.sf.basedb.core.Project" 32 33 import="net.sf.basedb.core.Annotation" 33 34 import="net.sf.basedb.core.AnnotationType" … … 116 117 cc.setMessage(t.getMessage()); 117 118 } 119 Project activeProject = Project.getActive(dc); 118 120 int numListed = 0; 119 121 ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext); … … 459 461 </div> 460 462 <div class="icons"> 463 <base:icon 464 image="star.png" 465 tooltip="This is a default item for the current project" 466 visible="<%=activeProject != null && activeProject.isDefaultItem(item)%>" 467 /> 461 468 <base:icon 462 469 image="deleted.png" -
trunk/www/admin/protocols/view_protocol.jsp
r7954 r8026 89 89 String title = null; 90 90 Protocol protocol = Protocol.getById(dc, itemId); 91 Project activeProject = Project.getActive(dc); 91 92 92 93 final boolean writePermission = protocol.hasPermission(Permission.WRITE); … … 122 123 <tr> 123 124 <th class="itemstatus"> 125 <base:icon 126 image="star.png" 127 tooltip="This is a default item for the current project" 128 visible="<%=activeProject != null && activeProject.isDefaultItem(protocol)%>" 129 /> 124 130 <base:icon 125 131 image="shared.png" -
trunk/www/admin/software/list_software.jsp
r7982 r8026 29 29 import="net.sf.basedb.core.Item" 30 30 import="net.sf.basedb.core.Software" 31 import="net.sf.basedb.core.Project" 31 32 import="net.sf.basedb.core.ItemSubtype" 32 33 import="net.sf.basedb.core.Annotation" … … 116 117 cc.setMessage(t.getMessage()); 117 118 } 119 Project activeProject = Project.getActive(dc); 118 120 int numListed = 0; 119 121 ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext); … … 450 452 </div> 451 453 <div class="icons"> 454 <base:icon 455 image="star.png" 456 tooltip="This is a default item for the current project" 457 visible="<%=activeProject != null && activeProject.isDefaultItem(item)%>" 458 /> 452 459 <base:icon 453 460 image="deleted.png" -
trunk/www/admin/software/view_software.jsp
r7954 r8026 83 83 String title = null; 84 84 Software software = Software.getById(dc, itemId); 85 Project activeProject = Project.getActive(dc); 85 86 86 87 final boolean writePermission = software.hasPermission(Permission.WRITE); … … 117 118 <tr> 118 119 <th class="itemstatus"> 120 <base:icon 121 image="star.png" 122 tooltip="This is a default item for the current project" 123 visible="<%=activeProject != null && activeProject.isDefaultItem(software)%>" 124 /> 119 125 <base:icon 120 126 image="shared.png" -
trunk/www/include/styles/table.css
r7955 r8026 275 275 { 276 276 display: inline-block; 277 max-width: calc(100% - 1 2px);277 max-width: calc(100% - 16px); 278 278 overflow: hidden; 279 279 } … … 287 287 color: #666666; 288 288 } 289 290 /* This will make room for the '›' without causing the header to wrap */ 291 .itemlist div.data th.linkeditemcol > span 292 { 293 display: inline-block; 294 max-width: calc(100% - 16px); 295 overflow: hidden; 296 } 297 289 298 290 299 /* Place property filters */ -
trunk/www/lims/arraydesigns/list_designs.jsp
r7982 r8026 33 33 import="net.sf.basedb.core.PlatformVariant" 34 34 import="net.sf.basedb.core.File" 35 import="net.sf.basedb.core.Project" 35 36 import="net.sf.basedb.core.AnnotationType" 36 37 import="net.sf.basedb.core.AnnotationSet" … … 163 164 t.printStackTrace(); 164 165 } 166 Project activeProject = Project.getActive(dc); 165 167 int numListed = 0; 166 168 Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc); … … 618 620 </div> 619 621 <div class="icons"> 622 <base:icon 623 image="star.png" 624 tooltip="This is a default item for the current project" 625 visible="<%=activeProject != null && activeProject.isDefaultItem(item)%>" 626 /> 620 627 <base:icon 621 628 image="deleted.png" -
trunk/www/lims/arraydesigns/view_design.jsp
r7954 r8026 100 100 String title = null; 101 101 ArrayDesign design = ArrayDesign.getById(dc, itemId); 102 Project activeProject = Project.getActive(dc); 102 103 Job job = null; 103 104 boolean readJob = true; … … 146 147 <tr> 147 148 <th class="itemstatus"> 149 <base:icon 150 image="star.png" 151 tooltip="This is a default item for the current project" 152 visible="<%=activeProject != null && activeProject.isDefaultItem(design)%>" 153 /> 148 154 <base:icon 149 155 image="shared.png" -
trunk/www/plugins/net/sf/basedb/clients/web/plugins/simple_export.jsp
r7645 r8026 138 138 <tr class="big"> 139 139 <th> 140 Which columns?<br> 140 Which columns? 141 </th> 142 <td> 143 <table style="width: 100%;"> 144 <tr> 145 <td></td> 146 <td colspan="3"> 141 147 <select name="presets" id="presets"> 142 <option >148 <option value="">-presets- 143 149 <option value="all" title="Export all columns">All 144 150 <option value="_current_" title="Export the currently visible columns" selected>Current … … 164 170 %> 165 171 </select> 166 </th> 167 <td> 168 <table style="width: 100%;"> 172 </td> 173 </tr> 169 174 <tr> 170 <td >175 <td style="padding: 2px;"> 171 176 <base:buttongroup vertical="true"> 172 177 <base:button … … 184 189 </base:buttongroup> 185 190 </td> 186 <td style="width: 50%;">191 <td style="width: 45%;"> 187 192 <b>Exported columns</b><br> 188 <select name="exported" id="exported" multiple size=10 style="width: 100%;"193 <select name="exported" id="exported" multiple size=10 style="width: calc(100% - 10px);" 189 194 data-to="not_exported" 190 195 </select> 191 196 </td> 192 <td style="padding -left: 2px;">197 <td style="padding: 2px;"> 193 198 <base:buttongroup vertical="true"> 194 199 <base:button … … 208 213 </base:buttongroup> 209 214 </td> 210 <td style="width: 50%; padding-right: 0.5em;">215 <td style="width: 45%; padding-right: 4px;"> 211 216 <b>Not exported</b><br> 212 <select name="not_exported" id="not_exported" multiple size=10 style="width: 100%;"217 <select name="not_exported" id="not_exported" multiple size=10 style="width: calc(100% - 10px);" 213 218 data-to="exported" 214 219 </select> -
trunk/www/views/derivedbioassays/view_bioassay.jsp
r7954 r8026 285 285 </tr> 286 286 </table> 287 <table style="width: 100%; height: 16em;" class="bottomborder">287 <table style="width: 100%; height: 20em;" class="bottomborder"> 288 288 <tr> 289 289 <td style="width: 50%; height: 100%;"> 290 <div style="height: 20em; overflow: auto;"> 290 291 <table class="fullform" > 291 292 <tr> … … 330 331 </tr> 331 332 </table> 333 </div> 332 334 </td> 333 335 <td style="width: 50%; height: 100%;" class="leftborder"> 336 <div style="height: 20em; overflow: auto;"> 334 337 <table class="fullform"> 335 338 <tr> … … 454 457 </tr> 455 458 </table> 456 459 </div> 457 460 </td> 458 461 </tr> -
trunk/www/views/rawbioassays/view_rawbioassay.jsp
r7954 r8026 285 285 <tr> 286 286 <td style="width: 50%; height: 100%;"> 287 <div style="height: 20em; overflow: auto;"> 287 288 <table class="fullform" > 288 289 <tr> … … 340 341 </tr> 341 342 </table> 343 </div> 342 344 </td> 343 345 <td style="width: 50%; height: 100%;" class="leftborder"> 346 <div style="height: 20em; overflow: auto;"> 344 347 <table class="fullform"> 345 348 <tr> … … 464 467 </tr> 465 468 </table> 469 </div> 466 470 </td> 467 471 </tr>
Note: See TracChangeset
for help on using the changeset viewer.