Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: tools/callstats.html

Issue 2368393005: [tools] Fix callstats.html's first select behavior (Closed)
Patch Set: support selecting groups Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <html> 1 <html>
2 <!-- 2 <!--
3 Copyright 2016 the V8 project authors. All rights reserved. Use of this source 3 Copyright 2016 the V8 project authors. All rights reserved. Use of this source
4 code is governed by a BSD-style license that can be found in the LICENSE file. 4 code is governed by a BSD-style license that can be found in the LICENSE file.
5 --> 5 -->
6 6
7 <head> 7 <head>
8 <meta charset="UTF-8"> 8 <meta charset="UTF-8">
9 <style> 9 <style>
10 body { 10 body {
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 } 242 }
243 } 243 }
244 244
245 var versions; 245 var versions;
246 var pages; 246 var pages;
247 var selectedPage; 247 var selectedPage;
248 var baselineVersion; 248 var baselineVersion;
249 var selectedEntry; 249 var selectedEntry;
250 250
251 function initialize() { 251 function initialize() {
252 // Initialize the stats table and toggle lists.
252 var original = $("column"); 253 var original = $("column");
253 var view = document.createElement('div'); 254 var view = document.createElement('div');
254 view.id = 'view'; 255 view.id = 'view';
255 var i = 0; 256 var i = 0;
256 versions.forEach((version) => { 257 versions.forEach((version) => {
257 if (!version.enabled) return; 258 if (!version.enabled) return;
258 // add column 259 // add column
259 var column = original.cloneNode(true); 260 var column = original.cloneNode(true);
260 column.id = "column_" + i; 261 column.id = "column_" + i;
261 // Fill in all versions 262 // Fill in all versions
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 removeAllChildren(select); 297 removeAllChildren(select);
297 select.appendChild(document.createElement('option')); 298 select.appendChild(document.createElement('option'));
298 versions.forEach((version) => { 299 versions.forEach((version) => {
299 var option = document.createElement("option"); 300 var option = document.createElement("option");
300 option.textContent = version.name; 301 option.textContent = version.name;
301 option.version = version; 302 option.version = version;
302 select.appendChild(option); 303 select.appendChild(option);
303 }); 304 });
304 initializeToggleList(versions.versions, $('versionSelector')); 305 initializeToggleList(versions.versions, $('versionSelector'));
305 initializeToggleList(pages.values(), $('pageSelector')); 306 initializeToggleList(pages.values(), $('pageSelector'));
307 initializeToggleList(Group.groups.values(), $('groupSelector'));
306 initializeToggleContentVisibility(); 308 initializeToggleContentVisibility();
307 } 309 }
308 310
309 function initializeToggleList(items, node) { 311 function initializeToggleList(items, node) {
310 var list = node.querySelector('ul'); 312 var list = node.querySelector('ul');
311 removeAllChildren(list); 313 removeAllChildren(list);
312 items = Array.from(items); 314 items = Array.from(items);
313 items.sort(NameComparator); 315 items.sort(NameComparator);
314 items.forEach((item) => { 316 items.forEach((item) => {
315 var li = document.createElement('li'); 317 var li = document.createElement('li');
316 var checkbox = document.createElement('input'); 318 var checkbox = document.createElement('input');
317 checkbox.type = 'checkbox'; 319 checkbox.type = 'checkbox';
318 checkbox.checked = item.enabled; 320 checkbox.checked = item.enabled;
319 checkbox.item = item; 321 checkbox.item = item;
320 checkbox.addEventListener('click', handleToggleVersionEnable); 322 checkbox.addEventListener('click', handleToggleVersionOrPageEnable);
321 li.appendChild(checkbox); 323 li.appendChild(checkbox);
322 li.appendChild(document.createTextNode(item.name)); 324 li.appendChild(document.createTextNode(item.name));
323 list.appendChild(li); 325 list.appendChild(li);
324 }); 326 });
325 $('results').querySelectorAll('#results > .hidden').forEach((node) => { 327 $('results').querySelectorAll('#results > .hidden').forEach((node) => {
326 toggleCssClass(node, 'hidden', false); 328 toggleCssClass(node, 'hidden', false);
327 }) 329 })
328 } 330 }
329 331
330 function initializeToggleContentVisibility() { 332 function initializeToggleContentVisibility() {
(...skipping 22 matching lines...) Expand all
353 var pageVersions = versions.getPageVersions(firstPage); 355 var pageVersions = versions.getPageVersions(firstPage);
354 var index = 1; 356 var index = 1;
355 pageVersions.forEach((page) => { 357 pageVersions.forEach((page) => {
356 if (page !== firstPage) { 358 if (page !== firstPage) {
357 showPageInColumn(page, index); 359 showPageInColumn(page, index);
358 index++; 360 index++;
359 } 361 }
360 }); 362 });
361 if (changeSelectedEntry) { 363 if (changeSelectedEntry) {
362 showEntryDetail(selectedPage.getEntry(selectedEntry)); 364 showEntryDetail(selectedPage.getEntry(selectedEntry));
363 } else {
364 showImpactList(selectedPage);
365 } 365 }
366 showImpactList(selectedPage);
366 } 367 }
367 368
368 function showPageInColumn(page, columnIndex) { 369 function showPageInColumn(page, columnIndex) {
369 page.sort(); 370 page.sort();
370 var showDiff = (baselineVersion === undefined && columnIndex !== 0) || 371 var showDiff = (baselineVersion === undefined && columnIndex !== 0) ||
371 (baselineVersion !== undefined && page.version !== baselineVersion); 372 (baselineVersion !== undefined && page.version !== baselineVersion);
372 var diffStatus = (td, a, b) => {}; 373 var diffStatus = (td, a, b) => {};
373 if (showDiff) { 374 if (showDiff) {
374 if (baselineVersion !== undefined) { 375 if (baselineVersion !== undefined) {
375 diffStatus = (td, a, b) => { 376 diffStatus = (td, a, b) => {
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 656
656 function showGraphs(page) { 657 function showGraphs(page) {
657 var groups = page.groups.slice(); 658 var groups = page.groups.slice();
658 // Sort groups by the biggest impact 659 // Sort groups by the biggest impact
659 groups.sort((a, b) => { 660 groups.sort((a, b) => {
660 return b.getTimeImpact() - a.getTimeImpact(); 661 return b.getTimeImpact() - a.getTimeImpact();
661 }); 662 });
662 if (selectedGroup == undefined) { 663 if (selectedGroup == undefined) {
663 selectedGroup = groups[0]; 664 selectedGroup = groups[0];
664 } else { 665 } else {
665 groups = groups.filter(each => each.name != selectedGroup.name); 666 groups = groups.filter(each => each.enabled && each.name != selectedGrou p.name);
666 groups.unshift(selectedGroup); 667 groups.unshift(selectedGroup);
667 } 668 }
668 showPageGraph(groups, page); 669 showPageGraph(groups, page);
669 showVersionGraph(groups, page); 670 showVersionGraph(groups, page);
670 showPageVersionGraph(groups, page); 671 showPageVersionGraph(groups, page);
671 } 672 }
672 673
673 function getGraphDataTable(groups) { 674 function getGraphDataTable(groups) {
674 var dataTable = new google.visualization.DataTable(); 675 var dataTable = new google.visualization.DataTable();
675 dataTable.addColumn('string', 'Name'); 676 dataTable.addColumn('string', 'Name');
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 handleLoadText(this.result); 1031 handleLoadText(this.result);
1031 } 1032 }
1032 reader.readAsText(file); 1033 reader.readAsText(file);
1033 } 1034 }
1034 1035
1035 function handleLoadText(text) { 1036 function handleLoadText(text) {
1036 pages = new Pages(); 1037 pages = new Pages();
1037 versions = Versions.fromJSON(JSON.parse(text)); 1038 versions = Versions.fromJSON(JSON.parse(text));
1038 initialize() 1039 initialize()
1039 showPage(versions.versions[0].pages[0]); 1040 showPage(versions.versions[0].pages[0]);
1041 selectEntry(selectedPage.total);
1040 } 1042 }
1041 1043
1042 function handleToggleGroup(event) { 1044 function handleToggleGroup(event) {
1043 var group = event.target.parentNode.parentNode.entry; 1045 var group = event.target.parentNode.parentNode.entry;
1044 toggleGroup(selectedPage.get(group.name)); 1046 toggleGroup(selectedPage.get(group.name));
1045 } 1047 }
1046 1048
1047 function handleSelectPage(select, event) { 1049 function handleSelectPage(select, event) {
1048 var option = select.options[select.selectedIndex]; 1050 var option = select.options[select.selectedIndex];
1049 if (select.id == "select_0") { 1051 if (select.id == "select_0") {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1110 var popover = $('popover'); 1112 var popover = $('popover');
1111 popover.style.left = event.pageX + 'px'; 1113 popover.style.left = event.pageX + 'px';
1112 popover.style.top = event.pageY + 'px'; 1114 popover.style.top = event.pageY + 'px';
1113 popover.style.display = 'none'; 1115 popover.style.display = 'none';
1114 popover.style.display = event.shiftKey ? 'block' : 'none'; 1116 popover.style.display = event.shiftKey ? 'block' : 'none';
1115 var entry = findEntry(event); 1117 var entry = findEntry(event);
1116 if (entry === undefined) return; 1118 if (entry === undefined) return;
1117 showPopover(entry); 1119 showPopover(entry);
1118 } 1120 }
1119 1121
1120 function handleToggleVersionEnable(event) { 1122 function handleToggleVersionOrPageEnable(event) {
1121 var item = this.item ; 1123 var item = this.item ;
1122 if (item === undefined) return; 1124 if (item === undefined) return;
1123 item .enabled = this.checked; 1125 item .enabled = this.checked;
1124 initialize(); 1126 initialize();
1125 var page = selectedPage; 1127 var page = selectedPage;
1126 if (page === undefined || !page.version.enabled) { 1128 if (page === undefined || !page.version.enabled) {
1127 page = versions.getEnabledPage(page.name); 1129 page = versions.getEnabledPage(page.name);
1128 } 1130 }
1131 if (!page.enabled) {
1132 page = page.getNextPage();
1133 }
1129 showPage(page); 1134 showPage(page);
1130 } 1135 }
1131 1136
1132 function handleToggleContentVisibility(event) { 1137 function handleToggleContentVisibility(event) {
1133 var content = event.target.contentNode; 1138 var content = event.target.contentNode;
1134 toggleCssClass(content, 'hidden'); 1139 toggleCssClass(content, 'hidden');
1135 } 1140 }
1136 1141
1137 function handleCodeSearch(event) { 1142 function handleCodeSearch(event) {
1138 var entry = findEntry(event); 1143 var entry = findEntry(event);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 } 1208 }
1204 add(page) { 1209 add(page) {
1205 this.pages.push(page); 1210 this.pages.push(page);
1206 } 1211 }
1207 indexOf(name) { 1212 indexOf(name) {
1208 for (var i = 0; i < this.pages.length; i++) { 1213 for (var i = 0; i < this.pages.length; i++) {
1209 if (this.pages[i].name == name) return i; 1214 if (this.pages[i].name == name) return i;
1210 } 1215 }
1211 return -1; 1216 return -1;
1212 } 1217 }
1218 getNextPage(page) {
1219 if (this.length == 0) return undefined;
1220 return this.pages[(this.indexOf(page.name) + 1) % this.length];
1221 }
1213 get(name) { 1222 get(name) {
1214 var index = this.indexOf(name); 1223 var index = this.indexOf(name);
1215 if (0 <= index) return this.pages[index]; 1224 if (0 <= index) return this.pages[index];
1216 return undefined 1225 return undefined
1217 } 1226 }
1218 get length() { 1227 get length() {
1219 return this.versions.length 1228 return this.pages.length
1220 } 1229 }
1221 getEntry(entry) { 1230 getEntry(entry) {
1222 if (entry === undefined) return undefined; 1231 if (entry === undefined) return undefined;
1223 var page = this.get(entry.page.name); 1232 var page = this.get(entry.page.name);
1224 if (page === undefined) return undefined; 1233 if (page === undefined) return undefined;
1225 return page.get(entry.name); 1234 return page.get(entry.name);
1226 } 1235 }
1227 forEachEntry(fun) { 1236 forEachEntry(fun) {
1228 this.forEachPage((page) => { 1237 this.forEachPage((page) => {
1229 page.forEach(fun); 1238 page.forEach(fun);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 } 1337 }
1329 add(page) { 1338 add(page) {
1330 this.versions.push(page); 1339 this.versions.push(page);
1331 } 1340 }
1332 } 1341 }
1333 1342
1334 class PageVersion { 1343 class PageVersion {
1335 constructor(version, page) { 1344 constructor(version, page) {
1336 this.page = page; 1345 this.page = page;
1337 this.page.add(this); 1346 this.page.add(this);
1338 this.total = new GroupedEntry('Total', /.*Total.*/, '#BBB'); 1347 this.total = Group.groups.get('total').entry();
1339 this.total.isTotal = true; 1348 this.total.isTotal = true;
1340 this.unclassified = new UnclassifiedEntry(this, "#000") 1349 this.unclassified = new UnclassifiedEntry(this)
1341 this.groups = [ 1350 this.groups = [
1342 this.total, 1351 this.total,
1343 new GroupedEntry('IC', /.*IC.*/, "#3366CC"), 1352 Group.groups.get('ic').entry(),
1344 new GroupedEntry('Optimize', 1353 Group.groups.get('optimize').entry(),
1345 /StackGuard|.*Optimize.*|.*Deoptimize.*|Recompile.*/, "#DC3912"), 1354 Group.groups.get('compile').entry(),
1346 new GroupedEntry('Compile', /.*Compile.*/, "#FFAA00"), 1355 Group.groups.get('parse').entry(),
1347 new GroupedEntry('Parse', /.*Parse.*/, "#FF6600"), 1356 Group.groups.get('callback').entry(),
1348 new GroupedEntry('Callback', /.*Callback$/, "#109618"), 1357 Group.groups.get('api').entry(),
1349 new GroupedEntry('API', /.*API.*/, "#990099"), 1358 Group.groups.get('gc').entry(),
1350 new GroupedEntry('GC', /GC|AllocateInTargetSpace/, "#0099C6"), 1359 Group.groups.get('javascript').entry(),
1351 new GroupedEntry('JavaScript', /JS_Execution/, "#DD4477"), 1360 Group.groups.get('runtime').entry(),
1352 new GroupedEntry('Runtime', /.*/, "#88BB00"),
1353 this.unclassified 1361 this.unclassified
1354 ]; 1362 ];
1355 this.entryDict = new Map(); 1363 this.entryDict = new Map();
1356 this.groups.forEach((entry) => { 1364 this.groups.forEach((entry) => {
1357 entry.page = this; 1365 entry.page = this;
1358 this.entryDict.set(entry.name, entry); 1366 this.entryDict.set(entry.name, entry);
1359 }); 1367 });
1360 this.version = version; 1368 this.version = version;
1361 } 1369 }
1362 add(entry) { 1370 add(entry) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1413 distanceFromTotalPercent() { 1421 distanceFromTotalPercent() {
1414 var sum = 0; 1422 var sum = 0;
1415 this.groups.forEach(group => { 1423 this.groups.forEach(group => {
1416 if (group == this.total) return; 1424 if (group == this.total) return;
1417 var value = group.getTimePercentImpact() - 1425 var value = group.getTimePercentImpact() -
1418 this.getEntry(group).timePercent; 1426 this.getEntry(group).timePercent;
1419 sum += value * value; 1427 sum += value * value;
1420 }); 1428 });
1421 return sum; 1429 return sum;
1422 } 1430 }
1431 getNextPage() {
1432 return this.version.getNextPage(this);
1433 }
1423 } 1434 }
1424 PageVersion.fromJSON = function(version, name, data) { 1435 PageVersion.fromJSON = function(version, name, data) {
1425 var page = new PageVersion(version, pages.get(name)); 1436 var page = new PageVersion(version, pages.get(name));
1426 for (var i = 0; i < data.length; i++) { 1437 for (var i = 0; i < data.length; i++) {
1427 page.add(Entry.fromJSON(i, data[data.length - i - 1])); 1438 page.add(Entry.fromJSON(i, data[data.length - i - 1]));
1428 } 1439 }
1429 page.sort(); 1440 page.sort();
1430 return page 1441 return page
1431 } 1442 }
1432 1443
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1509 return this._timeVariance 1520 return this._timeVariance
1510 } 1521 }
1511 get timeVariancePercent() { 1522 get timeVariancePercent() {
1512 return this._timeVariancePercent 1523 return this._timeVariancePercent
1513 } 1524 }
1514 } 1525 }
1515 Entry.fromJSON = function(position, data) { 1526 Entry.fromJSON = function(position, data) {
1516 return new Entry(position, ...data); 1527 return new Entry(position, ...data);
1517 } 1528 }
1518 1529
1530 class Group {
1531 constructor(name, regexp, color) {
1532 this.name = name;
1533 this.regexp = regexp;
1534 this.color = color;
1535 this.enabled = true;
1536 }
1537 entry() { return new GroupedEntry(this) };
1538 }
1539 Group.groups = new Map();
1540 Group.add = function(name, group) {
1541 this.groups.set(name, group);
1542 }
1543 Group.add('total', new Group('Total', /.*Total.*/, '#BBB'));
1544 Group.add('ic', new Group('IC', /.*IC.*/, "#3366CC"));
1545 Group.add('optimize', new Group('Optimize',
1546 /StackGuard|.*Optimize.*|.*Deoptimize.*|Recompile.*/, "#DC3912"));
1547 Group.add('compile', new Group('Compile', /.*Compile.*/, "#FFAA00"));
1548 Group.add('parse', new Group('Parse', /.*Parse.*/, "#FF6600"));
1549 Group.add('callback', new Group('Callback', /.*Callback$/, "#109618"));
1550 Group.add('api', new Group('API', /.*API.*/, "#990099"));
1551 Group.add('gc', new Group('GC', /GC|AllocateInTargetSpace/, "#0099C6"));
1552 Group.add('javascript', new Group('JavaScript', /JS_Execution/, "#DD4477"));
1553 Group.add('runtime', new Group('Runtime', /.*/, "#88BB00"));
1554 Group.add('unclassified', new Group('Unclassified', /.*/, "#000"));
1519 1555
1520 class GroupedEntry extends Entry { 1556 class GroupedEntry extends Entry {
1521 constructor(name, regexp, color) { 1557 constructor(group) {
1522 super(0, 'Group-' + name, 0, 0, 0, 0, 0, 0); 1558 super(0, 'Group-' + group.name, 0, 0, 0, 0, 0, 0);
1523 this.regexp = regexp; 1559 this.group = group;
1524 this.color = color;
1525 this.entries = []; 1560 this.entries = [];
1526 } 1561 }
1562 get regexp() { return this.group.regexp }
1563 get color() { return this.group.color }
1564 get enabled() { return this.group.enabled }
1527 add(entry) { 1565 add(entry) {
1528 if (!this.regexp.test(entry.name)) return false; 1566 if (!this.regexp.test(entry.name)) return false;
1529 this._time += entry.time; 1567 this._time += entry.time;
1530 this._count += entry.count; 1568 this._count += entry.count;
1531 // TODO: sum up variance 1569 // TODO: sum up variance
1532 this.entries.push(entry); 1570 this.entries.push(entry);
1533 entry.parent = this; 1571 entry.parent = this;
1534 return true; 1572 return true;
1535 } 1573 }
1536 forEach(fun) { 1574 forEach(fun) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 get timeVariancePercent() { 1618 get timeVariancePercent() {
1581 if (this._time == 0) return 0; 1619 if (this._time == 0) return 0;
1582 return this.getVarianceForProperty('time') / this._time * 100 1620 return this.getVarianceForProperty('time') / this._time * 100
1583 } 1621 }
1584 get timeVariance() { 1622 get timeVariance() {
1585 return this.getVarianceForProperty('time') 1623 return this.getVarianceForProperty('time')
1586 } 1624 }
1587 } 1625 }
1588 1626
1589 class UnclassifiedEntry extends GroupedEntry { 1627 class UnclassifiedEntry extends GroupedEntry {
1590 constructor(page, color) { 1628 constructor(page) {
1591 super('Unclassified', undefined, color); 1629 super(Group.groups.get('unclassified'));
1592 this.page = page; 1630 this.page = page;
1593 this._time = undefined; 1631 this._time = undefined;
1594 this._count = undefined; 1632 this._count = undefined;
1595 } 1633 }
1596 add(entry) { 1634 add(entry) {
1597 this.entries.push(entry); 1635 this.entries.push(entry);
1598 entry.parent = this; 1636 entry.parent = this;
1599 return true; 1637 return true;
1600 } 1638 }
1601 forEachPageGroup(fun) { 1639 forEachPageGroup(fun) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 <div class="inline hidden"> 1681 <div class="inline hidden">
1644 <h2>Result</h2> 1682 <h2>Result</h2>
1645 <div class="compareSelector inline"> 1683 <div class="compareSelector inline">
1646 Compare against:&nbsp;<select id="baseline" onchange="handleSelectBaseli ne(this, event)"></select><br/> 1684 Compare against:&nbsp;<select id="baseline" onchange="handleSelectBaseli ne(this, event)"></select><br/>
1647 <span style="color: #060">Green</span> the selected version above perfor ms 1685 <span style="color: #060">Green</span> the selected version above perfor ms
1648 better on this measurement. 1686 better on this measurement.
1649 </div> 1687 </div>
1650 </div> 1688 </div>
1651 1689
1652 <div id="versionSelector" class="inline toggleContentVisibility"> 1690 <div id="versionSelector" class="inline toggleContentVisibility">
1653 <h2>Version Selector</h2> 1691 <h2>Versions</h2>
1654 <div class="content hidden"> 1692 <div class="content hidden">
1655 <ul></ul> 1693 <ul></ul>
1656 </div> 1694 </div>
1657 </div> 1695 </div>
1658 1696
1659 <div id="pageSelector" class="inline toggleContentVisibility"> 1697 <div id="pageSelector" class="inline toggleContentVisibility">
1660 <h2>Page Selector</h2> 1698 <h2>Pages</h2>
1661 <div class="content hidden"> 1699 <div class="content hidden">
1662 <ul></ul> 1700 <ul></ul>
1663 </div> 1701 </div>
1702 </div>
1703
1704 <div id="groupSelector" class="inline toggleContentVisibility">
1705 <h2>Groups</h2>
1706 <div class="content hidden">
1707 <ul></ul>
1708 </div>
1664 </div> 1709 </div>
1665 1710
1666 <div id="view"> 1711 <div id="view">
1667 </div> 1712 </div>
1668 1713
1669 <div id="detailView" class="hidden"> 1714 <div id="detailView" class="hidden">
1670 <div class="versionDetail inline toggleContentVisibility"> 1715 <div class="versionDetail inline toggleContentVisibility">
1671 <h3><span></span></h3> 1716 <h3><span></span></h3>
1672 <div class="content"> 1717 <div class="content">
1673 <table class="versionDetailTable" onclick="handleSelectDetailRow(this, event);"> 1718 <table class="versionDetailTable" onclick="handleSelectDetailRow(this, event);">
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1820 </tr> 1865 </tr>
1821 <tr> 1866 <tr>
1822 <td>Overall Impact:</td> 1867 <td>Overall Impact:</td>
1823 <td class="timeImpact"></td><td>±</td><td class="timePercentImpact"></td > 1868 <td class="timeImpact"></td><td>±</td><td class="timePercentImpact"></td >
1824 <td class="compare timeImpact"></td><td class="compare"> ± </td><td clas s="compare timePercentImpact"></td> 1869 <td class="compare timeImpact"></td><td class="compare"> ± </td><td clas s="compare timePercentImpact"></td>
1825 </tr> 1870 </tr>
1826 </table> 1871 </table>
1827 </div> 1872 </div>
1828 </body> 1873 </body>
1829 </html> 1874 </html>
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698