<html>
  <head>
    <title>Results of Cluster Telemetry Tryserver Run</title>
    {% include "column_threshold_css.html" %}
  </head>

  <body>
    <h2>Results of Cluster Telemetry Tryserver Run</h2>
    Run requester: {{ requester_email }}
    <br/>
    Run description: {{ description }}
    <br/>
    This report was created on {{ html_report_date }}
    <br/>
    <br/>
    The run was done on {{ target_platform }} slaves using the {{ pageset_type }} page set
    <br/>
    The run was done using Chromium commit hash <a href='https://chromium.googlesource.com/chromium/src/+show/{{ chromium_hash }}'>{{ chromium_hash|slice:":7" }}</a> and Skia commit hash <a href='https://skia.googlesource.com/skia/+show/{{ skia_hash }}'>{{ skia_hash|slice:":7" }}</a>
    <br/>
    The specified patch(es) are: <a href='{{ chromium_patch_link }}'>Chromium</a>/<a href='{{ skia_patch_link }}'>Skia</a> (if no patch is specified the page will be empty)
    <br/>
    Browser arguments for the nopatch run: "{{ browser_args_nopatch }}"
    <br/>
    Browser arguments for the withpatch run: "{{ browser_args_withpatch }}"
    <br/>
    <br/>
    The raw CSVs used to create the below tables are here: <a href='{{ raw_csv_nopatch }}'>nopatch</a>/<a href='{{ raw_csv_withpatch }}'>withpatch</a>
    <br/>
    Read <a href="https://docs.google.com/a/chromium.org/document/d/1GhqosQcwsy6F-eBAmFn_ITDF7_Iv_rY9FhCKwAnk9qQ/edit?pli=1#heading=h.lgvqzgu7bc4d">this</a> for an explanation of CT's accuracy of results.
    <br/>
    {% if crashed_instances %}
      <br/><b>Note:</b> The following slaves are down and their results are missing from the report: <b>{{ crashed_instances }}</b><br/>
    {% endif %}
    {% if missing_devices %}
      <br/><b>Note:</b> Android devices in the following slaves are down and their results are missing from the report: <b>{{ missing_devices }}</b><br/>
    {% endif %}
    {% if missing_output_slaves %}
      <br/><b>Note:</b> The following slaves failed to report their results:
          {% for missing_output_slave in missing_output_slaves %}
            <a href="{{ logs_link_prefix }}{{ missing_output_slave }}">task{{ missing_output_slave }}</a>
          {% endfor %}
      <br/>
    {% endif %}
    <br/>
    Each pageset was repeated: {{ num_repeated }} time{% if num_repeated > 1 %}s{% endif %}
    <br/>
    Percentage difference threshold used: {{ threshold }}%
    <br/>
    Outliers discarded from top and bottom: {{ discard_outliers }}%
    <br/>
    Fieldnames displayed only if they were outputted by minimum {{ min_webpages }} webpages.
    <br/><br/>
    Click on a fieldname to see the webpages breakdown.
    <br/><br/><br/>

    {% if sorted_fieldnames_totals_items %}
    <table border="1" cellpadding="5">
      <tr bgcolor="#CCCCFF">
        <th>Fieldname</th>
        <th>#Webpages</th>
        <th>Total</th>
        <th>Total with Patch</th>
        <th>Percentage Change</th>
        <th>Percentage Difference</th>
      </tr>
      {% for fieldname, fieldname_values in sorted_fieldnames_totals_items %}
        <tr>
          <td><a href='{{ absolute_url }}fieldname{{ forloop.counter }}.html'>{{ fieldname }}</a></td>
          <td>{{ fieldname_values.total_webpages_reported }}</td>
          <td>{{ fieldname_values.value1|floatformat:"-3" }}</td>
          <td>{{ fieldname_values.value2|floatformat:"-3" }}</td>
          <td {% if fieldname_values.perc_diff <= 0 %}class="belowthreshold"{% else %}class="abovethreshold"{% endif %} >{{ fieldname_values.perc_change|floatformat:"-3" }}%</td>
          <td {% if fieldname_values.perc_diff <= 0 %}class="belowthreshold"{% else %}class="abovethreshold"{% endif %} >{{ fieldname_values.perc_diff|floatformat:"-3" }}%</td>
        </tr>
      {% endfor %}
    </table>
    {% else %}
      <h4>No results. It is very likely something went wrong with this run. Please contact rmistry@.</h4>
    {% endif %}
  </body>
</html>
