Bug 961365 - Part 6: Add tests for OpenType MATH constants. r=jfkthame
authorFrédéric Wang <fred.wang@free.fr>
Thu, 03 Jul 2014 07:56:00 -0400
changeset 192212 a6a15c2d53491cd76452ad614fb352e694790eda
parent 192211 7f3ca4925cb5e347a3105f978985709a6553bc05
child 192213 54252e1504396a29613ee3ca2ac2bffbc0c898d5
push id27077
push userryanvm@gmail.com
push dateThu, 03 Jul 2014 21:03:59 +0000
treeherdermozilla-central@06e9a27a6fcc [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjfkthame
bugs961365
milestone33.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 961365 - Part 6: Add tests for OpenType MATH constants. r=jfkthame
layout/mathml/tests/mochitest.ini
layout/mathml/tests/test_opentype-axis-height.html
layout/mathml/tests/test_opentype-fraction.html
layout/mathml/tests/test_opentype-limits.html
layout/mathml/tests/test_opentype-radical.html
layout/mathml/tests/test_opentype-scripts.html
layout/mathml/tests/test_opentype-stack.html
layout/moz.build
layout/reftests/fonts/math/README
layout/reftests/fonts/math/axis-height-1.otf
layout/reftests/fonts/math/axis-height-2.otf
layout/reftests/fonts/math/fraction-1.otf
layout/reftests/fonts/math/fraction-2.otf
layout/reftests/fonts/math/fraction-3.otf
layout/reftests/fonts/math/fraction-4.otf
layout/reftests/fonts/math/fraction-5.otf
layout/reftests/fonts/math/fraction-6.otf
layout/reftests/fonts/math/fraction-7.otf
layout/reftests/fonts/math/fraction-8.otf
layout/reftests/fonts/math/fraction-9.otf
layout/reftests/fonts/math/generate.py
layout/reftests/fonts/math/limits-1.otf
layout/reftests/fonts/math/limits-2.otf
layout/reftests/fonts/math/limits-3.otf
layout/reftests/fonts/math/limits-4.otf
layout/reftests/fonts/math/limits-5.otf
layout/reftests/fonts/math/mochitest.ini
layout/reftests/fonts/math/radical-1.otf
layout/reftests/fonts/math/radical-2.otf
layout/reftests/fonts/math/radical-3.otf
layout/reftests/fonts/math/radical-4.otf
layout/reftests/fonts/math/radical-5.otf
layout/reftests/fonts/math/radical-6.otf
layout/reftests/fonts/math/radical-7.otf
layout/reftests/fonts/math/scripts-1.otf
layout/reftests/fonts/math/scripts-2.otf
layout/reftests/fonts/math/scripts-3.otf
layout/reftests/fonts/math/scripts-4.otf
layout/reftests/fonts/math/scripts-5.otf
layout/reftests/fonts/math/scripts-6.otf
layout/reftests/fonts/math/scripts-7.otf
layout/reftests/fonts/math/scripts-8.otf
layout/reftests/fonts/math/stack-1.otf
layout/reftests/fonts/math/stack-2.otf
layout/reftests/fonts/math/stack-3.otf
layout/reftests/fonts/math/stack-4.otf
layout/reftests/fonts/math/stack-5.otf
layout/reftests/fonts/math/stack-6.otf
layout/reftests/mathml/opentype-fraction-dynamic-linethickness-ref.html
layout/reftests/mathml/opentype-fraction-dynamic-linethickness.html
layout/reftests/mathml/reftest.list
--- a/layout/mathml/tests/mochitest.ini
+++ b/layout/mathml/tests/mochitest.ini
@@ -1,8 +1,16 @@
 [DEFAULT]
 
 [test_bug330964.html]
 [test_bug553917.html]
 [test_bug706406.html]
 [test_bug827713-2.html]
 [test_bug827713.html]
 [test_bug975681.html]
+[test_opentype-axis-height.html]
+[test_opentype-fraction.html]
+[test_opentype-limits.html]
+skip-if = os == "win" # Fails on WinXP
+[test_opentype-radical.html]
+skip-if = os == "win" # Fails on WinXP
+[test_opentype-scripts.html]
+[test_opentype-stack.html]
new file mode 100644
--- /dev/null
+++ b/layout/mathml/tests/test_opentype-axis-height.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Open Type MATH - axis-height</title>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/SimpleTest.js"></script>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/EventUtils.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: axis-height-1;
+        src: url(/tests/fonts/math/axis-height-1.otf);
+      }
+      @font-face {
+        font-family: axis-height-2;
+        src: url(/tests/fonts/math/axis-height-2.otf);
+      }
+    </style>
+    <script type="application/javascript">
+      SimpleTest.waitForExplicitFinish();
+
+      var epsilon = 5;
+      function almostEqual(x, y) { return Math.abs(x - y) < epsilon; }
+
+      function getBox(aId) {
+        return document.getElementById(aId).getBoundingClientRect();
+      }
+
+      function doTest() {
+        ok(almostEqual(getBox("plus1").top - getBox("plus2").top, 10 * 20),
+           "Bad AxisHeight");
+
+        SimpleTest.finish();
+      }
+    </script>
+  </head>
+  <body onload="doTest()">
+    <a target="_blank"
+       href="https://bugzilla.mozilla.org/show_bug.cgi?id=961365">
+      Mozilla Bug 961365
+    </a>
+
+    <p id="display"></p>
+
+    <p>
+      <math style="font-family: axis-height-1;">
+        <mo id="plus1">+</mo>
+      </math>
+      <math style="font-family: axis-height-2;">
+        <mo id="plus2">+</mo>
+      </math>
+    </p>
+
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/mathml/tests/test_opentype-fraction.html
@@ -0,0 +1,187 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Open Type MATH - fraction</title>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/SimpleTest.js"></script>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/EventUtils.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: fraction-1;
+        src: url(/tests/fonts/math/fraction-1.otf);
+      }
+      @font-face {
+        font-family: fraction-2;
+        src: url(/tests/fonts/math/fraction-2.otf);
+      }
+      @font-face {
+        font-family: fraction-3;
+        src: url(/tests/fonts/math/fraction-3.otf);
+      }
+      @font-face {
+        font-family: fraction-4;
+        src: url(/tests/fonts/math/fraction-4.otf);
+      }
+      @font-face {
+        font-family: fraction-5;
+        src: url(/tests/fonts/math/fraction-5.otf);
+      }
+      @font-face {
+        font-family: fraction-6;
+        src: url(/tests/fonts/math/fraction-6.otf);
+      }
+      @font-face {
+        font-family: fraction-7;
+        src: url(/tests/fonts/math/fraction-7.otf);
+      }
+      @font-face {
+        font-family: fraction-8;
+        src: url(/tests/fonts/math/fraction-8.otf);
+      }
+      @font-face {
+        font-family: fraction-9;
+        src: url(/tests/fonts/math/fraction-9.otf);
+      }
+    </style>
+    <script type="text/javascript">
+      var epsilon = 5;
+      function almostEqual(x, y) { return Math.abs(x - y) < epsilon; }
+
+      function getBox(aId) {
+        return document.getElementById(aId).getBoundingClientRect();
+      }
+
+      function doTest() {
+        /* inline style */
+        var ref = getBox("ref").height;
+
+        ok(almostEqual(getBox("d1").top - getBox("n1").bottom, ref * 20),
+           "Bad FractionRuleThickness");
+
+        ok(almostEqual(getBox("n1").top, getBox("n2").top) &&
+           almostEqual(getBox("d2").top - getBox("n2").bottom, ref * 10.5),
+           "Bad FractionNumeratorGapMin");
+
+        ok(almostEqual(getBox("d1").bottom, getBox("d3").bottom) &&
+           almostEqual(getBox("d3").top - getBox("n3").bottom, ref * 10.5),
+           "Bad FractionDenominatorGapMin");
+
+        ok(almostEqual(getBox("ref").top - getBox("n4").top, ref*3),
+           "Bad FractionNumeratorShiftUp");
+
+        ok(almostEqual(getBox("d5").bottom - getBox("ref").bottom, ref*3),
+           "Bad FractionDenominatorShiftDown");
+
+        /* display style */
+        ref = getBox("dref").height;
+
+        ok(almostEqual(getBox("dd1").top - getBox("dn1").bottom, ref * 20),
+           "Bad FractionRuleThickness");
+
+        ok(almostEqual(getBox("dn1").top, getBox("n6").top) &&
+           almostEqual(getBox("d6").top - getBox("n6").bottom, ref * 10.5),
+           "Bad FractionNumeratorDisplayStyleGapMin");
+
+        ok(almostEqual(getBox("dd1").bottom, getBox("d7").bottom) &&
+           almostEqual(getBox("d7").top - getBox("n7").bottom, ref * 10.5),
+           "Bad FractionDenominatorDisplayStyleGapMin");
+
+        ok(almostEqual(getBox("dref").top - getBox("n8").top, ref*3),
+           "Bad FractionNumeratorDisplayStyleShiftUp");
+
+        ok(almostEqual(getBox("d9").bottom - getBox("dref").bottom, ref*3),
+           "Bad FractionDenominatorDisplayStyleShiftDown");
+
+        SimpleTest.finish();
+      }
+    </script>
+  </head>
+  <body onload="doTest()">
+
+    <a target="_blank"
+       href="https://bugzilla.mozilla.org/show_bug.cgi?id=961365">
+      Mozilla Bug 961365
+    </a>
+
+    <p id="display"></p>
+
+    <p>
+      <math>
+        <mspace id="ref" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: fraction-1;">
+        <mfrac>
+          <mspace id="n1" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d1" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math style="font-family: fraction-2;">
+        <mfrac>
+          <mspace id="n2" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d2" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math style="font-family: fraction-3;">
+        <mfrac>
+          <mspace id="n3" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d3" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math style="font-family: fraction-4;">
+        <mfrac>
+          <mspace id="n4" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d4" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math style="font-family: fraction-5;">
+        <mfrac>
+          <mspace id="n5" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d5" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+    </p>
+
+    <p>
+      <math displaystyle="true">
+        <mspace id="dref" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math displaystyle="true" style="font-family: fraction-1;">
+        <mfrac>
+          <mspace id="dn1" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="dd1" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math displaystyle="true" style="font-family: fraction-6;">
+        <mfrac>
+          <mspace id="n6" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d6" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math displaystyle="true" style="font-family: fraction-7;">
+        <mfrac>
+          <mspace id="n7" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d7" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math displaystyle="true" style="font-family: fraction-8;">
+        <mfrac>
+          <mspace id="n8" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d8" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math displaystyle="true" style="font-family: fraction-9;">
+        <mfrac>
+          <mspace id="n9" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d9" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+    </p>
+
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/mathml/tests/test_opentype-limits.html
@@ -0,0 +1,172 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Open Type MATH - limits</title>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/SimpleTest.js"></script>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/EventUtils.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: limits-1;
+        src: url(/tests/fonts/math/limits-1.otf);
+      }
+      @font-face {
+        font-family: limits-2;
+        src: url(/tests/fonts/math/limits-2.otf);
+      }
+      @font-face {
+        font-family: limits-3;
+        src: url(/tests/fonts/math/limits-3.otf);
+      }
+      @font-face {
+        font-family: limits-4;
+        src: url(/tests/fonts/math/limits-4.otf);
+      }
+      @font-face {
+        font-family: limits-5;
+        src: url(/tests/fonts/math/limits-5.otf);
+      }
+    </style>
+    <script type="text/javascript">
+      SimpleTest.waitForExplicitFinish();
+
+      var epsilon = 5;
+      function almostEqual(x, y) { return Math.abs(x - y) < epsilon; }
+
+      function getBox(aId) {
+        return document.getElementById(aId).getBoundingClientRect();
+      }
+
+      function doTest() {
+        ok(almostEqual(getBox("base1").top - getBox("over1").bottom, 7 * 10) &&
+           almostEqual(getBox("base2").top - getBox("over2").bottom, 7 * 10),
+           "Bad UpperLimitGapMin");
+
+        ok(almostEqual(getBox("under3").top - getBox("base3").bottom, 5 * 10) &&
+           almostEqual(getBox("under4").top - getBox("base4").bottom, 5 * 10),
+           "Bad LowerLimitGapMin");
+
+        ok(almostEqual(getBox("ref3").top - getBox("over5").bottom, 9 * 10) &&
+           almostEqual(getBox("ref3").top - getBox("over6").bottom, 9 * 10),
+           "UpperLimitBaselineRiseMin");
+
+        ok(almostEqual(getBox("under7").top - getBox("ref4").bottom, 2 * 10) &&
+           almostEqual(getBox("under8").top - getBox("ref4").bottom, 2 * 10),
+           "LowerLimitBaselineDropMin");
+
+        ok(almostEqual(getBox("base9").top - getBox("over9").bottom,
+                       (6 - 2) * 10) &&
+           almostEqual(getBox("base10").top - getBox("over10").bottom,
+                       (6 - 2) * 10),
+           "Bad AccentBaseHeight");
+
+        SimpleTest.finish();
+      }
+    </script>
+  </head>
+  <body onload="doTest()">
+
+    <a target="_blank"
+       href="https://bugzilla.mozilla.org/show_bug.cgi?id=961365">
+      Mozilla Bug 961365
+    </a>
+
+    <p id="display"></p>
+
+    <p>
+      <math style="font-family: limits-1;" displaystyle="true">
+        <mover>
+          <mo id="base1">∑</mo>
+          <mspace id="over1" height="1em" width="1em" mathbackground="red"/>
+        </mover>
+      </math>
+      <math style="font-family: limits-1;" displaystyle="true">
+        <munderover>
+          <mo id="base2">∑</mo>
+          <mspace id="under2" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="over2" height="1em" width="1em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: limits-2;" displaystyle="true">
+        <munder>
+          <mo id="base3">∑</mo>
+          <mspace id="under3" height="1em" width="1em" mathbackground="red"/>
+        </munder>
+      </math>
+      <math style="font-family: limits-2;" displaystyle="true">
+        <munderover>
+          <mo id="base4">∑</mo>
+          <mspace id="under4" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="over4" height="1em" width="1em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: limits-3;" displaystyle="true">
+        <mspace id="ref3" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: limits-3;" displaystyle="true">
+        <mover>
+          <mo id="base5">∑</mo>
+          <mspace id="over5" height="1em" width="1em" mathbackground="red"/>
+        </mover>
+      </math>
+      <math style="font-family: limits-3;" displaystyle="true">
+        <munderover>
+          <mo id="base6">∑</mo>
+          <mspace id="under6" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="over6" height="1em" width="1em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: limits-4;" displaystyle="true">
+        <mspace id="ref4" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: limits-4;" displaystyle="true">
+        <munder>
+          <mo id="base7">∑</mo>
+          <mspace id="under7" height="1em" width="1em" mathbackground="red"/>
+        </munder>
+      </math>
+      <math style="font-family: limits-4;" displaystyle="true">
+        <munderover>
+          <mo id="base8">∑</mo>
+          <mspace id="under8" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="over8" height="1em" width="1em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: limits-5;" displaystyle="true">
+        <mspace id="ref5" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: limits-5;" displaystyle="true">
+        <mover>
+          <mspace id="base9" height="2em" width="2em" mathbackground="blue"/>
+          <mo id="over9" stretchy="false">~</mo>
+        </mover>
+      </math>
+      <math style="font-family: limits-5;" displaystyle="true">
+        <munderover>
+          <mspace id="base10" height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="under10" height="1em" width="1em" mathbackground="red"/>
+          <mo id="over10" stretchy="false">~</mo>
+        </munderover>
+      </math>
+    </p>
+
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/mathml/tests/test_opentype-radical.html
@@ -0,0 +1,196 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Open Type MATH - radical</title>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/SimpleTest.js"></script>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/EventUtils.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: radical-1;
+        src: url(/tests/fonts/math/radical-1.otf);
+      }
+      @font-face {
+        font-family: radical-2;
+        src: url(/tests/fonts/math/radical-2.otf);
+      }
+      @font-face {
+        font-family: radical-3;
+        src: url(/tests/fonts/math/radical-3.otf);
+      }
+      @font-face {
+        font-family: radical-4;
+        src: url(/tests/fonts/math/radical-4.otf);
+      }
+      @font-face {
+        font-family: radical-5;
+        src: url(/tests/fonts/math/radical-5.otf);
+      }
+      @font-face {
+        font-family: radical-6;
+        src: url(/tests/fonts/math/radical-6.otf);
+      }
+      @font-face {
+        font-family: radical-7;
+        src: url(/tests/fonts/math/radical-7.otf);
+      }
+    </style>
+    <script type="text/javascript">
+      SimpleTest.waitForExplicitFinish();
+
+      var epsilon = 5;
+      function almostEqual(x, y) { return Math.abs(x - y) < epsilon; }
+
+      function getBox(aId) {
+        return document.getElementById(aId).getBoundingClientRect();
+      }
+
+      function doTest() {
+        ok(almostEqual(getBox("inner1").top -
+                       getBox("outer1").top, 5*10) &&
+           almostEqual(getBox("inner2").top -
+                       getBox("outer2").top, 5*10) &&
+           almostEqual(getBox("inner3").top -
+                       getBox("outer3").top, 5*10),
+           "Bad RadicalRuleThickness");
+
+        ok(almostEqual(getBox("inner4").top -
+                       getBox("outer4").top, (7+1)*10) &&
+           almostEqual(getBox("inner5").top -
+                       getBox("outer5").top, (7+1)*10) &&
+           almostEqual(getBox("inner6").top -
+                       getBox("outer6").top, (7+1)*10),
+           "Bad RadicalExtraAscender");
+
+        ok(almostEqual(getBox("inner7").top -
+                       getBox("outer7").top, (3+1)*10) &&
+           almostEqual(getBox("inner7").top -
+                       getBox("outer8").top, (3+1)*10) &&
+           almostEqual(getBox("inner8").top -
+                       getBox("outer9").top, (3+1)*10),
+           "Bad RadicalVerticalGap");
+
+        ok(almostEqual(getBox("inner10").top -
+                       getBox("outer10").top, (9+1)*10) &&
+           almostEqual(getBox("inner11").top -
+                       getBox("outer11").top, (9+1)*10) &&
+           almostEqual(getBox("inner12").top -
+                       getBox("outer12").top, (9+1)*10),
+           "Bad RadicalDisplayStyleVerticalGap");
+
+        ok(almostEqual(getBox("base5").bottom - getBox("index5").bottom,
+                       (getBox("base5").bottom - getBox("root5").top) * .25),
+           "Bad RadicalDegreeBottomRaisePercent")
+
+        ok(almostEqual(getBox("index6").left - getBox("root6").left, 10 * 5),
+           "Bad RadicalKernBeforeDegree")
+
+        ok(almostEqual(getBox("base7").left -
+                       getBox("index7").right, 10 * (7+1)),
+           "Bad RadicalKernAfterDegree")
+
+        SimpleTest.finish();
+      }
+    </script>
+  </head>
+  <body onload="doTest()">
+
+    <a target="_blank"
+       href="https://bugzilla.mozilla.org/show_bug.cgi?id=961365">
+      Mozilla Bug 961365
+    </a>
+
+    <p id="display"></p>
+
+    <p>
+      <math style="font-family: radical-1;">
+        <msqrt id="outer1" mathbackground="green">
+          <mspace id="inner1" width="1em" height="1em" mathbackground="red"/>
+        </msqrt>
+        <menclose id="outer2" notation="radical" mathbackground="green">
+          <mspace id="inner2" width="1em" height="1em" mathbackground="red"/>
+        </menclose>
+        <mroot id="outer3" mathbackground="green">
+          <mspace id="inner3" width="1em" height="1em" mathbackground="red"/>
+          <mspace/>
+        </mroot>
+      </math>
+    </p>
+    <p>
+      <math style="font-family: radical-2;">
+        <msqrt id="outer4" mathbackground="green">
+          <mspace id="inner4" width="1em" height="1em" mathbackground="red"/>
+        </msqrt>
+        <menclose id="outer5" notation="radical" mathbackground="green">
+          <mspace id="inner5" width="1em" height="1em" mathbackground="red"/>
+        </menclose>
+        <mroot id="outer6" mathbackground="green">
+          <mspace id="inner6" width="1em" height="1em" mathbackground="red"/>
+          <mspace/>
+        </mroot>
+      </math>
+    </p>
+    <p>
+      <math style="font-family: radical-3;">
+        <msqrt id="outer7" mathbackground="green">
+          <mspace id="inner7" width="1em" height="1em" mathbackground="red"/>
+        </msqrt>
+        <menclose id="outer8" notation="radical" mathbackground="green">
+          <mspace id="inner8" width="1em" height="1em" mathbackground="red"/>
+        </menclose>
+        <mroot id="outer9" mathbackground="green">
+          <mspace id="inner9" width="1em" height="1em" mathbackground="red"/>
+          <mspace/>
+        </mroot>
+      </math>
+    </p>
+    <p>
+      <math style="font-family: radical-4;" displaystyle="true">
+        <msqrt id="outer10" mathbackground="green">
+          <mspace id="inner10" width="1em" height="1em" mathbackground="red"/>
+        </msqrt>
+        <menclose id="outer11" notation="radical" mathbackground="green">
+          <mspace id="inner11" width="1em" height="1em" mathbackground="red"/>
+        </menclose>
+        <mroot id="outer12" mathbackground="green">
+          <mspace id="inner12" width="1em" height="1em" mathbackground="red"/>
+          <mspace/>
+        </mroot>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: radical-5;">
+        <mroot id="root5" mathbackground="green">
+          <mspace id="base5" width="1em" height="10em" mathbackground="red"/>
+          <mspace id="index5" width="1em" height="1em" mathbackground="blue"/>
+        </mroot>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: radical-6;">
+        <mroot id="root6" mathbackground="green">
+          <mspace id="base6" width="1em" height="10em" mathbackground="red"/>
+          <mspace id="index6" width="1em" height="1em" mathbackground="blue"/>
+        </mroot>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: radical-7;">
+        <mroot id="root7" mathbackground="green">
+          <mspace id="base7" width="1em" height="10em" mathbackground="red"/>
+          <mspace id="index7" width="1em" height="1em" mathbackground="blue"/>
+        </mroot>
+      </math>
+    </p>
+
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/mathml/tests/test_opentype-scripts.html
@@ -0,0 +1,268 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Open Type MATH - scripts</title>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/SimpleTest.js"></script>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/EventUtils.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: scripts-1;
+        src: url(/tests/fonts/math/scripts-1.otf);
+      }
+      @font-face {
+        font-family: scripts-2;
+        src: url(/tests/fonts/math/scripts-2.otf);
+      }
+      @font-face {
+        font-family: scripts-3;
+        src: url(/tests/fonts/math/scripts-3.otf);
+      }
+      @font-face {
+        font-family: scripts-4;
+        src: url(/tests/fonts/math/scripts-4.otf);
+      }
+      @font-face {
+        font-family: scripts-5;
+        src: url(/tests/fonts/math/scripts-5.otf);
+      }
+      @font-face {
+        font-family: scripts-6;
+        src: url(/tests/fonts/math/scripts-6.otf);
+      }
+      @font-face {
+        font-family: scripts-7;
+        src: url(/tests/fonts/math/scripts-7.otf);
+      }
+      @font-face {
+        font-family: scripts-8;
+        src: url(/tests/fonts/math/scripts-8.otf);
+      }
+    </style>
+    <script type="text/javascript">
+      SimpleTest.waitForExplicitFinish();
+
+      function doTest() {
+        var epsilon = 5;
+        function almostEqual(x, y) { return Math.abs(x - y) < epsilon; }
+
+        function getBox(aId) {
+          return document.getElementById(aId).getBoundingClientRect();
+        }
+
+        ok(almostEqual(getBox("ref1").left - getBox("sub1").right, 3*10) &&
+           almostEqual(getBox("ref2").left - getBox("sup2").right, 3*10) &&
+           almostEqual(getBox("sup32").left - getBox("sup31").right, 3*10) &&
+           almostEqual(getBox("ref3").left - getBox("sup32").right, 3*10),
+           "SpaceAfterScript");
+
+        ok(almostEqual(getBox("ref4").bottom -
+                       getBox("sup41").bottom, 7 * 10) &&
+           almostEqual(getBox("ref4").bottom -
+                       getBox("sup42").bottom, 7 * 10) &&
+           almostEqual(getBox("ref4").bottom -
+                       getBox("sup43").bottom, 7 * 10) &&
+           almostEqual(getBox("ref4").bottom -
+                     getBox("sup44").bottom, 7 * 10),
+                     "Bad SuperscriptShiftUp")
+        ok(almostEqual(getBox("ref5").bottom -
+                       getBox("sup51").bottom, 5 * 10) &&
+           almostEqual(getBox("ref5").bottom -
+                       getBox("sup52").bottom, 5 * 10) &&
+           almostEqual(getBox("ref5").bottom -
+                       getBox("sup53").bottom, 5 * 10) &&
+           almostEqual(getBox("ref5").bottom -
+                       getBox("sup54").bottom, 5 * 10),
+           "Bad SuperscriptShiftUpCramped")
+
+        ok(almostEqual(getBox("ref6").bottom -
+                       getBox("sub61").bottom, -6 * 10) &&
+           almostEqual(getBox("ref6").bottom -
+                       getBox("sub62").bottom, -6 * 10) &&
+           almostEqual(getBox("ref6").bottom -
+                       getBox("sub63").bottom, -6 * 10) &&
+           almostEqual(getBox("ref6").bottom -
+                       getBox("sub64").bottom, -6 * 10),
+           "Bad SubscriptShiftDown")
+
+        ok(almostEqual(getBox("sub7").top -
+                       getBox("sup7").bottom, 11 * 10),
+                      "Bad SubSuperscriptGapMin");
+
+        ok(almostEqual(getBox("sub8").top -
+                       getBox("sup8").bottom, 11 * 10) &&
+           almostEqual(getBox("ref8").bottom -
+                       getBox("sup8").bottom, 3 * 10),
+           "Bad SuperscriptBottomMaxWithSubscript");
+
+        ok(almostEqual(getBox("ref9").top, getBox("sub9").top),
+           "Bad SubscriptTopMax");
+
+        ok(almostEqual(getBox("ref10").bottom - getBox("sup10").bottom, 9 * 10),
+           "Bad SuperscriptBottomMin");
+
+        SimpleTest.finish();
+      }
+    </script>
+  </head>
+  <body onload="doTest()">
+
+    <a target="_blank"
+       href="https://bugzilla.mozilla.org/show_bug.cgi?id=961365">
+      Mozilla Bug 961365
+    </a>
+
+    <p id="display"></p>
+
+    <p>
+      <math style="font-family: scripts-1;">
+        <msub>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub1" height="1em" width="1em" mathbackground="red"/>
+        </msub>
+        <mspace id="ref1" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: scripts-1;">
+        <msup>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sup2" height="1em" width="1em" mathbackground="red"/>
+        </msup>
+        <mspace id="ref2" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: scripts-1;">
+        <mmultiscripts>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <none/>
+          <mspace id="sup31" height="1em" width="1em" mathbackground="red"/>
+          <none/>
+          <mspace id="sup32" height="1em" width="1em" mathbackground="red"/>
+        </mmultiscripts>
+        <mspace id="ref3" height="1em" width="1em" mathbackground="green"/>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-2;">
+        <mspace id="ref4" height="1em" width="1em" mathbackground="green"/>
+        <msup>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sup41" height="1em" width="1em" mathbackground="red"/>
+        </msup>
+        <msubsup>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+          <mspace id="sup42" height="1em" width="1em" mathbackground="red"/>
+        </msubsup>
+        <mmultiscripts>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <none/>
+          <mspace id="sup43" height="1em" width="1em" mathbackground="red"/>
+          <none/>
+          <mspace id="sup44" height="1em" width="1em" mathbackground="red"/>
+        </mmultiscripts>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-3;">
+        <msqrt>
+          <mspace id="ref5" height="1em" width="1em" mathbackground="green"/>
+          <msup>
+            <mspace height="2em" width="2em" mathbackground="blue"/>
+            <mspace id="sup51" height="1em" width="1em" mathbackground="red"/>
+          </msup>
+          <msubsup>
+            <mspace height="2em" width="2em" mathbackground="blue"/>
+            <mspace height="1em" width="1em" mathbackground="red"/>
+            <mspace id="sup52" height="1em" width="1em" mathbackground="red"/>
+          </msubsup>
+          <mmultiscripts>
+            <mspace height="2em" width="2em" mathbackground="blue"/>
+            <mspace height="1em" width="1em" mathbackground="red"/>
+            <mspace id="sup53" height="1em" width="1em" mathbackground="red"/>
+            <mspace height="1em" width="1em" mathbackground="red"/>
+            <mspace id="sup54" height="1em" width="1em" mathbackground="red"/>
+          </mmultiscripts>
+        </msqrt>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-4;">
+        <mspace id="ref6" height="1em" width="1em" mathbackground="green"/>
+        <msub>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub61" height="1em" width="1em" mathbackground="red"/>
+        </msub>
+        <msubsup>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub62" height="1em" width="1em" mathbackground="red"/>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+        </msubsup>
+        <mmultiscripts>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub63" height="1em" width="1em" mathbackground="red"/>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+          <mspace id="sub64" height="1em" width="1em" mathbackground="red"/>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+        </mmultiscripts>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-5;">
+        <msubsup>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub7" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="sup7" height="1em" width="1em" mathbackground="red"/>
+        </msubsup>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-6;">
+        <mspace id="ref8" height="1em" width="1em" mathbackground="green"/>
+        <msubsup>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub8" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="sup8" height="1em" width="1em" mathbackground="red"/>
+        </msubsup>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-7;">
+        <msub>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="ref9" height="5em"
+                  width="1em" mathbackground="green"/>
+        </msub>
+        <msub>
+          <mspace height="2em" width="2em" mathbackground="blue"/>
+          <mspace id="sub9" height="9em"
+                  width="1em" mathbackground="red"/>
+        </msub>
+      </math>
+    </p>
+
+    <p>
+      <math style="font-family: scripts-8;">
+        <mspace id="ref10" height="1em"
+                width="1em" mathbackground="green"/>
+        <msup>
+          <mspace id="base10" height="2em"
+                  width="2em" mathbackground="blue"/>
+          <mspace id="sup10" height="1em"
+                  width="1em" mathbackground="red"/>
+        </msup>
+      </math>
+    </p>
+
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/mathml/tests/test_opentype-stack.html
@@ -0,0 +1,137 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Open Type MATH - stack</title>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/SimpleTest.js"></script>
+    <script type="application/javascript"
+            src="/tests/SimpleTest/EventUtils.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: stack-1;
+        src: url(/tests/fonts/math/stack-1.otf);
+      }
+      @font-face {
+        font-family: stack-2;
+        src: url(/tests/fonts/math/stack-2.otf);
+      }
+      @font-face {
+        font-family: stack-3;
+        src: url(/tests/fonts/math/stack-3.otf);
+      }
+      @font-face {
+        font-family: stack-4;
+        src: url(/tests/fonts/math/stack-4.otf);
+      }
+      @font-face {
+        font-family: stack-5;
+        src: url(/tests/fonts/math/stack-5.otf);
+      }
+      @font-face {
+        font-family: stack-6;
+        src: url(/tests/fonts/math/stack-6.otf);
+      }
+    </style>
+    <script type="text/javascript">
+      SimpleTest.waitForExplicitFinish();
+
+      function doTest() {
+        var epsilon = 5;
+        function almostEqual(x, y) { return Math.abs(x - y) < epsilon; }
+
+        function getBox(aId) {
+          return document.getElementById(aId).getBoundingClientRect();
+        }
+
+        /* inline style */
+        var ref = getBox("ref").height;
+
+        ok(almostEqual(getBox("d1").top - getBox("n1").bottom, ref * 20),
+           "Bad StackGapMin");
+
+        ok(almostEqual(getBox("ref").top - getBox("n2").top, ref*3),
+           "Bad StackTopShiftMin");
+
+        ok(almostEqual(getBox("d3").bottom - getBox("ref").bottom, ref*3),
+           "Bad StackBottomShiftDown");
+
+        /* display style */
+        ref = getBox("ref").height;
+
+        ok(almostEqual(getBox("d4").top - getBox("n4").bottom, ref * 20),
+           "Bad StackGapDisplayStyleMin");
+
+        ok(almostEqual(getBox("dref").top - getBox("n5").top, ref*3),
+           "Bad StackTopDisplayStyleShiftMin");
+
+        ok(almostEqual(getBox("d6").bottom - getBox("dref").bottom, ref*3),
+           "Bad StackDisplayStyleBottomShiftDown");
+
+        SimpleTest.finish();
+      }
+    </script>
+  </head>
+  <body onload="doTest()">
+
+    <a target="_blank"
+       href="https://bugzilla.mozilla.org/show_bug.cgi?id=961365">
+      Mozilla Bug 961365
+    </a>
+
+    <p id="display"></p>
+
+    <p>
+      <math>
+        <mspace id="ref" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math style="font-family: stack-1;">
+        <mfrac linethickness="0">
+          <mspace id="n1" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d1" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math style="font-family: stack-2;">
+        <mfrac linethickness="0">
+          <mspace id="n2" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d2" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math style="font-family: stack-3;">
+        <mfrac linethickness="0">
+          <mspace id="n3" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d3" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+    </p>
+
+    <p>
+      <math displaystyle="true">
+        <mspace id="dref" height="1em" width="1em" mathbackground="green"/>
+      </math>
+      <math displaystyle="true" style="font-family: stack-4;">
+        <mfrac linethickness="0">
+          <mspace id="n4" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d4" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math displaystyle="true" style="font-family: stack-5;">
+        <mfrac linethickness="0">
+          <mspace id="n5" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d5" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+      <math displaystyle="true" style="font-family: stack-6;">
+        <mfrac linethickness="0">
+          <mspace id="n6" height="1em" width="1em" mathbackground="red"/>
+          <mspace id="d6" height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+    </p>
+
+  </body>
+</html>
--- a/layout/moz.build
+++ b/layout/moz.build
@@ -26,14 +26,15 @@ TEST_TOOL_DIRS += [
 ]
 
 DIRS += ['build', 'media']
 
 if CONFIG['MOZ_DEBUG']:
     TEST_DIRS += ['tools/layout-debug']
 
 MOCHITEST_MANIFESTS += [
+    'reftests/fonts/math/mochitest.ini',
     'reftests/fonts/mochitest.ini',
-    'reftests/fonts/mplus/mochitest.ini',
+    'reftests/fonts/mplus/mochitest.ini'
 ]
 
 REFTEST_MANIFESTS += ['reftests/reftest.list']
 CRASHTEST_MANIFESTS += ['../testing/crashtest/crashtests.list']
--- a/layout/reftests/fonts/math/README
+++ b/layout/reftests/fonts/math/README
@@ -1,6 +1,6 @@
 The fonts in this directory are autogenerated with FontForge using the Python
 script generate.py. See the comments in that file for more information on how
 to run the script.
 
 These fonts are intended to test the The MATH table and OpenType Features used
-in MathML. See layout/reftests/mathml/
+in MathML. See layout/reftests/mathml/ and layout/mathml/tests.
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2d6cc2fa0ab8768d8221bdc1f7e3b1a8b24b2af9
GIT binary patch
literal 1968
zc%0Q$O=uHA6#iy+v(?(BRaz|?WznK7lDLhwiqwNvf~d8Mr4$e9T0;|UyI~ulN(vRh
zgAqgzUOWim#fu^q4`RTh2el&ja}a-S6+C#TG*&czv%9T{T4;~%GV{Lo-uLFcnSGgb
zbar-N5k{cGY>UN=dtY{}00P|rUd3Xa?I&-&y8-AX^-%lv&RvRLS)jfb5ZxUIH$)d7
ztJy$o(0{b2-%4SR`V>$<)3!Siw~i~$$aVT2a<n99&^HI(6Hjo|C;HPvWzUIFc9T<i
zzcrMCx}Q+ganc8@{`jiVH!rA<0LqD!J(w<>$41t-g?<A<Qh`gm)@P1XwSL7SbzH7C
zc7NrkVyTY1_61PjJ&X|(VgiReK4*c_hfLO?5^3r<nE{$EC~_AUJt;n*Nhp%2FPw?`
za~0qbt6cBpa_3@>;qM@b+cVa+*ym$`N?i7_!rJfpSVe=V@UezUalpp`REx7d)@i>@
zrqE<<d)+9B1(xHKj}=tox{p<E_JNNzEEml_4!{sce5})c1#PgA!f7~2q8ACIxrYYy
zpph~P6HVAe)K1nJGWz&h)Mb>zI5}I4NfHeJZFcIklk82TjfS2^BWgBnGTQAk$-X|z
zXtSM^?O5rgO`e4zh72Oigz=fgVJ3q$lpG8v;&PEN)xZ3|T`@Oj+LaC|akt_KYc{Zz
zWA-GTznQp&V|tf}*#qgA?exZtXv8$O8YQJrZw|MF<(}qKe;54@nce{zOeK>=Tqz4h
zSKJxonHZ+o6fsTHn9t%~_jn`ZcgjxrbzNQKca)u@QCDQw77A{UQWicIUjOb}q5rGV
zOP?aYGCS+PepF8s&aor@aUcR3Pg00r=||v|ArQ`2A-_W8LrQ+7nqQ_}tPt7kRAwp@
z2;pi~2&fL>+Tsuvgz#($R2j049k+dMzn7APf3<)>1ymtcuL);!lfyZY%Y7Toskx<7
zb(0@|*6F$LcWNhxzm0w$E(->;nk?#PrYty>sma!6E6V+?@p-cC#+Z~Pcdhi4<AaFs
zK4}fSo#%-@_GRN7xK~-m;W_Z49@mxAxM+<Md$ed2#fw_t$4lZ?-oi^M>nW%2X!(|E
j_3jZbK^<1jT9wDFA*0?!L3drxIxUM{`7h=DQvtsKyP^*R
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fdb7c97ce00941025516f0cb50faf562e1cb7ac0
GIT binary patch
literal 1968
zc%0Q$O=uKJ6#lBar=u}W5=k`ZsD&FeL1yfXCW>SaVPp_B#>F5(L~Y}c8BNkdXM`vT
zWLZ#jyzCyl>_HGOUKCM0hyxz?u>KtO2Soh2McB(iBx6L!uev*N#u$i4tLb{*d+&So
zURA%T>FMq5!7@xhhm}Ys<(>Z%5g^nD;Gbl&xBK*s7uNvOq8{n)>fNoGN7hr{2Z+9&
zgInVDCmOa8OZt!Z57}Al)gJ-+f3)pMr|grOJ8_l12YfryG??2%FNvr4Hm8Sjqg79d
zP<5SC^^iT9g?@lgG;uPA?V;3$d(Zx&J^^T_vd&1ZbRJt--wygEgrWi$x-NDctL=P?
zW%{IA?a95hZ_1@U>DiY+gFhG}ro<Eu`+Uv<m4i&yp%WSUB$*+aE@^5PmwhQ-p-pIt
zXfB<L`f?TEA*<Z%=kn%qjtq7X#?3kFM(hu;z;gT=V2!ok4zP|EQ4?ST%f(Lt4xvu`
z9AK07n`8<@)wa)zQdnR$&IDLP9j*pg=VtE**uZMh9^eq9I2K@&_TP|zgDlR%MFs;%
zBgZ|opdYQ2aad@>Hll8_&XF<5$EL2LT*j%{W=w`?7)UtTvu<V}os%v7tuk)4ZIj*3
zxy<08EfbELbzD1_amceV%8(I6nJ_h%ILd^uM>8YQbV@A}r8>|5*_HHi<~-?=lJY8!
zv1W;#d>2mQ``d{-Jl)?VlFo20>9_+a8IM_Vr>rQ2dV91Zs`m6P^&g_&CDT73$y6#?
z%#*5697?$(JQHbIZ86KT<hLyDcaQ%@f==0`zOJVm{En(~4C<Qd+EU5uQOeTm(!Zbk
zR+wLF^vY4@*A`}d*F*P3=@)g<^AAM8;7JM*uKWnRG6bT<S`^oaVni#h)r+f)%QYgO
zpBbAO3q^3Hme+4x1i#luuq1-VE1;{8P3*X?#r<9?63%M@fg0#SZ1^FXFHDaYM4|BR
zZb2`soN1bV{jtd`yuZ~rJ^t?Q`|+x9IB%$;K8{s|XT}=xjrp4DU~3$I{&?+)k`;HY
z@>JuMi19w@3_bTxV!vGEiT)AD)<tlyu#BUN;KhBeCuecl8Wr|<*;^Jb8i5ag6L<0!
tUP;+ZIeSN|r&4S7j(7!{ux`Psd}ad~%^nJS>-yGNS@x)ZDgU1e_ypTz4+8)I
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..24e7d5155be95b413bf2881ddce7b0c7bd862f06
GIT binary patch
literal 1876
zc%0o;O-vI(6#iy+Td-jHNzo=2ooM|bhO(_nBH}?w8lyrnHpH0tv(!QxDcdYHK>`WJ
z!~-S969?nTn-{$hy;$SPcrek6#)DD3;T=QONPV+AKx;78t23Q>-<$WnH*bD+8jHtc
zsKYc==snRWKXv%d4Z!6G@GKgQ_g;PQ@jmJANe}cMi=R;3=P!`H1h8|lvmKG9L0^zC
zC;R0@#>ir``T|hrY3z6^X<S*EnS4UFr_?%AG@!&>p9qsbf~ibyyygud)SRZSHe-xu
zq4X1EVt)6ikx6#!e7A%2X+Q~Q&9PkR77hSfk?b5yP=VO8D}AY<`zz|yMG@`w<JK?b
zQkGgM5|IyEVoNyh@STy0Ld<@<ho&wP(?!aRB33c$NVb45Qv}7mY0c~RD8O^dk~?$R
zeL08A6?pM*ZFCR%Bxdj+FR?=MuEZ*KV^Lxa9u}0?g+_KpVmFPC6O(Box6`(lzzjZI
zlUSiTC$Wl?xF@j&AM;A=qTD+qcGLJEdSD`p>#&f<FjC0T8ulT9Hj)wO2;(53USdrU
zV}z<fy702dPxJ=)qzR1zJ!ba0l^#yz_`XCNkLclpyw{vakBk_+$F#DhW#rN(@rG=-
z#F}F}O@krJNC<N~VdodMjX7IdlwH!!DMVRubWz(VjAJ=OxRcuI3J^6%b5YY8PVz`d
z=Use#GExq;ceaaUt4M5slCUr)&78uE2|~6MX<;B~jS-jYdN`!(I<F$8yai4R$P@1t
zr)2Az2ur<Y>%3HQ`qJmsJI34_UDV3*H~W83R7aF<(y4E-U<QqLkg>Y5t!Lsp++S=!
zaT_ZJlwzw|+^Wsivpf}70QrUh&=|n&rT}UKc-#zCIP9eZJW}0NU!SY;z!?<AcJ9g-
zmZu7=Q1~`qPzzhW`<Fkj_}zsck6M<ezRmxbs_}ZiPx|sL`Ff9B0+m-s@4ptZ;!PA5
z4;EO69=UGUhkx9;mr}M>!JVTtE><79k8d2qKBLHQI8w$T%vyk-Zy~;gT5KU1B)R&Q
kidw0Oce5VN@MHTQ({Y$SVgzmEwc|RYtFo+$e-qJu0omU02LJ#7
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d404810257674162a9e25c327ce5b980a97d7f14
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+TM)1)DM;dKCR$WtTDDb5RE$w#W0Z<ULW~D>sg*WTwpnTd1QLvi
z2Wvcd;9xv)^P(4m7i&Bj4<>ps;b8o^;aLntBlXShP+HW0S7&zSeQ)0P-n{wQ>F(+2
zMlB|w!sv`fdDp@FHvvyGfalR@Pwe`m4^yPilCH;&^_*0^?P=2I0d}GLd|PC5pFcpD
zll@9OZDz1heF>=3G<H0hFt0A%8GA~$XVlu0G@x{QJ`yH>1d{3OaMfEvsOqAwI&BVT
zpqwSh#QfetGo3I3vm*WkpoBBlP_}p*`v9##b`B<}!0E3ij$W?s_=Z|_PDFb%v+YZ{
zl%*PqMC8Nf**q?~e0QXx5c90lLsRF7=^^EgB35zNmFyG3Oc50ChLYFnD8LKKlDl&`
zeL08A75MPDG`b6CBxa~VPGW`R1Bq3%U`}EUH7p>p2b<VAiM=#FOiZSU+`1euff@X`
zA+bVrQeqXS@K9n6e&&<dL%Fv}?4|KObizUgBe0P|Ka$AO8ulQLR+14I2xC8?7_ml)
zF+kNMU3l5#Cwh~7QiKM9PAfBFr}~pwz9-(wBSv^Xk6ELsfdP|uT6V^=&1}jd-ZjT9
zUUCf5RJdlFabXS;cE6}&%sSGh>=I5+A<By55Vb#raV-Z3w>!GK0z|FBY}B&*6Fd?!
z_#wVB87T*X?Lm?3Iuh%pBy0>xGpF!kf{-IcTIfyKL&W8V5e^xK!PgN}-U7Gj^29sD
zDLJ|(!cwm}IxiO8zW90hjxq0_E^1|2%l;n})fL5CVt;>MFoQ-r$XIRJ)-&-R?k&`#
zu$2{brLavcY|-x4u^bhTj$FMCY|?RWvyN&VGYwFM!)`k9!|S{1D|1yIID^92j-9#u
z!g!wL^NZ7YHQ)5TdExU?vp4_aN#nx!;`ER4DxdHBm_OH;tE-Vqpz`|2)Egly-b7)k
z!6z1?N3O&3{vUVlm6WaP;7(E+m)54W=q|VP9#2-raLy>Q3P;K~gjpl-^Bu&$P>m*%
o0g}sasi>8jcsJ|NfM#s}Yg#VTPmF+rd`?_<bXk^Fk-ccY0H`$b1poj5
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2698e8c7c22b29b11f7599c79dc2418cf0f43985
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+Td-hJQ<TKTOtk(GL)}(rBEmsQsxeeB5@S55Yb~^qvdvNxAdp~8
zJW%4va4?>@dC?2Oi#48%2NS)R7-JM~c=CdwYNWo|9k4YR>(!agyzjmDy*F=mrqkQs
z--|j-L50yBi}Co8J2wDN6M!eNSbzN5{r7XEzad?ZAL~D<c%vE8mjQOZ_w1p_)+>P^
zVNU+biHw=WX7w4M&XetUDrsI_ot}6^zQ;78DKaR%o)3g69>G*5H(K+G5Ndj8s?C_A
zStxx3nONUDY-W<-eQ#Sxp8}L{)*8u`Zs9PX70J)R1Qj^(xvTwBL+2ONsY@c;%Z27o
z<x;j<C=yW&TV~6+;PPEdMI&aPGec9Ci0L6^S`oXLaV1+sm??td-LxL{dluj+Rmt78
zoVlFC<qrIKux{Ol(-JfIke65?c~@c;d$A<31|JJb?7<dxMq)47M~TTaQCp7_B``w(
z*Cke{&q}P~6z)l^A;A0+d#Lt95_`#h1>LZa#Taa)F^Cj$w1)#opoL@v2Eu3~6erd=
zF@~s{q>Ct<;>2uHOq$Rz&~0VM?DSwN#}6c0c*F>|@whdf9vU)vw`FH7+svgc;te=q
ziS@u%aRml!Ga=lqgxz1vapoLpQ*}wFrVv%d(LrOQG_I$eaFoW{4iK}3b1};vO!7#`
z;2r$eVx+XUMq5R(RTOrPim)*v-JH^k1wxJ#W#L@X9w9C_jBv;>3|>V}c?;a3%M<Su
zr{w6GNK3Qk=)6>N=hDZuJI1^lUDV3<H~)XoR9BR4(y4E-VFr!9AY*l9pPq^T;lW}9
ziaS|RSBlMQafdcj&+^nfI`R!Vutmr1tvYITENp`+0`}91AFb}H|5~f^z!?<AcJIj-
zRwfIqQ207uPz&3?HLZMHZSoerKWto?{5t=Avc~WKHWA1-=IecO3)Eh8&Ak+|;!PAD
z9~N1N9=T4>yMO$0&!udsf;&rPT&yxLam9PQS9fu_-8rMkZ#YuMA<P<qAFm<)3$@rz
oGDvdmEfu{|6Ypj{wxJ2T{#cRA3=kveAitB>wXVssE~*#fCxa~V1poj5
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..140793337177715805d35945d229e51ed7e736eb
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+Tgs2+Cq+ptW};OghO(_fqT)eG8e>2(5@S55OD(h!*k-8-5=k^B
z9xU<LgYm@8i(UwNu*Q?|V1gGD4@U8Z@hFBWk@{wLT3W<dug-Mleeb>R&Aiz+oq?gD
z0o39qROr2t2tR!|a|>{_0C*mW4E0}q_+gIpcclCKj}M(x+^yB5uK?`)z}e1l<FGG4
zn3Ml<blgZ{oB9$^=gD>=9y6}2-@WmKe9vff$H|}!xIPl5cm(3(si~?rgizH-lV{wR
zN<tYV$i)8c31d7KZhIdj{U)G<lICP8e+LHvEk}M1Ca6H~m(j16>U+MSR$UgWEiSZv
zE|s!*ph!e9Y=y1hg2Q(#WsR7F_6$v3CZ>y&yNWo)tRvYHLQD}9cXcsp^D4j#%91;K
z*>fp}%M*C<sA%1X(-Je(AT6;%^1j3>_F`FL4K*wvu?r3CjKprTPZ5)8BDX#}N?-;b
zu1Ty=&q%D|6dp*d!N<H3yD0ZgiQQx$MlVbxaUB*C7)2Z@Izt<xXeSwljt~wJ>L=DT
zF~+DHq>Ctv;>2uFOoGq^)y+&^w-TfA6mN^R^RON|#QV+Z#Mqd@drd28T1F~i5^ux~
zixvYrXcLTBMpU>v2s^)s?M&IyqU>UJPC?3w;|PtdmT^2?gu7`JPJoCxk&2ksXpD!0
zIzPfUHY260qq{>STR~#yC<zOb(#>gku|d$5A}ySYS(C)&x*iJZy3Q+DQ{Dn+_+`a=
zM3rn^6U)-9**eeXojL!haL1T?tBYFR{^tJ=n(B!BZL0bf2WHUd3o=$)^68oQA0Ein
zBe#>~{7SA>&F#=;>sXqa%a3%uA87F7UZWo#KNgyxih%u8@uQVp^^LvC3(lZ0wtG)H
zyE>C)+3ffEteV~aqh<BedW$=|_PBX<=KK8GOqJLB<AyKYoUW^pN1*ol*xaI!WpASJ
z)L@AP>5=Pkz5mBA_e#q43b+|c<Kpk;+NWD{i|=u!+-}z>ya|U(ID}a<@bfLif5C(8
oBm*Q1Z>i|zns_(s(1aH3`eXJE(?^VejlA}{j<q05y2xIPU&BZ91ONa4
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9903b4b00ad9fc33b2feb382eaaa83eb1094aee3
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+TYfD<3X)jNM5}^^x-CK?VvLeB#(>30i18pUwbDjlo24d5Ai<b;
zpu{6F#uGO$dLih+8c)W930_P*7}S$+$51d*-|P<18i;sxrZew*?|tvho1N)Iy1OGN
z!vs|5?cp$woO*N*aMc2M9S(PQ-hR3;L;5GueVymJFDUN164I9eb~SS4M5waQ>nF^~
ze<M0*B(X<*3#hYXJ0Fi3H`gb}UXbq<jg~kWl!)sKVTy-8KA0LQ`alRp9W)gW8Y4+4
zT?Cm}-#ugu#+r^TG?6|5D8ZyToXR}_=~|Zj986Gwv)_A{dMny~piEs9+2-f!mhz=+
z#ZV-o7`Duoan0d7mV!piE_;TiE)vs4%A_K8G37}16+xy5io0Yp>d!2|8>*5!YuR%?
zhszy!@NCn11eYXcC`DRgh2&$2RUF2m#2QMOUt$;bvda>?$v#3%rit1*>?na5ytpH=
zLVa3d6&LYDVhvvAk=RAGpODy1_CB=3L=tylA%T9xk)l1+BZ>x+A?OI=B%w}XjS^#k
zx<R^#vM5f>2E`-@4FT<D@~)NWkEeKjw1J28;7Q(TjwS{M4Bl>9Nz*b?36prY?6Bx&
zU?ZBzXc<xAZY1pd!nQMION*+D*);{IDvnkf+of?l&4gQMZ0rDGb0`%yt^ODf1$5rZ
zw-zI%xv`~D6uXPUdZ-8s!_v(uy;vY%OHmejV%9KmxvmETx~}tG<dnC-89sU9ZQ_({
zT@z_()@+^Ua?YIlwsFUpd%KHT*#74K51Q(T+<iLrZ8prH(HCT_Ebr4Z@jpDCtw44^
z%ledTotoXJO_j4WHJ1<R3Lmi7hliCu6#Fn&1yuwbr4v8ByQ{vnR^fp&D2yFEl+LV-
zXILh)I-5~5HEXpi-_~p0nV-+ASH@Roe~uS<JZod#balGCRBnOV`!h51LKeJ<!c&T`
zEI^N3o9pvGez|v2Htd2sO=Vo)*<JRskh}RFPZ!$lGYb8ILwOv+tQz?B5#qm4j2e=D
mk{fTS=!KeiH_K6lS{&H1JcsEehTldWJFjEika=BHFUD`1GxG!h
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01b139cfba5fd6a8ba3c2b55f7d195d2ec71429f
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+TPk2dQk2AECRz}pt=kGj0S`*j7z2Wl5aU5zYo(3AHcL&AK%z16
zV2MW##1n}zUi3onVvQ%`!9*`69*jb~;2lGOXnnIg{1h?PtFxVX-+S+SZ{GZLx_f)O
zQHI-4p?5^1yyy7T9l%us;AJ%0+jZl~=V{VElJ4(1*?U@XH$NhM5nva(&mW2Gy6OuM
z=H$N;8#GebslEo(8M2*9#Eok|?~gqv-wWz32{I_%t}lcs9)ZMQdZgq%A(V8|;2AVV
zQc!vbGBLk<$QX<_9iBTz`fWf7r_AAW{vM73T8{i2Oi+Qgul0{FSG0denYtjdy_>E5
zwpq&Nfg%ybutm0riw@th6f|P?*dsJ`ftW5*?ki#y6OLqa2s1@c+&k8zwq^ldQI*`8
z%N{p#xLko3PuH#WI4dzjDKZi(B&Q@+QHKSIHI%Y|#4c2_a}vABK0-{UiP}2tD1jM#
zxGAwh-=xGU&fuZM8hp$vv5RUyBC(t7SJ43zDcpjEB>Is+n%2;O7#c}Npd*YXLS4if
zCB^`K2I(ToqBt=c6q6)01az3GTUN3^k>(AtMjp|_O}xt-O%4ngyu-9ore&m)Ch@M@
zVX^hVAX><188P7w5_W!3+nKhdMb*XannF|+M=SO1(m0-G8wb}{fT%f?j+$0~oJT@B
zZ{-`4k<uJ&35sHiD6Ef)urMs$oYIR4LbeoTp)YO?6PN3HIHc=3FCwSB1y1+N6K@x%
zWb2wpOQUA%JfC;Q{QTM-WA5!PYGM1E|37G|Bl36Y)VEnMgGM{ZSlOnnXX1Z&C|7~p
zUY7GKxmq>1N1G^T8EP&+G8KNH(vJtb{P6fOTLo1F9HbL(EAFaq%vE^c3<_iW4`i}S
z<5`x?F3)7u?CzDCrTL#V?(FKb>ZS4Jnbq+UuXkn4m#NN_m&zqjdwXK~osb1@qVSYr
zj)mxvYj=J6$DMm4Wn&TCNh;$~5j;ABI@&$^J&ydI!?s1X;7DOSs|J32fcP(Xu$yFn
n<l0**zCumBo8_oN4fg%9Du?MKM!-g1JFjD1lbb$Kz39IH#;EcI
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6c628a823e8a215c6988437f335afef1a6ed18d4
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+TWZ0Aq$r6CnP~kXhPtf+QQ@E@jWHk)8)7`DYpt{q*k-8-8c8rF
z9<1@`!Qh3&gBQIJyjbJOcrd|>i3cO-3GWyRMC+T~;im*+y*ksG_r3SN_vX#cbb8|P
z9#mo+DvZupjQ1UzxC40V0lbdI;@#JueVHWv6X|;Q$@po-+wzq31%RFJId?d^<4Q0@
zn3Ml<V#v&3yZRPTr^t3Hl{ByZx_|p6`CidzO_4$A@yrsYc!W|z+0lv*giz5%lW)iz
z%|PiT$i({IVRI<i68_df`Z%COGS*18cn?Patw4SbCa6H$Y~zzl)$Kn}sm_aRGt&*<
zH%i%jP$Z%lw!ju}!R5P_l19v4XNIQE6VpS=eMRizfh*Y@B1{n!@3yt5%~^mqR3&%U
za^{U3E_V>X^EK;!oRyftkDSB`$;T3_*oS$EHTYRbVh?IqpTu6Wj}nt<qP8w4N??W{
zZb+<9e<ZPrGnkNALy!d|_E7DICH9j23OZpSgPX9C#sE^t(jE>XfhLks7>M8~p>AT`
zBE}$flXMYfQ=FJhib)e120E?GO*=i1%JPGWCLT2+M|rn(D?K=9@=nXnShkr>Tg1EO
zgeBGjo6$x_+e`>|Ghz1^bDUX6+EiWAsVPiVaU7?yRT|gRLb#R2>JAXIhO;rt9!T<N
z*x<+c`eLNCG`BX3V#_G3pNg<CBHf(Qiv_}t6lI}5X^#+>8%88-7zQsRr@RI3(B+A@
zi&JuRO{Aq+b97!Tx^waC>K$X=tuAV5`<wqiXsRoUcj?r(*f4`eUy!lN4WFKg|KXuR
zH43{~L01Y5YGIf5po-<Fd35Beb)ZJa!yP(&I;Lx(ihu)j;wQ?x>g#Kj9yo)-*q*()
z{Nh-i<?~BZc{RUtxqk8MuX=BO<wf1%*wWO>SVbVPd^?z{%T@X17O1`Nn4A%^<V_SF
zKjv7N9=UeU=YRZi@1$%hgZqfexL5`+>I&yQCcIBC&Efc?n{c!=p49<AKSKN$eAr1c
nL~`{l6}?mw?`9QhQIEzyR^>8-#0WVk;N*3!t8zmZ)r;{Pp`h{w
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..32376dff9e3916df3f5803825cdd8f09c6e1a6db
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+Td-geQk2BSOtdP*P`4F`A|8OGQ6u6HAx0B*sg*WTwpnU|1`>>k
z2TDA0FvbHnFM1*B!5UA-gNa^DOf>!^9`KH#XtciB9iT;wcy*>T?|bik@6DT?>GbsW
z_MigeP+@dMqx{6aJJ$eD9e^j%Xm9tWyYHt-e?z+7-O+nc@#-C<&jIXI&&l19>i$5G
zFem@{SjtRez4{DLXUNu>h?^IFPK-Vz-(woB2{I@>o)3g69>GK^Gg9`75Xz3wRGu<N
z(ol{OWMX~qkeQ0N8lO8!9|x3h+8WLjZeS0f<;l;%1Qpox_RyJgRqbC<q0WkIFCWx@
zDVDO8Ly?GL*c_X~X_xO>N*XbbIWshMmY5z=CKR!YNmsIu2s1@cyz7>tR%QX7QkC3Y
z%bANgT<*Y+drQ_GI4UuN4_S#7lD8yQu^qD#Yw)q4#2##5$0hcXeT0}y6SW<2q6B6L
z;IhOD^(l!}9L8;lH3XPnVh`26TVgNS`_TmpX<UJgBnFT`hW5~a7#c}NU?7ZULfyo=
zN{m73Cg~!|rZ_R16q6)01aw*HD|T`qk>L%oMjkQ3&Ai*Xnj9Q7d6#9UE!)f_E#h5t
z!eUE-P1s9D+l&c!6Jhrkb(|ST+EiWKsVPKNakSA`Esg7GA>2x1aR-Q6Lz$>$55##S
zWbih=ycj7hO|4C$*fkW^M@85emTpez#R4Hmin7obw}*+#4I>;f41=#Br@RI3(B+A@
zi&JuRO{Aq+b97!PxO3st;vHk&)h=pj`<wqiXsRm;*Xh((*)W4fUy!kiqEFAn|8Q5n
z3i-_}uPga_HNQ!ltYleg9v#^#9oV4bX0?uT9S>@tih!MT;``Tj)tA>QJ#Yqvv8~&(
zx%sgi%jFhka%yhlx4QXHKkK}?@Aqrx#};P3kCplT-$n!3+H9pyZh_j11Jf^sEO`@!
z$A^zBM2}p%=iNVkx#v<gu7Nv6Wt?5zRq?1uiMYafk0Zb5aBPtkxR^(n)dD|WL;M%Y
qv5{nu<l<W@dZ{Mf%}Ugu4qN_My~_*`Bj_N%lh?H_%Azi+7vmRL=kf&r
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9c194bf3d708585cf41af5d80d984df3a63587e6
GIT binary patch
literal 1876
zc%0o-O-vI(6#iy+TPk4rNkI}<GtsILL)livsCYn<Y77VlLW~D>sg*VY+blIf0|~~&
zgEbyK7!QV<7rhYlV2vl^!9*`c4@Tu;@Q$HCq`ui5phZ-?I@6i=z4yNN=FQG@I(vFL
zQHF7-FxsL~-hJr7b-+^x;CVFK({cIXrwP(Okgj*M_MA|>dMoL(06Wv!-4v<n3j_&s
z@?VGznkj5nUjphR*^VXR=EbF3qff~9j7D>U3`(cxGhvEHFfo`ODS1l>CG9l%2F;Na
zlrDlytnVE%2jd4LUyqYM4k+Q2HJr}h#6CdFk)MMJD$w-4_4N6QmhUK2XGFF)Q`^23
zO4)o+B%&BL%Vu%b<-3-mM$9f}hNjLC(?iNFMeO3XE7=!>nIb6OO)F7rvj8usO75=Z
z%!M2-ci_jP73*%Cl9-_s8Hp8=_as)a3o{aHC}ly3J*Z@-CH9higqTbdwY57@0y6|~
zMPh~eU5Qnk#C?f11ejl957pizv6t+9XoH0muEItV{YW59d#FbY4J0El5XOE&9mKju
zi~;H<=_1OeI5C?PlO!|*v{|XEcCtT_=Jl}#9x=lEd53i^IWS=IHp@;~wwX>^#Jl8#
z#a03vafpnz858bC!tO8XIMa@_sk*pRQ;4eKI80-`G_L0W;bt1kJ3!PLN=GfbKh7f|
zgCFLri;;4mvAIzcyMe-bsR$dx(#<KoSRmv`Q5JgR_Aqg|VT415Vek#)l()bgx;*g~
zaY~M^iL^9pj?VLWcg{~Q-!bN0@1hpBzxn@zrn(}3gHC;&4Krx;1sN+V`1DNt5BKIO
zklV^~x{}+b=C)|J%UOn+M@ObY2P$>ksnX%oF;xv!1ni*`KeDl_zPeWNfiozK?bw;g
z&W&YRHakC=RkO7Vb#v28b>8ga<C?j#`N_qx62E_8G?1yul$XjaP<wrJ;*F3+Z=&#&
z;tLDWBiG{j_>W)im6Qz|;NGP&&i$EE_LQcGi=Fp4@@o#q7FmM}d4yRF@Z%lCf5C@Z
ol0lNoZ>i|Tns_(MQH?rm|7~e5GeC@>gZxfj*SahVx~N`^pD@$%1poj5
--- a/layout/reftests/fonts/math/generate.py
+++ b/layout/reftests/fonts/math/generate.py
@@ -51,16 +51,25 @@ def saveMathFont(aFont):
     aFont.os2_typodescent = aFont.os2_windescent = em/2
     aFont.hhea_ascent_add = aFont.hhea_descent_add = 0
     aFont.os2_typoascent_add = aFont.os2_typodescent_add = 0
     aFont.os2_winascent_add = aFont.os2_windescent_add = 0
     aFont.os2_use_typo_metrics = True
     aFont.generate(aFont.fontname + ".otf")
     print(" done.")
 
+def createSquareGlyph(aFont, aCodePoint):
+    g = aFont.createChar(aCodePoint)
+    p = g.glyphPen()
+    p.moveTo(0, 0)
+    p.lineTo(em, 0)
+    p.lineTo(em, em)
+    p.lineTo(0, em)
+    p.closePath();
+
 ################################################################################
 # Glyph variants and constructions
 f = newMathFont("stretchy")
 nvariants = 3
 
 # Draw boxes for the size variants and glues
 for i in range(0, nvariants):
     s = em * (i + 1)
@@ -224,8 +233,267 @@ for i in [1, 2, 7, 8, 9]:
     p.lineTo(s, 0)
     p.closePath();
     g.width = s
 
 f[largeop[0]].verticalVariants = "uni2A1B L7 L8 L9"
 f[largeop[1]].verticalVariants = "uni2A1C L8"
 
 saveMathFont(f)
+
+################################################################################
+# Testing AxisHeight
+f = newMathFont("axis-height-1")
+f.math.AxisHeight = 0
+createSquareGlyph(f, ord("+"))
+saveMathFont(f)
+
+f = newMathFont("axis-height-2")
+f.math.AxisHeight = 20 * em
+createSquareGlyph(f, ord("+"))
+saveMathFont(f)
+
+################################################################################
+# Testing Fraction Parameters
+f = newMathFont("fraction-1")
+f.math.FractionRuleThickness = 20 * em
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("fraction-2")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorGapMin = 9.5 * em
+f.math.FractionDenominatorGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("fraction-3")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionDenominatorGapMin = 9.5 * em
+saveMathFont(f)
+
+f = newMathFont("fraction-4")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorShiftUp = 3 * em
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionDenominatorGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("fraction-5")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionDenominatorShiftDown = 3 * em
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionDenominatorGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("fraction-6")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 9.5 * em
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("fraction-7")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 9.5 * em
+saveMathFont(f)
+
+f = newMathFont("fraction-8")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorDisplayStyleShiftUp = 3 * em
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("fraction-9")
+f.math.FractionRuleThickness = 1 * em
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 3 * em
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+saveMathFont(f)
+
+################################################################################
+# Testing Stack Parameters
+f = newMathFont("stack-1")
+f.math.StackTopShiftUp = 0
+f.math.StackBottomShiftDown = 0
+f.math.StackGapMin = 20 * em
+saveMathFont(f)
+
+f = newMathFont("stack-2")
+f.math.StackTopShiftUp = 3 * em
+f.math.StackBottomShiftDown = 0
+f.math.StackGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("stack-3")
+f.math.StackTopShiftUp = 0
+f.math.StackBottomShiftDown = 3 * em
+f.math.StackGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("stack-4")
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackDisplayStyleGapMin = 20 * em
+saveMathFont(f)
+
+f = newMathFont("stack-5")
+f.math.StackTopDisplayStyleShiftUp = 3 * em
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackDisplayStyleGapMin = 0
+saveMathFont(f)
+
+f = newMathFont("stack-6")
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackBottomDisplayStyleShiftDown = 3 * em
+f.math.StackDisplayStyleGapMin = 0
+saveMathFont(f)
+
+################################################################################
+# Testing Radical Parameters
+f = newMathFont("radical-1")
+f.math.RadicalExtraAscender = 0
+f.math.RadicalRuleThickness = 5 * em
+f.math.RadicalVerticalGap = 0
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("radical-2")
+f.math.RadicalExtraAscender = 7 * em
+f.math.RadicalRuleThickness = 1 * em
+f.math.RadicalVerticalGap = 0
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("radical-3")
+f.math.RadicalExtraAscender = 0
+f.math.RadicalRuleThickness = 1 * em
+f.math.RadicalVerticalGap = 3 * em
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("radical-4")
+f.math.RadicalExtraAscender = 0
+f.math.RadicalRuleThickness = 1 * em
+f.math.RadicalDisplayStyleVerticalGap = 9 * em
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("radical-5")
+f.math.RadicalExtraAscender = 0
+f.math.RadicalRuleThickness = 1 * em
+f.math.RadicalVerticalGap = 0
+f.math.RadicalDegreeBottomRaisePercent = 25
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("radical-6")
+f.math.RadicalKernBeforeDegree = 5 * em
+f.math.RadicalKernAfterDegree = 0
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("radical-7")
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalKernAfterDegree = 7 * em
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+################################################################################
+# Testing Scripts Parameters
+f = newMathFont("scripts-1")
+f.math.SpaceAfterScript = 3 * em
+saveMathFont(f)
+
+f = newMathFont("scripts-2")
+f.math.SuperscriptShiftUp = 7 * em
+saveMathFont(f)
+
+f = newMathFont("scripts-3")
+f.math.SuperscriptShiftUpCramped = 5 * em
+createSquareGlyph(f, 0x221a)
+saveMathFont(f)
+
+f = newMathFont("scripts-4")
+f.math.SubscriptShiftDown = 6 * em
+saveMathFont(f)
+
+f = newMathFont("scripts-5")
+f.math.SubSuperscriptGapMin = 11 * em
+saveMathFont(f)
+
+f = newMathFont("scripts-6")
+f.math.SubSuperscriptGapMin = 11 * em
+f.math.SuperscriptBottomMaxWithSubscript = 3 * em
+saveMathFont(f)
+
+f = newMathFont("scripts-7")
+f.math.SubscriptTopMax = 5 * em
+saveMathFont(f)
+
+f = newMathFont("scripts-8")
+f.math.SuperscriptBottomMin = 9 * em
+saveMathFont(f)
+
+################################################################################
+# Testing Limits Parameters
+f = newMathFont("limits-1")
+f.math.UpperLimitGapMin = 7 * em
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.LowerLimitBaselineDropMin = 0
+createSquareGlyph(f, 0x2211)
+saveMathFont(f)
+
+f = newMathFont("limits-2")
+f.math.UpperLimitGapMin = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.LowerLimitGapMin = 5 * em
+f.math.LowerLimitBaselineDropMin = 0
+createSquareGlyph(f, 0x2211)
+saveMathFont(f)
+
+f = newMathFont("limits-3")
+f.math.UpperLimitGapMin = 0
+f.math.UpperLimitBaselineRiseMin = 9 * em
+f.math.LowerLimitGapMin = 0
+f.math.LowerLimitBaselineDropMin = 0
+createSquareGlyph(f, 0x2211)
+saveMathFont(f)
+
+f = newMathFont("limits-4")
+f.math.UpperLimitGapMin = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.LowerLimitBaselineDropMin = 2 * em
+createSquareGlyph(f, 0x2211)
+saveMathFont(f)
+
+f = newMathFont("limits-5")
+f.math.UpperLimitGapMin = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.LowerLimitBaselineDropMin = 0
+f.math.AccentBaseHeight = 6 * em
+f.math.FlattenedAccentBaseHeight = 3 * em
+createSquareGlyph(f, ord("~"))
+saveMathFont(f)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ad657db6aa0d245a1bf7d8de6ffe41eabac5b882
GIT binary patch
literal 1884
zc$~#mO=whC6#njeZzeH@$qz}4bP_Hxh*`|^Wz<+gN-YUP6=Q^sR=TK8<B%CTlQ+D1
z0SyTR3JM(;rId722xRBRZh|WZT#5uDqPy0bm2p!jq-2cf_}%y3#EET9TzTJ|d%kn-
zIp?19&Yk<l5{WVF#T;~)!|}LmU0R+30`&kM#N&z4?`}L^r2ISO@aX4>FSKCaSCq?u
zI6wB~$FY{hfp%ia^^4=VWPYS$^(mnLO5MqHDtSq>=N7njn>3K7B6uwDC-FL|H=T1X
z*WD*V-5E{|x#Z<MbOl8xr{H8Vm+Jm&;UVQYK--_U3QpxJ4g<y-*Cm891x_4JoW0OA
z^bhvxN{^LWUC(N{zUJ!dp}`yU5$j?dUwihP1-1`bG7p`|(AQ`gpy~%rRdL<p;tBeN
zrVN97w!Bo7<J;ogf$VAV_Ht*`>?HjPLb$o5J&4mj7R>jWk2Uh2eXQdE9{bopy=e1s
z0L|hv9|x)bmX^X$xt(&o6c%X4l#ew&Kl)fl9P>Ul7)SGQ08(`MI7s~&48uYmS70N9
z38dk$hC>)fA9)NW`f-G4lvdNU$nr^2R$ey!)SRSGhG-HPw(?i(%tYFehsOJ4%<MlR
zN3H2hHk*{gmYuikq?55|m!(6F<e-2Ew?H<N%Q%Gyk@t(c@f?@i%q!()6J<UUgQT|u
zc-o`H1Egx+h+C6R+_EQ9G8Q%Epsa2~cr-E)Q3<{?nRDFOrrIk{GOP+5b-79f=Tdfo
z6-m?VkD8__-x<yCwnt&Vvm>e-u59qVt4<q~HFe4=6?LW*udM#@_nUJjg80|*etYb+
z{(*+Jv&pW9?y<`E?Du~ZEMV|W3bALa0Yd%jBIPEO!=l`!mAm!wKI3|$C>A$oHfI81
z{L~Z%n#1^|C5-wo?zO^DE)DGUCpcc1%H`biySr0f-L|&>LR^C`M9+apv9vK;5~b4f
zrIKFi*zDX`ebpH(z4)ztWA^#di`lwRsA#CHUd_~nHfP$3?Zw6hzbuaBPZw7d-*zvm
zl?FT!QC@UI?*0Bg<F3#9fRE1aU^~w=zS%|0m}l$qDz1sKO&_bF8h^oW(aT4~L%cmZ
t$a~4F_o;C2)LN;R)QDDeqWgcd@+{kE(d(j+8`slTdCjA~DBf2EcnuH{`u+d_
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d5fa8018b7666d852cfc223aa9f97a8da95556bf
GIT binary patch
literal 1884
zc$~#mO=weD6#njeFKMkMZS9X0QoW-^>>}xF)GAULrA`o;TEQaXVl-1j6HNNT%M*WS
zp&(c>E@Tkh2x50`oK10Mz~wLqir_-<uPZyd5jr$hZ05V~y|k&Kc2;v=&OP5b_ndRj
zdFST7!J(l+ti=R$nEmm%Y@U964hYl&covTj4V=06dW!N(%He_iLkG3s50jKjfH*#Q
zv^&-`)!RxexqfOmo5&q#n|TN5x2ZdnN+wQg_QV~oJtXy}s0i)~ydj<=b*8e;`I@Ih
zs5!!^E}J-?gRY=x=M)@GWRsizzWajm1fXrmS$U^?8QTG4mg^EinF2p`pL}<+q3<88
z)s-Gk9(4Rw&GlJVUkeT1ppTdnb2#DIa~4=RXvsWuB1500Wq_)ynyTWO$HiOp2u&FV
z*DQIdDEn5#c?7w+$=l1FQMHrwD+uBKl6ET&`&cmFNgr$EH+-yP3ts!!K&@!;aR80t
zM;`~N|CN@)P`Ul=dMPZ>h_gP{_+0m~jyP`m*kByZ#{o#u;o~6nN6-%oIb48^G)9nu
z!y2|>7+vHsnCQU{q5)c6q(z2Lg0k|m>8IudebPjuK);o{V5dh?j@&lfC1YmK4mn_5
zOlL9)*>Bl7%T73Hi*^}0WJwP4h;SQZ(%H0=j}UpkxEs%Lxy`(iZZ=WoBe93{c>qtl
zlepKFy}S{(MxD52k0fO*YRWybvJK(RNN+?X_|0UFabufmuRO`HDsa^0Dis_{+Idza
zO|vIznx_0_G{4&(h5gPRP~C84gYR8++MukdQ&ujkGo^TW=GFV<b0&iL;&^{PzPJ8A
z4ek3Ts~)<?%9qqz{<2^JgKtuZHA@W;>R%TrHJ}t0r4FsMQ7^4GuGNb|VPR}xED*+T
z4Pl@$j9X1%)Q0irIvC2Oj=kQEefhK5tb2Y}cgic<R`*|sN$5gs-V!Mk=f{hpSo|<u
z)QfEk?ejB>?ZM*5-&^O$KTLlduL*?;hRSMjtR}QD)>3FK)YtiCaXj8T^+fR%_o7;<
z!&?#MMc3!v@Bd}|;q$I#Rr8gv*xqCszpNr=%(HcQ1y{vbp^sHjmA~M(=+krJKHi>f
t<elV|`&77hYPHl!s>eFCW8+t|@+@0u(dnX)8`slTc-5o6DBf2E_!qQN`~3g_
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a667b520751c768487f183fd61d6a9b2ae2d1ee3
GIT binary patch
literal 1884
zc$~#mQD_rc6g_WdlGa+%R@!cbR35ghEs{9NYFDJ9QVGjqZNVb4A8M?j2_~H|8No^m
zg#`uUhlnVGAk;5^+@G>v8`#f91V!*qtNq&g=~8K|XgqIbQd3=P{qjxjyXW3_?|t{q
zeR(r9GBSjXn1&8>Ad!%*vkxYKKs|uRiNwg@nY(i{l%G-#4;~o#MGMBZQ7!}G*wB$3
z@s^psHe$*3lcTw0{$Tt3zkq&=x?j_&<Y~>GzRk72NPTH4f<FhI6EBjw(>do{-6JB@
z4RdP9CC}xdD=0cR1;>-Ql>G0`9OY?1+nl!wPUQlA0*nQ&O9*8O9N6A}^F&ksYi!h&
z9uNQQd|Au&1y^4W4c?%SSQLx+&9mn$uzJvvdFVujzCg<WRhKkX#bu9+7l;W>83s43
zc&RA+SH<}oa%+pXmph|oC+SxZ!o3ykk2vgO!F(_JSR=pYV;x<X^Ra<?(dy#>n#DdJ
z2dO_rOJS(o4!K?m3pC@bk2OA5e5@mZ>pnIZNAqz2Qgr$_Nc}JdU?GnQ*vMcEX*jH*
z2czgEkHbU^JBbEqb)FVkK1s^T%ch^2lk~|DjRON#e!|X-r5)Kb+AHH`Y^NNw&S$dO
zq#Us9yk#eyj77UF9daZG1w>T)vzc7RDMX08U&4*&xZGx5DL0!a^O4v?`ZR#2-9_9-
zs^*P^HSQ!Vdn_g6QB&@b)oloOMfxHt!8MaP%8hNRz49c(s=!f~t5k3_WfxeHG|gDl
zG)=i?G{4&(h5gPRRNZi8gYR8++MukdQ&y>{Go^TC{@JUK=S&3g+425#d~N+Z4ejeD
z>mIttD!;Se|5LDl!8a+yhLr{g^{<PRn@|pma;H|_qL+U#E;ou|ad~oiG7!eqrZCVP
z#*LOR>chCd35IfMV6S&$f8lH{=bqp7o$~6owfz_3B6K0Pc14P%rKyrAmEO#j^iunB
z$I|@!j$rBSA8kuhZ)V?4)rCSuLuK`TvM#hd*;;HXHa7TWaXi>N^HA|s_o7;9zzY%O
zMc41%@82^1@p-Sux_Z{Iz0Nd_uOnvMvvqkD*Th(*kJnI*zu>p%-4o(|-k$B`-Q?B#
oRJeC)t<+6w#3poL%NMiqEL&;O?V^wy*V9&c&7;03-d6?q0FZ6^{r~^~
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3dd80a3f98913f8577527bf6b62ff88d826a102f
GIT binary patch
literal 1884
zc$~#mO=whC6#njeZzey6Ng|mvg^64>ShJY%Wg4Ss#7Jb2(lmhvDK50rbjS>y$s680
zA<+Z^LIuZ#h{TN`1iI)(H^G$yU6vxG6x_9Gf{UihLQ2MnPQUx!n>drU8dsh-=brDJ
zd(OG%zH{fk(ed$7?7=*An8S&L3@<&o3IrMf{E|qFk9_m}$|Ch&sYgc6jGxnj;brP&
zKzuR!`H^`0;y{>Ka{kMSTrz*QbL|g6zen3A=~VJ-&7Qx{xyR&zG!4OHf!~QY$UW(t
zGu`kr5gNugH0P4jdFTp?E)Kz|WG=OT<GW|n=K<}*yj5^2-{NDySm(TiP_DqKkF1lI
zS_l8e9$ne7{HXiSTB)zQ_C{#%h%sVAY~X_D&rzVB=*c>CB12!NXMm;~n%c!pPl{Fa
z2~9Z$o3^7=mZ7>lKR_O6_ttVp)T|`^9fa^;+j<C}`B<>t>ps>f@Az29L9F=LK%?mJ
zaR6=Nw2y<de??DWsM<btqZAfs!(|_9d~W$zM*<5zHke2AaR5?u`#4DZ7=~dXj~Up=
zU=nFK+{0l^pqDZZ6Mg6>8ll$}dSv+|sjDcPacWF5CPOp@3|sjbJ2RPf<l%{488`d-
z<%o49lg%dOuw~~hJLzOB`ehlABReP{$_0?k<T6enO62_#Za&AAHtR~c)x=nj#0m1w
z1fKOM@c_A6HxkyAld$Z`l#Itrc|ul~Av_u#h^hkLSj>4YY}4#*Pcp4a9CM{A1?N+C
zfjg3>*%vcSQ@$~q-))a0erM0BZn(O^_pUl^P}kHct5npPQnIr4+h4EGnF!)v$9pHe
zZT>xx_I8(DlkSPiHTL^IHY{N9O$yPp-2kEfb<uJw$`MiS*2??z@(0Gv7Evs2&2G&G
zBDmce0oo$C+a5t<1V8PCp+cJ3>*E+IT+Zd(^SirKUR}1f|3X}cF2sR@(PC+Ht|UsO
z=SwBM)VbBQx%R3nSbFg=ygB!L>BU?_C{#35Rj+0nLR+&P#c;8u+20oF$*IL<CF|}*
zHPeh$5#vQS=-%(|LO=Slx8CgC<~wMCWnA1v&ba66$||nOQD=|Wa8116x9H_l;z8b?
uos>P4)%#SqcWSNHLvF!dbYb8BR^@qi(4)siAvdpQt;(85eNnux3h)m_@B94#
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fb8e9ec4fcb972c5229db675589c125be9205255
GIT binary patch
literal 1872
zc$~FWO=uHA6#iy+lh(GRKeSpgl|_rShr~^^6{I3k2_n`C77-8Dw1y_wbi;N9EvXb0
z1=E9wcoKwO#7n&t@nEnwJqUX7CjQ(i2wtj<6&t_V-PBan7Q~sndEa~U-kbMkCbPYL
zeZ8p01XLK^v6$XD-7*XKDgiu=#rk^A-hVSi`6cCG&;GuHia*ju`6D1s^d8$0tsiK-
zM67fE^k6!kQ9h|-fO?0zL&-$^jABjP<=kUZXOas4Zr@wtc~WaKZJ)1@kx_AgLsdF{
zJ_GeAp=jpdABm?ETfW?zqdWm98#CspUA&5&fJPm32x$sradTULZP#a1t5S~_4_iKz
zb9K(qS3-f?=p*LEJWjgy90gW3S~3rnNK@x%>7(kpBCD8mxp;?&P^6)M-LluOQGi)y
zdC^_V8Ov>SuYv%km$ln)#KVI5Uh}X*e#^ruw&IP4HB^d55BpFj_IcP({Qxb6CUZON
zcu6c!hjSiQ*l&1PMGUt+tTB$_VIOqS;$c7aN6`%v8C-yc6o!z5%^J325bfkq7>HmO
zQ4g)gXfezlr!2iJ`pGd)pA^vu&~0WeSgE0;t#2P}*P}*cm)>KJrG|&&dbeq1Oe=1u
zOxg|8Ax*L|iV!-eNTpNuXo$%D#hiGy!!72OaIy(AA02y0zXou%9mJiaQr?J}BX-QR
zh7x)-Z0LLR(lUe{q0W#@@UO`n=fW1%Zh1Px%D`cV%T#bYVU4mP-7q3y!!Y!}M)OYF
zrJ#4R2jpouvc`RvC#_Ld<Si=}ojXNdd|$ls^PUO+?=I%bw%Yu^HDz^^|KC)X6)*F=
ze^ao4#+?*m-SPnl`L7EVYEjrE3PGjNq82u2lQkljTg)zIeL-BS4FYvROx6cc8N`zY
zsM4hkJFt6gSG%-U`JoH+Llt7n)=)0LFrF9r{MVVhnqR-zyzqXh*`NRRplM<J>&&<D
zia;Qz$yAoI6@kTUW3DMzQ-xA(&-YHfkbK2kC}*nhPK5cmb@^WZtbRiVsD8A{4nFgE
z`x<upHq$t@2D_+h>+ljTi?Ko<Eu%7j(FA;dMcl;~b3J)0dFc%m&O2HzwUTPkfM#s|
aV^*$ZBQ07T6ma6Y+7d78@+;zgNq`@cANK$N
new file mode 100644
--- /dev/null
+++ b/layout/reftests/fonts/math/mochitest.ini
@@ -0,0 +1,39 @@
+[DEFAULT]
+support-files =
+  /tests/fonts/math/axis-height-1.otf
+  /tests/fonts/math/axis-height-2.otf
+  /tests/fonts/math/fraction-1.otf
+  /tests/fonts/math/fraction-2.otf
+  /tests/fonts/math/fraction-3.otf
+  /tests/fonts/math/fraction-4.otf
+  /tests/fonts/math/fraction-5.otf
+  /tests/fonts/math/fraction-6.otf
+  /tests/fonts/math/fraction-7.otf
+  /tests/fonts/math/fraction-8.otf
+  /tests/fonts/math/fraction-9.otf
+  /tests/fonts/math/limits-1.otf
+  /tests/fonts/math/limits-2.otf
+  /tests/fonts/math/limits-3.otf
+  /tests/fonts/math/limits-4.otf
+  /tests/fonts/math/limits-5.otf
+  /tests/fonts/math/radical-1.otf
+  /tests/fonts/math/radical-2.otf
+  /tests/fonts/math/radical-3.otf
+  /tests/fonts/math/radical-4.otf
+  /tests/fonts/math/radical-5.otf
+  /tests/fonts/math/radical-6.otf
+  /tests/fonts/math/radical-7.otf
+  /tests/fonts/math/scripts-1.otf
+  /tests/fonts/math/scripts-2.otf
+  /tests/fonts/math/scripts-3.otf
+  /tests/fonts/math/scripts-4.otf
+  /tests/fonts/math/scripts-5.otf
+  /tests/fonts/math/scripts-6.otf
+  /tests/fonts/math/scripts-7.otf
+  /tests/fonts/math/scripts-8.otf
+  /tests/fonts/math/stack-1.otf
+  /tests/fonts/math/stack-2.otf
+  /tests/fonts/math/stack-3.otf
+  /tests/fonts/math/stack-4.otf
+  /tests/fonts/math/stack-5.otf
+  /tests/fonts/math/stack-6.otf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..974cc958d322419672b0d7ae7e9e94e354466489
GIT binary patch
literal 1896
zc%02uU1%It6#nka?Bu6m)5fF?G7Z;uEy=^KleJBuM5v@JL5vX$MWwV3n<cxrn^`7X
zXiEYC@pt=HQ2Qk0NkR0b_~e4V2?{NUZ`wBa65k`)Y-!f-&fJZ=R-5$AJA3c<opaAQ
z_uM&m@6684&Ef!7VZxotWaReujU6C12;k>TW^U%~FYc~U-k|Kvyf`;)*v}jXYzq*t
z&%X9t`q0|M2)X3^TiKFVJ~z647cf7k?xlRrn>T{h&p7uj`$V1!`*iFc`6hcJU#eW`
zx<iJp3mke&-jy=US4qV%2Yb;g<!;_{#wf1>#<OLAsnUE8&jXh7mk`Pncy}=V<)!|~
zKXJfRdE)jrNB?L?b0gGu!$8#NBR0h*-i+)y3UoGFG7po?GB;=$qv|6=?c#cb;y%WO
zp$zSwT`v{oY)72$AdfvAtrd=FTS@92#PQXx_5@zhT%ZRZYHkoe(cDA=ziV!xM>v|t
za8OKZZc|^PrLa_PFNa==3k=}0<_4b|nwyx$P0cL~h;Geekm7{qHuY~{3O>rXiU0*H
zAdd?7Fp4b3h-tVO$4RmoT3w?>k&j1Nc?I-Sqeq_t*&;CIm#+qeg?vShX2)dO9X}~&
z{A-0`(UVhtQ1%0_Qt)Y~oaX72B^Ht7A_%<sLe?uLNuysT3|R>=U~0KAp%hb+IK%#E
zj7Wcqe1g4|JTm@bCF2JRIhjtm@{HVFiTqS@BB|2cE2Z;XKERURr(|dqJQbo!2<LOb
z61OH@cRb~~uG}l2u6)#66+fpc6Ur8ApsH?BHq?o0Hr4r3*j)du?Q{zpj~w-Xw!P;6
z2hG^q<gv|+p!p8V{x2IAu=pm0=>59_Lj47k^?uYHQ9o+bN6h*W>w2H4RvXKW<(PvT
z{SI)@!Ka5DbUXNQ0G4v;X4OyQtPZrl1HZd!#{m%HeV9TVJD#l8wpMDQR@=T+Gi!$%
z!&~b+!*=b#*F#$?+qWL9bj9OUOJ%jQ+!b#u4_1e&eZ6Sy^QRZqZY%7#Bh^eV?u!&J
zy~)_GPxv-}&^Wda+mD&X#eLYNBij&Lye&qDzQuKW>VpWy5b*F9l1WzKFfl=F-K`?5
lO}ms}@8kVAjFJD$DzY4;MIvPJFm9x6VcVm=F3}eT_zP;A{R031
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7f7ba0ef1e8926316618f657f18ab7616d512c03
GIT binary patch
literal 1896
zc%02uO=uHA6#iy+vrT_YwX|9^Ekljcf{EK$E0hXKB^0q%u!xGNOB$MB(hb`PDlHTQ
zMdMBI2Lz!fz38QQG9aD=g$m+Htrjo!Y^5=x@y+g}CKheIIh&dHy*J-`^Jd@dWN>I`
z5Ve?u3ZpL);f1G#BH(ER@G24+8aQ)*c8c_Q()|N_hx!$L+Z#aF0Csfn@b>V!sqR+7
zoaRqQQ)YT!``j#`-Xq)oc+4DD?8&<{_n3NjoDBLd&wIiP)C2KU=3LcFLZ~`HLruy&
zmxg+XAZw;UA2n04J9DkuNS_3hEoo~kQ@n&7fF}Gon4kg^Yd&|Ks_*@RT2<tUnMW<3
z%B4E**u7BTHu7N$YyrnzK8*~OjhK{&N=Q@ZiRmHJRYmOLnk(4{bTUN{_39-r5oJ$B
zoG0LI8{M^>5oIfJxdR^_ELpeWpu`N-xFWGa@}|Tp0{AGghHB=Q*n_pKUt*o?DPl5B
z<aWUE5}2U@XC+qXxh}Dae%zK=Lj&_l>;Y$6CDzG)41KVW#(CICU<7ewXb<g(qJv}@
z20GD2Xn<H3h>@hnBwcvf<R?axd=i94fj%pJ-cF3fGrT?8!NW#p7ay=LB$7#!_gQw@
zvdv7wBA##>CZ{OLB!aXMY;!mfHIqSt?l0nm%sA4f)M8FTAxep(hx+muu6-xrZbx^M
zN5mS<L@awG#={|l_wc2a2=5Gb2Su7IrF4Xrw=pL7$tko59&)5e2uEV}7;TLkMrX({
z48Br8S$VgYD!xxt#?dvZfvCDhx*|?ou_(@$kj1%oWv83zSa#HZZ!69J2TfU-^4F%i
zqIglf=H(k^(CAGvR`aU@OnidDd_D4hmTyt=t!jRQcCC(OvxV`(xW|v{^?qQjAGg-|
z;q~Kr12o~{rK<139vNtL2YzYQiUYvdWvGm`Z4PF0ixWAP%YB{Bsk!xq=Eb=m&3f+J
z!=}ZFuhZWqs(ikzCbIf5Ugax{H)fl%bu}pM^TqC|86hj~NHJ4`4=hBNUa#lvKfcXp
zQg*C@dxO$Axe8v`<vOy2%VJd6OIS8>r*Aq+>ofu1Uz4Gis<579fMn@zWln9%wE*=x
fx*wa-`p2wXW+O2I4)Qs1U292}Jt7nL9|rgdQsMsr
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..850eee0d1e199446581b96376b0efcb7360ce443
GIT binary patch
literal 1896
zc%02tO=ufO7=5$5TFXDkiLp}?WHY2{un$t!YT`iRLV|-Zp{@fpp)IBDA`44Y@`|+r
zNwC3CXh@Y?piNEzpOQ;*2_c6H3cVCsNFnr=rZKs=cNZ%*jrwMH<VsCjySL7I=6mza
z`@VUjZ#*-zvoq+%3QRbYnT*{2b{jyXpTpx!W_J41J5N_RU*|kNeR_7vu!l|pwgrgy
zX5KxL-oH9NOf0$nNw(yc&y1`+1<c#@oz3UmIm2JM#kH^5$Mba9$0NTGZ?GrwrOL&Q
zABoWMA&0J#d$A1j9HAKGU@y3(+^y&G2<Iz+@kZHOtTaByn}DU_C4`~^7oxG^$GsE3
zq1#kC@#w+OudUWx5ByOW2peO>hS<OdA)li_dn1!NOd`u%Co@9V7lt~;wa|)Z7!!sf
z+MPR5D$A+1Jl{YbIvDO1jA+?O>J!9pcgK4e?`SO0iK`kLv|nj#B7x@`Tj&&VjU(76
zrZl$cFOexMrS0t?N@0OMT+rCycU@x>Q@E+Ig+3A0I07jSYi!g1J|^Lzj7#uQz&!G(
z@C+l!Vw5%w2V*!&G)>lJGK&0M&Q+ApI5oPADG)6HlV16fUzpEV<Vbc@rk$~)a@xCG
zC>C8g>G@^PcPj;tJQXy@pe$_>Np%5ycdn3ii%G)pFB7D!1lFgtTp%b#NfIa6U(FHv
zj}ecvH^n34EmSg|KcAE7lp{~bot=n}CC8IW=5CVCb9*0)`ka!fRq|9|l^~qY`HMW7
zbeyr2<2Z7+gu3!!Z&v(_s!TAqSOZmci*rNWxJE<WFJ&8RKeya&VdIsn{@1qK`v0IA
zyHozPnW1TX#<Ks-fdwr7l0tO-SplK`1(Wq&)Z?N)WYmYv`fJv;9#O4sEp07D;<(-$
z2lmBrV}BgcIKJ<Lr9z^t`f;4niS~BkcXn;N076`WDa4`IlhxYha!u4~FYedO+JUXX
z&9#?<c5VCKz~=Ic``gPMu~^kos$MR2#I~0Ds{_@ZE;P^i!&|G5lx=$>)k+thi4-5b
ziO7@x_-lTr?dTr3UsA?Ld*G!*ZeW|ZB}bcI<L-yya`>imp8??ap9m&cg#)w++UDCT
kg4(ps66`&E9|tk~kE%juKN*Pt#e%${w`p5GrKG9m4+a|j0{{R3
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e199f73ae9ead4e3e9bb0d6552f11c9e4a808566
GIT binary patch
literal 1896
zc%02tO=ufO7=5$5TK~kzj<Hh{6f-!Au@6$#s^dU#Ai+VHQrCeRla$hAk%c89dBs|V
zB-mgmv^2^ske^e*r}olbLQfU+&_khx6hcq=vk3+F?qbDGqP*E%Ia2=Y+&Zh7_vYL0
z`{vDlqnVtVn#3L~L5DS#Ov<OfZ3!UM1>kNnIW=+Nhlk6YuW=rkI5{=0nZpkN(*VSo
z$xja__AZa~l1sinpUT^XQv<6H0sVX0KFXx+8O>e#j_-b9AIZ>Q9t}MrUuTbI^2Liy
zf03c-a}KR}`(gq5X;RU{!JM=6>E(a=5}Ypq+M$9oU#xzO4*^5PO9<r(<i$OCu6^`B
z?9r7@-1+&yzxAlEdG=;#@Ec>qx>(0&zCTBS#zs%-(8&yajh-Qzu4rl(SA7&K7!sOt
zG+VZ#RF)GBd47fL+wZUCji_5m20IAj$8BprJ_)!$3%(7wM!XSl9Z@_ExPcZC33vz{
zVm#m`?Rk0%Luvcii&9*m6JG{g<8v+GI>vD;;08KHbHGE8qCem!?PoCt2L)V$i!5f5
zL6LhHKnjDz1S||;m~4Vxm+6t?V{@*eT*j%<W=xiB4j6L^m)z`ZrYHwegEC<a4a*7V
zayFN<<(T6Z9M>*p9r~%D83v_@ImEaGTze*)vU4#~|CjVq7Cm$+E$s=4Q<B6n_SbXx
z_9NsY>^1R7I&;OO<IbjKB5uiJa(gB6Be9W~lDU(lX)f<#KG>&ZYLz_hp%R4Yv^&qO
zNy{3FTb3nvN*Gk$@3o4bQkC)M25X?IZg8%t6IZRO^QEx5`k?M~3lpy$^;g?Y@Bar)
z+u7xvP4}Vt70dpH4GS3jl0vk;tbkB|!C0jom58Vu&?>!p<pbktn<$kw7d96{5nOAJ
z038wB+#5l21b=kGP$A8%`ca$+67BB5Z?D>L0EGAkx)6N_W2N%OVp){SPi~j>^1jWU
zjn(HpW_jzU?v2GKx3?CX!r_vkR6Sp43U4lSmAXr9t*Gtu&*RH?6gJ$E>P;(FM4Xr2
zXz2cXe$C$l9NdNPb;|f+7k&xf*TWjG%h6y@yzB=DyxZJsq8oVjH_0fgu#Xre*6vo}
k)uw(HWpCsC*n{4;s`5R%=n?f;*vso%YgqRvB{elK0FMX$0ssI2
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bd3351bb4c741bb4cd22153494ff1a97e48dcbd3
GIT binary patch
literal 1896
zc%02tO=ufO7=5$5TK~kzv9S}kC}v2NU>~Hc)!2cMLV|-ZrLF@tAuXlJA`44I@`|+r
zNwC3CXla#OpiNH&Lm<60m(WuMy%Y*9Bv5)w)0iCU++D2LNt8FcBS*?l?cO@8nfK<~
z@B8M>exsS1o}R)kEWv~`o=(drKW`d9qz}OF>GbsE`S0#6bH2)XZ1TkPgkkrb18fTr
zXQn<ll<HX?8zh%}e=bvWODBg`?g8cv+TP7&-5JAQ`j+p0WFO1XU>}M6MZU%!&lSrT
z+wPE|?PCs|MfYL}<|$G!z`>q#i`nac$45C|0*nJCZ@ygr3~vLLikA?|6_|NE*n777
z*gx21DxJ9f!@h^jXs!nKb{Gg7W5k+R!$+Y%M}gKxPwFtqEOV8f5t_a<)Gn@sDDGoK
z7|PM^*osnFj<@9b33C6N;ab6nrj?}LK@{I_Sr6iU%>_E}h2{qFYt2o>@j!D69U`WA
z1iQtA<~Hp`dJ0QvdoPGmT%Z>hG&lHM)!f7czR}!5uV~ji0x1q^ZqxoD#^IraOYo7$
zEOIDw4@1acn3#ft5gaC)q}OG76!^HDt0<pwYIGTsCz}Jtz0xH=KbtGdq0F#MIU|SV
zq<1-AD7bRm^GlxZmh&F{RL~5AGQ<KB;DPYnnS91ABuK+wI!IX#(5JL)ASg*m5=Yrz
z&Jo&2$;a3m;*s{|%4yG^&B|2Lkw@j$O5~%7v4oPjout!T-p9P&r(|lCJQ<)8gwt7n
zo?DZSGm>;1M{bu;S3c~Gil0=K3Fa1SpsH?hZm1JiudDN=u)gwV)9DsAUOMV8w(Z{k
z51O&P%fB`=g!-o}`ztmqVDU=|(fParLj463wQkg6qPEYd4VtyR)|D<%scbB4EJR|s
z+8qOS$8fDDhV~eK?S-X6+FA7@IIa`z?7(lW+HwGd_#CDX``=1bs_TnYQLR3@RW+-7
zHU`#Lo(|a6&71w}i;r$?F1AIZ6-%jly3iKgSm>+tSGqdU*ynHWEZ<hxa!0B+owzTO
zy!4Jm?*7NG`HRNk9r%7l8K3OHFBSR**x*e$TI>z3TX?5)oqpiSA0%(E3VVogV&iTV
kL2a66arQ3Wj{_Kdt*X$oj~?-WMT5MdwSi5KQqoZK3_d6Q0{{R3
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b28a85d700acf6577e4c48e1de2708adf8f65d00
GIT binary patch
literal 1896
zc%02uO=uHA6#iy+lm3!wt+hy6h8jzINZdwkrBqN_LJ?~Pi>QdYq@f8W-LQ?&mKF+v
zfAJs`{5gowQ@!X#JQ?sLf`Woqtrjo!UP)}B@y+feCjPbFoXyPl&71e$yti*MJ2X5z
zgc{63h29qm@%0yLD&T4W@GcY@9=!N)ah~SOH1`f39v)C!t@i=92C!2@C-wxl&UdvC
z=d^wyoG_C8?MsV*x<Ilc(TFjkShEjk?HTp1C<)x%u8+i5sQaRc)I`NwVyHMvLv_NK
zNJ2eMlr_=d9y1b=g)eOfXg&)lyOZX4Dt`rg0ZrI*Frf;Z&1P?%uj~Da8db!JH&2_t
zl%l$9%PXP4X=KAz*b2@#`ZO|>H`1gy=uJRVmr2t_q8p0H;--V_6FQk96x~%tE8*o(
znV;w2tvj8)>=7k9ahZV!kBZVZ9Fv@(3fCo92=7R)!iUe2Yp7yg$z9mO1|)ZrJVBaF
z6R{n&tpsPN$0f-XdgdfoF@SrLYp7?HlDoiJo8)eipGF@{BrypKF^nRL6y?y4Fggf>
z(9wx~#0E)giZtT%7&I4F7TJl>Ae$JmF`&;(PFk_iXo|OoJ9tp<+{XvasaQO2@IKQ@
znwF7@nWQI-M#v~k7>6HSBr--~VI%G*>ij~s%an~4g%+^`3Q$NKJ=A~o;mG&f++PeH
zA#*GhGOf`F4+eDJ!;3o+-|z48i!e6|=_GA$VO-|P$+d7Euu%krlM!p2QscVb8PIi|
zZ{$!`-sy#k_lwHdbB$^ss;<#o5hpI67w1c0e(6KW>1J;Ha@2or8?FBbP1#uGuT6Cz
zf0@eun}iuOdXtP*|EK^He?fn)4mmH&H7mImHMc{%S<BMt)#=q~mltz&USNwCcei>`
z>BXyhXu_nDs@{!5($VG)d~w&Z1Hjl-sEoDl@~1P|nGDNhzCFpPna0(o?9zIZJG1t9
zdv@mAleL)&k0-5(sMe<|Jgd_U>Fw#-Y83K(eQ^Gbz_L41tW@I@3(%$4>w5o>Z}X+Z
zj!o#^rZCQJLNDm(+F0NvKFZ|5l3rrJ?V9AhRE0)DA7SBcWp-^!XFlq+bU!ws<&RN0
Ynhm7kvzf>C>qrY&@`$gC^MwJv1C$N@0{{R3
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4a4fc99c870fdda2252e5ba5a40c59c38570859b
GIT binary patch
literal 1896
zc%02uUuaWT82_DnZ_+=O)Rx+nEtZ3er4<ryV{O58;HZQm)(#A%il~<~G+{|^xQ(FF
zLSeA6#W!Jpo(6r|7;G=Hrv-d-Fu{SZvs!$q_#{*sTQL64y*D+{xz;z&%{kxieCPLl
z=lkw=a_(d@If*@3f(~;mk&xBfTLuv50&p*pNKSn5%gQq6Yn+ECK1+^kfkSy9NRF7E
zJaahSu{_*MEV+IumA48f`d3!~{b%Y<X42M-<}CfhwLjU1GgJge0uPAS*&~^J@k-M_
zL})tCp*3$^DM0_6Q1oyJ&RO~NuTT0v;d}|u4i@bBV)ZK=0Ssj?AruuzK7F)yv3>Lz
z_UI~3-2G$!<9eyDx%y^k@EUEzx>(0KkIzw{v60C*bRt7vBQrqNx0=f0x+ld$3<^yV
zgDu-u%FFQvKer$ceCX}vj;Py7`Wb}q+qSk3r+qBYf^U4RQGV}Z9T7b8v4Iv5_Hh7v
z#kh}y)aS_*hKlW!Yo)M2CocO~<8#BuI>zy%j}3H+W*-M2MW2s@)Stx|Y!q-64zid<
z21Vx3j}!(d<1jIZA)*Pgu91=BV{xvm9NMYTqD_`)4j8iwSDox^rYQSU12S$74#^4o
zS~i!n<e2RgY{x2QZSs`S42@EhIYco+l{J%1S-B{o_e;1gi>`DSTG|aL#*ieAvA^lV
z(;p=sX0HX0ggsYG*v@QP#$%>DCbxGYJ{ld4sxWs7X^PuBnD_IPbgi7nT&V)WRN9$m
zYSJ_ZW2R}!ogDg=_j;}3CsbwJxxpH!svDeZ>cmy6>U=3#UA<p-x<wFg9QD`RPV4VM
z({`r(Z__<d{gP$>kAwvbzDXfkUsXV;zhJb|j!IZm_G^`1z4C!^y-k!#n+ux@fiP~g
zhk?Ce{Lm3ba~OYj!cZp7tojI!`;K;Z;J0^eH~>O?4PA%>A4f~&jm5Gkm!ID(>*emv
zo{iNPJ;CzU@B20upWobCYzl=+hKlONLQ`mSp{um7)Yghxo_9W7zN=)z9jR7Y@leEg
z>5T^deaE-?moEo)!TpY5T-XIK?r~jN!*xCy^zpi0Z_oD8G>1`Ep_?*7S-V?>Tbue>
iguRXTV-I@Y8kNWFA|v9Wkn7je)@0qIzAoMu26zcfi2VZq
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1d70be6130ea7791e28ff2979bb3bf8ebb2e7eda
GIT binary patch
literal 1860
zc%0o;O>9h26#njeZ>G~9Z8dFG47p*HhK|=k6H*JBOuA4d8o>giopdHTeUmpMK~$PZ
z1S1wC#MX)p3xb46ti(dX#!mc%1z}m~AdK(6_oim3w6^Y@bI*6q{m!}PzWd&tfx*E6
z)M5fU%-(2JhP96;0bd<}`_brN|Do$IuhM=@JJ`Q@uut<ZJWu-_Aa)PzToajpusK95
zIe%a%6-#5D{s_>o(YGZLj}8Agd;Biv9#FaybZ7&<SHzQ)P$HE*QuT}oRXrR6so0S;
zwC#kVje~zImWpp#ec}S`2|!z(wldk`DXayIPn?$!iV6(xn3&k#(DNC!`g@h_>7B(N
z%C*-5&^*K#F)1do*X6sOibm#kXM~}@C(}pctfqEx&eh^Ix`d`E{_5$d-?IP@S*3K>
za>jCw^mb5>8`Iu)Z1b={HO_cgqrU869U;8+uz_k3^so<&qR+#A`cq^IL)Es`iBedg
z35Pwbv0wDCjy_!Ruz@BK@UV}yw|m%6{~q+hLK;V5BZ(0tkmVj$VhA175t!)0I--8E
zj*&6S9;2<IY{scE#+W407|?5_kJ`zRL{_dG>W~q$Yn|-3jwMG&W3tz>)0Q2}CN1(Z
zTtF?DW@rYTTm+dRJDJXAItkrh)Jd6jw9V4uPC;RoB(ah5XAalDp17M*Djrd5EE~1#
zk+_V6O}SA{uSC4Qv%6E3Ia^7)xV%ljyHCl~DtXw^svzu&+Zk?6nr2tnG)*~MLhs~V
zDV=zaIvK|{R8EeDW6NUE9gA;D@0IY+^m10V+2;R)rn{<mlE*#6h6M~hK_O~>J$a!%
zy;X$<6c&j>P%A9f3k!^Mbt1>+3*vM`5NHe{H$R9#5VxA3tAG_e<qdOtyQi0`IBfw<
zh^5PN`Kj@|$mhS@&g=QsuWeIrezf`X-)^={jeoiQZM>?!{_FAPTuZL52BrNx*>v@(
z(iL~0nyJBS5$2`V<9qRsPwla*YVXZ~dx>T2n*%T6avfd5WjQMRkuoWZ7cIc|=TP54
r0Ik#^>eAh*dZiVj)bajn!;-&N<uaSe2sx<U$?JMcx~!{z4<$bVwiNCS
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..13f7afcb5011fdb18ec9a7beeae3dc046007759f
GIT binary patch
literal 1860
zc%0o;O-vI(6#iy+Tgs381(1YdCR!0<TDBEPBzRC_gNX=<1kn(+VnZ7#+iYtB1QHSw
zqm-Lb<CT+M^dQlLHt}RQnBc{mQHUNedc;s5Qs3-uu>}>*&UD`U-kbL~KRfN}>FGit
zCLu#@_xpLH@@)#R6#;nZ_xE((c>Hme<av^vohN%bBzwaJlD`0~uj_oHuk2cdi!i78
zs{@fh6#L{ifc%Jbr$WKN_08$=7c}>ZMoWkkQkU%$;T0OLP$WK*_l^+q+K4zJfsrVr
zZi1|uh<!K^37+;$-XnPukPb(+SUi0T#{lI!&2une3iO}pU%pb(_5+3TvWT|uy!LB0
zx0(Zzg~*4kuoYY~?M+QiBg<}sLXnrr(ni9xBvvtFa<&LBlZ1&qf6Hro6yP;g$<15_
z&9>pz3X1V$OIwF?7G}uD9ScjuA6Qt13!g2lAfGucY(pvQu&|x<5wc{8sO_xbB``xd
zZdzEPe%Hb>I`GiK3d)(o!ZxbC&cb%mUqm}JL@^2-VGJUKIIW=`185-bg9<O22z8Rx
z7+DNa50EUpbn+84Kt5qY!$7+h9o55wp*XJ}Xy888+r&GyvGCAPfVXRURMP|Tuts(<
zN+1$O$u$NyB|>aK4@cuMH$n5~H$uh@u2X42qaY8J#L-G)XAD!{Ot{66&EnzLhU0!s
z9}IGzN9C=2D-+>ncZ*w;xm!uSlwK#jxlT@@MR1S7MM3Bd>M>dxS5>b^RaL%QK<nhq
zkvZ`;aWaOih?qnbL+0tUNz+T2d&TU3x}3RfxB35|$tFuriS6CFU<QSDkg<Z_JI}<Y
zcQjRkR1HfxrBtn)+ONzMu>>`n6Sqs8K&canGAA5PJS&GR9FEW_AK%;U-b$5o+6)q7
z2M;BZs}o6<Os>r(<z&@*_3F}QwLQ7<v~qP~ZEj;Cuef-9ydqJVC@Mf^J#SCUE(o6U
z28x*iEHV#0YHhX;|K6mUzHN$mi#P0HhwoDvm-k@jGi?o?!C5hK^uDZ-<<BaCpYI{Q
t0|%;zyNGArPSJBE7mXr%|Eh7|uT`0r6=dNuP_Yr$)Mj{A7ylk&`~q74?hOC{
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4326ead245fc46044c0ab9d42c67ebf1487aca5f
GIT binary patch
literal 1896
zc%02uU1$_n6#nka?BvI=(U@o`Yq-@_l84<+R*fJjD3K+IX$l5uMbu$kvP-j>Wp)LX
z1VRh7y1oh4J{9uRzSI}#lM6ly7AzFs{0n_a!N*9}__O`)%xpTVZ8wkJ*?Z4-&OLv3
z&e=PYQ&W@JgazoZ#?omy@Ot+yAkquqk92x!;;WyZERtU)ADcKlHLjT-Uj|GA5MN9l
z|0K0#ab$p4a{p|mU>A=JE<FMCpC~(;%i8BOci~6w-QgU`QD7d3JSAS?jOPmF3vIs>
zq3slx&VqfR2>o+H(a*)4wF}vC>+7537XWQ{(J7Vd-(oLdD0>N^RDs8@pWivtJ^BKh
zbd@I_{JP_>Fx8hmc{?=tgEnGCtl*@t&sCs#P?LG+M25ah%?L$THFb(>J{8X}EHtHP
zcC1?|FNd1^+=blvksr%j5sD;(6GZXLx^xdd3$Q>3t^`;k{XW1t;`lSb20BD6z!7W~
z;{i4)FHln$Dz{^vmBIo&I3Hk*&-DQ77{?C*Hqay50~~=Adjf1y{w2oXpooibk;gQ0
zDDw=1$Y6*x1q;L2M>IjLOVpU*W0O}_F74E6(<V<e3ye9%i*9~8SC)gBA(^s<_sI$8
zQhsK}mSc`vbX>cfcc@ol02Q!E(-IP@0ZJJ+Uo4jrg#It>xh#9sWolV3p(In1ILP_F
z4`05Yc!aZ&Jkri=IqkU9S(!>&@}OLgM7%#Sl2B>3O6df{yOjIqlyt3}Cq1eX!ilU~
z;?bmK4JR$jlC2yDmG@_(;zv|vJl<dpRMidgn(DZEUG<lu^`*z5?iMEAYxQ?WtNjmP
zXsuQLcj!K;f5Wo>%Yg+9zDXfE|EYjbf5Akp8?~6I?a*oidTqOLtxHrYYjbOJkr=Lb
z$AHZ-+}sjFdkpt`U?`JzR{a1Dx%Rny#-7<&!>>neY5*ZFLl<J_u0*A}I$ssl>dV_z
zy}E6!e|70?zgc~Ct8aDw<?UDVZP94OP+7g5Ym2VU^;Y^SU7cv0^S4hIA1K;%N2;Ap
zJQGP?dZUp?tzY2Q??TMIfDUco&EH@er#GON@^wAhz#$(^@>FPs>_s2&<{|MYtFVnU
rPTIIzg;$#}7w7Ea{n(Fz|IEtQ?4?HBLs8GKFKy7!qrNWw7Y6tnOkDsE
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f807eba4d8d01b05b6396fc65a6dd1ee688d0428
GIT binary patch
literal 1860
zc%0o;O=uHA6#iy+lcu${T3Rg_WzhIjq;V6qpwxpFLc!Jw7Euv3*3bl-?y`xXVnI+u
zjW<CNZ=MuH4;DRWz>|0o>cyM*gB}z;RvHzJ-|TK`;$M4qCU4&N-n{qby_wm`z~JBj
z=HMiBm_3PvjD<d&0s@Ty?k5t1{fBS7xJLOg<#7Mz!Co!6+@kyz5W5C;tclM**cu_0
zoIfy>P1=~NKLYgY)NM(pl83&ZKXH$94@g~UDzt&XOX5jVB%RG4t$Rv@x^51kZ1SiL
zZ9Ac8=MWrCW>Z_^r>{~z324i0E0-^y!CJuh$ax8&Oo6@)dvES<?*4>1`a2bE;_l-2
z)!c6(Xg;Ekm=u%P<Jo(fnnug*?g&GFN6P?(^O~ySg2%-x#Du0yg7wp0zeWKbGE3>L
z<&M=h(yyQix2Cl#u+7H;^*HBajr_8Ybwu#S#|G*}*vA3P6TLnTQlF)zFjQ`Ru9w0B
zEjZ$1js2pJb@bwjj}5elkdFh*eT9#M)bB<QEZ8^(2N?__jXY~ug&}m1$6+FdbwvHN
zI!=ob_9SKH<<L)!N%~}nMu8s7KIUYG(|NgSs6)oh*gDy79nXx6BxR4~*p`#bXDr&~
zxPV&FrfUwJTmrcvCu8SxorK;m;fBn+++k`dH=!s~lGsT4J%*=WPuxYSB#(qOnon5H
za7xCbrrao}S0Y~D+107ioGGQ9T;8GHt5Y(x3LbU2N(ehsPL8EX(~Lz;)08s>^iSTS
z%87TYlW}E3#pGzXvMiUqvHZGnuSD=qm$SCbH2)to-DBlbJnlafEMRa4g=qM>^Fn=k
zt4qx&EfS@$R$8o=78(~CMS(34#@XgDFfWY4{4hdc+-ZTX99Hs_H_YyKPcKz-+5(yo
zOP3XjQ)5L@EPfs@>cs_L+NWNBZx0r~-fo*3`#k=2tgfl)%Zb)PTcNQ5m3p3Rx;CMB
z%^Rp@8t_U)`KWaVp8viv3+;dG+GC%0%wmTxF^zq*u#0=PF0bIK7&ZEM6;=6*HsISc
usP7<z1>_O(%G;@WtrQ_O^8IValD}r<S+>$5;-V%uuBWZ=s;>S$6#W3dtnLi}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..018d270f1c4f9aebf404f7b496152db183f9a812
GIT binary patch
literal 1860
zc%0o;O=uHA6#iy+lcu${T3Rg_Wzbly(zuCjQK<*5gdVIdSVTRjv4$qtbi*csEfxep
z)OZsVFCIMUMGuM|G~h`*2zv1*+M)+VkCjG6<2SpTn)pNO)tS6`-+S}DH*a=!Cj&!6
z16YL9&|&t*VlrCy;SAub2k;;k8|puP^VN0QPiP1GcMSDu{w<qmzXinpfxVleOOG~(
zh$ZKb45#B6EY=?b`VIPaCKK^v-!GiH&$)+`?j#-BfbTW&3?-CI=T6o<CqhjRhd?@h
zG6QXpP_%OJkHyo8J)LK-(LN1mYcp0hS2~N$fbo&@5<*ddU6IXghZ}o7VUhk$WqWpS
z<@-wQwE#2^F-FXY860%^uBWPzIp~Zq^mk<XXk5_LE-t!SOd%pPMe*0pMg5uuc*H8D
zyOuLna-_F|2HcwSwqcKl1!{5L!y5G!59<iwjfV}?ilB#mSR(p7?596XrZ7}(yPYV7
z1)6Ze!y5Y~59{c|RSz3z5&;kUSbLj?{q!F|FDzs*4jU<qAc-9JupYx`r;frz1f4|v
zWKEDU${we!qHM;gG0vD2(HPKcWybB)NHQna54X#x8R?Y$)<kM_G%kBBJ7d}LT*@LZ
z%LUYe8HQ%jfiAj+?Nlb0?I3i2F(+lt(Kbs<I0c1SlEgO3?>St57jZYGTs&gdST1JS
zBMBJ|n{u0+TZy=<qq{?uIbTWpxV%ljyHCl~DtXw^svzu3*ja8(nr0+ynx>pDp?C7G
zlux`zos44}Dkn$7v1O^`j-~1HdnNpTdO54xeDnW7(_K|M!{h$Lh6M~hK_TjXK6#-&
zy^Y026jz91P%Ey~i_49R^&-#a3*ua35LgmKerXVaAnr6lR{`sI%3BxqcF!$Ub=m@&
z5UbbZ3$v32Q7C-AThI&3zO>Fxe{b~{zTR$`o&0?F>tszs!<SRd`IdZr9m@N8y8Zey
zrK|2hHB*Nv5$2`V<9qpU4{bxy1MLeSUuGGH7Ql<TTt}C2MUE<ev_dN4MGNrl1=M#C
qz%uF(b@}d8z1j*<>UsaQV%1-(a+%F!gdEi1<aNDeUD4IQhms%fnC%V#
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..963f26179c7d5fdbb14ac50eea6c3bc94aba917b
GIT binary patch
literal 1860
zc%0o;O=uHA6#iy+lcsHKZRsDF%Am1YC2^bnfF&L@5PGn-VkzoDjWsmErW-a9+R{Ry
zAhqdDP(0d`UR1ECpaD<fL8upRqAdz4daN|I*!X656BDhpUY*Iz``(-Hy?JkEchb|>
z*Mo9QLWUX$26?OV%M@U90(cS(_H|#n^LCE(7o@wokMwm(_P|HdKLG4h&&h+nstYx4
z!kpI655z)oY?Ge@@@=vmjf6uN*Js8b(b`iQ9T74}J+^m*mua{ovE)d}D?%vo)8vSS
zM&giq39<&7?8Bj0_(aF_Ez&0eX-`~BB(qo03MgM`or4J~;BT(Kf3DL14dwDD5pCgN
z<L5$YH3uXMkq=vD%Q$25O-oTDX0I_rkv|dBM#_vNs+ct;TSN<!1jSyO_xe2w@QkwL
z=3d5J$l+E66}X$XHsQF18A@^0!V<|F7M9`0dkZTlWiAWbu$^^T*iQBsF_|KAJ7#zZ
z%utQX7M7@Av#^XV+_bQQYUZ%8jdE|Yu$}Cu5rBp`Mxi5$K}3+G8unoT%_MzL(SkNY
z-NYIr#t`)o>B37VKQV{MCrW4-2x#$9Jvtak@_hr%+^4p*@osG_Iy4mG0Zor<dMFvy
zh?k%Z#D;NlO~8W=G7ad_crxK3X#Rpm$fO~4N-b<8<fW82I%)hF!?d>>*pp8lL2Wo0
z)bznH_jy&`$@4oAZufL}M4FqW)KA;%WH;;N6j}uL8d4;L{;-~)(zvR&cvV&9n+3E^
z-W<6T_luJ;bVbCZSuu2;&6;y|DfeD6`$jKkaocSDKWMTkvQu>28x+i-&=X{=?AMcL
z;?p~jsYGT6%ebUWqnxQ%W}PfW&E~>%r3={ZLaNFIhYJs?Aq$7SbjpXe_IBsDDmrZj
ziLqU~Q|Xn7G)t$y&!^>d-D<<i(t3kEy>_p5W#aq%+C)i3#p-xXsy5{;L$02ehvycA
zEV={5N*NZJmo7EG?ajYEwEY>N{4s&%Es(EM8fUk_^O;;j=5RrbBD=3(6!^1R;Kyr-
t@4$gNl5Uc@yHoUH%}v8e_g@2c{xvI;SwjrBfhvr+rZp!Ey7>1H<0lj{?+gF{
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..98f6634187e7721d4fe56e735be23fcd80b3f6c5
GIT binary patch
literal 1860
zc%0o;O=uHA6#iy+lcu$%T3am`Wz_gnq;VT-{h=PT5PGmyFo=3kV+~ET>4r@N6$^sk
zPvcEcyov|C=t0qg20Td*f?m9dKj=ZxW2I5i_|5L7CR%CF&g9Me-kbN{yf-sD8HmRR
zFb8L#!|aX4WLNOhS-{r_;9)El?>~0y)pg3_ltca7;(eNb*?G$E0kL;r_qyo(!!2QA
z$@xQrnM4+I^(TOSle+DxWa7xrvC|JY_lVS;qCy++y(XR@g;SaQiMr=RsO#Yn$Rti=
zq3t3RZ5;d~iA*xSY3v5&Gk~@-YvuCgb65`;pE)lflqt})Z12&7O+8;QNB^LrJ-ff;
zV>S0$0GfyBBPPTI_Ph43rl!$ymovi9KhV-gVN6q1TynX1gHE9-6My}b*Pl^<$IMc?
zYdK@Jjr1xA;`Wqw6?S@9pdJ@JtdU>!u#Pa^dDuX`2zl6td7{t5e(E!{6o$%ehvTKN
zKr@beSYyBJVI6(A=3xWPBH&>kb6@3QKlS_23kzACgpD+YkV2j{tid4K$)hmQi7ujk
zTAiZBFnfZs^0Mit#sq!RL?b}2l|5;vhf;aDX0TmG&CV{_Z=FgH4<}@=WoIorkxyH+
z%W(m<V3w{qbYLS@gLXQb&vg*GznBv;?{J%`C7pyKOi5x3>F*e>egkngsggWm)<`~P
z*+WSgjhJ$aoLY%^Lq~UqN^_=^_HcQddbdu=&?<Pu;VL2QN!mG<CQY+5Vw$F$DWG@q
zE>%vvN1co#8!9G8!;xjV?2hHPm3t-p(_PNmHq-on&~%rT&+@pZDOkYZ4hqrmd*_Av
z^wyS|P+BZXA+5ATFD)`IHHre8FN6zCAz)qzh4~=_Lb%%uT{*1gDQ}+L?Vehy=ClPg
zA(pQw6emZEqFDTTuc#Lnerub2`?Jko{C=l(a`fxH@1u3W;J4E)h1No211j}A-Fp3*
z;x%uenrXlr5#giO<9j*%<}A4Ik6j!0c>64N_zKfFFblh=YwPd|u8L8kk5*BYzi0)1
vyny-+0$4~MCa=7ms@F<kQX}8LHZ1*TR<30WEy4~8I&ocXg;#a;@1f`y`t9xw
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..eca5ee75caf010968c8238de01e9b9cce1d53433
GIT binary patch
literal 1860
zc%0o;O=weD6#njeFKJpkZ7r=<jB?S~AGGl$+M=Z{#zN@ATEXJaEM|-~G{L4XyhKp3
zAPAzSJ3(>lMrWf7#aYY*Tn#P;oXzaSA9SJUveKxG@w@Nc)Wjd!wfE+n^PO|gIrp4*
z-@6%~m>9<joP`N{B$1E<ZLiM(fo1@ICK3~4$A5o(o%#dn;jy15MvY*shx!XZ92(!h
zHNNs_M}$~%{m5iCnZr-!-++0Ow%zGe^4P~qXa3;YU!=h_4aRuj3GqBBlFk-RHvCJ3
zhGDW$HhD4!V;`aDA`8wWv#Enab2q4;1&mEOCts+X$2P!v!*vOvT!AfX1|q+;4!^|;
z^QFr6@ZP#twNj4|42>8g=EXdI@%?>E-Js__kHa!w(lbEilA*eo^QCx-m@t$}uyHZ!
z%PhcsRw@0xJYMS~bq6iDwP@|eUX2ABaZzJ~@~XxrB6zN`g+>w9IDj@Ws&SC^EIoy#
zYTM&QDJ;;A6B-+wmo+vqifbBMXcr-k1FXGU;~?#aF#-oUoPvuCrjSN~J@jG{eUx$7
zh+#X?7`;x@W12HbT}8Q!Q#{F-4ABfQ;^a=bnW=O^_D=T6xE<Rr$DGrd>FJ~#aon8a
zCJPydetB-7Hq0?JkACc+Y0}N)3i*CQ|CjJm7Ch;)w3Js+lqE?Fk-pC1+XsjTN!8+!
zaApb#$DK;ac+{3da&af(f&RgMRpwG99pLsZ?S7w<sa5i*Csjc>kaF{EP1<%WYTLG4
zDxp4kpQ<N5tWL($EtQkp@^o3L_`LG0`d*3Pw_eWrvDEqxFic-m&hfav(XfEUCn!YI
z=O-`Jr?<J>it<`f4jbilW_h(W*DQ)0fiNz#hJm&)iYvnig>k1HrV8lcDeqj~+r79|
z-DwLLLTuPrEG^8IM5*-dZpkdIdf&D1>|<B3^x<~r!tA@dA7&d`THc@OD0UW`n^5iN
zpIz4<Dp_|2s+A@@6;WPl!+}T3dsrKLHF%(9-!g)(u#8`q;TQLPJz2#yIqK~38mfsG
yoxuP9L45}ytfGuiR_{(V>$M1}nfG58)_=Du-?M`r5f8O^d3|eD)=c&9q39FT)a?!c
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..80721864f9a904b909bec259613d1f699dcc8441
GIT binary patch
literal 1832
zc%0o;&1(}u6#vcc=EGXkTG|>g%Ai48Bykhl9;6<$5<S>fuvAe{*BYA8rW-a9+R{Q%
z6f_kS(LbOk1+|x|7XuzdJP7rm2cc-a>AlieKjNF+NlB!o_3E3vdB6AOea+17rn{%7
z8yhhJ6?#W3#_u0>&j8v2fG4q7Pv^jck5ho_A?bn6gFQzT_nGUYzXsT;?h|{Xn=jM{
z33FOM-<LAd*rdJ!)LUdbl!zM_f8Q8;Mr+TB+Y)3@x?P_Li~PYvDm(0XO9&nj?@bxQ
zX(-1DGCxi3AtM!^4rP`|p8%9iX)}{8Uc)}>?;WjkFyRW^eK}WmuBQDPHmYAlw%MoK
zzLrZ#UMLb#3|n9eIPLg5mI@-z<Ms?q{X(8DQf??>7n6=;^N27-xVSegNBx}zctKrq
zr<OgJ`*67fA097TccDvS1`n=EtdP7dv5Fn|Ah8AytCrY>TGl49o9rjalWC&2V|J9l
zjA~tySfO!KVikvRM`De9eoE}3-s>fH!^e)G118cKfrTXckwBLA(1boTlZ-+~1TBO*
z$!nB625A_iiztiY#B5MZlF$&)VWvl{WPc*doBEo0RFAaqPIELlIB4(=(@L9`kxiQ9
zm!S}YiVPq`1(3-aeFGr^&M#&s%i7YSrs8%hVQPkBKXGNWV{0YcMqFwcF>@#zGp+tO
zkA`)=pUWDAT0?Ci(c0>5^ioNSR-IjON-2_tZ7G^SZ`{hzM!2p=!n&^W)l<nEb~qq!
zvt8VPt!pA1&6=(AV$qq4pG(gVbFcIeR?=GQ{{g9vC|;opUSY!w8l50x-qN`<@q+Cs
z)S$4H6#`0On_AeSO;)oUkt=}9H36VDfUBDW@CNXx4yp*)O?TY7zGqk#D!XR}g|Qtw
zbNR*bJj>_5&*as7<C1^z^KZX9|6{sgas2ztk8zLBw=`CtYsghsm0Blyb6{##$cpcr
zSgFE13)6?I-8J`*C-z#(=CxhBIJI$h9XZ9>-;=V0OZ2xrTE=DZtO5A-9^xJFqLE~f
mWa;}TMx_=cu0|dF*uH94j%Pi21a0KA^E%d&EF0n<Lhv6z9OV@N
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..90814048b082e83af44891680f703f1b20443f34
GIT binary patch
literal 1832
zc%0o;+e;Kt82_D_*-NSG1vR5JPPLR0uH&XYh&`0C`H&eT6%o~Bi@SK4Wn3XeK?-~D
z0!7dt;G56|!mNiD>Lq*#>Y<<@y1do9;hO38otd+;t4a3SIeX6c`|jU&&dh9kM@KvI
zFbWlVOE}DDTHSMiwgBL9INZ_JJ@aWAaNQ%`-*%*<RdMg!L;O6z&b6Pe4HaK04G`v}
zzueht#8IHW1k_t3I~t7`S69b}pOEeut;Q$`ly=u=!Xkbk+MBrMc|!;u;qUD=uEn98
zBFHLebN3m&kw>)yE5wfiN<rN0Po!_+5Y_jV^c+l>0#h$8yuVb~`~!LFHxcdiT;=y{
zDu)+}MC8L3*aFTw_KqZHkmV_Rho*ibOBXTYis)j}q3jFlm?BKv+t$3+M**HwmE6f?
z@7Xq7cHqN<HR*nwl$gPTF^LtTw<T7w7at_n;9>a^yHLa$C3chiELk#5)ON!55|~l0
z0f`lwQxdB<hC32#Wb;d67u8-Wu^T>i94#;r#~>`k(1j=x)I$|IQB5=i9d)QD)J9fA
zWYI&@AYOP`<R^B6d}4(9fEF`8XvMms30~D%%|m)!J#RCIVm&<uZ!xX7X&H%_Np}6@
zVo;K9)KC)iCydVS8UoHQYzIr&)S{vyb}2zBhNFpAuD2s=Alzv4PRR(HeTlGXbwzk6
zsPiT+a}a8%X{-^YZC=J1N@<bS>55ZG5j1F1Q3TFJtbS^Q>v~;K*LA*mD0#!q^2^(7
z7B^t?nutcbX7fCqcJ}nw%=5$Ce|iXW$KUk-!B8ENz99~GW5Wy@ogic0%(*l1f*nj1
zBDIU9{7R})P3_Po^VtLqmmk*){Xmf)W5s@W{kUHORX7}=J8sz8Gb|Hj-7|y2*xr2;
z$;FW*OD30QlWMa3XT{>z)e3iV`C-}O$kOcch{xyqIb1qXHj%$QQ#y@Tho@f)n)96#
zn(g?)g7o2Pc76QE6PuT`dZQ}u=|&m5xP_Ra&%2UlaAvHRhq6|dKPv-P-a)(rUX&9J
n5Y2oa#mwabwDM7c3hdsrD#x;vECM$2*>N3dhGtFi4<XiX`!wYh
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bcd71b827a69d25f0fa34662b1cd19a013063377
GIT binary patch
literal 1832
zc%0o;&1(};5dXd1&4;$8wxk*{%CiP-k;YB5IY>QdC3-MMFsOJ?*BF}6j}4m$RV;{7
z4^}}D`~$oxeq8+M!GI^}L97Qo2;#?0@0F&l8t3i4l%zCRug=T7`OUnUdGp@vZjz}~
z5>2=S6?$Jh&hH;^PXO99fT!_zDlu^H(_O&zfb?KuPwIf;Ubl(#Nq`+s9@!pkJ>w4%
z=Cpn~J!IsuN__>WH_5g)n=#J*zIO3Bt-T<QWyzo<U7rby{Gsenam4eM5IiE@J7kRH
zp&Ta20yMdYjiJob$cWG{0m`bpStwSnVh7dtj*J{kECFMs<8My2^!`AT`b}h;dbZ(v
zt(4@2A`!)~X*P`$j=y86Bl0|K&(PFw<mn>inj%hd-I44IB1{o3?iCABi?aYPsY>qb
zWzV%fT%N#(M+??1I3zKH2V)W|ByUNqq5~f!*5F~y61%XP#Uyr<{TO*NP1JVKjuM#B
zUgsoMXxxxk#Xj7YSR<dG61%8&zr=3%*nafEL>}j1A%}isQKU0;B8@JRQRs+ZC!qv+
zT_BG^8V2bi%Az<i8x)fxGz|2a`SVt;KU?IT=`J4CBRhG*ypS6lG<ctB<xR^d=1lS{
zP>4aB44_*yzfd&N1Kk9iU))Ysw53HwW$aSIR1C*1;`(UE)<ZZ(TrC-KbGR5ct^N#;
zhIPJ+%RLD7bjP|yX^qP`N?TgA>YR#GN|7{dOHl-lW~>4ogzI`Ftm`^&oJw}s;h^kh
zujqiSYa$!XnyvFn#hEK#tIrQ}FZB@C)8E$r15zDPxk3$I;=l|V-5_J$>b*1Zf^93e
zpuC=ygGzaWT3)MNZ)W2}t{^VA1cB8-jI{>g4dP)NR1vV1dfc<TXIO4j(`N>Sv5w8-
zrJ2zZE0t!Sl+@CixxmcV-vM`N{&D-v=<JjEQIF3zchNuIKHj{tS~}6|-FK&itozQ1
zm6iCy!t~+lb$$HD8=I7}tFcSdM9mGJTt-fD_jjbM;wmk+M{Bqyp0xwN-b1_tUaTP*
nB3b=DicznHh?~)d05&$P%JKA*N61D#JFjD{%9<hmAq4*cRe<Cc
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..51bb28a56e0caaff90e1ab153a6bd1792f502b00
GIT binary patch
literal 1832
zc%0o;&1(}u6#vcc=EEA(4_XZvWze84lDJK64y7J65<M6r7*u-EHHId%>4t3tEe6D|
zgHccf{{U~|*TpZyfL^2rp$d8s#E+ZaD~+G=&F-WmVzFMG$(#3kZ+`F1o0;8BDxFSY
zDNaCz9#16r^&ReqfHn)@ZX%IRj$M0u6>!}kJDA*(-l4cho{&8au>Gk$8>5|vx<iCH
z%^%DZj3Sn)PXYBJ`L^b=#^Immj^C%bM<lTvIh2&^9bu6_lq-~udY%)4N5p#z#?c~_
z-2_>H2KR(f$UYdDQpr96D9eiGWT}1@161Ejn&)7G3X~tbIDMdf_%oKOA4RsAd#gS*
zYuUU|B%&BL%Vsg+@EuP}Bj#><gr<HZri+YoirB?@N3-|nXNsV>m&`}~o&|VJRdQ!7
zdu--#xdT6L&3o5jm&6PnoRL@|eMw>!Yw%iP4Ibu`*o6)jlh{rEeZ*v%sBNbmB`~A4
zj!3LfzaX)SZMZD4Mx5^wyQubViQVwC?TEuf5yxO5k5S}MqCNB?gFezx=;+5LLP=sx
z5o4UXLAHppC{Bz9#pDT10CBT;%*v1EO1wAI$D?}xCZ05>^5f$MkDFG}w2V^TB;F*2
z7_`V3!jvA9B_lHyCgA)McCwPKEh;K&mlC03IEF}CqaEKM;TTDyWF*XqQo^)GvpgEn
z`4E?D5E=}}!lJZ=%h*dxS~TnIic?CFG-7K}1omdFN!ke4_5O&i>wMu<@`fD=%G(?k
zH(=YE$VQ`P+q_<P#`=fG^TXVKdI($F-{${=raG#AiZ1vM8)nex1R3)-&Yg)DY(uRb
zwUw+ERBEf#+6wKwk5#C-f;ib81UiB^(;0*}h?`wdMZkKx<H5x}!*ZdfduC7=TeG%O
zohw&awff~wRjn@n8kqa=GvKa%yWKNa{&MGA+2i+rJ>FgEsrcF&rBi#h`Ra_&E#EmY
z(}wpfLLaVS*PDMlv1zIM7Qwv&?Ba{yMIElK8@MS)i$B^VP4TP;`0)zj9q?i~=@9A0
k_fhm#D@5W$7XnzlU{wyYn;0P*`R%-px1pQ5_=gbk3$G^S6#xJL
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..12ea7bcbfc173ebbb851c73fd4b42db798dab3a1
GIT binary patch
literal 1832
zc%0o;%}*0S6#vccc3T0<M*y2x%tRZ780xlC4g?R1sl<pFC4OCW#fCOewpmJ|1QMdr
zgJ7aD@ekl;f_lM^M4Nar9!&6{2NUDR4euBVsP)b6l(Yt-UY+U8`@Q#m@6DT;-ED7Q
zUoR>#2^B_HJkDpk_2+=L2;fmX-q$mD@8b;MnI%2gv%jxf(F12le+979y(jiWYcJG?
z2y^nE?@yZ<Y*t?a>MgPzNG8mSKW~gbAs^*Ldy))FujdnCkw277XD@l*5Q104`_ks6
z43uL8S%4;e*i0v$#m05gCjn)1#u~{Mu46CN_m=z|Oi+Q*N5>DJtM2@UN_9bGn}6K&
zwN%RHgCY^dutm0rvo7DYlr>@=b7pAj0x><L+)%_Wrd`QCBf=Cx(KoF{{hkGQK~-{h
zEoUy}aJd6N9;{h+;;6(7UR;w{A$eP372EM%VhvtaC9wxJtX*QA?5BvyG*R0TCrV&O
zYmG{*P`@d$ii5Z#u|}Nl5__ojdWm)T*&%enLI#&%BZUDZk)=H}qaQ6Kqc9Lb8=)Rz
zjS*vrx=Ff-vMEl?CdH%(4Fg?P=CYj{NM?C+e+!Qqkv86AjirW$Ox|VL8Ot`aDT{a`
z6k^gMgJ?yJ)U4S**h;|t#hqkXN7__W!YL(8#c*`cD35k+F~aRMiX|g%4QJz)J&@qh
zu)#aHT!T=owY^o8ws9FJX-S*B?yfkc6iLI56h+`<!XBZGaKng%4a49Yr;<19j-b5F
zPH_W{u8C|kYmUwf1$QodDLy|;U+*C-Z-4Ut2TgTF;VND5IvZxt=mZ(_70;cC7i@RF
z8u_g(A5`*9YJQ70UB#xTd4jl79RzBExK<m4FNphfP({Ely5rd2J;QRLl6z)Q7~8&M
zDz`L|W4YY&Tu#k3t^}68{0!*1)rSpB6U%d}6JEc6WxRf>VXCU4SUR=W`)1~aEc?z0
zPX#`+Fnzc>Js<w@#9m3+vc9|WX^C?8FLOpEH(G*Ab41tSM9bq@1MuS=#5>?aBgqiS
l;`dSXaxFxo3Uvrz+lE!S%z9#k9OQTMy4IpB>Ea(kj9(4`<Q4z`
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a640cd553f18ac755e5d5d7fbad5621acae313ab
GIT binary patch
literal 1832
zc%0o;&1(}u6#vcc=A&O}Ev*JjWze7&N!-S^f>cl|u?K4l2EQ)4*3g7D-LQ?&ij|`1
zp{bw<{sFxSRuSsQ!H6gEAm~94f@piwd!?yg@y+g}B&F4Qbtd!P@4flGH*aQkH$Aaf
z52`Q@6?$hh%BQ>B&j4*6z{6-X);)0N;}qb!OLm}pf2>P!`%jYn5@08Kj_!=CJKGQ>
z%xV5iU&=_MMtuROH^_G&5jW2Lnz;Cw=AP1MPmn|DaeX2z@&^;C%!ua=A$UZ*H)V{Z
zq4W}DeiH5>BNczP`%(qj<A73=Hit8XYuH8gy`^~$Ca6H_!I6EZYdgN8O8qRdy?)g6
zrBuu2g(4Bfuz5C*Qx4zplr>`Z+7g=jnV2pzCKR!YNk_9;v@k_b+!aev%d-H_sY>pw
zWy?|ympky`-ja7Kj!4Yl!BvSB(l;emu^I0r*5F~)61z~x+9h_A|2Q$3CTcruM+wYm
zt@9Eq)UQjd;vjBGtP$sj#4f76L1H(2><~I(B8^d4NTMGJWM~iD(T8Tz5$I?^E1_;;
zT_DCFb%SgXWl@}v2E`-^4FR2IdelnxCo+6{Uo(&BEv>xUypS9mG<c_JrA^DoBu(NC
zQ;0!}3?PJdGBZZsK!||zi`vODwzjCKxLrz^is9HpqdeO2wb?kdR5GIGP$p_x{c#=%
z>wFKFYY=J+wTDD$tCw+%mb7Tr*%hahB5Byxq6i#|Tf?*wuInvfUDx^QspJhiBOq_H
zL)?IEYa$y-&9-@=;K;&U@%dryl^(+K_P6=}ps9{3T%ikIVZ#g>ogic0;<+>Ng6+uH
zBEOO414_P0&2P{qt67$sD}c+j0iZ5`tLp;r1~6R@RRnCKJ8oOsGb|S>xn~B2vCUhu
zxrMPD%jFhla%yh<H~+%iFTXqY{eI)Z*y7ChF^|vp?P5c=F<V_(ES=h`y;HA+F8j`j
znM%yEFnzc>Tp#}N#9m6>{AXI#6B4)Am@^`|krG^N%l(m(Q4-G@fuHXn-T^PxlMa$D
leji0Iw}LdPQ4c>hty-1CY#>I^Mm{^Q<1OlvF8(3J_zmY0<Q4z`
new file mode 100644
--- /dev/null
+++ b/layout/reftests/mathml/opentype-fraction-dynamic-linethickness-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>mfrac linethickness</title>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: fraction-1;
+        src: url(../fonts/math/fraction-1.otf);
+      }
+    </style>
+  </head>
+  <body>
+    <math style="font-family: fraction-1;">
+      <mfrac>
+        <mspace height="1em" width="1em" mathbackground="red"/>
+        <mspace height="1em" width="1em" mathbackground="red"/>
+      </mfrac>
+    </math>
+      <math displaystyle="true" style="font-family: fraction-1;">
+        <mfrac>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/mathml/opentype-fraction-dynamic-linethickness.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <title>mfrac linethickness</title>
+    <style type="text/css">
+      math {
+        font-size: 10px;
+      }
+      @font-face {
+        font-family: fraction-1;
+        src: url(../fonts/math/fraction-1.otf);
+      }
+    </style>
+    <script type="text/javascript">
+      function doTest() {
+        var mfracs = document.getElementsByTagName("mfrac");
+        mfracs[0].removeAttribute("linethickness");
+        mfracs[1].removeAttribute("linethickness");
+        document.documentElement.removeAttribute("class");
+      }
+      window.addEventListener("MozReftestInvalidate", doTest, false);
+    </script>
+  </head>
+  <body>
+    <math style="font-family: fraction-1;">
+      <mfrac linethickness="200%">
+        <mspace height="1em" width="1em" mathbackground="red"/>
+        <mspace height="1em" width="1em" mathbackground="red"/>
+      </mfrac>
+    </math>
+      <math displaystyle="true" style="font-family: fraction-1;">
+        <mfrac linethickness="200%">
+          <mspace height="1em" width="1em" mathbackground="red"/>
+          <mspace height="1em" width="1em" mathbackground="red"/>
+        </mfrac>
+      </math>
+  </body>
+</html>
--- a/layout/reftests/mathml/reftest.list
+++ b/layout/reftests/mathml/reftest.list
@@ -150,16 +150,17 @@ skip-if(B2G) == maction-dynamic-1.html m
 == mo-invisibleoperators-2.html mo-invisibleoperators-2-ref.html
 skip-if(B2G) == maction-dynamic-3.html maction-dynamic-3-ref.html # bug 773482
 == whitespace-trim-1.html whitespace-trim-1-ref.html
 == whitespace-trim-2.html whitespace-trim-2-ref.html
 == whitespace-trim-3.html whitespace-trim-3-ref.html
 fails == whitespace-trim-4.html whitespace-trim-4-ref.html # Bug 787215
 == whitespace-trim-5.html whitespace-trim-5-ref.html
 random-if(winWidget&&!d2d) == opentype-stretchy.html opentype-stretchy-ref.html
+== opentype-fraction-dynamic-linethickness.html opentype-fraction-dynamic-linethickness-ref.html
 == operator-1.xhtml operator-1-ref.xhtml
 == scriptshift-1.xhtml scriptshift-1-ref.xhtml
 == number-size-1.xhtml number-size-1-ref.xhtml
 random-if(B2G&&browserIsRemote) == multiscripts-1.html multiscripts-1-ref.html # B2G - slight height variation from font metrics
 == mathml-mmultiscript-base.html mathml-mmultiscript-base-ref.html
 == mathml-mmultiscript-mprescript.html mathml-mmultiscript-mprescript-ref.html
 != menclose-1a.html menclose-1-ref.html
 != menclose-1b.html menclose-1-ref.html
@@ -297,23 +298,23 @@ fails-if(B2G||Android||/^Windows\x20NT\x
 == mfrac-A-2.html mfrac-A-2-ref.html
 == mfrac-A-3.html mfrac-A-3-ref.html
 == mfrac-A-4.html mfrac-A-4-ref.html
 == mfrac-A-5.html mfrac-A-5-ref.html
 == mfrac-A-6.html mfrac-A-6-ref.html
 == mfrac-A-7.html mfrac-A-7-ref.html
 == mfrac-A-8.html mfrac-A-8-ref.html
 == mfrac-B-1.html mfrac-B-1-ref.html
-== mfrac-B-2.html mfrac-B-2-3-ref.html
-== mfrac-B-3.html mfrac-B-2-3-ref.html
+random-if(winWidget&&!/^Windows\x20NT\x205\.1/.test(http.oscpu)) == mfrac-B-2.html mfrac-B-2-3-ref.html
+random-if(winWidget&&!/^Windows\x20NT\x205\.1/.test(http.oscpu)) == mfrac-B-3.html mfrac-B-2-3-ref.html
 == mfrac-B-4.html mfrac-B-4-5-ref.html
 == mfrac-B-5.html mfrac-B-4-5-ref.html
 == mfrac-B-6.html mfrac-B-6-7-ref.html
 == mfrac-B-7.html mfrac-B-6-7-ref.html
 fuzzy-if(OSX,1,100) == mfrac-C-1.html mfrac-C-1-ref.html
-== mfrac-C-2.html mfrac-C-2-ref.html
+random-if(winWidget&&!/^Windows\x20NT\x205\.1/.test(http.oscpu)) == mfrac-C-2.html mfrac-C-2-ref.html
 == mfrac-C-3.html mfrac-C-3-ref.html
 == mfrac-C-4.html mfrac-C-4-ref.html
 fuzzy-if(OSX,1,100) == mfrac-D-1.html mfrac-D-1-ref.html
-== mfrac-D-2.html mfrac-D-2-ref.html
+random-if(winWidget&&!/^Windows\x20NT\x205\.1/.test(http.oscpu)) == mfrac-D-2.html mfrac-D-2-ref.html
 == mfrac-D-3.html mfrac-D-3-ref.html
 == mfrac-D-4.html mfrac-D-4-ref.html
 == mfrac-E-1.html mfrac-E-1-ref.html