<!-- Copyright (C) 2011 Google Inc. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
    * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!DOCTYPE html>
<title>Test Runtimes</title>
<link rel='stylesheet' href='webtreemap.css'></link>
<style>
body {
    display: -moz-box;
    display: -webkit-box;
    display: box;
    -moz-box-orient: vertical;
    -webkit-box-orient: vertical;
    box-orient: vertical;

    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

td:first-child {
    text-align: left;
}

td {
    text-align: right;
}

#map {
    display: -moz-box;
    display: -webkit-box;
    display: box;

    -moz-box-flex: 1;
    -webkit-box-flex: 1;
    box-flex: 1;

    position: relative;
    cursor: pointer;
    -webkit-user-select: none;
    -moz-user-select: none;
}

.extra-dom {
    display: none;
    border: none;
    border-top: 1px dashed;
    padding: 4px;
    margin: 0;
    overflow: auto;
    cursor: auto;
    -webkit-user-select: text;
    -moz-user-select: text;
}

#focused-leaf {
    display: -webkit-box;
    display: -moz-box;
    -webkit-box-orient: vertical;
    -moz-box-orient: vertical;
}

#focused-leaf > .extra-dom {
    display: -webkit-box;
    display: -moz-box;
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
}

#focused-leaf.webtreemap-node:hover {
    background: white;
}

#focused-leaf .webtreemap-caption:hover {
    background: #eee;
}

.error {
    color: red;
    font-style: italic;
}
</style>
<script src="builders.js"></script>
<script src="loader.js"></script>
<script src="string.js"></script>
<script src="history.js"></script>
<script src="dashboard_base.js"></script>
<script src="ui.js"></script>
<script src="treemap.js"></script>
<script src="webtreemap.js"></script>

<div id='header-container'></div>
<p>Click on a box to zoom in. Click on the outermost box to zoom out. <a href="" onclick="showAverages();return false;">Show averages</a></p>
<div id='map'></div>
