Merge mozilla-central to autoland. CLOSED TREE
authorCsoregi Natalia <ncsoregi@mozilla.com>
Fri, 05 Oct 2018 01:31:25 +0300
changeset 488074 d8d225f8204d0afacc288b12e12a62176ba9aa1c
parent 488073 b363fee0880d7b029a895baacdb7249520548f8d (current diff)
parent 488042 301f1711aab2fabca34a6c80d6bf4f42779b0c01 (diff)
child 488075 ca4200ebd92b479740b2c379ef730d3b6ef20c16
push id246
push userfmarier@mozilla.com
push dateSat, 13 Oct 2018 00:15:40 +0000
milestone64.0a1
Merge mozilla-central to autoland. CLOSED TREE
testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome_webdriver.py
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Merge day clobber
\ No newline at end of file
+Bug 1397263 - moving AS to moz.configure will break AS detection
--- a/devtools/client/framework/components/MeatballMenu.js
+++ b/devtools/client/framework/components/MeatballMenu.js
@@ -1,24 +1,25 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const { PureComponent, createFactory } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
-const MenuItem = createFactory(
-  require("devtools/client/shared/components/menu/MenuItem")
-);
-const MenuList = createFactory(
-  require("devtools/client/shared/components/menu/MenuList")
-);
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const { hr } = dom;
 
+loader.lazyGetter(this, "MenuItem", function() {
+  return createFactory(require("devtools/client/shared/components/menu/MenuItem"));
+});
+loader.lazyGetter(this, "MenuList", function() {
+  return createFactory(require("devtools/client/shared/components/menu/MenuList"));
+});
+
 loader.lazyRequireGetter(this, "openDocLink", "devtools/client/shared/link", true);
 loader.lazyRequireGetter(this, "assert", "devtools/shared/DevToolsUtils", true);
 
 const openDevToolsDocsLink = () => {
   openDocLink(
     "https://developer.mozilla.org/docs/Tools?utm_source=devtools&utm_medium=tabbar-menu"
   );
 };
--- a/devtools/client/framework/components/ToolboxToolbar.js
+++ b/devtools/client/framework/components/ToolboxToolbar.js
@@ -2,24 +2,32 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const { Component, createFactory } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 const {div, button} = dom;
-const { getUnicodeUrl } = require("devtools/client/shared/unicode-url");
 
-const MeatballMenu = createFactory(require("devtools/client/framework/components/MeatballMenu"));
 const MenuButton = createFactory(require("devtools/client/shared/components/menu/MenuButton"));
-const MenuItem = createFactory(require("devtools/client/shared/components/menu/MenuItem"));
-const MenuList = createFactory(require("devtools/client/shared/components/menu/MenuList"));
 const ToolboxTabs = createFactory(require("devtools/client/framework/components/ToolboxTabs"));
 
+loader.lazyGetter(this, "MeatballMenu", function() {
+  return createFactory(require("devtools/client/framework/components/MeatballMenu"));
+});
+loader.lazyGetter(this, "MenuItem", function() {
+  return createFactory(require("devtools/client/shared/components/menu/MenuItem"));
+});
+loader.lazyGetter(this, "MenuList", function() {
+  return createFactory(require("devtools/client/shared/components/menu/MenuList"));
+});
+
+loader.lazyRequireGetter(this, "getUnicodeUrl", "devtools/client/shared/unicode-url", true);
+
 /**
  * This is the overall component for the toolbox toolbar. It is designed to not know how
  * the state is being managed, and attempts to be as pure as possible. The
  * ToolboxController component controls the changing state, and passes in everything as
  * props.
  */
 class ToolboxToolbar extends Component {
   static get propTypes() {
--- a/devtools/client/inspector/inspector.js
+++ b/devtools/client/inspector/inspector.js
@@ -227,26 +227,16 @@ Inspector.prototype = {
       Services.prefs.setBoolPref(THREE_PANE_CHROME_ENABLED_PREF,
         this._is3PaneModeChromeEnabled);
     } else {
       this._is3PaneModeEnabled = value;
       Services.prefs.setBoolPref(THREE_PANE_ENABLED_PREF, this._is3PaneModeEnabled);
     }
   },
 
-  // Added in 53.
-  get canGetCssPath() {
-    return this._target.client.traits.getCssPath;
-  },
-
-  // Added in 56.
-  get canGetXPath() {
-    return this._target.client.traits.getXPath;
-  },
-
   get notificationBox() {
     if (!this._notificationBox) {
       this._notificationBox = this.toolbox.getNotificationBox();
     }
 
     return this._notificationBox;
   },
 
@@ -1757,26 +1747,24 @@ Inspector.prototype = {
       click: () => this.copyUniqueSelector(),
     }));
     copySubmenu.append(new MenuItem({
       id: "node-menu-copycsspath",
       label: INSPECTOR_L10N.getStr("inspectorCopyCSSPath.label"),
       accesskey:
         INSPECTOR_L10N.getStr("inspectorCopyCSSPath.accesskey"),
       disabled: !isSelectionElement,
-      hidden: !this.canGetCssPath,
       click: () => this.copyCssPath(),
     }));
     copySubmenu.append(new MenuItem({
       id: "node-menu-copyxpath",
       label: INSPECTOR_L10N.getStr("inspectorCopyXPath.label"),
       accesskey:
         INSPECTOR_L10N.getStr("inspectorCopyXPath.accesskey"),
       disabled: !isSelectionElement,
-      hidden: !this.canGetXPath,
       click: () => this.copyXPath(),
     }));
     copySubmenu.append(new MenuItem({
       id: "node-menu-copyimagedatauri",
       label: INSPECTOR_L10N.getStr("inspectorImageDataUri.label"),
       disabled: !isSelectionElement || !markupContainer ||
                 !markupContainer.isPreviewable(),
       click: () => this.copyImageDataUri(),
--- a/devtools/client/inspector/markup/markup.xhtml
+++ b/devtools/client/inspector/markup/markup.xhtml
@@ -9,17 +9,15 @@
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
   <link rel="stylesheet" href="chrome://devtools/skin/markup.css" type="text/css"/>
   <link rel="stylesheet" href="chrome://devtools/content/sourceeditor/codemirror/lib/codemirror.css" type="text/css"/>
   <link rel="stylesheet" href="chrome://devtools/content/sourceeditor/codemirror/addon/dialog/dialog.css" type="text/css"/>
   <link rel="stylesheet" href="chrome://devtools/content/sourceeditor/codemirror/mozilla.css" type="text/css"/>
 
   <script type="application/javascript"
           src="chrome://devtools/content/shared/theme-switching.js"></script>
-  <script type="application/javascript"
-          src="chrome://devtools/content/sourceeditor/codemirror/codemirror.bundle.js"></script>
 </head>
 <body class="theme-body devtools-monospace" role="application">
   <div id="root-wrapper" role="presentation">
     <div id="root" role="presentation"></div>
   </div>
 </body>
 </html>
--- a/devtools/client/inspector/rules/rules.js
+++ b/devtools/client/inspector/rules/rules.js
@@ -174,18 +174,16 @@ function CssRuleView(inspector, document
     this._handleDefaultColorUnitPrefChange.bind(this);
 
   this._prefObserver = new PrefObserver("devtools.");
   this._prefObserver.on(PREF_UA_STYLES, this._handleUAStylePrefChange);
   this._prefObserver.on(PREF_DEFAULT_COLOR_UNIT, this._handleDefaultColorUnitPrefChange);
 
   this.showUserAgentStyles = Services.prefs.getBoolPref(PREF_UA_STYLES);
 
-  this._showEmpty();
-
   // Add the tooltips and highlighters to the view
   this.tooltips = new TooltipsOverlay(this);
 }
 
 CssRuleView.prototype = {
   // The element that we're inspecting.
   _viewedElement: null,
 
--- a/devtools/client/shared/components/menu/MenuButton.js
+++ b/devtools/client/shared/components/menu/MenuButton.js
@@ -2,25 +2,25 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /* eslint-env browser */
 "use strict";
 
 // A button that toggles a doorhanger menu.
 
-const { PureComponent } = require("devtools/client/shared/vendor/react");
+const Services = require("Services");
+const flags = require("devtools/shared/flags");
+const { createRef, PureComponent } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
-const ReactDOM = require("devtools/client/shared/vendor/react-dom");
-const Services = require("Services");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const { button } = dom;
-const {
-  HTMLTooltip,
-} = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
+const { HTMLTooltip } = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
+
+loader.lazyRequireGetter(this, "createPortal", "devtools/client/shared/vendor/react-dom", true);
 
 // Return a copy of |obj| minus |fields|.
 const omit = (obj, fields) => {
   const objCopy = { ...obj };
   for (const field of fields) {
     delete objCopy[field];
   }
   return objCopy;
@@ -66,30 +66,39 @@ class MenuButton extends PureComponent {
 
     this.showMenu = this.showMenu.bind(this);
     this.hideMenu = this.hideMenu.bind(this);
     this.toggleMenu = this.toggleMenu.bind(this);
     this.onHidden = this.onHidden.bind(this);
     this.onClick = this.onClick.bind(this);
     this.onKeyDown = this.onKeyDown.bind(this);
 
-    this.tooltip = null;
-    this.buttonRef = null;
-    this.setButtonRef = element => {
-      this.buttonRef = element;
-    };
+    this.buttonRef = createRef();
 
     this.state = {
       expanded: false,
+      // In tests, initialize the menu immediately.
+      isMenuInitialized: flags.testing || false,
       win: props.doc.defaultView.top,
     };
+
+    this.initializeTooltip();
   }
 
-  componentWillMount() {
-    this.initializeTooltip();
+  componentDidMount() {
+    if (!this.state.isMenuInitialized) {
+      // Initialize the menu when the button is focused or moused over.
+      for (const event of ["focus", "mousemove"]) {
+        this.buttonRef.current.addEventListener(event, () => {
+          if (!this.state.isMenuInitialized) {
+            this.setState({ isMenuInitialized: true });
+          }
+        }, { once: true });
+      }
+    }
   }
 
   componentWillReceiveProps(nextProps) {
     // If the window changes, we need to regenerate the HTMLTooltip or else the
     // XUL wrapper element will appear above (in terms of z-index) the old
     // window, and not the new.
     const win = nextProps.doc.defaultView.top;
     if (
@@ -172,21 +181,21 @@ class MenuButton extends PureComponent {
 
   async toggleMenu(anchor) {
     return this.state.expanded ? this.hideMenu() : this.showMenu(anchor);
   }
 
   // Used by the call site to indicate that the menu content has changed so
   // its container should be updated.
   resizeContent() {
-    if (!this.state.expanded || !this.tooltip || !this.buttonRef) {
+    if (!this.state.expanded || !this.tooltip || !this.buttonRef.current) {
       return;
     }
 
-    this.tooltip.updateContainerBounds(this.buttonRef, {
+    this.tooltip.updateContainerBounds(this.buttonRef.current, {
       position: this.props.menuPosition,
       y: this.props.menuOffset,
     });
   }
 
   onHidden() {
     this.setState({ expanded: false });
     // While the menu is open, if we click _anywhere_ outside the menu, it will
@@ -196,31 +205,31 @@ class MenuButton extends PureComponent {
     // 'pointer-events: none' on the button while the menu is open.
     //
     // After the menu is closed we need to remove the pointer-events style (so
     // the button works again) but we don't want to do it immediately since the
     // "popuphidden" event which triggers this callback might be dispatched
     // before the "click" event that we want to ignore.  As a result, we queue
     // up a task using setTimeout() to run after the "click" event.
     this.state.win.setTimeout(() => {
-      if (this.buttonRef) {
-        this.buttonRef.style.pointerEvents = "auto";
+      if (this.buttonRef.current) {
+        this.buttonRef.current.style.pointerEvents = "auto";
       }
     }, 0);
 
     if (this.props.onCloseButton) {
       this.props.onCloseButton();
     }
   }
 
   async onClick(e) {
-    if (e.target === this.buttonRef) {
+    if (e.target === this.buttonRef.current) {
       // On Mac, even after clicking the button it doesn't get focus.
       // Force focus to the button so that our keydown handlers get called.
-      this.buttonRef.focus();
+      this.buttonRef.current.focus();
 
       if (this.props.onClick) {
         this.props.onClick(e);
       }
 
       if (!e.defaultPrevented) {
         const wasKeyboardEvent = e.screenX === 0 && e.screenY === 0;
         // If the popup menu will be shown, disable this button in order to
@@ -228,17 +237,17 @@ class MenuButton extends PureComponent {
         // above.
         //
         // Also, we should _not_ set 'pointer-events: none' if
         // ui.popup.disable_autohide pref is in effect since, in that case,
         // there's no redundant hiding behavior and we actually want clicking
         // the button to close the menu.
         if (!this.state.expanded &&
             !Services.prefs.getBoolPref("ui.popup.disable_autohide", false)) {
-          this.buttonRef.style.pointerEvents = "none";
+          this.buttonRef.current.style.pointerEvents = "none";
         }
         await this.toggleMenu(e.target);
         // If the menu was activated by keyboard, focus the first item.
         if (wasKeyboardEvent && this.tooltip) {
           this.tooltip.focus();
         }
 
         // MenuButton creates the children dynamically when clicking the button,
@@ -258,17 +267,17 @@ class MenuButton extends PureComponent {
   }
 
   onKeyDown(e) {
     if (!this.state.expanded) {
       return;
     }
 
     const isButtonFocussed =
-      this.props.doc && this.props.doc.activeElement === this.buttonRef;
+      this.props.doc && this.props.doc.activeElement === this.buttonRef.current;
 
     switch (e.key) {
       case "Escape":
         this.hideMenu();
         e.preventDefault();
         break;
 
       case "Tab":
@@ -286,38 +295,42 @@ class MenuButton extends PureComponent {
             e.preventDefault();
           }
         }
         break;
     }
   }
 
   render() {
-    const menu = ReactDOM.createPortal(
-      typeof this.props.children === "function"
-        ? this.props.children()
-        : this.props.children,
-      this.tooltip.panel
-    );
-
     const buttonProps = {
       // Pass through any props set on the button, except the ones we handle
       // here.
       ...omit(this.props, Object.keys(MenuButton.propTypes)),
       onClick: this.onClick,
       "aria-expanded": this.state.expanded,
       "aria-haspopup": "menu",
-      ref: this.setButtonRef,
+      ref: this.buttonRef,
     };
 
     if (this.state.expanded) {
       buttonProps.onKeyDown = this.onKeyDown;
     }
 
     if (this.props.menuId) {
       buttonProps["aria-controls"] = this.props.menuId;
     }
 
-    return button(buttonProps, menu);
+    if (this.state.isMenuInitialized) {
+      const menu = createPortal(
+        typeof this.props.children === "function"
+          ? this.props.children()
+          : this.props.children,
+        this.tooltip.panel
+      );
+
+      return button(buttonProps, menu);
+    }
+
+    return button(buttonProps);
   }
 }
 
 module.exports = MenuButton;
--- a/devtools/client/shared/components/tabs/TabBar.js
+++ b/devtools/client/shared/components/tabs/TabBar.js
@@ -7,20 +7,20 @@
 /* eslint-env browser */
 
 "use strict";
 
 const { Component, createFactory } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 
-const Menu = require("devtools/client/framework/menu");
-const MenuItem = require("devtools/client/framework/menu-item");
+const Sidebar = createFactory(require("devtools/client/shared/components/Sidebar"));
 
-const Sidebar = createFactory(require("devtools/client/shared/components/Sidebar"));
+loader.lazyRequireGetter(this, "Menu", "devtools/client/framework/menu");
+loader.lazyRequireGetter(this, "MenuItem", "devtools/client/framework/menu-item");
 
 // Shortcuts
 const { div } = dom;
 
 /**
  * Renders Tabbar component.
  */
 class Tabbar extends Component {
--- a/devtools/client/webreplay/menu.js
+++ b/devtools/client/webreplay/menu.js
@@ -66,16 +66,17 @@ const menuItems = [
   { id: "devtoolsSaveRecording", command: SaveRecording },
   { id: "devtoolsReplayNewTab", command: ReplayNewTab },
 ];
 
 exports.addWebReplayMenu = function(doc) {
   const menu = doc.createXULElement("menu");
   menu.id = "menu_webreplay";
   menu.setAttribute("label", l10n("devtoolsWebReplay.label"));
+  menu.setAttribute("hidden", "true");
 
   const popup = doc.createXULElement("menupopup");
   popup.id = "menupopup_webreplay";
   menu.appendChild(popup);
 
   for (const { id, command } of menuItems) {
     const menuitem = doc.createXULElement("menuitem");
     menuitem.id = id;
--- a/devtools/server/actors/root.js
+++ b/devtools/server/actors/root.js
@@ -123,20 +123,16 @@ RootActor.prototype = {
     // Whether conditional breakpoints are supported
     conditionalBreakpoints: true,
     // Whether the server supports full source actors (breakpoints on
     // eval scripts, etc)
     debuggerSourceActors: true,
     // Whether the server can return wasm binary source
     wasmBinarySource: true,
     bulk: true,
-    // Whether the dom node actor implements the getCssPath method. Added in 53.
-    getCssPath: true,
-    // Whether the dom node actor implements the getXPath method. Added in 56.
-    getXPath: true,
     // Whether the director scripts are supported
     directorScripts: true,
     // Whether the debugger server supports
     // blackboxing/pretty-printing (not supported in Fever Dream yet)
     noBlackBoxing: false,
     noPrettyPrinting: false,
     // Trait added in Gecko 38, indicating that all features necessary for
     // grabbing allocations from the MemoryActor are available for the performance tool
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -47,16 +47,17 @@
 #include "nsContentList.h"
 #include "nsVariant.h"
 #include "nsDOMTokenList.h"
 #include "nsXBLPrototypeBinding.h"
 #include "nsError.h"
 #include "nsDOMString.h"
 #include "nsIScriptSecurityManager.h"
 #include "mozilla/dom/AnimatableBinding.h"
+#include "mozilla/dom/FeaturePolicyUtils.h"
 #include "mozilla/dom/HTMLDivElement.h"
 #include "mozilla/dom/HTMLSpanElement.h"
 #include "mozilla/dom/KeyframeAnimationOptionsBinding.h"
 #include "mozilla/dom/MutationEventBinding.h"
 #include "mozilla/AnimationComparator.h"
 #include "mozilla/AsyncEventDispatcher.h"
 #include "mozilla/ContentEvents.h"
 #include "mozilla/DeclarationBlock.h"
@@ -3585,16 +3586,23 @@ GetFullscreenError(CallerType aCallerTyp
   return nullptr;
 }
 
 already_AddRefed<Promise>
 Element::RequestFullscreen(CallerType aCallerType, ErrorResult& aRv)
 {
   auto request = FullscreenRequest::Create(this, aCallerType, aRv);
   RefPtr<Promise> promise = request->GetPromise();
+
+  if (!FeaturePolicyUtils::IsFeatureAllowed(OwnerDoc(),
+                                            NS_LITERAL_STRING("fullscreen"))) {
+    request->Reject("FullscreenDeniedFeaturePolicy");
+    return promise.forget();
+  }
+
   // Only grant fullscreen requests if this is called from inside a trusted
   // event handler (i.e. inside an event handler for a user initiated event).
   // This stops the fullscreen from being abused similar to the popups of old,
   // and it also makes it harder for bad guys' script to go fullscreen and
   // spoof the browser chrome/window and phish logins etc.
   // Note that requests for fullscreen inside a web app's origin are exempt
   // from this restriction.
   if (const char* error = GetFullscreenError(aCallerType)) {
--- a/dom/bindings/BindingUtils.h
+++ b/dom/bindings/BindingUtils.h
@@ -2817,17 +2817,16 @@ public:
     js::ProxyOptions options;
     options.setClass(aClass);
     aReflector.set(js::NewProxyObject(aCx, aHandler, aExpandoValue, aProto,
                                       options));
     if (aReflector) {
       js::SetProxyReservedSlot(aReflector, DOM_OBJECT_SLOT, JS::PrivateValue(aNative));
       mNative = aNative;
       mReflector = aReflector;
-      RecordReplayRegisterDeferredFinalize<T>(aNative);
     }
 
     if (size_t mallocBytes = BindingJSObjectMallocBytes(aNative)) {
       JS_updateMallocCounter(aCx, mallocBytes);
     }
   }
 
   void
@@ -2835,53 +2834,62 @@ public:
                JS::Handle<JSObject*> aProto,
                T* aNative, JS::MutableHandle<JSObject*> aReflector)
   {
     aReflector.set(JS_NewObjectWithGivenProto(aCx, aClass, aProto));
     if (aReflector) {
       js::SetReservedSlot(aReflector, DOM_OBJECT_SLOT, JS::PrivateValue(aNative));
       mNative = aNative;
       mReflector = aReflector;
-      RecordReplayRegisterDeferredFinalize<T>(aNative);
     }
 
     if (size_t mallocBytes = BindingJSObjectMallocBytes(aNative)) {
       JS_updateMallocCounter(aCx, mallocBytes);
     }
   }
 
   void
   InitializationSucceeded()
   {
-    void* dummy;
-    mNative.forget(&dummy);
+    T* pointer;
+    mNative.forget(&pointer);
+    RecordReplayRegisterDeferredFinalize<T>(pointer);
+
     mReflector = nullptr;
   }
 
 private:
   struct OwnedNative
   {
     // Make sure the native objects inherit from NonRefcountedDOMObject so
     // that we log their ctor and dtor.
     static_assert(IsBaseOf<NonRefcountedDOMObject, T>::value,
                   "Non-refcounted objects with DOM bindings should inherit "
                   "from NonRefcountedDOMObject.");
 
     OwnedNative&
     operator=(T* aNative)
     {
+      mNative = aNative;
       return *this;
     }
 
     // This signature sucks, but it's the only one that will make a nsRefPtr
     // just forget about its pointer without warning.
     void
-    forget(void**)
+    forget(T** aResult)
     {
+      *aResult = mNative;
+      mNative = nullptr;
     }
+
+    // Keep track of the pointer for use in InitializationSucceeded().
+    // The caller (or, after initialization succeeds, the JS object) retains
+    // ownership of the object.
+    T* mNative;
   };
 
   JS::Rooted<JSObject*> mReflector;
   typename Conditional<IsRefcounted<T>::value, RefPtr<T>, OwnedNative>::Type mNative;
 };
 
 template<class T>
 struct DeferredFinalizerImpl
--- a/dom/html/HTMLIFrameElement.cpp
+++ b/dom/html/HTMLIFrameElement.cpp
@@ -307,14 +307,18 @@ HTMLIFrameElement::RefreshFeaturePolicy(
   }
 
   mFeaturePolicy->InheritPolicy(OwnerDoc()->Policy());
 
   if (AllowPaymentRequest()) {
     mFeaturePolicy->MaybeSetAllowedPolicy(NS_LITERAL_STRING("payment"));
   }
 
+  if (AllowFullscreen()) {
+    mFeaturePolicy->MaybeSetAllowedPolicy(NS_LITERAL_STRING("fullscreen"));
+  }
+
   // TODO: https://wicg.github.io/feature-policy/#process-feature-policy-attributes
-  // requires to check allowfullscreen, and allowusermediarequest
+  // requires to check allowusermediarequest
 }
 
 } // namespace dom
 } // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/html/test/file_fullscreen-featurePolicy-inner.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+</head>
+<body onload="doRequestFullscreen()">
+<script>
+function doRequestFullscreen() {
+  function handler(evt) {
+    document.removeEventListener("fullscreenchange", handler);
+    document.removeEventListener("fullscreenerror", handler);
+    if (evt.type == "fullscreenchange") {
+      document.exitFullscreen();
+    }
+    parent.continueTest(evt.type);
+  }
+  parent.ok(document.fullscreenEnabled, "Fullscreen " +
+            `should be enabled in ${parent.testTargetName}`);
+  document.addEventListener("fullscreenchange", handler);
+  document.addEventListener("fullscreenerror", handler);
+  document.documentElement.requestFullscreen();
+}
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/html/test/file_fullscreen-featurePolicy.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test for FeaturePolicy + fullscreen</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <script type="application/javascript" src="file_fullscreen-utils.js"></script>
+  <style>
+  body {
+    background-color: black;
+  }
+  </style>
+</head>
+<body>
+
+<script type="application/javascript">
+
+function ok(condition, msg) {
+  opener.ok(condition, "[featurePolicy] " + msg);
+}
+
+function is(a, b, msg) {
+  opener.is(a, b, "[featurePolicy] " + msg);
+}
+
+const INNER_FILE = "file_fullscreen-featurePolicy-inner.html";
+
+function setupForInnerTest(targetName, callback) {
+  window.testTargetName = targetName;
+  window.continueTest = event => {
+    delete window.testTargetName;
+    delete window.continueTest;
+    callback(event);
+  };
+}
+
+function begin() {
+  nextTest();
+}
+
+var tests = [
+  [ "fullscreen 'none'", "fullscreenerror"],
+  [ "fullscreen", "fullscreenchange"],
+  [ "fullscreen 'src'", "fullscreenchange"],
+  [ "fullscreen 'self'", "fullscreenchange"],
+  [ "fullscreen *", "fullscreenchange"],
+  [ "fullscreen http://random.net", "fullscreenerror"],
+  [ null, "fullscreenchange"],
+];
+
+function nextTest() {
+  if (tests.length == 0) {
+    opener.nextTest();
+    return;
+  }
+
+  let test = tests.shift();
+
+  // Create an iframe with an allowfullscreen and with an allow attribute.
+  // The request should be denied or allowed, based on the current test.
+  var iframe = document.createElement("iframe");
+  iframe.setAttribute("allowfullscreen", "true");
+  if (test[0]) {
+    iframe.setAttribute("allow", test[0]);
+  }
+  iframe.src = INNER_FILE;
+  setupForInnerTest("an iframe+allowfullscreen+allow: " + test[0], event => {
+    is(event, test[1], "Expected a " + test[1] + " event");
+    document.body.removeChild(iframe);
+    SimpleTest.executeSoon(nextTest);
+  });
+  document.body.appendChild(iframe);
+}
+
+</script>
+</body>
+</html>
--- a/dom/html/test/mochitest.ini
+++ b/dom/html/test/mochitest.ini
@@ -441,16 +441,18 @@ skip-if = toolkit == 'android'
 support-files =
   file_fullscreen-api.html
   file_fullscreen-backdrop.html
   file_fullscreen-denied-inner.html
   file_fullscreen-denied.html
   file_fullscreen-esc-exit-inner.html
   file_fullscreen-esc-exit.html
   file_fullscreen-event-order.html
+  file_fullscreen-featurePolicy.html
+  file_fullscreen-featurePolicy-inner.html
   file_fullscreen-hidden.html
   file_fullscreen-lenient-setters.html
   file_fullscreen-multiple-inner.html
   file_fullscreen-multiple.html
   file_fullscreen-navigation.html
   file_fullscreen-nested.html
   file_fullscreen-prefixed.html
   file_fullscreen-plugins.html
--- a/dom/html/test/test_fullscreen-api.html
+++ b/dom/html/test/test_fullscreen-api.html
@@ -23,36 +23,37 @@
 
 /** Tests for Bug 545812 **/
 SimpleTest.requestFlakyTimeout("untriaged");
 
 // Run the tests which go full-screen in new windows, as mochitests normally
 // run in an iframe, which by default will not have the allowfullscreen
 // attribute set, so full-screen won't work.
 var gTestWindows = [
-  "file_fullscreen-multiple.html",
-  "file_fullscreen-rollback.html",
-  "file_fullscreen-esc-exit.html",
-  "file_fullscreen-denied.html",
-  "file_fullscreen-api.html",
-  "file_fullscreen-plugins.html",
-  "file_fullscreen-hidden.html",
-  "file_fullscreen-svg-element.html",
-  "file_fullscreen-navigation.html",
-  "file_fullscreen-scrollbar.html",
-  "file_fullscreen-selector.html",
-  "file_fullscreen-shadowdom.html",
-  "file_fullscreen-top-layer.html",
-  "file_fullscreen-backdrop.html",
-  "file_fullscreen-nested.html",
-  "file_fullscreen-prefixed.html",
-  "file_fullscreen-unprefix-disabled.html",
-  "file_fullscreen-lenient-setters.html",
-  "file_fullscreen-table.html",
-  "file_fullscreen-event-order.html",
+  { test: "file_fullscreen-multiple.html" },
+  { test: "file_fullscreen-rollback.html" },
+  { test: "file_fullscreen-esc-exit.html" },
+  { test: "file_fullscreen-denied.html" },
+  { test: "file_fullscreen-api.html" },
+  { test: "file_fullscreen-plugins.html" },
+  { test: "file_fullscreen-hidden.html" },
+  { test: "file_fullscreen-svg-element.html" },
+  { test: "file_fullscreen-navigation.html" },
+  { test: "file_fullscreen-scrollbar.html" },
+  { test: "file_fullscreen-selector.html" },
+  { test: "file_fullscreen-shadowdom.html" },
+  { test: "file_fullscreen-top-layer.html" },
+  { test: "file_fullscreen-backdrop.html" },
+  { test: "file_fullscreen-nested.html" },
+  { test: "file_fullscreen-prefixed.html" },
+  { test: "file_fullscreen-unprefix-disabled.html" },
+  { test: "file_fullscreen-lenient-setters.html" },
+  { test: "file_fullscreen-table.html" },
+  { test: "file_fullscreen-event-order.html" },
+  { test: "file_fullscreen-featurePolicy.html", prefs: [["dom.security.featurePolicy.enabled", true]] },
 ];
 
 var testWindow = null;
 var gTestIndex = 0;
 
 function finish() {
   SimpleTest.finish();
 }
@@ -107,40 +108,45 @@ function waitForEvent(eventTarget, event
     eventTarget.removeEventListener(eventName, listener);
     callback();
   });
 }
 
 function runNextTest() {
   if (gTestIndex < gTestWindows.length) {
     let test = gTestWindows[gTestIndex];
-    if (shouldSkipTest(test)) {
-      info(`Skip test ${test}`);
+    if (shouldSkipTest(test.test)) {
+      info(`Skip test ${test.test}`);
       SimpleTest.executeSoon(runNextTest);
     } else {
-      info(`Run test ${test}`);
-      testWindow = window.open(test, "", "width=500,height=500,scrollbars=yes");
-      // We'll wait for the window to load, then make sure our window is refocused
-      // before starting the test, which will get kicked off on "focus".
-      // This ensures that we're essentially back on the primary "desktop" on
-      // OS X Lion before we run the test.
-      waitForLoadAndPaint(testWindow, function() {
-        SimpleTest.waitForFocus(function() {
+      let promise = ("prefs" in test)
+                      ? SpecialPowers.pushPrefEnv({"set": test.prefs})
+                      : Promise.resolve();
+      promise.then(function() {
+        info(`Run test ${test.test}`);
+        testWindow = window.open(test.test, "", "width=500,height=500,scrollbars=yes");
+        // We'll wait for the window to load, then make sure our window is refocused
+        // before starting the test, which will get kicked off on "focus".
+        // This ensures that we're essentially back on the primary "desktop" on
+        // OS X Lion before we run the test.
+        waitForLoadAndPaint(testWindow, function() {
           SimpleTest.waitForFocus(function() {
-            // For the platforms that support reporting occlusion state (e.g. Mac),
-            // we should wait until the docshell has been activated again,
-            // otherwise, the fullscreen request might be denied.
-            if (testWindow.document.hidden) {
-              waitForEvent(testWindow.document, "visibilitychange", (event) => {
-                return !testWindow.document.hidden;
-              }, testWindow.begin);
-              return;
-            }
-            testWindow.begin();
-          }, testWindow);
+            SimpleTest.waitForFocus(function() {
+              // For the platforms that support reporting occlusion state (e.g. Mac),
+              // we should wait until the docshell has been activated again,
+              // otherwise, the fullscreen request might be denied.
+              if (testWindow.document.hidden) {
+                waitForEvent(testWindow.document, "visibilitychange", (event) => {
+                  return !testWindow.document.hidden;
+                }, testWindow.begin);
+                return;
+              }
+              testWindow.begin();
+            }, testWindow);
+          });
         });
       });
     }
     gTestIndex++;
   } else {
     SimpleTest.finish();
   }
 }
--- a/dom/locales/en-US/chrome/dom/dom.properties
+++ b/dom/locales/en-US/chrome/dom/dom.properties
@@ -65,16 +65,17 @@ FullscreenDeniedContainerNotAllowed=Request for fullscreen was denied because at least one of the document’s containing elements is not an iframe or does not have an “allowfullscreen” attribute.
 FullscreenDeniedNotInputDriven=Request for fullscreen was denied because Element.requestFullscreen() was not called from inside a short running user-generated event handler.
 FullscreenDeniedNotHTMLSVGOrMathML=Request for fullscreen was denied because requesting element is not <svg>, <math>, or an HTML element.
 FullscreenDeniedNotInDocument=Request for fullscreen was denied because requesting element is no longer in its document.
 FullscreenDeniedMovedDocument=Request for fullscreen was denied because requesting element has moved document.
 FullscreenDeniedLostWindow=Request for fullscreen was denied because we no longer have a window.
 FullscreenDeniedSubDocFullscreen=Request for fullscreen was denied because a subdocument of the document requesting fullscreen is already fullscreen.
 FullscreenDeniedNotDescendant=Request for fullscreen was denied because requesting element is not a descendant of the current fullscreen element.
 FullscreenDeniedNotFocusedTab=Request for fullscreen was denied because requesting element is not in the currently focused tab.
+FullscreenDeniedFeaturePolicy=Request for fullscreen was denied because of FeturePolicy directives.
 RemovedFullscreenElement=Exited fullscreen because fullscreen element was removed from document.
 FocusedWindowedPluginWhileFullscreen=Exited fullscreen because windowed plugin was focused.
 PointerLockDeniedDisabled=Request for pointer lock was denied because Pointer Lock API is disabled by user preference.
 PointerLockDeniedInUse=Request for pointer lock was denied because the pointer is currently controlled by a different document.
 PointerLockDeniedNotInDocument=Request for pointer lock was denied because the requesting element is not in a document.
 PointerLockDeniedSandboxed=Request for pointer lock was denied because Pointer Lock API is restricted via sandbox.
 PointerLockDeniedHidden=Request for pointer lock was denied because the document is not visible.
 PointerLockDeniedNotFocused=Request for pointer lock was denied because the document is not focused.
--- a/dom/quota/ActorsChild.cpp
+++ b/dom/quota/ActorsChild.cpp
@@ -311,16 +311,17 @@ QuotaRequestChild::Recv__delete__(const 
   MOZ_ASSERT(mRequest);
 
   switch (aResponse.type()) {
     case RequestResponse::Tnsresult:
       HandleResponse(aResponse.get_nsresult());
       break;
 
     case RequestResponse::TInitResponse:
+    case RequestResponse::TInitTemporaryStorageResponse:
     case RequestResponse::TClearOriginResponse:
     case RequestResponse::TClearDataResponse:
     case RequestResponse::TClearAllResponse:
     case RequestResponse::TResetAllResponse:
     case RequestResponse::TPersistResponse:
       HandleResponse();
       break;
 
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -1224,16 +1224,37 @@ private:
 
   nsresult
   DoDirectoryWork(QuotaManager* aQuotaManager) override;
 
   void
   GetResponse(RequestResponse& aResponse) override;
 };
 
+class InitTemporaryStorageOp final
+  : public QuotaRequestBase
+{
+public:
+  InitTemporaryStorageOp()
+    : QuotaRequestBase(/* aExclusive */ false)
+  {
+    AssertIsOnOwningThread();
+  }
+
+private:
+  ~InitTemporaryStorageOp()
+  { }
+
+  nsresult
+  DoDirectoryWork(QuotaManager* aQuotaManager) override;
+
+  void
+  GetResponse(RequestResponse& aResponse) override;
+};
+
 class InitOriginOp final
   : public QuotaRequestBase
 {
   const InitOriginParams mParams;
   nsCString mSuffix;
   nsCString mGroup;
   bool mCreated;
 
@@ -6760,16 +6781,20 @@ Quota::AllocPQuotaRequestParent(const Re
 
   RefPtr<QuotaRequestBase> actor;
 
   switch (aParams.type()) {
     case RequestParams::TInitParams:
       actor = new InitOp();
       break;
 
+    case RequestParams::TInitTemporaryStorageParams:
+      actor = new InitTemporaryStorageOp();
+      break;
+
     case RequestParams::TInitOriginParams:
       actor = new InitOriginOp(aParams);
       break;
 
     case RequestParams::TClearOriginParams:
       actor = new ClearOriginOp(aParams);
       break;
 
@@ -7402,16 +7427,41 @@ InitOp::DoDirectoryWork(QuotaManager* aQ
 void
 InitOp::GetResponse(RequestResponse& aResponse)
 {
   AssertIsOnOwningThread();
 
   aResponse = InitResponse();
 }
 
+nsresult
+InitTemporaryStorageOp::DoDirectoryWork(QuotaManager* aQuotaManager)
+{
+  AssertIsOnIOThread();
+
+  AUTO_PROFILER_LABEL("InitTemporaryStorageOp::DoDirectoryWork", OTHER);
+
+  aQuotaManager->AssertStorageIsInitialized();
+
+  nsresult rv = aQuotaManager->EnsureTemporaryStorageIsInitialized();
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  return NS_OK;
+}
+
+void
+InitTemporaryStorageOp::GetResponse(RequestResponse& aResponse)
+{
+  AssertIsOnOwningThread();
+
+  aResponse = InitTemporaryStorageResponse();
+}
+
 InitOriginOp::InitOriginOp(const RequestParams& aParams)
   : QuotaRequestBase(/* aExclusive */ false)
   , mParams(aParams.get_InitOriginParams())
   , mCreated(false)
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(aParams.type() == RequestParams::TInitOriginParams);
 }
--- a/dom/quota/PQuota.ipdl
+++ b/dom/quota/PQuota.ipdl
@@ -16,16 +16,20 @@ using mozilla::dom::quota::PersistenceTy
 namespace mozilla {
 namespace dom {
 namespace quota {
 
 struct InitParams
 {
 };
 
+struct InitTemporaryStorageParams
+{
+};
+
 struct InitOriginParams
 {
   PrincipalInfo principalInfo;
   PersistenceType persistenceType;
 };
 
 struct AllUsageParams
 {
@@ -73,16 +77,17 @@ struct PersistedParams
 struct PersistParams
 {
   PrincipalInfo principalInfo;
 };
 
 union RequestParams
 {
   InitParams;
+  InitTemporaryStorageParams;
   InitOriginParams;
   ClearOriginParams;
   ClearDataParams;
   ClearAllParams;
   ResetAllParams;
   PersistedParams;
   PersistParams;
 };
--- a/dom/quota/PQuotaRequest.ipdl
+++ b/dom/quota/PQuotaRequest.ipdl
@@ -7,16 +7,20 @@ include protocol PQuota;
 namespace mozilla {
 namespace dom {
 namespace quota {
 
 struct InitResponse
 {
 };
 
+struct InitTemporaryStorageResponse
+{
+};
+
 struct InitOriginResponse
 {
   bool created;
 };
 
 struct ClearOriginResponse
 {
 };
@@ -41,16 +45,17 @@ struct PersistedResponse
 struct PersistResponse
 {
 };
 
 union RequestResponse
 {
   nsresult;
   InitResponse;
+  InitTemporaryStorageResponse;
   InitOriginResponse;
   ClearOriginResponse;
   ClearDataResponse;
   ClearAllResponse;
   ResetAllResponse;
   PersistedResponse;
   PersistResponse;
 };
--- a/dom/quota/QuotaManagerService.cpp
+++ b/dom/quota/QuotaManagerService.cpp
@@ -454,16 +454,41 @@ QuotaManagerService::Init(nsIQuotaReques
     return rv;
   }
 
   request.forget(_retval);
   return NS_OK;
 }
 
 NS_IMETHODIMP
+QuotaManagerService::InitTemporaryStorage(nsIQuotaRequest** _retval)
+{
+  MOZ_ASSERT(NS_IsMainThread());
+  MOZ_ASSERT(nsContentUtils::IsCallerChrome());
+
+  if (NS_WARN_IF(!gTestingMode)) {
+    return NS_ERROR_UNEXPECTED;
+  }
+
+  RefPtr<Request> request = new Request();
+
+  InitTemporaryStorageParams params;
+
+  nsAutoPtr<PendingRequestInfo> info(new RequestInfo(request, params));
+
+  nsresult rv = InitiateRequest(info);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  request.forget(_retval);
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 QuotaManagerService::InitStoragesForPrincipal(
                                              nsIPrincipal* aPrincipal,
                                              const nsACString& aPersistenceType,
                                              nsIQuotaRequest** _retval)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(nsContentUtils::IsCallerChrome());
 
--- a/dom/quota/nsIQuotaManagerService.idl
+++ b/dom/quota/nsIQuotaManagerService.idl
@@ -20,16 +20,26 @@ interface nsIQuotaManagerService : nsISu
    *
    * If the dom.quotaManager.testing preference is not true the call will be
    * a no-op.
    */
   [must_use] nsIQuotaRequest
   init();
 
   /**
+   * Initializes temporary storage. This can be used in tests to verify
+   * temporary storage initialization.
+   *
+   * If the dom.quotaManager.testing preference is not true the call will be
+   * a no-op.
+   */
+  [must_use] nsIQuotaRequest
+  initTemporaryStorage();
+
+  /**
    * Initializes storages for the given principal. This can be used in tests to
    * verify origin initialization.
    *
    * If the dom.quotaManager.testing preference is not true the call will be
    * a no-op.
    *
    * @param aPrincipal
    *        A principal for the origin whose storages are to be initialized.
--- a/dom/quota/test/unit/head.js
+++ b/dom/quota/test/unit/head.js
@@ -4,16 +4,18 @@
  */
 
 const NS_OK = Cr.NS_OK;
 const NS_ERROR_FAILURE = Cr.NS_ERROR_FAILURE;
 const NS_ERROR_UNEXPECTED = Cr.NS_ERROR_UNEXPECTED;
 const NS_ERROR_STORAGE_BUSY = Cr.NS_ERROR_STORAGE_BUSY;
 const NS_ERROR_FILE_NO_DEVICE_SPACE = Cr.NS_ERROR_FILE_NO_DEVICE_SPACE;
 
+Cu.import("resource://gre/modules/Services.jsm");
+
 function is(a, b, msg)
 {
   Assert.equal(a, b, msg);
 }
 
 function ok(cond, msg)
 {
   Assert.ok(!!cond, msg);
@@ -111,16 +113,24 @@ function resetGlobalLimit()
 function init(callback)
 {
   let request = SpecialPowers._getQuotaManager().init();
   request.callback = callback;
 
   return request;
 }
 
+function initTemporaryStorage(callback)
+{
+  let request = SpecialPowers._getQuotaManager().initTemporaryStorage();
+  request.callback = callback;
+
+  return request;
+}
+
 function initOrigin(principal, persistence, callback)
 {
   let request =
     SpecialPowers._getQuotaManager().initStoragesForPrincipal(principal,
                                                               persistence);
   request.callback = callback;
 
   return request;
new file mode 100644
--- /dev/null
+++ b/dom/quota/test/unit/test_initTemporaryStorage.js
@@ -0,0 +1,35 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/**
+ * This test is mainly to verify initTemporaryStorage() does call
+ * QuotaManager::EnsureTemporaryStorageIsInitialized() which does various
+ * things, for example, it restores the directory metadata if it's broken or
+ * missing.
+ */
+
+async function testSteps()
+{
+  const originDirPath = "storage/default/https+++foo.example.com";
+  const metadataFileName = ".metadata-v2";
+
+  info("Creating an empty directory");
+
+  let originDir = getRelativeFile(originDirPath);
+  originDir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("0755", 8));
+
+  info("Initializing the temporary storage");
+
+  let request = initTemporaryStorage();
+  await requestFinished(request);
+
+  info("Verifying directory metadata was restored after calling " +
+       "initTemporaryStorage()");
+
+  let metadataFile = originDir.clone();
+  metadataFile.append(metadataFileName);
+
+  ok(metadataFile.exists(), "Directory metadata file does exist");
+}
new file mode 100644
--- /dev/null
+++ b/dom/quota/test/unit/test_persist_globalLimit.js
@@ -0,0 +1,73 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/**
+ * This test is mainly to verify that persisted origins are always bounded by
+ * the global limit.
+ */
+
+async function testSteps()
+{
+  const globalLimitKB = 1;
+
+  const principal = getPrincipal("https://persisted.example.com");
+
+  info("Setting limits");
+
+  setGlobalLimit(globalLimitKB);
+
+  let request = clear();
+  await requestFinished(request);
+
+  for (let initializeStorageBeforePersist of [false, true]) {
+    if (initializeStorageBeforePersist) {
+      info("Initializing the temporary storage");
+
+      request = initTemporaryStorage();
+      await requestFinished(request);
+    }
+
+    info("Persisting an origin");
+
+    request = persist(principal);
+    await requestFinished(request);
+
+    info("Verifying the persisted origin is bounded by global limit");
+
+    let database = getSimpleDatabase(principal);
+
+    info("Opening a database for the persisted origin");
+
+    request = database.open("data");
+    await requestFinished(request);
+
+    try {
+      info("Writing over the limit shouldn't succeed");
+
+      request = database.write(getBuffer(globalLimitKB * 1024 + 1));
+      await requestFinished(request);
+
+      ok(false, "Should have thrown");
+    } catch (ex) {
+      ok(true, "Should have thrown");
+      ok(ex === NS_ERROR_FILE_NO_DEVICE_SPACE, "Threw right code");
+    }
+
+    info("Closing the database and clearing");
+
+    request = database.close();
+    await requestFinished(request);
+
+    request = clear();
+    await requestFinished(request);
+  }
+
+  info("Resetting limits");
+
+  resetGlobalLimit();
+
+  request = reset();
+  await requestFinished(request);
+}
new file mode 100644
--- /dev/null
+++ b/dom/quota/test/unit/test_storagePressure.js
@@ -0,0 +1,116 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+function awaitStoragePressure()
+{
+  let promise_resolve;
+
+  let promise = new Promise(function(resolve) {
+    promise_resolve = resolve;
+  });
+
+  function observer(subject, topic) {
+    ok(true, "Got the storage pressure event");
+
+    Services.obs.removeObserver(observer, topic);
+
+    let usage = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
+    promise_resolve(usage);
+  }
+
+  Services.obs.addObserver(observer, "QuotaManager::StoragePressure", false);
+
+  return promise;
+}
+
+/**
+ * This test is mainly to verify that the storage pressure event is fired when
+ * the eviction process is not able to free some space when a quota client
+ * attempts to write over the global limit or when the global limit is reduced
+ * below the global usage.
+ */
+
+async function testSteps()
+{
+  const globalLimitKB = 2;
+
+  const principal = getPrincipal("https://example.com");
+
+  info("Setting limits");
+
+  setGlobalLimit(globalLimitKB);
+
+  let request = initTemporaryStorage();
+  await requestFinished(request);
+
+  info("Persisting and filling an origin");
+
+  // We need to persist the origin first to omit the group limit checks.
+  // Otherwise, we would have to fill five separate origins.
+  request = persist(principal);
+  await requestFinished(request);
+
+  let database = getSimpleDatabase(principal);
+
+  request = database.open("data");
+  await requestFinished(request);
+
+  try {
+    request = database.write(getBuffer(globalLimitKB * 1024));
+    await requestFinished(request);
+
+    ok(true, "Should not have thrown");
+  } catch(ex) {
+    ok(false, "Should not have thrown");
+  }
+
+  info("Testing storage pressure by writing over the global limit");
+
+  info("Storing one more byte to get the storage pressure event while writing");
+
+  let promiseStoragePressure = awaitStoragePressure();
+
+  try {
+    request = database.write(getBuffer(1));
+    await requestFinished(request);
+
+    ok(false, "Should have thrown");
+  } catch(ex) {
+    ok(true, "Should have thrown");
+    ok(ex === NS_ERROR_FILE_NO_DEVICE_SPACE, "Threw right code");
+  }
+
+  info("Checking the storage pressure event");
+
+  let usage = await promiseStoragePressure;
+  ok(usage == globalLimitKB * 1024, "Got correct usage");
+
+  info("Testing storage pressure by reducing the global limit");
+
+  info("Reducing the global limit to get the storage pressuse event while the" +
+       " temporary storage is being initialized");
+
+  setGlobalLimit(globalLimitKB - 1);
+
+  request = reset();
+  await requestFinished(request);
+
+  promiseStoragePressure = awaitStoragePressure();
+
+  request = initTemporaryStorage();
+  await requestFinished(request);
+
+  info("Checking the storage pressure event");
+
+  usage = await promiseStoragePressure;
+  ok(usage == globalLimitKB * 1024, "Got correct usage");
+
+  info("Resetting limits");
+
+  resetGlobalLimit();
+
+  request = reset();
+  await requestFinished(request);
+}
--- a/dom/quota/test/unit/xpcshell.ini
+++ b/dom/quota/test/unit/xpcshell.ini
@@ -20,21 +20,24 @@ support-files =
   tempMetadataCleanup_profile.zip
   version2_1upgrade_profile.zip
 
 [test_basics.js]
 [test_bad_origin_directory.js]
 [test_defaultStorageUpgrade.js]
 [test_getUsage.js]
 [test_idbSubdirUpgrade.js]
+[test_initTemporaryStorage.js]
 [test_morgueCleanup.js]
 [test_obsoleteOriginAttributesUpgrade.js]
 [test_originAttributesUpgrade.js]
 [test_persist.js]
 [test_persist_eviction.js]
+[test_persist_globalLimit.js]
 [test_persist_groupLimit.js]
 [test_removeAppsUpgrade.js]
 [test_removeLocalStorage.js]
 [test_simpledb.js]
 [test_storagePersistentUpgrade.js]
+[test_storagePressure.js]
 [test_tempMetadataCleanup.js]
 [test_unknownFiles.js]
 [test_version2_1upgrade.js]
--- a/dom/security/featurepolicy/FeaturePolicyUtils.cpp
+++ b/dom/security/featurepolicy/FeaturePolicyUtils.cpp
@@ -25,17 +25,16 @@ struct FeatureMap {
  * DOM Security peer!
  */
 static FeatureMap sSupportedFeatures[] = {
   // TODO: not supported yet!!!
   { "autoplay", FeatureMap::eAll },
   // TODO: not supported yet!!!
   { "camera", FeatureMap::eAll  },
   { "encrypted-media", FeatureMap::eAll  },
-  // TODO: not supported yet!!!
   { "fullscreen", FeatureMap::eAll  },
   // TODO: not supported yet!!!
   { "geolocation", FeatureMap::eAll  },
   // TODO: not supported yet!!!
   { "microphone", FeatureMap::eAll  },
   { "midi", FeatureMap::eAll  },
   { "payment", FeatureMap::eAll  },
   // TODO: not supported yet!!!
--- a/gfx/webrender/src/spatial_node.rs
+++ b/gfx/webrender/src/spatial_node.rs
@@ -251,30 +251,22 @@ impl SpatialNode {
             SpatialNodeType::ReferenceFrame(ref mut info) => {
                 // Resolve the transform against any property bindings.
                 let source_transform = scene_properties.resolve_layout_transform(&info.source_transform);
                 info.resolved_transform =
                     LayoutFastTransform::with_vector(info.origin_in_parent_reference_frame)
                     .pre_mul(&source_transform.into())
                     .pre_mul(&info.source_perspective);
 
-                // In order to compute a transformation to world coordinates, we need to apply the
-                // following transforms in order:
-                //   state.parent_accumulated_scroll_offset
-                //   info.source_perspective
-                //   info.source_transform
-                //   info.origin_in_parent_reference_frame
-                //   state.parent_reference_frame_transform
-                // The first one incorporates the scrolling effect of any scrollframes/sticky nodes
-                // between this reference frame and the parent reference frame. The middle three
-                // transforms (which are combined into info.resolved_transform) do the conversion
-                // into the parent reference frame's coordinate space, and then the last one
-                // applies the parent reference frame's transform to the world space.
+                // The transformation for this viewport in world coordinates is the transformation for
+                // our parent reference frame, plus any accumulated scrolling offsets from nodes
+                // between our reference frame and this node. Finally, we also include
+                // whatever local transformation this reference frame provides.
                 let relative_transform = info.resolved_transform
-                    .pre_translate(&state.parent_accumulated_scroll_offset)
+                    .post_translate(state.parent_accumulated_scroll_offset)
                     .to_transform()
                     .with_destination::<LayoutPixel>();
                 self.world_viewport_transform =
                     state.parent_reference_frame_transform.pre_mul(&relative_transform.into());
                 self.world_content_transform = self.world_viewport_transform;
 
                 info.invertible = self.world_viewport_transform.is_invertible();
                 if !info.invertible {
--- a/gfx/webrender/src/util.rs
+++ b/gfx/webrender/src/util.rs
@@ -535,17 +535,16 @@ impl<Src, Dst> FastTransform<Src, Dst> {
             FastTransform::Transform { inverse: Some(ref inverse), is_2d: true, .. }  =>
                 inverse.transform_rect(rect),
             FastTransform::Transform { ref transform, is_2d: false, .. } =>
                 transform.inverse_rect_footprint(rect),
             FastTransform::Transform { inverse: None, .. }  => None,
         }
     }
 
-    #[allow(dead_code)]
     pub fn post_translate(&self, new_offset: TypedVector2D<f32, Dst>) -> Self {
         match *self {
             FastTransform::Offset(offset) => {
                 let offset = offset.to_untyped() + new_offset.to_untyped();
                 FastTransform::Offset(TypedVector2D::from_untyped(&offset))
             }
             FastTransform::Transform { ref transform, .. } => {
                 let transform = transform.post_translate(new_offset.to_3d());
--- a/js/src/frontend/BinSource-auto.cpp
+++ b/js/src/frontend/BinSource-auto.cpp
@@ -37,61 +37,16 @@ template<typename Tok, size_t N>
 bool operator==(const typename Tok::Chars& left, const char (&right)[N]) {
     return Tok::equals(left, right);
 }
 
 
 // ----- Sums of interfaces (autogenerated, by lexicographical order)
 // Sums of sums are flattened.
 /*
-ArrowExpression ::= EagerArrowExpressionWithExpression
-    EagerArrowExpressionWithFunctionBody
-    LazyArrowExpressionWithExpression
-    LazyArrowExpressionWithFunctionBody
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrowExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumArrowExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumArrowExpression(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::EagerArrowExpressionWithExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpressionWithExpression(start, kind, fields));
-        break;
-      case BinKind::EagerArrowExpressionWithFunctionBody:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpressionWithFunctionBody(start, kind, fields));
-        break;
-      case BinKind::LazyArrowExpressionWithExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLazyArrowExpressionWithExpression(start, kind, fields));
-        break;
-      case BinKind::LazyArrowExpressionWithFunctionBody:
-        MOZ_TRY_VAR(result, parseInterfaceLazyArrowExpressionWithFunctionBody(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("ArrowExpression", kind);
-    }
-    return result;
-}
-
-/*
 AssertedMaybePositionalParameterName ::= AssertedParameterName
     AssertedPositionalParameterName
     AssertedRestParameterName
 */
 template<typename Tok> JS::Result<Ok>
 BinASTParser<Tok>::parseAssertedMaybePositionalParameterName(
         AssertedScopeKind scopeKind,
         MutableHandle<GCVector<JSAtom*>> positionalParams)
@@ -233,53 +188,16 @@ BinASTParser<Tok>::parseSumAssignmentTar
         break;
       default:
         return raiseInvalidKind("AssignmentTargetOrAssignmentTargetWithInitializer", kind);
     }
     return result;
 }
 
 /*
-AssignmentTargetPattern ::= ArrayAssignmentTarget
-    ObjectAssignmentTarget
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetPattern()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumAssignmentTargetPattern(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumAssignmentTargetPattern(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::ArrayAssignmentTarget:
-        MOZ_TRY_VAR(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
-        break;
-      case BinKind::ObjectAssignmentTarget:
-        MOZ_TRY_VAR(result, parseInterfaceObjectAssignmentTarget(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("AssignmentTargetPattern", kind);
-    }
-    return result;
-}
-
-/*
 AssignmentTargetProperty ::= AssignmentTargetPropertyIdentifier
     AssignmentTargetPropertyProperty
 */
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseAssignmentTargetProperty()
 {
     BinKind kind;
     BinFields fields(cx_);
@@ -393,53 +311,16 @@ BinASTParser<Tok>::parseSumBindingOrBind
         break;
       default:
         return raiseInvalidKind("BindingOrBindingWithInitializer", kind);
     }
     return result;
 }
 
 /*
-BindingPattern ::= ArrayBinding
-    ObjectBinding
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingPattern()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumBindingPattern(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumBindingPattern(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::ArrayBinding:
-        MOZ_TRY_VAR(result, parseInterfaceArrayBinding(start, kind, fields));
-        break;
-      case BinKind::ObjectBinding:
-        MOZ_TRY_VAR(result, parseInterfaceObjectBinding(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("BindingPattern", kind);
-    }
-    return result;
-}
-
-/*
 BindingProperty ::= BindingPropertyIdentifier
     BindingPropertyProperty
 */
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseBindingProperty()
 {
     BinKind kind;
     BinFields fields(cx_);
@@ -467,65 +348,16 @@ BinASTParser<Tok>::parseSumBindingProper
         break;
       default:
         return raiseInvalidKind("BindingProperty", kind);
     }
     return result;
 }
 
 /*
-ExportDeclaration ::= Export
-    ExportAllFrom
-    ExportDefault
-    ExportFrom
-    ExportLocals
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExportDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumExportDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumExportDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::Export:
-        MOZ_TRY_VAR(result, parseInterfaceExport(start, kind, fields));
-        break;
-      case BinKind::ExportAllFrom:
-        MOZ_TRY_VAR(result, parseInterfaceExportAllFrom(start, kind, fields));
-        break;
-      case BinKind::ExportDefault:
-        MOZ_TRY_VAR(result, parseInterfaceExportDefault(start, kind, fields));
-        break;
-      case BinKind::ExportFrom:
-        MOZ_TRY_VAR(result, parseInterfaceExportFrom(start, kind, fields));
-        break;
-      case BinKind::ExportLocals:
-        MOZ_TRY_VAR(result, parseInterfaceExportLocals(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("ExportDeclaration", kind);
-    }
-    return result;
-}
-
-/*
 Expression ::= ArrayExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
@@ -1048,53 +880,16 @@ BinASTParser<Tok>::parseSumForInOfBindin
         break;
       default:
         return raiseInvalidKind("ForInOfBindingOrAssignmentTarget", kind);
     }
     return result;
 }
 
 /*
-FunctionDeclaration ::= EagerFunctionDeclaration
-    LazyFunctionDeclaration
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::EagerFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-        break;
-      case BinKind::LazyFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceLazyFunctionDeclaration(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("FunctionDeclaration", kind);
-    }
-    return result;
-}
-
-/*
 FunctionDeclarationOrClassDeclarationOrExpression ::= ArrayExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassDeclaration
     ClassExpression
     CompoundAssignmentExpression
@@ -1299,127 +1094,16 @@ BinASTParser<Tok>::parseSumFunctionDecla
         break;
       default:
         return raiseInvalidKind("FunctionDeclarationOrClassDeclarationOrVariableDeclaration", kind);
     }
     return result;
 }
 
 /*
-FunctionExpression ::= EagerFunctionExpression
-    LazyFunctionExpression
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionExpression(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
-        break;
-      case BinKind::LazyFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLazyFunctionExpression(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("FunctionExpression", kind);
-    }
-    return result;
-}
-
-/*
-Getter ::= EagerGetter
-    LazyGetter
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseGetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumGetter(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumGetter(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::EagerGetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerGetter(start, kind, fields));
-        break;
-      case BinKind::LazyGetter:
-        MOZ_TRY_VAR(result, parseInterfaceLazyGetter(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Getter", kind);
-    }
-    return result;
-}
-
-/*
-ImportDeclaration ::= Import
-    ImportNamespace
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseImportDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumImportDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumImportDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::Import:
-        MOZ_TRY_VAR(result, parseInterfaceImport(start, kind, fields));
-        break;
-      case BinKind::ImportNamespace:
-        MOZ_TRY_VAR(result, parseInterfaceImportNamespace(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("ImportDeclaration", kind);
-    }
-    return result;
-}
-
-/*
 ImportDeclarationOrExportDeclarationOrStatement ::= Block
     BreakStatement
     ClassDeclaration
     ContinueStatement
     DebuggerStatement
     DoWhileStatement
     EagerFunctionDeclaration
     EmptyStatement
@@ -1563,151 +1247,16 @@ BinASTParser<Tok>::parseSumImportDeclara
         break;
       default:
         return raiseInvalidKind("ImportDeclarationOrExportDeclarationOrStatement", kind);
     }
     return result;
 }
 
 /*
-IterationStatement ::= DoWhileStatement
-    ForInStatement
-    ForOfStatement
-    ForStatement
-    WhileStatement
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseIterationStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumIterationStatement(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumIterationStatement(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::DoWhileStatement:
-        MOZ_TRY_VAR(result, parseInterfaceDoWhileStatement(start, kind, fields));
-        break;
-      case BinKind::ForInStatement:
-        MOZ_TRY_VAR(result, parseInterfaceForInStatement(start, kind, fields));
-        break;
-      case BinKind::ForOfStatement:
-        MOZ_TRY_VAR(result, parseInterfaceForOfStatement(start, kind, fields));
-        break;
-      case BinKind::ForStatement:
-        MOZ_TRY_VAR(result, parseInterfaceForStatement(start, kind, fields));
-        break;
-      case BinKind::WhileStatement:
-        MOZ_TRY_VAR(result, parseInterfaceWhileStatement(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("IterationStatement", kind);
-    }
-    return result;
-}
-
-/*
-Literal ::= LiteralBooleanExpression
-    LiteralInfinityExpression
-    LiteralNullExpression
-    LiteralNumericExpression
-    LiteralStringExpression
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteral()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumLiteral(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumLiteral(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::LiteralBooleanExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
-        break;
-      case BinKind::LiteralInfinityExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLiteralInfinityExpression(start, kind, fields));
-        break;
-      case BinKind::LiteralNullExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLiteralNullExpression(start, kind, fields));
-        break;
-      case BinKind::LiteralNumericExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLiteralNumericExpression(start, kind, fields));
-        break;
-      case BinKind::LiteralStringExpression:
-        MOZ_TRY_VAR(result, parseInterfaceLiteralStringExpression(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Literal", kind);
-    }
-    return result;
-}
-
-/*
-Method ::= EagerMethod
-    LazyMethod
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseMethod()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumMethod(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumMethod(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::EagerMethod:
-        MOZ_TRY_VAR(result, parseInterfaceEagerMethod(start, kind, fields));
-        break;
-      case BinKind::LazyMethod:
-        MOZ_TRY_VAR(result, parseInterfaceLazyMethod(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Method", kind);
-    }
-    return result;
-}
-
-/*
 MethodDefinition ::= EagerGetter
     EagerMethod
     EagerSetter
     LazyGetter
     LazyMethod
     LazySetter
 */
 template<typename Tok> JS::Result<ParseNode*>
@@ -1937,53 +1486,16 @@ BinASTParser<Tok>::parseSumPropertyName(
         break;
       default:
         return raiseInvalidKind("PropertyName", kind);
     }
     return result;
 }
 
 /*
-Setter ::= EagerSetter
-    LazySetter
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumSetter(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumSetter(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch (kind) {
-      case BinKind::EagerSetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerSetter(start, kind, fields));
-        break;
-      case BinKind::LazySetter:
-        MOZ_TRY_VAR(result, parseInterfaceLazySetter(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Setter", kind);
-    }
-    return result;
-}
-
-/*
 SimpleAssignmentTarget ::= AssignmentTargetIdentifier
     ComputedMemberAssignmentTarget
     StaticMemberAssignmentTarget
 */
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseSimpleAssignmentTarget()
 {
     BinKind kind;
@@ -2300,66 +1812,16 @@ BinASTParser<Tok>::parseSumStatement(con
         MOZ_TRY_VAR(result, parseInterfaceWithStatement(start, kind, fields));
         break;
       default:
         return raiseInvalidKind("Statement", kind);
     }
     return result;
 }
 
-/*
-VariableDeclarationOrExpression ::= ArrayExpression
-    AssignmentExpression
-    AwaitExpression
-    BinaryExpression
-    CallExpression
-    ClassExpression
-    CompoundAssignmentExpression
-    ComputedMemberExpression
-    ConditionalExpression
-    EagerArrowExpressionWithExpression
-    EagerArrowExpressionWithFunctionBody
-    EagerFunctionExpression
-    IdentifierExpression
-    LazyArrowExpressionWithExpression
-    LazyArrowExpressionWithFunctionBody
-    LazyFunctionExpression
-    LiteralBooleanExpression
-    LiteralInfinityExpression
-    LiteralNullExpression
-    LiteralNumericExpression
-    LiteralRegExpExpression
-    LiteralStringExpression
-    NewExpression
-    NewTargetExpression
-    ObjectExpression
-    StaticMemberExpression
-    TemplateExpression
-    ThisExpression
-    UnaryExpression
-    UpdateExpression
-    VariableDeclaration
-    YieldExpression
-    YieldStarExpression
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseVariableDeclarationOrExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumVariableDeclarationOrExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
 
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseSumVariableDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch (kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
@@ -2465,131 +1927,28 @@ BinASTParser<Tok>::parseSumVariableDecla
     }
     return result;
 }
 
 
 
 // ----- Interfaces (autogenerated, by lexicographical order)
 // When fields have a non-trivial type, implementation is deanonymized and delegated to another parser.
-
-/*
- interface  : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseNull()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::_Null) {
-        return raiseInvalidKind("_Null", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceNull(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceNull(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    return raiseError("FIXME: Not implemented yet (Null)");
-}
-
-
-/*
- interface ArrayAssignmentTarget : Node {
-    FrozenArray<(AssignmentTarget or AssignmentTargetWithInitializer)> elements;
-    AssignmentTarget? rest;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrayAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ArrayAssignmentTarget) {
-        return raiseInvalidKind("ArrayAssignmentTarget", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceArrayAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ArrayAssignmentTarget)");
 }
 
-
-/*
- interface ArrayBinding : Node {
-    FrozenArray<(Binding or BindingWithInitializer)?> elements;
-    Binding? rest;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrayBinding()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ArrayBinding) {
-        return raiseInvalidKind("ArrayBinding", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceArrayBinding(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceArrayBinding(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ArrayBinding)");
 }
 
-
-/*
- interface ArrayExpression : Node {
-    FrozenArray<(SpreadElement or Expression)?> elements;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrayExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ArrayExpression) {
-        return raiseInvalidKind("ArrayExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceArrayExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceArrayExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ArrayExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Elements };
@@ -2879,44 +2238,16 @@ BinASTParser<Tok>::parseInterfaceAsserte
     ParseContext::Scope* scope;
     DeclarationKind declKind;
     MOZ_TRY(getDeclaredScope(scopeKind, kind_, scope, declKind));
     MOZ_TRY(addScopeName(scopeKind, name, scope, declKind, isCaptured));
     auto result = Ok();
     return result;
 }
 
-
-/*
- interface AssertedParameterName : Node {
-    IdentifierName name;
-    bool isCaptured;
- }
-*/
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseAssertedParameterName(
-        AssertedScopeKind scopeKind,
-        MutableHandle<GCVector<JSAtom*>> positionalParams)
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssertedParameterName) {
-        return raiseInvalidKind("AssertedParameterName", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssertedParameterName(start, kind, fields,
-        scopeKind, positionalParams));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<Ok>
 BinASTParser<Tok>::parseInterfaceAssertedParameterName(const size_t start, const BinKind kind, const BinFields& fields,
         AssertedScopeKind scopeKind,
         MutableHandle<GCVector<JSAtom*>> positionalParams)
 {
     MOZ_ASSERT(kind == BinKind::AssertedParameterName);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
@@ -2992,45 +2323,16 @@ BinASTParser<Tok>::parseInterfaceAsserte
         // In non-strict mode code, direct calls to eval can
         // add variables to the call object.
         parseContext_->functionBox()->setHasExtensibleScope();
     }
     auto result = Ok();
     return result;
 }
 
-
-/*
- interface AssertedPositionalParameterName : Node {
-    unsigned long index;
-    IdentifierName name;
-    bool isCaptured;
- }
-*/
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseAssertedPositionalParameterName(
-        AssertedScopeKind scopeKind,
-        MutableHandle<GCVector<JSAtom*>> positionalParams)
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssertedPositionalParameterName) {
-        return raiseInvalidKind("AssertedPositionalParameterName", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssertedPositionalParameterName(start, kind, fields,
-        scopeKind, positionalParams));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<Ok>
 BinASTParser<Tok>::parseInterfaceAssertedPositionalParameterName(const size_t start, const BinKind kind, const BinFields& fields,
         AssertedScopeKind scopeKind,
         MutableHandle<GCVector<JSAtom*>> positionalParams)
 {
     MOZ_ASSERT(kind == BinKind::AssertedPositionalParameterName);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
@@ -3057,44 +2359,16 @@ BinASTParser<Tok>::parseInterfaceAsserte
     ParseContext::Scope* scope;
     DeclarationKind declKind;
     MOZ_TRY(getBoundScope(scopeKind, scope, declKind));
     MOZ_TRY(addScopeName(scopeKind, name, scope, declKind, isCaptured));
     auto result = Ok();
     return result;
 }
 
-
-/*
- interface AssertedRestParameterName : Node {
-    IdentifierName name;
-    bool isCaptured;
- }
-*/
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseAssertedRestParameterName(
-        AssertedScopeKind scopeKind,
-        MutableHandle<GCVector<JSAtom*>> positionalParams)
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssertedRestParameterName) {
-        return raiseInvalidKind("AssertedRestParameterName", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssertedRestParameterName(start, kind, fields,
-        scopeKind, positionalParams));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<Ok>
 BinASTParser<Tok>::parseInterfaceAssertedRestParameterName(const size_t start, const BinKind kind, const BinFields& fields,
         AssertedScopeKind scopeKind,
         MutableHandle<GCVector<JSAtom*>> positionalParams)
 {
     MOZ_ASSERT(kind == BinKind::AssertedRestParameterName);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
@@ -3218,41 +2492,16 @@ BinASTParser<Tok>::parseInterfaceAsserte
         // In non-strict mode code, direct calls to eval can
         // add variables to the call object.
         parseContext_->functionBox()->setHasExtensibleScope();
     }
     auto result = Ok();
     return result;
 }
 
-
-/*
- interface AssignmentExpression : Node {
-    AssignmentTarget binding;
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssignmentExpression) {
-        return raiseInvalidKind("AssignmentExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceAssignmentExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::AssignmentExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Binding, BinField::Expression };
@@ -3308,165 +2557,40 @@ BinASTParser<Tok>::parseInterfaceAssignm
     if (!IsIdentifier(name)) {
         return raiseError("Invalid identifier");
     }
     BINJS_TRY(usedNames_.noteUse(cx_, name, parseContext_->scriptId(), parseContext_->innermostScope()->id()));
     BINJS_TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));
     return result;
 }
 
-
-/*
- interface AssignmentTargetPropertyIdentifier : Node {
-    AssignmentTargetIdentifier binding;
-    Expression? init;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetPropertyIdentifier()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssignmentTargetPropertyIdentifier) {
-        return raiseInvalidKind("AssignmentTargetPropertyIdentifier", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetPropertyIdentifier(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceAssignmentTargetPropertyIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AssignmentTargetPropertyIdentifier)");
 }
 
-
-/*
- interface AssignmentTargetPropertyProperty : Node {
-    PropertyName name;
-    (AssignmentTarget or AssignmentTargetWithInitializer) binding;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetPropertyProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssignmentTargetPropertyProperty) {
-        return raiseInvalidKind("AssignmentTargetPropertyProperty", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetPropertyProperty(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceAssignmentTargetPropertyProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AssignmentTargetPropertyProperty)");
 }
 
-
-/*
- interface AssignmentTargetWithInitializer : Node {
-    AssignmentTarget binding;
-    Expression init;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetWithInitializer()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AssignmentTargetWithInitializer) {
-        return raiseInvalidKind("AssignmentTargetWithInitializer", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetWithInitializer(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceAssignmentTargetWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AssignmentTargetWithInitializer)");
 }
 
-
-/*
- interface AwaitExpression : Node {
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAwaitExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::AwaitExpression) {
-        return raiseInvalidKind("AwaitExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAwaitExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceAwaitExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AwaitExpression)");
 }
 
-
-/*
- interface BinaryExpression : Node {
-    BinaryOperator operator;
-    Expression left;
-    Expression right;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBinaryExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::BinaryExpression) {
-        return raiseInvalidKind("BinaryExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBinaryExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceBinaryExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::BinaryExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Operator, BinField::Left, BinField::Right };
@@ -3615,103 +2739,28 @@ BinASTParser<Tok>::parseInterfaceBinding
 
     if (!IsIdentifier(name)) {
         return raiseError("Invalid identifier");
     }
     BINJS_TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));
     return result;
 }
 
-
-/*
- interface BindingPropertyIdentifier : Node {
-    BindingIdentifier binding;
-    Expression? init;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingPropertyIdentifier()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::BindingPropertyIdentifier) {
-        return raiseInvalidKind("BindingPropertyIdentifier", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingPropertyIdentifier(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceBindingPropertyIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (BindingPropertyIdentifier)");
 }
 
-
-/*
- interface BindingPropertyProperty : Node {
-    PropertyName name;
-    (Binding or BindingWithInitializer) binding;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingPropertyProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::BindingPropertyProperty) {
-        return raiseInvalidKind("BindingPropertyProperty", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingPropertyProperty(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceBindingPropertyProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (BindingPropertyProperty)");
 }
 
-
-/*
- interface BindingWithInitializer : Node {
-    Binding binding;
-    Expression init;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingWithInitializer()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::BindingWithInitializer) {
-        return raiseInvalidKind("BindingWithInitializer", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingWithInitializer(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceBindingWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (BindingWithInitializer)");
 }
 
 
 /*
@@ -3757,40 +2806,16 @@ BinASTParser<Tok>::parseInterfaceBlock(c
     BINJS_MOZ_TRY_DECL(statements, parseListOfStatement());
 
     MOZ_TRY(checkClosedVars(currentScope));
     BINJS_TRY_DECL(bindings, NewLexicalScopeData(cx_, currentScope, alloc_, parseContext_));
     BINJS_TRY_DECL(result, factory_.newLexicalScope(*bindings, statements));
     return result;
 }
 
-
-/*
- interface BreakStatement : Node {
-    Label? label;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBreakStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::BreakStatement) {
-        return raiseInvalidKind("BreakStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBreakStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceBreakStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::BreakStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Label };
@@ -3814,41 +2839,16 @@ BinASTParser<Tok>::parseInterfaceBreakSt
                 return raiseError(kind, "Label not found");
             }
         }
     }
     BINJS_TRY_DECL(result, factory_.newBreakStatement(label ? label->asPropertyName() : nullptr, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface CallExpression : Node {
-    (Expression or Super) callee;
-    Arguments arguments;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseCallExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::CallExpression) {
-        return raiseInvalidKind("CallExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceCallExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceCallExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::CallExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Callee, BinField::Arguments };
@@ -3938,42 +2938,16 @@ BinASTParser<Tok>::parseInterfaceCatchCl
 
     MOZ_TRY(checkClosedVars(currentScope));
     BINJS_TRY_DECL(bindings, NewLexicalScopeData(cx_, currentScope, alloc_, parseContext_));
     BINJS_TRY_DECL(result, factory_.newLexicalScope(*bindings, body));
     BINJS_TRY(factory_.setupCatchScope(result, binding, body));
     return result;
 }
 
-
-/*
- interface ClassDeclaration : Node {
-    BindingIdentifier name;
-    Expression? super;
-    FrozenArray<ClassElement> elements;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseClassDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ClassDeclaration) {
-        return raiseInvalidKind("ClassDeclaration", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceClassDeclaration(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceClassDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ClassDeclaration)");
 }
 
 
 /*
@@ -4001,74 +2975,22 @@ BinASTParser<Tok>::parseClassElement()
 }
 
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceClassElement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ClassElement)");
 }
 
-
-/*
- interface ClassExpression : Node {
-    BindingIdentifier? name;
-    Expression? super;
-    FrozenArray<ClassElement> elements;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseClassExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ClassExpression) {
-        return raiseInvalidKind("ClassExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceClassExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceClassExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ClassExpression)");
 }
 
-
-/*
- interface CompoundAssignmentExpression : Node {
-    CompoundAssignmentOperator operator;
-    SimpleAssignmentTarget binding;
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseCompoundAssignmentExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::CompoundAssignmentExpression) {
-        return raiseInvalidKind("CompoundAssignmentExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceCompoundAssignmentExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::CompoundAssignmentExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Operator, BinField::Binding, BinField::Expression };
@@ -4119,41 +3041,16 @@ BinASTParser<Tok>::parseInterfaceCompoun
       case CompoundAssignmentOperator::BitAndAssign:
         pnk = ParseNodeKind::BitAndAssign;
         break;
     }
     BINJS_TRY_DECL(result, factory_.newAssignment(pnk, binding, expression));
     return result;
 }
 
-
-/*
- interface ComputedMemberAssignmentTarget : Node {
-    (Expression or Super) object;
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseComputedMemberAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ComputedMemberAssignmentTarget) {
-        return raiseInvalidKind("ComputedMemberAssignmentTarget", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceComputedMemberAssignmentTarget(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceComputedMemberAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ComputedMemberAssignmentTarget);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Object, BinField::Expression };
@@ -4163,41 +3060,16 @@ BinASTParser<Tok>::parseInterfaceCompute
     BINJS_MOZ_TRY_DECL(object, parseExpressionOrSuper());
 
     BINJS_MOZ_TRY_DECL(expression, parseExpression());
 
     BINJS_TRY_DECL(result, factory_.newPropertyByValue(object, expression, tokenizer_->offset()));
     return result;
 }
 
-
-/*
- interface ComputedMemberExpression : Node {
-    (Expression or Super) object;
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseComputedMemberExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ComputedMemberExpression) {
-        return raiseInvalidKind("ComputedMemberExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceComputedMemberExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceComputedMemberExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ComputedMemberExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Object, BinField::Expression };
@@ -4207,72 +3079,22 @@ BinASTParser<Tok>::parseInterfaceCompute
     BINJS_MOZ_TRY_DECL(object, parseExpressionOrSuper());
 
     BINJS_MOZ_TRY_DECL(expression, parseExpression());
 
     BINJS_TRY_DECL(result, factory_.newPropertyByValue(object, expression, tokenizer_->offset()));
     return result;
 }
 
-
-/*
- interface ComputedPropertyName : Node {
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseComputedPropertyName()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ComputedPropertyName) {
-        return raiseInvalidKind("ComputedPropertyName", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceComputedPropertyName(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceComputedPropertyName(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ComputedPropertyName)");
 }
 
-
-/*
- interface ConditionalExpression : Node {
-    Expression test;
-    Expression consequent;
-    Expression alternate;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseConditionalExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ConditionalExpression) {
-        return raiseInvalidKind("ConditionalExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceConditionalExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceConditionalExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ConditionalExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Test, BinField::Consequent, BinField::Alternate };
@@ -4284,40 +3106,16 @@ BinASTParser<Tok>::parseInterfaceConditi
     BINJS_MOZ_TRY_DECL(consequent, parseExpression());
 
     BINJS_MOZ_TRY_DECL(alternate, parseExpression());
 
     BINJS_TRY_DECL(result, factory_.newConditional(test, consequent, alternate));
     return result;
 }
 
-
-/*
- interface ContinueStatement : Node {
-    Label? label;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseContinueStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ContinueStatement) {
-        return raiseInvalidKind("ContinueStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceContinueStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceContinueStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ContinueStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Label };
@@ -4341,41 +3139,16 @@ BinASTParser<Tok>::parseInterfaceContinu
             }
         }
     }
 
     BINJS_TRY_DECL(result, factory_.newContinueStatement(label ? label->asPropertyName() : nullptr, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface DataProperty : Node {
-    PropertyName name;
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseDataProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::DataProperty) {
-        return raiseInvalidKind("DataProperty", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceDataProperty(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceDataProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::DataProperty);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Name, BinField::Expression };
@@ -4389,39 +3162,16 @@ BinASTParser<Tok>::parseInterfaceDataPro
     if (!factory_.isUsableAsObjectPropertyName(name)) {
         return raiseError("DataProperty key kind");
     }
 
     BINJS_TRY_DECL(result, factory_.newObjectMethodOrPropertyDefinition(name, expression, AccessorType::None));
     return result;
 }
 
-
-/*
- interface DebuggerStatement : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseDebuggerStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::DebuggerStatement) {
-        return raiseInvalidKind("DebuggerStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceDebuggerStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceDebuggerStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (DebuggerStatement)");
 }
 
 
 /*
@@ -4461,41 +3211,16 @@ BinASTParser<Tok>::parseInterfaceDirecti
     RootedAtom rawValue(cx_);
     MOZ_TRY_VAR(rawValue, tokenizer_->readAtom());
 
     TokenPos pos = tokenizer_->pos(start);
     BINJS_TRY_DECL(result, factory_.newStringLiteral(rawValue, pos));
     return result;
 }
 
-
-/*
- interface DoWhileStatement : Node {
-    Expression test;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseDoWhileStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::DoWhileStatement) {
-        return raiseInvalidKind("DoWhileStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceDoWhileStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceDoWhileStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::DoWhileStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Test, BinField::Body };
@@ -4506,110 +3231,28 @@ BinASTParser<Tok>::parseInterfaceDoWhile
     BINJS_MOZ_TRY_DECL(test, parseExpression());
 
     BINJS_MOZ_TRY_DECL(body, parseStatement());
 
     BINJS_TRY_DECL(result, factory_.newDoWhileStatement(body, test, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface EagerArrowExpressionWithExpression : Node {
-    bool isAsync;
-    unsigned long length;
-    ArrowExpressionContentsWithExpression contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerArrowExpressionWithExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerArrowExpressionWithExpression) {
-        return raiseInvalidKind("EagerArrowExpressionWithExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerArrowExpressionWithExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerArrowExpressionWithExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (EagerArrowExpressionWithExpression)");
 }
 
-
-/*
- interface EagerArrowExpressionWithFunctionBody : Node {
-    bool isAsync;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    ArrowExpressionContentsWithFunctionBody contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerArrowExpressionWithFunctionBody()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerArrowExpressionWithFunctionBody) {
-        return raiseInvalidKind("EagerArrowExpressionWithFunctionBody", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerArrowExpressionWithFunctionBody(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerArrowExpressionWithFunctionBody(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (EagerArrowExpressionWithFunctionBody)");
 }
 
-
-/*
- interface EagerFunctionDeclaration : Node {
-    bool isAsync;
-    bool isGenerator;
-    BindingIdentifier name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    FunctionOrMethodContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerFunctionDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerFunctionDeclaration) {
-        return raiseInvalidKind("EagerFunctionDeclaration", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerFunctionDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::EagerFunctionDeclaration);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[6] = { BinField::IsAsync, BinField::IsGenerator, BinField::Name, BinField::Length, BinField::Directives, BinField::Contents };
@@ -4652,45 +3295,16 @@ BinASTParser<Tok>::parseInterfaceEagerFu
         length, &params, &tmpBody));
     BINJS_MOZ_TRY_DECL(body, appendDirectivesToBody(tmpBody, directives));
     BINJS_TRY_DECL(lexicalScopeData, NewLexicalScopeData(cx_, lexicalScope, alloc_, parseContext_));
     BINJS_TRY_VAR(body, factory_.newLexicalScope(*lexicalScopeData, body));
     BINJS_MOZ_TRY_DECL(result, buildFunction(start, kind, name, params, body, funbox));
     return result;
 }
 
-
-/*
- interface EagerFunctionExpression : Node {
-    bool isAsync;
-    bool isGenerator;
-    BindingIdentifier? name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    FunctionExpressionContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerFunctionExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerFunctionExpression) {
-        return raiseInvalidKind("EagerFunctionExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerFunctionExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::EagerFunctionExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[6] = { BinField::IsAsync, BinField::IsGenerator, BinField::Name, BinField::Length, BinField::Directives, BinField::Contents };
@@ -4733,42 +3347,16 @@ BinASTParser<Tok>::parseInterfaceEagerFu
         length, &params, &tmpBody));
     BINJS_MOZ_TRY_DECL(body, appendDirectivesToBody(tmpBody, directives));
     BINJS_TRY_DECL(lexicalScopeData, NewLexicalScopeData(cx_, lexicalScope, alloc_, parseContext_));
     BINJS_TRY_VAR(body, factory_.newLexicalScope(*lexicalScopeData, body));
     BINJS_MOZ_TRY_DECL(result, buildFunction(start, kind, name, params, body, funbox));
     return result;
 }
 
-
-/*
- interface EagerGetter : Node {
-    PropertyName name;
-    FrozenArray<Directive> directives;
-    GetterContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerGetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerGetter) {
-        return raiseInvalidKind("EagerGetter", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerGetter(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerGetter(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::EagerGetter);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Name, BinField::Directives, BinField::Contents };
@@ -4808,45 +3396,16 @@ BinASTParser<Tok>::parseInterfaceEagerGe
     MOZ_TRY(parseGetterContents(
         length, &params, &tmpBody));
     BINJS_MOZ_TRY_DECL(body, appendDirectivesToBody(tmpBody, directives));
     BINJS_MOZ_TRY_DECL(method, buildFunction(start, kind, name, params, body, funbox));
     BINJS_TRY_DECL(result, factory_.newObjectMethodOrPropertyDefinition(name, method, accessorType));
     return result;
 }
 
-
-/*
- interface EagerMethod : Node {
-    bool isAsync;
-    bool isGenerator;
-    PropertyName name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    FunctionOrMethodContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerMethod()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerMethod) {
-        return raiseInvalidKind("EagerMethod", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerMethod(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerMethod(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::EagerMethod);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[6] = { BinField::IsAsync, BinField::IsGenerator, BinField::Name, BinField::Length, BinField::Directives, BinField::Contents };
@@ -4889,43 +3448,16 @@ BinASTParser<Tok>::parseInterfaceEagerMe
     MOZ_TRY(parseFunctionOrMethodContents(
         length, &params, &tmpBody));
     BINJS_MOZ_TRY_DECL(body, appendDirectivesToBody(tmpBody, directives));
     BINJS_MOZ_TRY_DECL(method, buildFunction(start, kind, name, params, body, funbox));
     BINJS_TRY_DECL(result, factory_.newObjectMethodOrPropertyDefinition(name, method, accessorType));
     return result;
 }
 
-
-/*
- interface EagerSetter : Node {
-    PropertyName name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    SetterContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEagerSetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EagerSetter) {
-        return raiseInvalidKind("EagerSetter", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEagerSetter(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEagerSetter(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::EagerSetter);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[4] = { BinField::Name, BinField::Length, BinField::Directives, BinField::Contents };
@@ -4966,165 +3498,45 @@ BinASTParser<Tok>::parseInterfaceEagerSe
     MOZ_TRY(parseSetterContents(
         length, &params, &tmpBody));
     BINJS_MOZ_TRY_DECL(body, appendDirectivesToBody(tmpBody, directives));
     BINJS_MOZ_TRY_DECL(method, buildFunction(start, kind, name, params, body, funbox));
     BINJS_TRY_DECL(result, factory_.newObjectMethodOrPropertyDefinition(name, method, accessorType));
     return result;
 }
 
-
-/*
- interface EmptyStatement : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseEmptyStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::EmptyStatement) {
-        return raiseInvalidKind("EmptyStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceEmptyStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceEmptyStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::EmptyStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 MOZ_TRY(tokenizer_->checkFields0(kind, fields));
 
     BINJS_TRY_DECL(result, factory_.newEmptyStatement(tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface Export : Node {
-    (FunctionDeclaration or ClassDeclaration or VariableDeclaration) declaration;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExport()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::Export) {
-        return raiseInvalidKind("Export", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceExport(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExport(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (Export)");
 }
 
-
-/*
- interface ExportAllFrom : Node {
-    string moduleSpecifier;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExportAllFrom()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ExportAllFrom) {
-        return raiseInvalidKind("ExportAllFrom", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceExportAllFrom(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExportAllFrom(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ExportAllFrom)");
 }
 
-
-/*
- interface ExportDefault : Node {
-    (FunctionDeclaration or ClassDeclaration or Expression) body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExportDefault()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ExportDefault) {
-        return raiseInvalidKind("ExportDefault", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceExportDefault(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExportDefault(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ExportDefault)");
 }
 
-
-/*
- interface ExportFrom : Node {
-    FrozenArray<ExportFromSpecifier> namedExports;
-    string moduleSpecifier;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExportFrom()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ExportFrom) {
-        return raiseInvalidKind("ExportFrom", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceExportFrom(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExportFrom(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ExportFrom)");
 }
 
 
 /*
@@ -5183,70 +3595,22 @@ BinASTParser<Tok>::parseExportLocalSpeci
 }
 
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExportLocalSpecifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ExportLocalSpecifier)");
 }
 
-
-/*
- interface ExportLocals : Node {
-    FrozenArray<ExportLocalSpecifier> namedExports;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExportLocals()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ExportLocals) {
-        return raiseInvalidKind("ExportLocals", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceExportLocals(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExportLocals(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ExportLocals)");
 }
 
-
-/*
- interface ExpressionStatement : Node {
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExpressionStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ExpressionStatement) {
-        return raiseInvalidKind("ExpressionStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceExpressionStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceExpressionStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ExpressionStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Expression };
@@ -5254,41 +3618,16 @@ BinASTParser<Tok>::parseInterfaceExpress
 #endif // defined(DEBUG)
 
     BINJS_MOZ_TRY_DECL(expression, parseExpression());
 
     BINJS_TRY_DECL(result, factory_.newExprStatement(expression, tokenizer_->offset()));
     return result;
 }
 
-
-/*
- interface ForInOfBinding : Node {
-    VariableDeclarationKind kind;
-    Binding binding;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseForInOfBinding()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ForInOfBinding) {
-        return raiseInvalidKind("ForInOfBinding", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceForInOfBinding(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceForInOfBinding(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ForInOfBinding);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Kind, BinField::Binding };
@@ -5307,42 +3646,16 @@ BinASTParser<Tok>::parseInterfaceForInOf
         kind_ == VariableDeclarationKind::Let
             ? ParseNodeKind::Let
             : ParseNodeKind::Var;
     BINJS_TRY_DECL(result, factory_.newDeclarationList(pnk, tokenizer_->pos(start)));
     factory_.addList(result, binding);
     return result;
 }
 
-
-/*
- interface ForInStatement : Node {
-    (ForInOfBinding or AssignmentTarget) left;
-    Expression right;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseForInStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ForInStatement) {
-        return raiseInvalidKind("ForInStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceForInStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceForInStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ForInStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Left, BinField::Right, BinField::Body };
@@ -5368,75 +3681,22 @@ BinASTParser<Tok>::parseInterfaceForInSt
 
     if (!scope.isEmpty()) {
         BINJS_TRY_DECL(bindings, NewLexicalScopeData(cx_, scope, alloc_, parseContext_));
         BINJS_TRY_VAR(result, factory_.newLexicalScope(*bindings, result));
     }
     return result;
 }
 
-
-/*
- interface ForOfStatement : Node {
-    (ForInOfBinding or AssignmentTarget) left;
-    Expression right;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseForOfStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ForOfStatement) {
-        return raiseInvalidKind("ForOfStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceForOfStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceForOfStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ForOfStatement)");
 }
 
-
-/*
- interface ForStatement : Node {
-    (VariableDeclaration or Expression)? init;
-    Expression? test;
-    Expression? update;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseForStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ForStatement) {
-        return raiseInvalidKind("ForStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceForStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceForStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ForStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[4] = { BinField::Init, BinField::Test, BinField::Update, BinField::Body };
@@ -5758,42 +4018,16 @@ BinASTParser<Tok>::parseInterfaceIdentif
     if (!IsIdentifier(name)) {
         return raiseError("Invalid identifier");
     }
     BINJS_TRY(usedNames_.noteUse(cx_, name, parseContext_->scriptId(), parseContext_->innermostScope()->id()));
     BINJS_TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));
     return result;
 }
 
-
-/*
- interface IfStatement : Node {
-    Expression test;
-    Statement consequent;
-    Statement? alternate;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseIfStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::IfStatement) {
-        return raiseInvalidKind("IfStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceIfStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceIfStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::IfStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Test, BinField::Consequent, BinField::Alternate };
@@ -5805,74 +4039,22 @@ BinASTParser<Tok>::parseInterfaceIfState
     BINJS_MOZ_TRY_DECL(consequent, parseStatement());
 
     BINJS_MOZ_TRY_DECL(alternate, parseOptionalStatement());
 
     BINJS_TRY_DECL(result, factory_.newIfStatement(start, test, consequent, alternate));
     return result;
 }
 
-
-/*
- interface Import : Node {
-    string moduleSpecifier;
-    BindingIdentifier? defaultBinding;
-    FrozenArray<ImportSpecifier> namedImports;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseImport()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::Import) {
-        return raiseInvalidKind("Import", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceImport(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceImport(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (Import)");
 }
 
-
-/*
- interface ImportNamespace : Node {
-    string moduleSpecifier;
-    BindingIdentifier? defaultBinding;
-    BindingIdentifier namespaceBinding;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseImportNamespace()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ImportNamespace) {
-        return raiseInvalidKind("ImportNamespace", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceImportNamespace(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceImportNamespace(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ImportNamespace)");
 }
 
 
 /*
@@ -5900,41 +4082,16 @@ BinASTParser<Tok>::parseImportSpecifier(
 }
 
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceImportSpecifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ImportSpecifier)");
 }
 
-
-/*
- interface LabelledStatement : Node {
-    Label label;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLabelledStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LabelledStatement) {
-        return raiseInvalidKind("LabelledStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLabelledStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLabelledStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LabelledStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Label, BinField::Body };
@@ -5948,110 +4105,28 @@ BinASTParser<Tok>::parseInterfaceLabelle
     }
     ParseContext::LabelStatement stmt(parseContext_, label);
     BINJS_MOZ_TRY_DECL(body, parseStatement());
 
     BINJS_TRY_DECL(result, factory_.newLabeledStatement(label->asPropertyName(), body, start));
     return result;
 }
 
-
-/*
- interface LazyArrowExpressionWithExpression : Node {
-    bool isAsync;
-    unsigned long length;
-    ArrowExpressionContentsWithExpression contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazyArrowExpressionWithExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazyArrowExpressionWithExpression) {
-        return raiseInvalidKind("LazyArrowExpressionWithExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazyArrowExpressionWithExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazyArrowExpressionWithExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (LazyArrowExpressionWithExpression)");
 }
 
-
-/*
- interface LazyArrowExpressionWithFunctionBody : Node {
-    bool isAsync;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    ArrowExpressionContentsWithFunctionBody contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazyArrowExpressionWithFunctionBody()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazyArrowExpressionWithFunctionBody) {
-        return raiseInvalidKind("LazyArrowExpressionWithFunctionBody", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazyArrowExpressionWithFunctionBody(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazyArrowExpressionWithFunctionBody(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (LazyArrowExpressionWithFunctionBody)");
 }
 
-
-/*
- interface LazyFunctionDeclaration : Node {
-    bool isAsync;
-    bool isGenerator;
-    BindingIdentifier name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    FunctionOrMethodContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazyFunctionDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazyFunctionDeclaration) {
-        return raiseInvalidKind("LazyFunctionDeclaration", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazyFunctionDeclaration(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazyFunctionDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LazyFunctionDeclaration);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[7] = { BinField::IsAsync, BinField::IsGenerator, BinField::Name, BinField::Length, BinField::Directives, BinField::ContentsSkip, BinField::Contents };
@@ -6096,45 +4171,16 @@ BinASTParser<Tok>::parseInterfaceLazyFun
     }
     lazy->setIsBinAST();
     funbox->function()->initLazyScript(lazy);
 
     BINJS_MOZ_TRY_DECL(result, makeEmptyFunctionNode(skipStart, kind, funbox));
     return result;
 }
 
-
-/*
- interface LazyFunctionExpression : Node {
-    bool isAsync;
-    bool isGenerator;
-    BindingIdentifier? name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    FunctionExpressionContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazyFunctionExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazyFunctionExpression) {
-        return raiseInvalidKind("LazyFunctionExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazyFunctionExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazyFunctionExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LazyFunctionExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[7] = { BinField::IsAsync, BinField::IsGenerator, BinField::Name, BinField::Length, BinField::Directives, BinField::ContentsSkip, BinField::Contents };
@@ -6179,140 +4225,34 @@ BinASTParser<Tok>::parseInterfaceLazyFun
     }
     lazy->setIsBinAST();
     funbox->function()->initLazyScript(lazy);
 
     BINJS_MOZ_TRY_DECL(result, makeEmptyFunctionNode(skipStart, kind, funbox));
     return result;
 }
 
-
-/*
- interface LazyGetter : Node {
-    PropertyName name;
-    FrozenArray<Directive> directives;
-    GetterContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazyGetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazyGetter) {
-        return raiseInvalidKind("LazyGetter", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazyGetter(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazyGetter(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (LazyGetter)");
 }
 
-
-/*
- interface LazyMethod : Node {
-    bool isAsync;
-    bool isGenerator;
-    PropertyName name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    FunctionOrMethodContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazyMethod()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazyMethod) {
-        return raiseInvalidKind("LazyMethod", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazyMethod(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazyMethod(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (LazyMethod)");
 }
 
-
-/*
- interface LazySetter : Node {
-    PropertyName name;
-    unsigned long length;
-    FrozenArray<Directive> directives;
-    SetterContents contents;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLazySetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LazySetter) {
-        return raiseInvalidKind("LazySetter", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLazySetter(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLazySetter(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (LazySetter)");
 }
 
-
-/*
- interface LiteralBooleanExpression : Node {
-    bool value;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralBooleanExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralBooleanExpression) {
-        return raiseInvalidKind("LiteralBooleanExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralBooleanExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LiteralBooleanExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Value };
@@ -6320,103 +4260,33 @@ BinASTParser<Tok>::parseInterfaceLiteral
 #endif // defined(DEBUG)
 
     BINJS_MOZ_TRY_DECL(value, tokenizer_->readBool());
 
     BINJS_TRY_DECL(result, factory_.newBooleanLiteral(value, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface LiteralInfinityExpression : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralInfinityExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralInfinityExpression) {
-        return raiseInvalidKind("LiteralInfinityExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralInfinityExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralInfinityExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (LiteralInfinityExpression)");
 }
 
-
-/*
- interface LiteralNullExpression : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralNullExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralNullExpression) {
-        return raiseInvalidKind("LiteralNullExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralNullExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralNullExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LiteralNullExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 MOZ_TRY(tokenizer_->checkFields0(kind, fields));
 
     BINJS_TRY_DECL(result, factory_.newNullLiteral(tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface LiteralNumericExpression : Node {
-    number value;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralNumericExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralNumericExpression) {
-        return raiseInvalidKind("LiteralNumericExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralNumericExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralNumericExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LiteralNumericExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Value };
@@ -6424,40 +4294,16 @@ BinASTParser<Tok>::parseInterfaceLiteral
 #endif // defined(DEBUG)
 
     BINJS_MOZ_TRY_DECL(value, tokenizer_->readDouble());
 
     BINJS_TRY_DECL(result, factory_.newNumber(value, DecimalPoint::HasDecimal, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface LiteralPropertyName : Node {
-    string value;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralPropertyName()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralPropertyName) {
-        return raiseInvalidKind("LiteralPropertyName", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralPropertyName(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralPropertyName(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LiteralPropertyName);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Value };
@@ -6472,41 +4318,16 @@ BinASTParser<Tok>::parseInterfaceLiteral
     if (value->isIndex(&index)) {
         BINJS_TRY_VAR(result, factory_.newNumber(index, NoDecimal, TokenPos(start, tokenizer_->offset())));
     } else {
         BINJS_TRY_VAR(result, factory_.newObjectLiteralPropertyName(value, tokenizer_->pos(start)));
     }
     return result;
 }
 
-
-/*
- interface LiteralRegExpExpression : Node {
-    string pattern;
-    string flags;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralRegExpExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralRegExpExpression) {
-        return raiseInvalidKind("LiteralRegExpExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralRegExpExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralRegExpExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LiteralRegExpExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Pattern, BinField::Flags };
@@ -6542,40 +4363,16 @@ BinASTParser<Tok>::parseInterfaceLiteral
         reflags,
         alloc_,
         TenuredObject));
 
     BINJS_TRY_DECL(result, factory_.newRegExp(reobj, tokenizer_->pos(start), *this));
     return result;
 }
 
-
-/*
- interface LiteralStringExpression : Node {
-    string value;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteralStringExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::LiteralStringExpression) {
-        return raiseInvalidKind("LiteralStringExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceLiteralStringExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceLiteralStringExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::LiteralStringExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Value };
@@ -6584,73 +4381,22 @@ BinASTParser<Tok>::parseInterfaceLiteral
 
     RootedAtom value(cx_);
     MOZ_TRY_VAR(value, tokenizer_->readAtom());
 
     BINJS_TRY_DECL(result, factory_.newStringLiteral(value, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface Module : Node {
-    AssertedVarScope scope;
-    FrozenArray<Directive> directives;
-    FrozenArray<(ImportDeclaration or ExportDeclaration or Statement)> items;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseModule()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::Module) {
-        return raiseInvalidKind("Module", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceModule(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceModule(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (Module)");
 }
 
-
-/*
- interface NewExpression : Node {
-    Expression callee;
-    Arguments arguments;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseNewExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::NewExpression) {
-        return raiseInvalidKind("NewExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceNewExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceNewExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::NewExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Callee, BinField::Arguments };
@@ -6660,129 +4406,34 @@ BinASTParser<Tok>::parseInterfaceNewExpr
     BINJS_MOZ_TRY_DECL(callee, parseExpression());
 
     BINJS_MOZ_TRY_DECL(arguments, parseArguments());
 
     BINJS_TRY_DECL(result, factory_.newNewExpression(tokenizer_->pos(start).begin, callee, arguments));
     return result;
 }
 
-
-/*
- interface NewTargetExpression : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseNewTargetExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::NewTargetExpression) {
-        return raiseInvalidKind("NewTargetExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceNewTargetExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceNewTargetExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (NewTargetExpression)");
 }
 
-
-/*
- interface ObjectAssignmentTarget : Node {
-    FrozenArray<AssignmentTargetProperty> properties;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseObjectAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ObjectAssignmentTarget) {
-        return raiseInvalidKind("ObjectAssignmentTarget", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceObjectAssignmentTarget(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceObjectAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ObjectAssignmentTarget)");
 }
 
-
-/*
- interface ObjectBinding : Node {
-    FrozenArray<BindingProperty> properties;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseObjectBinding()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ObjectBinding) {
-        return raiseInvalidKind("ObjectBinding", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceObjectBinding(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceObjectBinding(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ObjectBinding)");
 }
 
-
-/*
- interface ObjectExpression : Node {
-    FrozenArray<ObjectProperty> properties;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseObjectExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ObjectExpression) {
-        return raiseInvalidKind("ObjectExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceObjectExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceObjectExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ObjectExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Properties };
@@ -6790,40 +4441,16 @@ BinASTParser<Tok>::parseInterfaceObjectE
 #endif // defined(DEBUG)
 
     BINJS_MOZ_TRY_DECL(properties, parseListOfObjectProperty());
 
     auto result = properties;
     return result;
 }
 
-
-/*
- interface ReturnStatement : Node {
-    Expression? expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseReturnStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ReturnStatement) {
-        return raiseInvalidKind("ReturnStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceReturnStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceReturnStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ReturnStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Expression };
@@ -6837,42 +4464,16 @@ BinASTParser<Tok>::parseInterfaceReturnS
     parseContext_->functionBox()->usesReturn = true;
 
     BINJS_MOZ_TRY_DECL(expression, parseOptionalExpression());
 
     BINJS_TRY_DECL(result, factory_.newReturnStatement(expression, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface Script : Node {
-    AssertedScriptGlobalScope scope;
-    FrozenArray<Directive> directives;
-    FrozenArray<Statement> statements;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseScript()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::Script) {
-        return raiseInvalidKind("Script", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceScript(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceScript(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::Script);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Scope, BinField::Directives, BinField::Statements };
@@ -6951,40 +4552,16 @@ BinASTParser<Tok>::parseInterfaceSetterC
     BINJS_MOZ_TRY_DECL(body, parseFunctionBody());
 
     *paramsOut = params;
     *bodyOut = body;
     auto result = Ok();
     return result;
 }
 
-
-/*
- interface ShorthandProperty : Node {
-    IdentifierExpression name;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseShorthandProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ShorthandProperty) {
-        return raiseInvalidKind("ShorthandProperty", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceShorthandProperty(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceShorthandProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ShorthandProperty);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Name };
@@ -6996,71 +4573,22 @@ BinASTParser<Tok>::parseInterfaceShortha
     if (!factory_.isUsableAsObjectPropertyName(name)) {
         BINJS_TRY_VAR(name, factory_.newObjectLiteralPropertyName(name->name(), tokenizer_->pos(start)));
     }
 
     BINJS_TRY_DECL(result, factory_.newObjectMethodOrPropertyDefinition(name, name, AccessorType::None));
     return result;
 }
 
-
-/*
- interface SpreadElement : Node {
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSpreadElement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::SpreadElement) {
-        return raiseInvalidKind("SpreadElement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceSpreadElement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceSpreadElement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (SpreadElement)");
 }
 
-
-/*
- interface StaticMemberAssignmentTarget : Node {
-    (Expression or Super) object;
-    IdentifierName property;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseStaticMemberAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::StaticMemberAssignmentTarget) {
-        return raiseInvalidKind("StaticMemberAssignmentTarget", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceStaticMemberAssignmentTarget(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceStaticMemberAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::StaticMemberAssignmentTarget);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Object, BinField::Property };
@@ -7076,41 +4604,16 @@ BinASTParser<Tok>::parseInterfaceStaticM
 
     }
 
     BINJS_TRY_DECL(name, factory_.newPropertyName(property->asPropertyName(), tokenizer_->pos(nameStart)));
     BINJS_TRY_DECL(result, factory_.newPropertyAccess(object, name));
     return result;
 }
 
-
-/*
- interface StaticMemberExpression : Node {
-    (Expression or Super) object;
-    IdentifierName property;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseStaticMemberExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::StaticMemberExpression) {
-        return raiseInvalidKind("StaticMemberExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceStaticMemberExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceStaticMemberExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::StaticMemberExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Object, BinField::Property };
@@ -7126,39 +4629,16 @@ BinASTParser<Tok>::parseInterfaceStaticM
 
     }
 
     BINJS_TRY_DECL(name, factory_.newPropertyName(property->asPropertyName(), tokenizer_->pos(nameStart)));
     BINJS_TRY_DECL(result, factory_.newPropertyAccess(object, name));
     return result;
 }
 
-
-/*
- interface Super : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSuper()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::Super) {
-        return raiseInvalidKind("Super", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceSuper(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceSuper(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (Super)");
 }
 
 
 /*
@@ -7240,41 +4720,16 @@ BinASTParser<Tok>::parseInterfaceSwitchD
 #endif // defined(DEBUG)
 
     BINJS_MOZ_TRY_DECL(consequent, parseListOfStatement());
 
     BINJS_TRY_DECL(result, factory_.newCaseOrDefault(start, nullptr, consequent));
     return result;
 }
 
-
-/*
- interface SwitchStatement : Node {
-    Expression discriminant;
-    FrozenArray<SwitchCase> cases;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSwitchStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::SwitchStatement) {
-        return raiseInvalidKind("SwitchStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceSwitchStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceSwitchStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::SwitchStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Discriminant, BinField::Cases };
@@ -7285,43 +4740,16 @@ BinASTParser<Tok>::parseInterfaceSwitchS
 
     BINJS_MOZ_TRY_DECL(cases, parseListOfSwitchCase());
 
     BINJS_TRY_DECL(scope, factory_.newLexicalScope(nullptr, cases));
     BINJS_TRY_DECL(result, factory_.newSwitchStatement(start, discriminant, scope, false));
     return result;
 }
 
-
-/*
- interface SwitchStatementWithDefault : Node {
-    Expression discriminant;
-    FrozenArray<SwitchCase> preDefaultCases;
-    SwitchDefault defaultCase;
-    FrozenArray<SwitchCase> postDefaultCases;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSwitchStatementWithDefault()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::SwitchStatementWithDefault) {
-        return raiseInvalidKind("SwitchStatementWithDefault", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceSwitchStatementWithDefault(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceSwitchStatementWithDefault(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::SwitchStatementWithDefault);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[4] = { BinField::Discriminant, BinField::PreDefaultCases, BinField::DefaultCase, BinField::PostDefaultCases };
@@ -7345,100 +4773,28 @@ BinASTParser<Tok>::parseInterfaceSwitchS
         factory_.addList(cases, iter);
         iter = next;
     }
     BINJS_TRY_DECL(scope, factory_.newLexicalScope(nullptr, cases));
     BINJS_TRY_DECL(result, factory_.newSwitchStatement(start, discriminant, scope, true));
     return result;
 }
 
-
-/*
- interface TemplateElement : Node {
-    string rawValue;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseTemplateElement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::TemplateElement) {
-        return raiseInvalidKind("TemplateElement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceTemplateElement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceTemplateElement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (TemplateElement)");
 }
 
-
-/*
- interface TemplateExpression : Node {
-    Expression? tag;
-    FrozenArray<(Expression or TemplateElement)> elements;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseTemplateExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::TemplateExpression) {
-        return raiseInvalidKind("TemplateExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceTemplateExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceTemplateExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (TemplateExpression)");
 }
 
-
-/*
- interface ThisExpression : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseThisExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ThisExpression) {
-        return raiseInvalidKind("ThisExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceThisExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceThisExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ThisExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 MOZ_TRY(tokenizer_->checkFields0(kind, fields));
 
     if (parseContext_->isFunctionBox()) {
@@ -7452,40 +4808,16 @@ MOZ_TRY(tokenizer_->checkFields0(kind, f
         BINJS_TRY(usedNames_.noteUse(cx_, dotThis, parseContext_->scriptId(), parseContext_->innermostScope()->id()));
         BINJS_TRY_VAR(thisName, factory_.newName(dotThis, pos, cx_));
     }
 
     BINJS_TRY_DECL(result, factory_.newThisLiteral(pos, thisName));
     return result;
 }
 
-
-/*
- interface ThrowStatement : Node {
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseThrowStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::ThrowStatement) {
-        return raiseInvalidKind("ThrowStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceThrowStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceThrowStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ThrowStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[1] = { BinField::Expression };
@@ -7493,41 +4825,16 @@ BinASTParser<Tok>::parseInterfaceThrowSt
 #endif // defined(DEBUG)
 
     BINJS_MOZ_TRY_DECL(expression, parseExpression());
 
     BINJS_TRY_DECL(result, factory_.newThrowStatement(expression, tokenizer_->pos(start)));
     return result;
 }
 
-
-/*
- interface TryCatchStatement : Node {
-    Block body;
-    CatchClause catchClause;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseTryCatchStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::TryCatchStatement) {
-        return raiseInvalidKind("TryCatchStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceTryCatchStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceTryCatchStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::TryCatchStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Body, BinField::CatchClause };
@@ -7543,42 +4850,16 @@ BinASTParser<Tok>::parseInterfaceTryCatc
     }
 
     BINJS_MOZ_TRY_DECL(catchClause, parseCatchClause());
 
     BINJS_TRY_DECL(result, factory_.newTryStatement(start, body, catchClause, /* finallyBlock = */ nullptr));
     return result;
 }
 
-
-/*
- interface TryFinallyStatement : Node {
-    Block body;
-    CatchClause? catchClause;
-    Block finalizer;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseTryFinallyStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::TryFinallyStatement) {
-        return raiseInvalidKind("TryFinallyStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceTryFinallyStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceTryFinallyStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::TryFinallyStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::Body, BinField::CatchClause, BinField::Finalizer };
@@ -7602,41 +4883,16 @@ BinASTParser<Tok>::parseInterfaceTryFina
         MOZ_TRY_VAR(finalizer, parseBlock());
 
     }
 
     BINJS_TRY_DECL(result, factory_.newTryStatement(start, body, catchClause, finalizer));
     return result;
 }
 
-
-/*
- interface UnaryExpression : Node {
-    UnaryOperator operator;
-    Expression operand;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseUnaryExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::UnaryExpression) {
-        return raiseInvalidKind("UnaryExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceUnaryExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceUnaryExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::UnaryExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Operator, BinField::Operand };
@@ -7689,42 +4945,16 @@ BinASTParser<Tok>::parseInterfaceUnaryEx
         }
         break;
       }
     }
     BINJS_TRY_DECL(result, factory_.newUnary(pnk, start, operand));
     return result;
 }
 
-
-/*
- interface UpdateExpression : Node {
-    bool isPrefix;
-    UpdateOperator operator;
-    SimpleAssignmentTarget operand;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseUpdateExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::UpdateExpression) {
-        return raiseInvalidKind("UpdateExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceUpdateExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceUpdateExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::UpdateExpression);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[3] = { BinField::IsPrefix, BinField::Operator, BinField::Operand };
@@ -7747,41 +4977,16 @@ BinASTParser<Tok>::parseInterfaceUpdateE
         pnk = isPrefix ? ParseNodeKind::PreDecrement
                        : ParseNodeKind::PostDecrement;
         break;
     }
     BINJS_TRY_DECL(result, factory_.newUnary(pnk, start, operand));
     return result;
 }
 
-
-/*
- interface VariableDeclaration : Node {
-    VariableDeclarationKind kind;
-    FrozenArray<VariableDeclarator> declarators;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseVariableDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::VariableDeclaration) {
-        return raiseInvalidKind("VariableDeclaration", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceVariableDeclaration(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceVariableDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::VariableDeclaration);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Kind, BinField::Declarators };
@@ -7873,41 +5078,16 @@ BinASTParser<Tok>::parseInterfaceVariabl
         }
 
         MOZ_CRASH("Unimplemented: AssertedScope check for BindingPattern variable declaration");
         BINJS_TRY_VAR(result, factory_.newAssignment(ParseNodeKind::Assign, binding, init));
     }
     return result;
 }
 
-
-/*
- interface WhileStatement : Node {
-    Expression test;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseWhileStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::WhileStatement) {
-        return raiseInvalidKind("WhileStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceWhileStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceWhileStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::WhileStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Test, BinField::Body };
@@ -7918,41 +5098,16 @@ BinASTParser<Tok>::parseInterfaceWhileSt
     BINJS_MOZ_TRY_DECL(test, parseExpression());
 
     BINJS_MOZ_TRY_DECL(body, parseStatement());
 
     BINJS_TRY_DECL(result, factory_.newWhileStatement(start, test, body));
     return result;
 }
 
-
-/*
- interface WithStatement : Node {
-    Expression object;
-    Statement body;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseWithStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::WithStatement) {
-        return raiseInvalidKind("WithStatement", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceWithStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceWithStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::WithStatement);
     BINJS_TRY(CheckRecursionLimit(cx_));
 
 #if defined(DEBUG)
     const BinField expected_fields[2] = { BinField::Object, BinField::Body };
@@ -7962,70 +5117,22 @@ BinASTParser<Tok>::parseInterfaceWithSta
     BINJS_MOZ_TRY_DECL(object, parseExpression());
 
     BINJS_MOZ_TRY_DECL(body, parseStatement());
 
     BINJS_TRY_DECL(result, factory_.newWithStatement(start, object, body));
     return result;
 }
 
-
-/*
- interface YieldExpression : Node {
-    Expression? expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseYieldExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::YieldExpression) {
-        return raiseInvalidKind("YieldExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceYieldExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceYieldExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (YieldExpression)");
 }
 
-
-/*
- interface YieldStarExpression : Node {
-    Expression expression;
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseYieldStarExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    if (kind != BinKind::YieldStarExpression) {
-        return raiseInvalidKind("YieldStarExpression", kind);
-    }
-    const auto start = tokenizer_->offset();
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceYieldStarExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
 template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseInterfaceYieldStarExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (YieldStarExpression)");
 }
 
 
 
@@ -8714,28 +5821,16 @@ BinASTParser<Tok>::parseOptionalExpressi
         MOZ_TRY_VAR(result, parseSumExpression(start, kind, fields));
     }
     MOZ_TRY(guard.done());
 
     return result;
 }
 
 template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseOptionalIdentifierName()
-{
-    return raiseError("FIXME: Not implemented yet (OptionalIdentifierName)");
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseOptionalLabel()
-{
-    return raiseError("FIXME: Not implemented yet (OptionalLabel)");
-}
-
-template<typename Tok> JS::Result<ParseNode*>
 BinASTParser<Tok>::parseOptionalSpreadElementOrExpression()
 {
     BinKind kind;
     BinFields fields(cx_);
     AutoTaggedTuple guard(*tokenizer_);
 
     MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
     ParseNode* result;
--- a/js/src/frontend/BinSource-auto.h
+++ b/js/src/frontend/BinSource-auto.h
@@ -84,237 +84,112 @@ enum class VariableDeclarationKind {
     Const                     /* "const" */
 };
 
 
 
 // ----- Sums of interfaces (by lexicographical order)
 // Implementations are autogenerated
 // `ParseNode*` may never be nullptr
-JS::Result<ParseNode*> parseArrowExpression();
 JS::Result<Ok> parseAssertedMaybePositionalParameterName(
     AssertedScopeKind scopeKind,
     MutableHandle<GCVector<JSAtom*>> positionalParams);
 JS::Result<ParseNode*> parseAssignmentTarget();
 JS::Result<ParseNode*> parseAssignmentTargetOrAssignmentTargetWithInitializer();
-JS::Result<ParseNode*> parseAssignmentTargetPattern();
 JS::Result<ParseNode*> parseAssignmentTargetProperty();
 JS::Result<ParseNode*> parseBinding();
 JS::Result<ParseNode*> parseBindingOrBindingWithInitializer();
-JS::Result<ParseNode*> parseBindingPattern();
 JS::Result<ParseNode*> parseBindingProperty();
-JS::Result<ParseNode*> parseExportDeclaration();
 JS::Result<ParseNode*> parseExpression();
 JS::Result<ParseNode*> parseExpressionOrSuper();
 JS::Result<ParseNode*> parseExpressionOrTemplateElement();
 JS::Result<ParseNode*> parseForInOfBindingOrAssignmentTarget();
-JS::Result<ParseNode*> parseFunctionDeclaration();
 JS::Result<ParseNode*> parseFunctionDeclarationOrClassDeclarationOrExpression();
 JS::Result<ParseNode*> parseFunctionDeclarationOrClassDeclarationOrVariableDeclaration();
-JS::Result<ParseNode*> parseFunctionExpression();
-JS::Result<ParseNode*> parseGetter();
-JS::Result<ParseNode*> parseImportDeclaration();
 JS::Result<ParseNode*> parseImportDeclarationOrExportDeclarationOrStatement();
-JS::Result<ParseNode*> parseIterationStatement();
-JS::Result<ParseNode*> parseLiteral();
-JS::Result<ParseNode*> parseMethod();
 JS::Result<ParseNode*> parseMethodDefinition();
 JS::Result<ParseNode*> parseObjectProperty();
 JS::Result<ParseNode*> parseParameter();
 JS::Result<ParseNode*> parseProgram();
 JS::Result<ParseNode*> parsePropertyName();
-JS::Result<ParseNode*> parseSetter();
 JS::Result<ParseNode*> parseSimpleAssignmentTarget();
 JS::Result<ParseNode*> parseSpreadElementOrExpression();
 JS::Result<ParseNode*> parseStatement();
-JS::Result<ParseNode*> parseVariableDeclarationOrExpression();
-JS::Result<ParseNode*> parseSumArrowExpression(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<Ok> parseSumAssertedMaybePositionalParameterName(const size_t start, const BinKind kind, const BinFields& fields,
     AssertedScopeKind scopeKind,
     MutableHandle<GCVector<JSAtom*>> positionalParams);
 JS::Result<ParseNode*> parseSumAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumAssignmentTargetOrAssignmentTargetWithInitializer(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumAssignmentTargetPattern(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumAssignmentTargetProperty(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumBinding(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumBindingOrBindingWithInitializer(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumBindingPattern(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumBindingProperty(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumExportDeclaration(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumExpression(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumExpressionOrSuper(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumExpressionOrTemplateElement(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumForInOfBindingOrAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumFunctionDeclaration(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumFunctionDeclarationOrClassDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumFunctionDeclarationOrClassDeclarationOrVariableDeclaration(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumFunctionExpression(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumGetter(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumImportDeclaration(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumImportDeclarationOrExportDeclarationOrStatement(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumIterationStatement(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumLiteral(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumMethod(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumMethodDefinition(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumObjectProperty(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumParameter(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumProgram(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumPropertyName(const size_t start, const BinKind kind, const BinFields& fields);
-JS::Result<ParseNode*> parseSumSetter(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumSimpleAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumSpreadElementOrExpression(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumStatement(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseSumVariableDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields);
 
 
 // ----- Interfaces (by lexicographical order)
 // Implementations are autogenerated
 // `ParseNode*` may never be nullptr
-JS::Result<ParseNode*> parseNull();
-JS::Result<ParseNode*> parseArrayAssignmentTarget();
-JS::Result<ParseNode*> parseArrayBinding();
-JS::Result<ParseNode*> parseArrayExpression();
 JS::Result<ParseNode*> parseArrowExpressionContentsWithExpression();
 JS::Result<ParseNode*> parseArrowExpressionContentsWithFunctionBody();
 JS::Result<Ok> parseAssertedBlockScope();
 JS::Result<Ok> parseAssertedBoundName(
     AssertedScopeKind scopeKind);
 JS::Result<Ok> parseAssertedBoundNamesScope();
 JS::Result<Ok> parseAssertedDeclaredName(
     AssertedScopeKind scopeKind);
-JS::Result<Ok> parseAssertedParameterName(
-    AssertedScopeKind scopeKind,
-    MutableHandle<GCVector<JSAtom*>> positionalParams);
 JS::Result<Ok> parseAssertedParameterScope(
     MutableHandle<GCVector<JSAtom*>> positionalParams);
-JS::Result<Ok> parseAssertedPositionalParameterName(
-    AssertedScopeKind scopeKind,
-    MutableHandle<GCVector<JSAtom*>> positionalParams);
-JS::Result<Ok> parseAssertedRestParameterName(
-    AssertedScopeKind scopeKind,
-    MutableHandle<GCVector<JSAtom*>> positionalParams);
 JS::Result<Ok> parseAssertedScriptGlobalScope();
 JS::Result<Ok> parseAssertedVarScope();
-JS::Result<ParseNode*> parseAssignmentExpression();
 JS::Result<ParseNode*> parseAssignmentTargetIdentifier();
-JS::Result<ParseNode*> parseAssignmentTargetPropertyIdentifier();
-JS::Result<ParseNode*> parseAssignmentTargetPropertyProperty();
-JS::Result<ParseNode*> parseAssignmentTargetWithInitializer();
-JS::Result<ParseNode*> parseAwaitExpression();
-JS::Result<ParseNode*> parseBinaryExpression();
 JS::Result<ParseNode*> parseBindingIdentifier();
-JS::Result<ParseNode*> parseBindingPropertyIdentifier();
-JS::Result<ParseNode*> parseBindingPropertyProperty();
-JS::Result<ParseNode*> parseBindingWithInitializer();
 JS::Result<ParseNode*> parseBlock();
-JS::Result<ParseNode*> parseBreakStatement();
-JS::Result<ParseNode*> parseCallExpression();
 JS::Result<LexicalScopeNode*> parseCatchClause();
-JS::Result<ParseNode*> parseClassDeclaration();
 JS::Result<ParseNode*> parseClassElement();
-JS::Result<ParseNode*> parseClassExpression();
-JS::Result<ParseNode*> parseCompoundAssignmentExpression();
-JS::Result<ParseNode*> parseComputedMemberAssignmentTarget();
-JS::Result<ParseNode*> parseComputedMemberExpression();
-JS::Result<ParseNode*> parseComputedPropertyName();
-JS::Result<ParseNode*> parseConditionalExpression();
-JS::Result<ParseNode*> parseContinueStatement();
-JS::Result<ParseNode*> parseDataProperty();
-JS::Result<ParseNode*> parseDebuggerStatement();
 JS::Result<ParseNode*> parseDirective();
-JS::Result<ParseNode*> parseDoWhileStatement();
-JS::Result<ParseNode*> parseEagerArrowExpressionWithExpression();
-JS::Result<ParseNode*> parseEagerArrowExpressionWithFunctionBody();
-JS::Result<ParseNode*> parseEagerFunctionDeclaration();
-JS::Result<ParseNode*> parseEagerFunctionExpression();
-JS::Result<ParseNode*> parseEagerGetter();
-JS::Result<ParseNode*> parseEagerMethod();
-JS::Result<ParseNode*> parseEagerSetter();
-JS::Result<ParseNode*> parseEmptyStatement();
-JS::Result<ParseNode*> parseExport();
-JS::Result<ParseNode*> parseExportAllFrom();
-JS::Result<ParseNode*> parseExportDefault();
-JS::Result<ParseNode*> parseExportFrom();
 JS::Result<ParseNode*> parseExportFromSpecifier();
 JS::Result<ParseNode*> parseExportLocalSpecifier();
-JS::Result<ParseNode*> parseExportLocals();
-JS::Result<ParseNode*> parseExpressionStatement();
-JS::Result<ParseNode*> parseForInOfBinding();
-JS::Result<ParseNode*> parseForInStatement();
-JS::Result<ParseNode*> parseForOfStatement();
-JS::Result<ParseNode*> parseForStatement();
 JS::Result<ListNode*> parseFormalParameters();
 JS::Result<Ok> parseFunctionExpressionContents(
     uint32_t funLength,
     ListNode** paramsOut,
     ListNode** bodyOut);
 JS::Result<Ok> parseFunctionOrMethodContents(
     uint32_t funLength,
     ListNode** paramsOut,
     ListNode** bodyOut);
 JS::Result<Ok> parseGetterContents(
     uint32_t funLength,
     ListNode** paramsOut,
     ListNode** bodyOut);
 JS::Result<ParseNode*> parseIdentifierExpression();
-JS::Result<ParseNode*> parseIfStatement();
-JS::Result<ParseNode*> parseImport();
-JS::Result<ParseNode*> parseImportNamespace();
 JS::Result<ParseNode*> parseImportSpecifier();
-JS::Result<ParseNode*> parseLabelledStatement();
-JS::Result<ParseNode*> parseLazyArrowExpressionWithExpression();
-JS::Result<ParseNode*> parseLazyArrowExpressionWithFunctionBody();
-JS::Result<ParseNode*> parseLazyFunctionDeclaration();
-JS::Result<ParseNode*> parseLazyFunctionExpression();
-JS::Result<ParseNode*> parseLazyGetter();
-JS::Result<ParseNode*> parseLazyMethod();
-JS::Result<ParseNode*> parseLazySetter();
-JS::Result<ParseNode*> parseLiteralBooleanExpression();
-JS::Result<ParseNode*> parseLiteralInfinityExpression();
-JS::Result<ParseNode*> parseLiteralNullExpression();
-JS::Result<ParseNode*> parseLiteralNumericExpression();
-JS::Result<ParseNode*> parseLiteralPropertyName();
-JS::Result<ParseNode*> parseLiteralRegExpExpression();
-JS::Result<ParseNode*> parseLiteralStringExpression();
-JS::Result<ParseNode*> parseModule();
-JS::Result<ParseNode*> parseNewExpression();
-JS::Result<ParseNode*> parseNewTargetExpression();
-JS::Result<ParseNode*> parseObjectAssignmentTarget();
-JS::Result<ParseNode*> parseObjectBinding();
-JS::Result<ParseNode*> parseObjectExpression();
-JS::Result<ParseNode*> parseReturnStatement();
-JS::Result<ParseNode*> parseScript();
 JS::Result<Ok> parseSetterContents(
     uint32_t funLength,
     ListNode** paramsOut,
     ListNode** bodyOut);
-JS::Result<ParseNode*> parseShorthandProperty();
-JS::Result<ParseNode*> parseSpreadElement();
-JS::Result<ParseNode*> parseStaticMemberAssignmentTarget();
-JS::Result<ParseNode*> parseStaticMemberExpression();
-JS::Result<ParseNode*> parseSuper();
 JS::Result<CaseClause*> parseSwitchCase();
 JS::Result<ParseNode*> parseSwitchDefault();
-JS::Result<ParseNode*> parseSwitchStatement();
-JS::Result<ParseNode*> parseSwitchStatementWithDefault();
-JS::Result<ParseNode*> parseTemplateElement();
-JS::Result<ParseNode*> parseTemplateExpression();
-JS::Result<ParseNode*> parseThisExpression();
-JS::Result<ParseNode*> parseThrowStatement();
-JS::Result<ParseNode*> parseTryCatchStatement();
-JS::Result<ParseNode*> parseTryFinallyStatement();
-JS::Result<ParseNode*> parseUnaryExpression();
-JS::Result<ParseNode*> parseUpdateExpression();
-JS::Result<ParseNode*> parseVariableDeclaration();
 JS::Result<ParseNode*> parseVariableDeclarator();
-JS::Result<ParseNode*> parseWhileStatement();
-JS::Result<ParseNode*> parseWithStatement();
-JS::Result<ParseNode*> parseYieldExpression();
-JS::Result<ParseNode*> parseYieldStarExpression();
-JS::Result<ParseNode*> parseInterfaceNull(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseInterfaceArrayAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseInterfaceArrayBinding(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseInterfaceArrayExpression(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseInterfaceArrowExpressionContentsWithExpression(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<ParseNode*> parseInterfaceArrowExpressionContentsWithFunctionBody(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<Ok> parseInterfaceAssertedBlockScope(const size_t start, const BinKind kind, const BinFields& fields);
 JS::Result<Ok> parseInterfaceAssertedBoundName(const size_t start, const BinKind kind, const BinFields& fields,
     AssertedScopeKind scopeKind);
@@ -495,14 +370,12 @@ JS::Result<ListNode*> parseListOfVariabl
 // ----- Default values (by lexicographical order)
 // Implementations are autogenerated
 JS::Result<ParseNode*> parseOptionalAssignmentTarget();
 JS::Result<ParseNode*> parseOptionalBinding();
 JS::Result<ParseNode*> parseOptionalBindingIdentifier();
 JS::Result<ParseNode*> parseOptionalBindingOrBindingWithInitializer();
 JS::Result<LexicalScopeNode*> parseOptionalCatchClause();
 JS::Result<ParseNode*> parseOptionalExpression();
-JS::Result<ParseNode*> parseOptionalIdentifierName();
-JS::Result<ParseNode*> parseOptionalLabel();
 JS::Result<ParseNode*> parseOptionalSpreadElementOrExpression();
 JS::Result<ParseNode*> parseOptionalStatement();
 JS::Result<ParseNode*> parseOptionalVariableDeclarationOrExpression();
 
--- a/js/src/frontend/binsource/src/main.rs
+++ b/js/src/frontend/binsource/src/main.rs
@@ -6,16 +6,20 @@ extern crate itertools;
 extern crate webidl;
 extern crate yaml_rust;
 
 use binjs_meta::export::{ ToWebidl, TypeDeanonymizer, TypeName };
 use binjs_meta::import::Importer;
 use binjs_meta::spec::*;
 use binjs_meta::util:: { Reindentable, ToCases, ToStr };
 
+mod refgraph;
+
+use refgraph::{ ReferenceGraph };
+
 use std::collections::{ HashMap, HashSet };
 use std::fs::*;
 use std::io::{ Read, Write };
 use std::path::Path;
 use std::rc::Rc;
 
 use clap::{ App, Arg };
 
@@ -486,24 +490,47 @@ enum MethodCallKind {
     /// Use MOZ_TRY_VAR if the result type is not "Ok",
     /// use MOZ_TRY otherwise.
     Var,
 
     /// Always use MOZ_TRY_VAR regardless of the result type.
     AlwaysVar,
 }
 
+/// Fixed parameter of interface method.
+const INTERFACE_PARAMS: &str =
+    "const size_t start, const BinKind kind, const BinFields& fields";
+
+/// Fixed arguments of interface method.
+const INTERFACE_ARGS: &str =
+    "start, kind, fields";
+
+/// The name of the toplevel interface for the script.
+const TOPLEVEL_INTERFACE: &str =
+    "Program";
+
+/// Get Rc<String> from NodeName.
+///
+/// FIXME: Do not clone the String itself, but just clone the Rc<String> inside
+///        NodeName (Bug NNNNNN).
+fn string_from_nodename(name: &NodeName) -> Rc<String> {
+    Rc::new(name.to_string().clone())
+}
+
 /// The actual exporter.
 struct CPPExporter {
     /// The syntax to export.
     syntax: Spec,
 
     /// Rules, as specified in yaml.
     rules: GlobalRules,
 
+    /// Reference graph of the method call.
+    refgraph: ReferenceGraph,
+
     /// All parsers of lists.
     list_parsers_to_generate: Vec<ListParserData>,
 
     /// All parsers of options.
     option_parsers_to_generate: Vec<OptionParserData>,
 
     /// A mapping from symbol (e.g. `+`, `-`, `instanceof`, ...) to the
     /// name of the symbol as part of `enum class BinVariant`
@@ -574,26 +601,132 @@ impl CPPExporter {
                         .sorted()
                         .into_iter()
                         .format("Or"),
                     symbol = string.to_cpp_enum_case());
                 (string, expanded)
             })
             .collect();
 
+        // This is just a placeholder to instantiate the CPPExporter struct.
+        // The field will be overwritten later in generate_reference_graph.
+        let refgraph = ReferenceGraph::new();
+
         CPPExporter {
             syntax,
             rules,
+            refgraph,
             list_parsers_to_generate,
             option_parsers_to_generate,
             variants_by_symbol,
             enum_types,
         }
     }
 
+    /// Generate a reference graph of methods.
+    fn generate_reference_graph(&mut self) {
+        let mut refgraph = ReferenceGraph::new();
+
+        // FIXME: Reflect `replace` rule in yaml file for each interface to
+        //        the reference (bug NNNNNN).
+
+        // 1. Typesums
+        let sums_of_interfaces = self.syntax.resolved_sums_of_interfaces_by_name();
+        for (name, nodes) in sums_of_interfaces {
+            let mut edges: HashSet<Rc<String>> = HashSet::new();
+            edges.insert(Rc::new(format!("Sum{}", name)));
+            refgraph.insert(string_from_nodename(name), edges);
+
+            let mut sum_edges: HashSet<Rc<String>> = HashSet::new();
+            for node in nodes {
+                sum_edges.insert(Rc::new(format!("Interface{}", node.to_string())));
+            }
+            refgraph.insert(Rc::new(format!("Sum{}", name.to_string())), sum_edges);
+        }
+
+        // 2. Single interfaces
+        let interfaces_by_name = self.syntax.interfaces_by_name();
+        for (name, interface) in interfaces_by_name {
+            let mut edges: HashSet<Rc<String>> = HashSet::new();
+            edges.insert(Rc::new(format!("Interface{}", name)));
+            refgraph.insert(string_from_nodename(name), edges);
+
+            let mut interface_edges: HashSet<Rc<String>> = HashSet::new();
+            for field in interface.contents().fields() {
+                match field.type_().get_primitive(&self.syntax) {
+                    Some(IsNullable { is_nullable: _, content: Primitive::Interface(_) })
+                    | None => {
+                        let typename = TypeName::type_(field.type_());
+                        interface_edges.insert(Rc::new(typename.to_string()));
+                    },
+
+                    // Don't have to handle other type of fields (string,
+                    // number, bool, etc).
+                    _ => {}
+                }
+            }
+            refgraph.insert(Rc::new(format!("Interface{}", name)), interface_edges);
+        }
+
+        // 3. String Enums
+        for (kind, _) in self.syntax.string_enums_by_name() {
+            refgraph.insert(string_from_nodename(kind), HashSet::new());
+        }
+
+        // 4. Lists
+        for parser in &self.list_parsers_to_generate {
+            let mut edges: HashSet<Rc<String>> = HashSet::new();
+            edges.insert(string_from_nodename(&parser.elements));
+            refgraph.insert(string_from_nodename(&parser.name), edges);
+        }
+
+        // 5. Optional values
+        for parser in &self.option_parsers_to_generate {
+            let mut edges: HashSet<Rc<String>> = HashSet::new();
+            let named_implementation =
+                if let Some(NamedType::Typedef(ref typedef)) = self.syntax.get_type_by_name(&parser.name) {
+                    assert!(typedef.is_optional());
+                    if let TypeSpec::NamedType(ref named) = *typedef.spec() {
+                        self.syntax.get_type_by_name(named)
+                            .unwrap_or_else(|| panic!("Internal error: Could not find type {}, which should have been generated.", named.to_str()))
+                    } else {
+                        panic!("Internal error: In {}, type {:?} should have been a named type",
+                               parser.name.to_str(),
+                               typedef);
+                    }
+                } else {
+                    panic!("Internal error: In {}, there should be a type with that name",
+                           parser.name.to_str());
+                };
+            match named_implementation {
+                NamedType::Interface(_) => {
+                    edges.insert(Rc::new(format!("Interface{}", parser.elements.to_string())));
+                },
+                NamedType::Typedef(ref type_) => {
+                    match type_.spec() {
+                        &TypeSpec::TypeSum(_) => {
+                            edges.insert(Rc::new(format!("Sum{}", parser.elements.to_string())));
+                        },
+                        _ => {}
+                    }
+                },
+                _ => {}
+            }
+            refgraph.insert(string_from_nodename(&parser.name), edges);
+        }
+
+        self.refgraph = refgraph;
+    }
+
+    /// Trace the reference graph from the node with `name and mark all nodes
+    /// as used. `name` is the name of the method, without leading "parse".
+    fn trace(&mut self, name: Rc<String>) {
+        self.refgraph.trace(name)
+    }
+
 // ----- Generating the header
 
     /// Get the type representing a success for parsing this node.
     fn get_type_ok(&self, name: &NodeName) -> Rc<String> {
         // enum has its own rule.
         if self.enum_types.contains_key(name) {
             return self.enum_types.get(name).unwrap().clone();
         }
@@ -829,27 +962,37 @@ enum class BinVariant {
     fn export_declare_sums_of_interface_methods(&self, buffer: &mut String) {
         let sums_of_interfaces = self.syntax.resolved_sums_of_interfaces_by_name()
             .iter()
             .sorted_by(|a, b| a.0.cmp(&b.0));
         buffer.push_str("\n\n// ----- Sums of interfaces (by lexicographical order)\n");
         buffer.push_str("// Implementations are autogenerated\n");
         buffer.push_str("// `ParseNode*` may never be nullptr\n");
         for &(ref name, _) in &sums_of_interfaces {
+            if !self.refgraph.is_used(string_from_nodename(&name)) {
+                continue;
+            }
+
             let rules_for_this_sum = self.rules.get(name);
             let extra_params = rules_for_this_sum.extra_params;
             let rendered = self.get_method_signature(name, "", "",
                                                      &extra_params);
             buffer.push_str(&rendered.reindent("")
                             .newline_if_not_empty());
         }
         for (name, _) in sums_of_interfaces {
+            let prefix = "Sum";
+            if !self.refgraph.is_used(Rc::new(format!("{}{}", prefix, name))) {
+                continue;
+            }
+
             let rules_for_this_sum = self.rules.get(name);
             let extra_params = rules_for_this_sum.extra_params;
-            let rendered = self.get_method_signature(name, "Sum", "const size_t start, const BinKind kind, const BinFields& fields",
+            let rendered = self.get_method_signature(name, prefix,
+                                                     INTERFACE_PARAMS,
                                                      &extra_params);
             buffer.push_str(&rendered.reindent("")
                             .newline_if_not_empty());
         }
     }
 
     fn export_declare_single_interface_methods(&self, buffer: &mut String) {
         buffer.push_str("\n\n// ----- Interfaces (by lexicographical order)\n");
@@ -860,20 +1003,29 @@ enum class BinVariant {
             .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
 
         let mut outer_parsers = Vec::with_capacity(interfaces_by_name.len());
         let mut inner_parsers = Vec::with_capacity(interfaces_by_name.len());
 
         for &(name, _) in &interfaces_by_name {
             let rules_for_this_interface = self.rules.get(name);
             let extra_params = rules_for_this_interface.extra_params;
-            let outer = self.get_method_signature(name, "", "", &extra_params);
-            let inner = self.get_method_signature(name, "Interface", "const size_t start, const BinKind kind, const BinFields& fields",
+
+            if self.refgraph.is_used(string_from_nodename(name)) {
+                let outer = self.get_method_signature(name, "", "", &extra_params);
+                outer_parsers.push(outer.reindent(""));
+            }
+
+            let inner_prefix = "Interface";
+            if !self.refgraph.is_used(Rc::new(format!("{}{}", inner_prefix, name))) {
+                continue;
+            }
+            let inner = self.get_method_signature(name, inner_prefix,
+                                                  INTERFACE_PARAMS,
                                                   &extra_params);
-            outer_parsers.push(outer.reindent(""));
             inner_parsers.push(inner.reindent(""));
         }
 
         for parser in outer_parsers.drain(..) {
             buffer.push_str(&parser);
             buffer.push_str("\n");
         }
 
@@ -885,39 +1037,51 @@ enum class BinVariant {
 
     fn export_declare_string_enums_methods(&self, buffer: &mut String) {
         buffer.push_str("\n\n// ----- String enums (by lexicographical order)\n");
         buffer.push_str("// Implementations are autogenerated\n");
         let string_enums_by_name = self.syntax.string_enums_by_name()
             .iter()
             .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
         for (kind, _) in string_enums_by_name {
+            if !self.refgraph.is_used(string_from_nodename(kind)) {
+                continue;
+            }
+
             let rendered = self.get_method_signature(kind, "", "", &None);
             buffer.push_str(&rendered.reindent(""));
             buffer.push_str("\n");
         }
     }
 
     fn export_declare_list_methods(&self, buffer: &mut String) {
         buffer.push_str("\n\n// ----- Lists (by lexicographical order)\n");
         buffer.push_str("// Implementations are autogenerated\n");
         for parser in &self.list_parsers_to_generate {
+            if !self.refgraph.is_used(string_from_nodename(&parser.name)) {
+                continue;
+            }
+
             let rules_for_this_node = self.rules.get(&parser.name);
             let extra_params = rules_for_this_node.extra_params;
             let rendered = self.get_method_signature(&parser.name, "", "",
                                                      &extra_params);
             buffer.push_str(&rendered.reindent(""));
             buffer.push_str("\n");
         }
     }
 
     fn export_declare_option_methods(&self, buffer: &mut String) {
         buffer.push_str("\n\n// ----- Default values (by lexicographical order)\n");
         buffer.push_str("// Implementations are autogenerated\n");
         for parser in &self.option_parsers_to_generate {
+            if !self.refgraph.is_used(string_from_nodename(&parser.name)) {
+                continue;
+            }
+
             let rules_for_this_node = self.rules.get(&parser.name);
             let extra_params = rules_for_this_node.extra_params;
             let rendered = self.get_method_signature(&parser.name, "", "",
                                                      &extra_params);
             buffer.push_str(&rendered.reindent(""));
             buffer.push_str("\n");
         }
     }
@@ -965,56 +1129,64 @@ impl CPPExporter {
     fn generate_implement_sum(&self, buffer: &mut String, name: &NodeName, nodes: &HashSet<NodeName>) {
         // Generate comments (FIXME: We should use the actual webidl, not the resolved sum)
         let rules_for_this_sum = self.rules.get(name);
         let extra_params = rules_for_this_sum.extra_params;
         let extra_args = rules_for_this_sum.extra_args;
         let nodes = nodes.iter()
             .sorted();
         let kind = name.to_class_cases();
-        let rendered_bnf = format!("/*\n{name} ::= {nodes}\n*/",
-            nodes = nodes.iter()
-                .format("\n    "),
-            name = name.to_str());
 
-        // Generate outer method
-        buffer.push_str(&format!("{bnf}
+        if self.refgraph.is_used(string_from_nodename(name)) {
+            let rendered_bnf = format!("/*\n{name} ::= {nodes}\n*/",
+                nodes = nodes.iter()
+                    .format("\n    "),
+                name = name.to_str());
+
+            // Generate outer method
+            buffer.push_str(&format!("{bnf}
 {first_line}
 {{
     BinKind kind;
     BinFields fields(cx_);
     AutoTaggedTuple guard(*tokenizer_);
     const auto start = tokenizer_->offset();
 
     MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
 
 {call}
 
     MOZ_TRY(guard.done());
     return result;
 }}\n",
                 bnf = rendered_bnf,
                 call = self.get_method_call("result", name,
-                                            "Sum", "start, kind, fields",
+                                            "Sum", INTERFACE_ARGS,
                                             &extra_args,
                                             MethodCallKind::AlwaysDecl)
                     .reindent("    "),
                 first_line = self.get_method_definition_start(name, "", "",
                                                               &extra_params)
-        ));
+            ));
+        }
+
+        let inner_prefix = "Sum";
+        if !self.refgraph.is_used(Rc::new(format!("{}{}", inner_prefix, name))) {
+            return;
+        }
 
         // Generate inner method
         let mut buffer_cases = String::new();
         for node in nodes {
             buffer_cases.push_str(&format!("
       case BinKind::{variant_name}:
 {call}
 {arm_after}        break;",
                 call = self.get_method_call("result", node,
-                                            "Interface", "start, kind, fields",
+                                            "Interface", INTERFACE_ARGS,
                                             &extra_args,
                                             MethodCallKind::AlwaysVar)
                     .reindent("        "),
                 variant_name = node.to_cpp_enum_case(),
                 arm_after = rules_for_this_sum.by_sum.get(&node)
                     .cloned()
                     .unwrap_or_default().after_arm.reindent("        ")
                     .newline_if_not_empty()));
@@ -1027,24 +1199,29 @@ impl CPPExporter {
         return raiseInvalidKind(\"{kind}\", kind);
     }}
     return result;
 }}
 
 ",
             kind = kind,
             cases = buffer_cases,
-            first_line = self.get_method_definition_start(name, "Sum", "const size_t start, const BinKind kind, const BinFields& fields",
+            first_line = self.get_method_definition_start(name, inner_prefix,
+                                                          INTERFACE_PARAMS,
                                                           &extra_params),
             type_ok = self.get_type_ok(name)
         ));
     }
 
     /// Generate the implementation of a single list parser
     fn generate_implement_list(&self, buffer: &mut String, parser: &ListParserData) {
+        if !self.refgraph.is_used(string_from_nodename(&parser.name)) {
+            return;
+        }
+
         let rules_for_this_list = self.rules.get(&parser.name);
         let extra_params = rules_for_this_list.extra_params;
         let extra_args = rules_for_this_list.extra_args;
 
         // Warn if some rules are unused.
         for &(condition, name) in &[
             (rules_for_this_list.build_result.is_some(), "build:"),
             (rules_for_this_list.type_ok.is_some(), "type-ok:"),
@@ -1124,16 +1301,20 @@ impl CPPExporter {
             append = append);
         buffer.push_str(&rendered);
     }
 
     fn generate_implement_option(&self, buffer: &mut String, parser: &OptionParserData) {
         debug!(target: "generate_spidermonkey", "Implementing optional value {} backed by {}",
             parser.name.to_str(), parser.elements.to_str());
 
+        if !self.refgraph.is_used(string_from_nodename(&parser.name)) {
+            return;
+        }
+
         let rules_for_this_node = self.rules.get(&parser.name);
         let extra_params = rules_for_this_node.extra_params;
         let extra_args = rules_for_this_node.extra_args;
 
         // Warn if some rules are unused.
         for &(condition, name) in &[
             (rules_for_this_node.build_result.is_some(), "build:"),
             (rules_for_this_node.append.is_some(), "append:"),
@@ -1189,17 +1370,17 @@ impl CPPExporter {
 }}
 
 ",
                     first_line = self.get_method_definition_start(&parser.name, "", "",
                                                                   &extra_params),
                     null = self.syntax.get_null_name().to_cpp_enum_case(),
                     call = self.get_method_call("result",
                                                 &parser.elements,
-                                                "Interface", "start, kind, fields",
+                                                "Interface", INTERFACE_ARGS,
                                                 &extra_args,
                                                 MethodCallKind::AlwaysVar)
                         .reindent("        "),
                     before = rules_for_this_node.some_before
                         .map_or_else(|| "".to_string(),
                                      |s| s
                                      .reindent("        ")
                                      .newline_if_not_empty()),
@@ -1238,17 +1419,17 @@ impl CPPExporter {
 
     return result;
 }}
 
 ",
                             first_line = self.get_method_definition_start(&parser.name, "", "",
                                                                           &extra_params),
                             call = self.get_method_call("result", &parser.elements,
-                                                        "Sum", "start, kind, fields",
+                                                        "Sum", INTERFACE_ARGS,
                                                         &extra_args,
                                                         MethodCallKind::AlwaysVar)
                                 .reindent("        "),
                             before = rules_for_this_node.some_before
                                 .map_or_else(|| "".to_string(),
                                              |s| s
                                              .reindent("        ")
                                              .newline_if_not_empty()),
@@ -1312,22 +1493,23 @@ impl CPPExporter {
         for &(condition, rule_name) in &[
             (rules_for_this_interface.append.is_some(), "build:"),
         ] {
             if condition {
                 warn!("In {}, rule `{}` was specified but is ignored.", name, rule_name);
             }
         }
 
-        // Generate comments
-        let comment = format!("\n/*\n{}*/\n", ToWebidl::interface(interface, "", "    "));
-        buffer.push_str(&comment);
+        if self.refgraph.is_used(string_from_nodename(name)) {
+            // Generate comments
+            let comment = format!("\n/*\n{}*/\n", ToWebidl::interface(interface, "", "    "));
+            buffer.push_str(&comment);
 
-        // Generate public method
-        buffer.push_str(&format!("{first_line}
+            // Generate public method
+            buffer.push_str(&format!("{first_line}
 {{
     BinKind kind;
     BinFields fields(cx_);
     AutoTaggedTuple guard(*tokenizer_);
 
     MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
     if (kind != BinKind::{kind}) {{
         return raiseInvalidKind(\"{kind}\", kind);
@@ -1335,29 +1517,36 @@ impl CPPExporter {
     const auto start = tokenizer_->offset();
 {call}
     MOZ_TRY(guard.done());
 
     return result;
 }}
 
 ",
-            first_line = self.get_method_definition_start(name, "", "",
-                                                          &extra_params),
-            kind = name.to_cpp_enum_case(),
-            call = self.get_method_call("result", name,
-                                        "Interface", "start, kind, fields",
-                                        &extra_args,
-                                        MethodCallKind::AlwaysDecl)
-                .reindent("    ")
-        ));
+                first_line = self.get_method_definition_start(name, "", "",
+                                                              &extra_params),
+                kind = name.to_cpp_enum_case(),
+                call = self.get_method_call("result", name,
+                                            "Interface", INTERFACE_ARGS,
+                                            &extra_args,
+                                            MethodCallKind::AlwaysDecl)
+                    .reindent("    ")
+            ));
+        }
+
+        let inner_prefix = "Interface";
+        if !self.refgraph.is_used(Rc::new(format!("{}{}", inner_prefix, name))) {
+            return;
+        }
 
         // Generate aux method
         let number_of_fields = interface.contents().fields().len();
-        let first_line = self.get_method_definition_start(name, "Interface", "const size_t start, const BinKind kind, const BinFields& fields",
+        let first_line = self.get_method_definition_start(name, inner_prefix,
+                                                          INTERFACE_PARAMS,
                                                           &extra_params);
 
         let fields_type_list = format!("{{ {} }}", interface.contents()
             .fields()
             .iter()
             .map(|field| format!("BinField::{}", field.name().to_cpp_enum_case()))
             .format(", "));
 
@@ -1567,16 +1756,20 @@ impl CPPExporter {
 
         // 3. String Enums
         buffer.push_str("\n\n// ----- String enums (autogenerated, by lexicographical order)\n");
         {
             let string_enums_by_name = self.syntax.string_enums_by_name()
                 .iter()
                 .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
             for (kind, enum_) in string_enums_by_name {
+                if !self.refgraph.is_used(string_from_nodename(kind)) {
+                    continue;
+                }
+
                 let convert = format!("    switch (variant) {{
 {cases}
       default:
         return raiseInvalidVariant(\"{kind}\", variant);
     }}",
                     kind = kind,
                     cases = enum_.strings()
                         .iter()
@@ -1724,17 +1917,20 @@ fn main() {
     file.read_to_string(&mut data)
         .expect("Could not read rules");
 
     let yaml = yaml_rust::YamlLoader::load_from_str(&data)
         .expect("Could not parse rules");
     assert_eq!(yaml.len(), 1);
 
     let global_rules = GlobalRules::new(&new_syntax, &yaml[0]);
-    let exporter = CPPExporter::new(new_syntax, global_rules);
+    let mut exporter = CPPExporter::new(new_syntax, global_rules);
+
+    exporter.generate_reference_graph();
+    exporter.trace(Rc::new(TOPLEVEL_INTERFACE.to_string()));
 
     let get_file_content = |path: &str| {
         if !Path::new(path).is_file() {
             return None;
         }
 
         let mut f = File::open(path)
             .expect("File not found");
new file mode 100644
--- /dev/null
+++ b/js/src/frontend/binsource/src/refgraph.rs
@@ -0,0 +1,90 @@
+use std::cell::RefCell;
+use std::collections::{ HashMap, HashSet };
+use std::rc::Rc;
+
+/// A node in the reference graph
+struct ReferenceGraphNode {
+    /// True if this node is used.
+    used: RefCell<bool>,
+
+    /// The set of method names which node uses.
+    edges: HashSet<Rc<String>>,
+}
+impl ReferenceGraphNode {
+    fn new(edges: HashSet<Rc<String>>) -> Self {
+        ReferenceGraphNode {
+            used: RefCell::new(false),
+            edges,
+        }
+    }
+}
+
+/// A reference graph of the method call.
+///
+/// Each auto-generated method has corresponding node in this reference graph,
+/// and the method definition/declaration are written to the file only if the
+/// method is marked as used.
+///
+/// This is necessary for the following reason:
+///   * we generate parseX and parseInterfaceX for `interface X`
+///   * parseX is not used if `interface X` appears only in sum interface
+pub struct ReferenceGraph {
+    /// The map from the node name to node struct.
+    /// Node name is the method name without leading "parse".
+    refnodes: HashMap<Rc<String>, Rc<ReferenceGraphNode>>,
+}
+impl ReferenceGraph {
+    pub fn new() -> Self {
+        ReferenceGraph {
+            refnodes: HashMap::new()
+        }
+    }
+
+    /// Trace the reference graph from the node with `name and mark all nodes
+    /// as used. `name` is the name of the method, without leading "parse".
+    pub fn trace(&mut self, name: Rc<String>) {
+        // The set of edges to trace in the current iteration.
+        let mut edges: HashSet<Rc<String>> = HashSet::new();
+        edges.insert(name);
+
+        // Iterate over the remaining edges until all edges are traced.
+        loop {
+            // The set of edges to trace in the next iteration.
+            let mut next_edges: HashSet<Rc<String>> = HashSet::new();
+
+            for edge in edges {
+                let refnode = self.refnodes.get(&edge)
+                    .unwrap_or_else(|| panic!("While computing dependencies, node {} doesn't exist", edge));
+                if *refnode.used.borrow() {
+                    continue;
+                }
+
+                refnode.used.replace(true);
+
+                for next_edge in refnode.edges.iter() {
+                    next_edges.insert(next_edge.clone());
+                }
+            }
+
+            if next_edges.len() == 0 {
+                break;
+            }
+
+            edges = next_edges;
+        }
+    }
+
+    /// Return true if the method named `name` (without leading "parse") is
+    /// used.
+    pub fn is_used(&self, name: Rc<String>) -> bool {
+        match self.refnodes.get(&name) {
+            Some(refnode) => *refnode.used.borrow(),
+            None => false
+        }
+    }
+
+    /// Insert a node with `name` to the graph.
+    pub fn insert(&mut self, name: Rc<String>, edges: HashSet<Rc<String>>) {
+        self.refnodes.insert(name, Rc::new(ReferenceGraphNode::new(edges)));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/README.md
@@ -0,0 +1,10 @@
+To update all binjs files in tree, run the following command:
+
+```
+./encode.py \
+    --topsrcdir={path to mozilla-unified} \
+    --binjsdir={path to binjs-ref clone} \
+    --binjs_encode={path to  binjs_encode} \
+    --babel={path to babel command} \
+    --babel-preset-env={path to babel-preset-env}
+```
new file mode 100755
--- /dev/null
+++ b/js/src/jsapi-tests/binast/encode.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python -B
+
+from __future__ import print_function
+from optparse import OptionParser
+import os
+import re
+import subprocess
+import sys
+
+parser = OptionParser()
+parser.add_option('--topsrcdir', dest='topsrcdir',
+                  help='path to mozilla-central')
+parser.add_option('--binjsdir', dest='binjsdir',
+                  help='cwd when running binjs_encode')
+parser.add_option('--binjs_encode', dest='binjs_encode',
+                  help='path to binjs_encode commad')
+(options, args) = parser.parse_args()
+
+
+def ensure_dir(path, name):
+    if not os.path.isdir(path):
+        print('{} directory {} does not exit'.format(name, path),
+              file=sys.stderr)
+        sys.exit(1)
+
+
+def ensure_file(path, name):
+    if not os.path.isfile(path):
+        print('{} {} does not exit'.format(name, path),
+              file=sys.stderr)
+        sys.exit(1)
+
+
+ensure_dir(options.topsrcdir, 'topsrcdir')
+ensure_dir(options.binjsdir, 'binjsdir')
+ensure_file(options.binjs_encode, 'binjs_encode command')
+
+
+def encode(infile_path, outfile_path, binjs_encode_args=[]):
+    print(infile_path)
+
+    infile = open(infile_path)
+    outfile = open(outfile_path, 'w')
+
+    binjs_encode = subprocess.Popen([options.binjs_encode] + binjs_encode_args,
+                                    cwd=options.binjsdir,
+                                    stdin=infile, stdout=outfile)
+
+    if binjs_encode.wait() != 0:
+        print('binjs_encode failed',
+              file=sys.stderr)
+        sys.exit(1)
+
+
+def encode_inplace(dir, *args, **kwargs):
+    js_pat = re.compile('\.js$')
+    for root, dirs, files in os.walk(dir):
+        for filename in files:
+            if filename.endswith('.js'):
+                binjsfilename = js_pat.sub('.binjs', filename)
+                infile_path = os.path.join(root, filename)
+                outfile_path = os.path.join(root, binjsfilename)
+                encode(infile_path, outfile_path, *args, **kwargs)
+
+
+wpt_dir = os.path.join(options.topsrcdir, 'testing', 'web-platform')
+ensure_dir(wpt_dir, 'wpt')
+
+wpt_binast_dir = os.path.join(wpt_dir, 'mozilla', 'tests', 'binast')
+ensure_dir(wpt_binast_dir, 'binast in wpt')
+
+encode(os.path.join(wpt_binast_dir, 'large-binjs.js'),
+       os.path.join(wpt_binast_dir, 'large.binjs'))
+encode(os.path.join(wpt_binast_dir, 'small-binjs.js'),
+       os.path.join(wpt_binast_dir, 'small.binjs'))
+
+binast_test_dir = os.path.join(options.topsrcdir, 'js', 'src', 'jsapi-tests', 'binast')
+ensure_dir(binast_test_dir, 'binast in jsapi-tests')
+
+encode_inplace(os.path.join(binast_test_dir, 'parser', 'tester'),
+               binjs_encode_args=['advanced', 'expanded'])
+encode_inplace(os.path.join(binast_test_dir, 'parser', 'unit'),
+               binjs_encode_args=['advanced', 'expanded'])
+encode_inplace(os.path.join(binast_test_dir, 'parser', 'multipart'))
index 069f07f159558c3001088dba08dce10d3c221f41..b3b99a370a86342101995867c6903f03c08a4105
GIT binary patch
literal 985
zc${@o@oSqv6h00S5fPCPN(ki^La<#H+7d?Derht;SrR*<^p`NoMc-08>&batn!jTI
z@=i@+>6r5FdEa~Qd*8it;`uiLUS2P*=JTt?k0gdnBx3v7Q-_XMZGI-e-Itt0Q6wxI
z%@P5erh(u|wr=p=B*|ilG&O@J7zirhNd}y&q5v)+{sK`-ImAAFg25f-30<X7gH*_h
z{#%T3B0EsNZCJZgnx@TmSawOGIXtai3octG>#XeFfc?FWNy?&MLBw(xH+doDYY@#z
z^eU_4!{*g_4-D)%tBx`H2PrDzi#;AhJjum%%2slGWu!f&B6^sn^tk||j$Xb##9KwZ
zkZ-G!!#tNkxbXbzpt-ku<&*lGa{S&5+-d0D`Zl~oke4$xr1a-h;KCBDzCJzl!kKG_
zxA!#<2J<_WYU6k2ox2ERH72Gb9yn|WKFMo6vW`p`OMzyioHN11Hiyxkk_bj9*?qIs
zBSeCjyY$QdmpLcKSDK^{>o>vq{dnLra?nkr0Jh0GJ`<99$6?fURtSZd(gM1x8vk&1
zc0PJ6>_ZE?5R{8DO%rk<8!ms~Z$M+<A)B%FGF-TBGrvE0&@(j!A<dL#Noz|}rD@W1
zB%ij9u%RgUtnzI<sJw}Ls)fc#E|=JpFH-OkGOL)1oyu#tUwO;65xFo<JCa+i5WS0r
z7@w*w2k8c~RLd@XpWtH~A;m5e6}5Gw;g(#>sBIv%i$)q!%&Hqc#vP>ME^bM+7W#<(
E0zxh+YXATM
index 01d2838244cf78620437e0e39b327ea26871732a..f7fe49d2e79e959beae047bf0a6bcf3787091546
GIT binary patch
literal 999
zc${@o|7+Sn6hDp-LI@!Qks?xVB4Rryu9Q-`F;EwsMdL7;zm!qV<khB2b8<OrWq-u}
z<z1pRrDF;29`|`)KA(4Yy^(wE;hW*CJDGH6Kcf&55sB@mk=kmG^37cY+<9JcNYjWV
z?QtZ4)7TR{N|ps)>qSW@k)ozi1U*3oJjy_`o2I}8gkK?uDTmOdkI<M?9??Y%JCF)l
zQGbguP9y{6+oEf=Pvf}QwlbC|n84%Wwcw00S|%BL0oGr1^kNqL@&dMk^CHiud<mkM
zM9;G-E^J=Sd+5N{Nj^sVA0*8ipS|E-z@wEI#%v*vFN>7>R0Q|^n66VWcG1h%L%dZ~
z^Z7O}Ih^N>=g&s&&@1lkxAH}Oq8z_BJ*V%FrmhXo0j#n!HKg=)EO4s(BY*5*FrR3=
zhUuO8ol1$}J8Rw@|8Q=n19R@oJXwp0*%bF2HUys}J2mo(NsqA@XwqJBCYac+puKNI
z1S6E}o(5ry2M7c)_t_W!t!kba0~*B;>et@K+w+FY$U!ra^lXz<Tqb1aeG6m9VEK@W
zK22e-yECXRb_pLkowN2sY9FZVR8TImd`-y35^OJW!{u}S1~dfjvoTxV_%p{TPV*0L
z)J#o5NHe6Bq?M(q(llv0l3!Uz*iaOFmisbp<lewF)j}6YE}yX}f280eWaKdwH*>Gy
zdhScMjmWumT9Lig9MP+&h4HCcY9if29o4ckUnlt3L`X5SL`5wfY1o!)7B#PsT19P5
U26Hxij4MdRRcuSO7P>@#0ht6Xr~m)}
index 03ff93aeb1ca6dd71395f3b45105be071b7baad1..9b202c33e194eb468806c65996d8ee9a7d4e7212
GIT binary patch
literal 1202
zc${TZ4{O>$6u%uI1PKy?h!l|^BHB60L`G@5GHcV$Qf)C|Fv=L$<W0k3PA+GyA9J5%
zUtuq?8tDS>y}S3`@Av+kUXCWWE`7Y24#wlb^hX##EJL|D`=fnnjk3$H5QOux6p$n#
zkL#CV9E9;Kk9F@t34%qg6zI=0oB7d|Ou_;ItwEB2kPuvfA29*Jge{=?jfs#wMX+@;
ziHOEq9~UV$oW&_k&TL^jOl)#Tb;zP9zjo5np+APj)8Q2ToXcZk1~MO~>dnI>&ur{E
zzKpp4+x7Vp3fb{!0_!~O<gm_La#G)u@Kv16-2Km!WZa#d{{e?y04_FjU+mpH3Df<s
zXrGXRd%L*ni*PA#BL0LAk|M2L1Q(h)%0njo`7mOu1Z;=RKwPh4Kjl1Fzje*U;-E%i
z?~?At804G>Lmo>UFtJ}>f3jMD2>pB`wJFGz$e&){wpRDVChK4ycyzt#XmaD`zrD6{
zu0AuNBhxC9^nKBFhTiCYV#13L%d`s}UY6j?!ZV9jppU;_4LnC5Z?2HC;ElXHhe9y{
z>4gg@esiWSf~jR#EjbskwrE>RGwoD$mx4<!H%sWg0$OeTnuQSrg<JRI&;G-f-TG|B
z2;J6bwa=`rdk?bP%?Y>m4O&=<uVejz;rau^gG3Hl0!D!754PPi_hrpQG9l9hO`<X+
z-~N%TwZP4O1r~tt_#K};dQ->Am-LsOcMPpah-RRuC?-k;MMEi|P=a5jK&Vbt#m;O+
zX=c_`>Z(cl1l1`u6hk4ZazxB5MwLcpHRU+71*LOQJt9QOZp9igh*~UDvqVszkk`*{
z(ng68TFO$>1X4h)VOr^gs5R2nh?-V16s4t9iKf&D5@G|NNDpxa#Y2l86P=KEeM<Fu
Wmk?DgS{0q>sVSFA#Ojq#EB^qJM{K<S
index abd66879e3c46202053c330553472408e7b1b7aa..82a80791737bcbfcdf2c5ab0c0662466012e3c7e
GIT binary patch
literal 1210
zc${TZ|7+Sn6u%uI1PLJo5s^}Yh{Vo`>tvL+D{HOoELDpM{iST<OkOox%*o}f_0Qa2
zvtRd;RwG^D-MjaB?|t5v(~JJ_#-$I}<MYAbeEdBOAeNzApZw9jI{nOe3_<js7Xp$b
z<Z<;PjDs+q=DyZ#C_%8ul>+fRvYuaE$t27%!8uP75E6n*@FON57_vFk@0keMB!U-^
zNzACd#kfdw!)ct-<jgj<!^AoV_PQ*Ja<iG14*dblC%aR0axRaFDad@B$`DpNblxmX
za<jJS|03f4Z`bDwC}h{8-8yf{Np+jXmvJ_8>pvvP*qR&s4u_rtE;fVDwlGh^bU!TG
z2BgV{8^7y|a3QZFKEVe`GwqEB7n%X3E|dPO8?j{q?H-$gxLU@3%DJ<C`-+SCPK~6!
z2^xt3$Qcj1JeD|M(tdsY;c^Zl^z&8ik3lX){`C4wYgJFIvktb72iF_-hu3cY+xw`T
zs!vSl$h3?keQ&tEuGb$8EqL}}k#?cO^8$QXcw*5K%)xpz`GuxBy0|HLeebqM!N^>r
zN9_{J827!giv-j*ZAZ=otZdq7rk>V9aLMI*0j<{r{fdPV1ce*-<Ihfg$n9-W8#DPT
z{()8OFLsP1o5D_JrF>4i(KxX&VngRN^gD)65SSh$vda=M1C0C7Zhx}2wXH-lA=3a&
z;$ceu@@KMF0=N4OSOCJ~w|x5GjeEU(QGe-a)6@(?G!sQdu}~@~8cG3$68y>qLUpPt
z?MzpcdZsO<s#>H&@HnQXVk$&c_K21Fs8Y+crZ|}{D9y9|JwlYsGRwrEWm2X`<n>dH
z619rNERlAd){2DCVium_q=2V}-r^Ba%cP|dHLYeU%7L;^G{q)JicNebhnQzjyg2lL
d=!CrMP^wp3NUs`pMJIZyO2r~6AC`_Q{{V;_ZtwsA
index a7512b5a03d3432ab41a35a57fa31cf078ce01ec..7cdfb384a885369b579c0fee0df0532335ea880a
GIT binary patch
literal 1147
zc${TZ@oU;Z6uuoHgb*YIky4}tCt^D%uE;2DH?TJCEY%hh3Zsm1O<wg_%*o}f^{4%v
z`)~FVr;#r3?%jRwec!wHl3WZ%H$Hv59`}aB-uMTPAW>Yc&VC!`%|U*6<{-V-xr8+3
zBB@>QB;v`Wh_!FI0?A@uNyLlHMzQr3Q!qn9vzMkI6-1X1#!NyqVl!wwFv;0d3~P`n
zWYphcLS|e(Nivy2*~RNHxhjBapT%);Y-Oc+IE2~LZWrA`D`0X0s%WRax#C4E!e4$U
z=3wUA{Shn+g_B+3w`$d3%F`m3)V7*pk>owM|3lKeRBMCZW79Lh!RGMSEi6)=&4<O?
zgp7Q=iTk1Cb9EhyCww6p)7?aHpgB<KGZjwzF<Ye2@z@09)glQq&7JYPS3=HqYNVY_
z(w!WFnu@3|5{3Py*1BRXkgHsH`>G%PU_2OI`^6{qUOU%cn6z*zi&)VQCEx1@gS(Lf
zuOZAcaSLAO5GwP9#S5^8-!FTCXAM`EC}{?R;MSv1!tn-t2BimY>?4`Fw%b%w2}_qA
z8d+v5TiSCelu)ZVwEq#TE5>7p%p3pH&+cfg?S63+B(5to56|2+yrDD?8zbRvZ|7ne
zu}rLch9iya08-UwDcBK`KXy7@XIs-r6_YAUFcdDf66>GCT}u2{z5$Cs2I5vs9)q#x
z6%+bHPg=H7BE+!KbTkKT56wU`(I~-Z&m`2My4K14p4P~{qt$eWbO|n})Yfc`=-NJU
z@)*_Xxi_?<+?!hKbRTuK{8XwEo9Lwqb;_hvA)N-TmkFWeJR`%2iK~Ip@(Izaq-_vA
wD`0C{Q>zj~J0Pfobw871<k=KAO?pHuLf&;LwQB8L=fJgymAOi}Ox)wjUuj%gxc~qF
index 3c5205d42c66923db3dd2a8dec4d9cf40ba256c6..1c70f206fb45026f3a78a863c8c49fab90b431da
GIT binary patch
literal 1027
zc${TY@oU;Z6uuroLI@(#bwx@!M8tJYVku>8KUEhyOSQv<{vxGZlUL0ab8>gq`rq$e
zoTl3ncz5r+?|tvxd)FI|Zvr~Ko?MMaSCfY%hD;}V^Yy*`xi!q4=LDqxx|E<)BC=+&
z4K&xVKuYH}(I9ymXqjZQf^gF3X<E3fmt<US3ZRZaj1fhi)|FBqHN@W_O1Xr1%okw5
zWR{ssMeIcZhFs1-7b1<FNG}!9uOJdjaPn>Qp38(krLa}!8g&}~VnUMoUO=p}yoAnw
zh{|=_JNyTRE&#ib!{<9Vh-9+V*Qt2I?wAv{JHfO$aMb5In)g$_QsDV~26C{<B2(F$
zBH2L51yA=$l(!?@$r0$ei2EYbcz<>FXB6Yr+s@a<ur54zTUFc4FNsF5c=~I=q1+5`
zP-(i^4|p1cli~O}D4xeV%PYNbSq}VuIJ_IvkFJ^ZW7i3X;jK@h3a=3?O@%J%u2NmT
z_a^}|y(PyE#9tWGa|vs<=TT;{2YbZzylqVD1Dh6yEK#fyg3^7iU~V>wJqyWh_zU0O
zhGDT;%w^2{U68^g`3sa%$l6}(ljn6WpLvp+Dl+jV305T5ne$V1A1|s(bE!=xTcfFH
zv3=caEwRJjfyW?2aVuuDJq;(mU$o|tp4V-+M2JhtfotPhA^25}2t9VF#qzacHS*QA
zPHBlW37R&wE!!g0IwUr_C4;r_Ck|@02_xj-jMN&0lxVq9w(4lz&gEg15Q@xW(mbUn
i4zissWOod!ilov7an8sV^~i}$@<djRxYm(XCFS2#@Ip8M
index 531991aa0e8d99aca74d84e91ee4f446ffe8e6b6..856a7e7733ee8dc9563ba78ef13008139d9b57ed
GIT binary patch
literal 1043
zc${TYVQbqk5LJZ<#+YD2$x0|igb=bW%hD3c=svZX+od$=h)utQQdIkzcyp{EDNXb5
zcXF1v-TXm!dV0F|e5cF7=q8|(>+!{KcrkuRV#su&*WW(aUt5EG^PGV6Ul$UTN<`Ky
z(m-<!bEI@`6AhB5ftE=&EeNd(4Aaa|3b0pzA(vCog$lb&GA`Ezw~j!JB@4=7pQq`2
z1&|uz?+~S2LOkMgXl%jDR7AgnNG!m~)8;*w34cmq!{!<*H2%eetc_q*NRaxjoLFYL
zK<7V1<tpth{u2w$0eh0er&~CPWU|oLsd&O(nG?1>K@&Mp?Q<Q?`YB&3==yvL@@kny
z#^)Q$>`KTvPj@1!yCvPpA?TTi`y$iWF?IZRFr($$rnws*Z8N_l8p8bP-GD>6zQQ@A
z>3TQdNf3?)qwAn}9$&0(>4nR3;P=D9-N?nu%T&`(Rg_j*E+hST;)H|n)~8T`*9aEI
zU-{l22T1QOIR1Ei&X}G_Sg{>}GK)RfL#}6D2uk<4f`v&Gdlr)2@E5-E&d^#Ga~U&#
zdsUsYowhF}j&WD@bGLhX_RN#iNM@ptGxB1UIlt7&W3QK?6C>UF$R=+%iDDI{xzxsp
zt#R?R*gSQ%lGxxMz+;f1xD`{{o`hrHFZu-Zv|)QTAs!`ro`caN_<2=A4_s;;<<Yb1
zd33BpS|&|`OPe|+r$nf=PaNFZ25XUHLR_rXA$3Cb+T^fFNQstg%VM~eyJ!0qLZ|_1
o<bbpoJ#z7ayFs0fAy$xA?h*HxY|t91VQr&jHAva2S`}jb0a!{%g8%>k
index 170f74dee7af1b3cf8fda9aa8d894cbb63285d34..ac4407f0eb2cb3bc3526eef1e2538cae3f9c78dd
GIT binary patch
literal 1204
zc${TY@oU;Z6uurI1Q7|LNGVbdDPlV(wv$rq_Cs}PXQ_5Gp$w#qYx1h;Vook+t$)q_
z(!pMmYNRumyZhevzW3dG>Gp>=4jo^QE(e3l(L>-vqyn|N_+fPF{q*n@fV5xd65==z
zQS&xXAbIF08AOvDujN}uaRoC>W!)g+a+OEwm$*!#B$k7f9uLF(*v>gFmlIIAiz@2*
zST#oyL68dkui%ATf<NRlXe0&#ZveB$ZRdw;ZZ{O(Z^sjJD5TrkJ(mH03?UQ2TqM88
zgxnv(GFKzjjht9SY2D_3NSsz_tnu$CGy`m33ZJfF$CJTaU5DZk+nPk!I)Wxrpxooi
zoAyG!h@oZk3COEO<Rw10EVC;iXFS{#iCb&Zog9Fg3cn{Jg`JC!-)1;mY&X7``8eP1
z-uqe9T)Dc!p@!jVGv%@4j{3uEC;xW-YM=ENF6oDoWB1(t-OyAb`(6re-@UcXOzhVQ
z1q)t1m?tKSXk!toVw@67_x8xa%+{P^FZ>Q;YARvLHgw7~_E72y5duf+X_Dzeta?0#
z=VTMJCn4Dlf8p817&?x8E`4UNMdA+2tk_cGfH&eFTdhxLPdo^d%8|&cCN9J>(xyS-
zIX?N-w&qeOp;mLSV#TFO>bA2RurDk^!<n;sbsAKUE`DaA=DHoodAmV#BeV&2-;wJ_
zY`o<ph?$|V99v49<~QIzNLSp732ltsk!|PW_(R(@!_>%*X%J!-@V`s&XYLWYU()Dd
zy6)2BbTw#IE089^*E!YkAsXEy1|ACuc19Y6lu)BZ4hh+5l7l)Sx@HtjTElng^t`;A
z0ak?^P+HfFGh*qMMJf$lD_FQE$5qOTs8UR*RMR_2b{Uf~T+~U1RtPhQrqk@9EqY4Z
Lq(t{=nVA0o)V+OX
index 7426c98dcb7a9fd92708d2764a14a1d93a5129f4..075afc5d50860e22dc529b70d24a332295cdb94b
GIT binary patch
literal 1070
zc${TZ?`z^f5Zx{kLI@J1lp>`pA|gFc(jukwKGj_8S*kru=ocwvO-7qu%*tl1^}oMK
zycp>v?5{U(<_&L?{&4)@(dqr<ZZx`^yhI@+DpK1YL;bcr%n$Pjr2Dy&kfxDHx{r|p
z$zxB+C|Q(vtK52uD_CM``wq{GB-@tJUJ3eKE<lwktRE#@ZcA<hfe>X%%9+FCxFlo>
zAQgl^A&9wzaLkv`EWmy&f<Im$R$%1Y)-#t8pT)3abA=U}Uojy`V_!h5le}d2KP1iT
zb_)DArY-@U$>FO4_5vBL)O{>w=vWqEMFeGY;Kbo7cynUDPQiA>a<#_b2$r)$(`}b8
zKn~VPkhOf!JsSwQ<ndlTwF}ad9D#Zhp(7H7=A{?^?rpq2^shdKO?fhR?RK&YjDoLC
zw0yZ8;049;c7MZD&z}s(_g?wkTvo2M4=$^o>-fW`v5Cp+SkZ5WKlC5nV_!VY-XT!0
zmlSI78Ne!Qw)*T&JY?G|j`oDNjHx#X8@4A<R$(ue52<o^3Q4v}*<48Wz(4q|YlclF
zA(tU@i>&mP6?(3eLTWQE>-(DDZM%0p=TV#qCZZI}#Kk7j=0fyvOdFWicwy56MwBw+
zJ-vMG)l$W!%KFh2PL>k8AA@Zq`uz)d2+|jiVnI7of8x5OQ488@=oTeMmQILe;IIfj
z)(N4fCZ*^3YSC7{>a<>|k~YDqOAXD?2&KnF$D@&97x)qrYjg=C<fudHO+vJardQB7
zO|RNF$2CG|2DC|op0&>DnTZ+Z4mRwJSwmv=nwTB3L$AoGPI58YBvpDsYoziQzYbE-
index d069324e064631c58581f915d9c65fa8d5e6bd2e..3de330d4032dc49f5164f3a5a4e472a8a040f93d
GIT binary patch
literal 1070
zc${TZ?`z^f5Zx{kLI@J1lp>`pA|gFc(&ClF`($%z&r<DSLcd5UYcksOVpcY5t^fT^
z;>AcWVSl}OGjDjC+ziL}9-ZDz2BXnn@*IVbs7P&p4E26{m>=d5NcUqUAx$HZbRQxG
zlE<EsQL-rUR=M>QSFps?_5ja|B-@tJUJ3eKE<lwk>?TUM+?L!10wKzjlrx9NaY@J&
zKq?4-LJ)Ha;g~O>S%5dO2>y71Sb>pmTTfg@d=|rw%@tN?e#V3(jeP;JPV$o7|By7V
z+bQthn7RaXCWo&I*b8K|Qg^YKp<`Ku6%mxpffI+T;MIxwItAMi%hei#BUsK3O}AaX
z0C~Gkf~@6(?%A!7OCImlQ@bEN$`Pnn5jrAKXkL2p@7~7iL;vby*pw%8*KQ}fz$p0K
zM9Y`kTfCq+-tKRB>iLu5_|7Z8o6E|T_ReM1a~*&9I5shP9V`09@Q40`d+dwH*&77v
z<&r`TJ_1-}%~qe>iHB@^#nGOy&zO3Zuwi=wWfk^p`H(7yr;ucul+A@?_xzpjx@Oo^
z5^@<bx5!HStk83%6jGaUS>M<EYTMtg=RArt!9<i|nYh>_+FXbpj%fqa8qaKcz=%?2
zyrq{fy;`ccR9Qc|!pTx%_hYb)M8AIl4?+6kK`dxz>Q7v^G-^S64c(&T$kGY13>+50
z$2uYO)TH!0UoG0oSDn@?RnjInb*Z5l8lm)<=y)_T>;hk6VvR0ggdBB9y-A2x(ew%$
zr|DJu`*DpBngMOnpl7XfdS+sVxq}TmW7d#Zy(VUd?9eN6s*_xdHc6G9&>E@y1;9U2
A(f|Me
index 3527a3a88b94cdf230768bc1e6712b7f5f57635e..7ae901063ac6c6096401ad43fbef01fc21315d59
GIT binary patch
literal 1225
zc${TYe{0%67`}!OLI@&Kq==NGl;T<^X%Q*i7;9bHS*jM3^&jcVnY`+CF(;Q(>&M$i
z**Do;tj4*7`}N%Oy!XD(-A$`=?`i$J-gUcu-Fv1X#Da?Dr{Ct+N-JFqDRB2~${|T8
zi%+ttCy0QFq|_d$08S!La2k&?LgiWxqgYWg5Z}<4@MQ)ZNg$NE>@=kVE+G5{K}0x&
z9WsG>7R)Dn1R~>?n<R>|fX8e3O~is<UcjbcrPERe7F(4(5l+b<g4HQRDCsW7II6D0
zJxX8#veGmpUc*w70**^Yz;9=9pdxJr#kY)4NVJhB&YINaZ4hG?Hd!oWF^ThTWM?)3
zPJ=AhOXW2U+AtXa-!-D_k7<%|4}a|VyRn1K;?&C8e@K#6aIwa{fYYhCi`YP3s@f?w
zi3rBch|Cf=-6Xkfy1mj=w-ep++ULt#dGArQ+`O8;=l5EjJ1={4Grexi3D?f@?PYiH
z3W3OZZqsjdJGP87i-hI3{0Fz>vqw%RRM0uRoNG{kw*aQf&)k#S^CaDw5?M)jg|QfO
zSl|sIFWBmlnsY`&4eR(h??WP*B!QutBzVX;z9)0Cst3z-<B;$WyXzRq750}?a5-nZ
zw2A!DaT<*wp^-W^X4#P{1-6K-*W~=A{xg=@tc$CBz-M>|=x+&Wf(wZtT&ToMA-mk1
zL^J3P@q)`c_zoll?z0Cr(yD#G=en7df3&N*W$S3qHe|C9vTfN4NPdL_q?If~KT5}f
zev*!sj<q~GMY3}=Q~t=%OURN-TVYjngpj2pbb<~M+B-&NjF7Gwr`2NZpn~2%wXSWg
zmB#*8V`xUs)Q@GKzx=W<6Veo5YDJ_Y)fyL?lasRCYR|k-^nJ<Be@3|?TA@XBXd**p
NsaH^5FYEir{0q1MdhGxJ
index 0289a0978e1d85ece41e638965e56f80edf23b05..d429a323f67236207e595881d677895f4f5dc39e
GIT binary patch
literal 1256
zc${TYe{0%67`}!OBm@x=DMiXrq`1~e>Rcz?7^^mQma4;~{YScTCa;<<=Hzl}{Yd*5
z`#k#+yNlJ>F5&LId*0{$eT{ba##RQc{$;0g*?;go2)WN!pZ}!3mD=%T<O8#wXAGjq
zr{QsOv^n806_m=Y&w-J^=FAVr388c;#5k0c1Uzc^p(kjGb4dfn!Mg%CAPl@NnF1Cx
z!d8i0Epg@$HU^$JC^ShBB+P>@EO!#VC(I|q0M_0K7g+HvMp<!_L?fW?FWaRv(BmU2
zZ!|vya|)u;Sc^BX@D&55MaICc=b<Y@>_o%Ylub#nHIK{<smD6NC)8`wkc(oXx@@WM
zc3?UL_O{-FGx4LHK5i4H^Du5%<v%2f6RU1;+hzWYw*op8vyz&8lW=#^49Gl!lb0cO
z=exZ$x9Aj@?<NXk?X0|;@lMknwz?Jr41(46l^ou^9_YY!`t5GZPTt&a^+H<^rkrLv
ztKRSlT%NYArqk|q4Pi46c;O00M96y*%;E7&ciPUar9c**U6{#+W*c{{?p>#0_0#uO
z-xikUjEL&J3yk@M!4hw&8BW*lRlzELFg~2ss~=5c9X8`Y#G537i9AGjL>ayz3$m^m
zi;_Z*Fb`WBXOZyltY%;_M%lqO#(UHJbUq?}AQK2_5?m%jm!bX?ojulmh9a*`#ie)n
z6u$umJBEIQvk@nZ%gj<-Z0UvUMsI|dOw8&#5D%C`Z|PVmrxw)r22S6yk|zIE>ZYM*
z5z=+BRJ5mSVj1F`L*mQjkdjYn>TxV{>PajOwHV8+dZ=Vj1&OVu7~)5odVmaZ)g@-4
zBZN{aLdWP3p}it1V1!gfE1m3rt)HWpPu{Cpgk!S)nye{WI;EDxo~eB~*cW687)lnY
qNUmx{DW`>5daX0gB|R_LnG2NOM{6{Tj#5aI>8WLuQ44AwrTzhoSAv-U
index ebd65794309a7a570938d0fc546790bb112352ea..f9c95eb480f07c5e2a6aafac3879ab79bee9424b
GIT binary patch
literal 1055
zc${TZVN2sc5Zx{zgb+$7;z<!%N+~_BSE7iBemTuWuVU-b1iuuKH5u#bHd{7ZYybUi
z(o0kBK6G~H?VFj$o91dTx()H<W_&puUXCAG0;ytZb@9bI>kf+Kg@Ft{=Mu7viL`&m
z6iCWLC0RPH@J@9N6;&|PrTaeRyu!Pe`k1EqO9h@(U_|8<R5g@bv6RYH#cgRI(Nil*
z-V&sO<R`?ON=Qa@2JI5O;v#+zV=)K2xON_>Wb~QCnoX7N+5Q(3616rB#3C(P_Wwh&
zqHnLnf9uj2XlDxexP-%4vbnn9;#oVEzmW1pk1c>*pQ`xP=X8;Q7tkrl>qQ#p%C<z3
zYawTpZ-!)ENxGLqP_H8KMXIzZ+2P;yj27F@H%G9nGH0!-m+y(iLzq2pFSrxQ)wMRB
z^VMdNlQ0?&MmJ&g_wbEl^MlHI82HiPe&p!l1y}f+8?I7CKc9~5Xb{~67#i>y!#tN-
ze+b5*=6Z9gJxI<8QLhq~WJAEjAdhYYneu4{Z}}x7FG7-A`a##4iI$WmR3;=StFm*l
zo*76fWFyu_uyg?z7JN|tBM;qH3AVnHNi~nKj5Igdch5UJeW8r!(o(TS(=x>}wcoO%
zr;|pes8qQ$OX=V$vHlRqQflLW0Zl+g;!aF)ZxW4zpmL1i<Cf)ORC6taTwDKKglfp$
zMR>1{ajQ68+$l~QHw_bYkq&+An2w1s-a)obtsFblPpGc@^bkR{+97JTQOz_g+rVud
z>;2Q62CCs4Fwp_V`<(;4@8}Xo;|Lp$ms1;>X`Udbht{Zv_AFFP!vxjwE^Z*>4=sUA
AcmMzZ
index 2358cf00623751d877d1fd65a1f58aa8e9cb8f19..658dbb50817d45ba61d954bc391e22dfc253b9d2
GIT binary patch
literal 1006
zc${TY@oU;Z6uuoL$Pq+Dq==M5L}cs4b~4uPCv~Z_)O47%zm!p~$<t<wIk`Kl{$cxZ
zf7AYjy~Jt87Pxo0?|tuk-@9ZmcCS79Fq-x!lm7H;6hdMmv;Fwf>b1w&VHSaMHcJIs
zM>1*lwFYG%9K<sC?gerQEPHJXq9lxxd0y1Yt2`qNEHKfzi3}(adqyEQC$#snpCE{Z
zg3uKUs1HRP=bYBPP?30wVaE|Bwev3~Rpa1Lu98fr^B<x!<7v}qo}|9=F1;M|g_?uO
z2jV!QP}`ha9SRdX4`Z>?(DK#x3iENiJxohZ_np6>w*}znS>y9P>;)=Xno%sD@JiAQ
z-)C^H4Cp#y4(e)^1nIbcP0p{RT8Q`{th;;Ct(t&&mf=t)22JRi3+vpoz3chl`O~pG
z^71eKi*~ISp^Ba}^vAbu$pwu*9?zIR_HP^tHf)v<7#np~v7v9ugS(M?HyJq7;=MEV
zu!IWwM7jO$?EK<=k6n9bkG+zQDnp^+Tl%8;Oe%gYUc}A>$D2w*p+fF#0$8Tz^(FVV
zi4hw|DXD6($KQ6l7xkHlVhAs}c~-FIl_Yb>joN-#3cNSW@I>-MP0Ew&q^yllChcD^
z82DP@Klm9$2+Ef?a{k~?9VfqsAN0J%>=GgN5iW|$!c`{tluLw`Ey^0%US{=dw;0d%
z5~~%8<Tb(2q4i?DNGLld7C%A_t8iRntc}qo3<*c%q)ID=G?Auhny439ll(b$$w>jr
oTZ9oC>8B`5EcDYMO+sFsl13X@ner}XauwuMveN;oB2>+x-$FMlO#lD@
index df1f5b4ee7e87eff8aad7f0f22082b6ec26880e2..d5a46cbbeaffa8d25ae9abd0a586a359fcff0c98
GIT binary patch
literal 705
zc${64ZEM>w5P&sdj4>gE5JCuH(@M$8UP2oNqur;()-sR8E0$XZVGPy2+5*=OvXZoa
zd4FP)Z8nd6u+MjT^qh2Fdj1!Nx2s^W*(`$ZB8FTE_4M(DF`2D}0?9L`q{tKcxRX$p
zqR7v@8oC!C+v2qSWQr?z(8$E$S@zGqMOlJW5W5g%Tte*g2RK=ZJl6WwIlbjl@Vg8e
zj4QqM^#58RE1O92s!!YEeOnB<OhC0-q8oAf)UxwG$6=8aJGIJ+JAK!v*umI`W6O1#
z^(_kn&tI{2M8EJ`^T1`7Q781i`gZ7rYijTGu+%`MvN)1_pJm-!8n9{^q%0(Ug9%yQ
zto)nJk_J~~e(~Y*a_Ca#1m1OJnY%^)N)bo$G9|S|52qG&sIyu8nD^+nYu%8#>8FLa
zrtZrt!qQ@&#U$kiAn>SvT1<{YrDUH+e4nIB7bDnJbDR-hn;I`sP^wuk)NhBEV8MZB
z<G<v)^NaI-skl@XU{x$RO6~p(JO&vS>mu2P0j2FcevXHxg%Pq0{n!XSL!%DDT^pm*
zI@)Mtn0Sin#6UxxyvBp>po=l;VMC`TM$enjH+ubnHud^r)G<bwSQ@fW$HXT(YUT_z
G;N&+>S=WdF
index a88dbbb9c5e9af2b78d131c1b7e1c95fe4bb4d2d..783b80c33d90a9576ef70fc155420e8196ab4ee1
GIT binary patch
literal 711
zc${64QES^U6ooZmOb8)_5JDG1r<Iar-4@!ir)@8(qh%gRR&1{f!WgQ3YYSY<$V$@w
z*Zr7XCv+Nnu&sOVch0e|ul&{5kgn&!bh(@cKV<@ik>>H^3uic4NCR5rq0zEP`9rCp
zs-!B${vNuMplx$xkD(C;?hzS!BG3QPO{)sDfn)}8E;J-7aSta~vPjV0dX8>{mf|*t
z111bgPyg>JUAxJ&sB>(@d)thJPQh4PhCxC<TK4kkb;4N7(#&&pi{Bcn5(X>SS*~@M
zufr(tSM$)W=(+RO-3r|fxfl80R?Wzd7QB7KgRrhZYo(hduFf2rOsgH+6banP0uuU$
zvi^*RUf^HX%1<*@yfVzwqRQBw#f4bB#l7Y9*JX$QxW*(t%RW#21)shAz`{&z@`Pn#
z3k)9cZzXIeO@`7~Y|_kNGlsHW;G`2lWjs;A+4m>kLliSOm^5H3^1)yH-TB2uw=zPT
zTGptM;ej4+l}y<AYqryv_XR`(I#LUjuA_i+yPV&HzT2RLG#tEKLY|R+i_mtHl9T<@
zC4I-Gr(|C^q=&^B?X`PtN=b)0SR#7tbh=&A!ut^#9noO}r!DlOjFK@jBXR%-e*lT3
B-4Xx*
index e1d0e762ae6182c8b8b097a38a42615e895d0305..18524d5d42bfd6ca5921c3d18665796429a8a975
GIT binary patch
literal 908
zc${TY|4Z9I9Q}BN5JKom5fLeJgd)|s;<q2h#*o@&u41bsK^$(#nS54{rMYssTK(_$
zNlJ}ug!{s~_j#XpFLyQ^UqtNgJnWA~{qUDeF*nk@e12!|^)97BEwadHnNNb}nZ}}!
zD(?;}(r<~n26yUhWQ4&fQT#KRr&L<=yZxd-Z7}_cNhUO=V=+ZeG@)N=f%ZUT*&FE_
zp{01pa9Jb_VV!?5r8_I_vrHv_qD0NGY$qpq>7|xCsliz237XoTTb25+LTa8@4txJ0
zMWuhV!lOjXnK{qY1I1OIYz%}+9tWA27q~UXMcv+8a`(%WWHQ3(!`m4BSie-IuOZ$=
zaX1{GNA<6{vX1O0q1pRJ6b$0w)wqSv3C_w`Jd&Ab#*K&ZWx&w87GyAO+yr4nJjNSc
z^Qdvb+3v@IqJLA?h>VlrDnj1nr~DJ&^}Y$2Vd`E)hxaGFvEr`{_(Bw%G}Iz*##oqv
zDDXB>)2SfN>JnV$T=3*ggJN|X?%<Qi+BNsX!NFmRj<qS}979vnsO6LUNw?&qANM!?
zkbmJu&yno;!R>W;=<hE#M?U$jcE>(nXnL^UQKYD2b*UzIaTo-3Zl|oX?K&2K<I-r-
zuxU5|Yp~t`*0e3ysn#a6tJQ@~%VS-j>43TPF$-GEt<D_Ss#Y7eyPGXoV?^pO=<zn&
p@&Ig)K(MU!4F?)D+ujcI_QCQQcbMf?YT&~<vta`o%%SQ%_zR?n6O8}>
index d1acaf21dde8256ea49388291e58034a3d0b0bbb..6053c7e33afc85c187ac88058f3fb55ebc0820fd
GIT binary patch
literal 1346
zc${TY|BKp46rUSH2q8!i5fPC=L~L(Q?6Q=lElbt9TbJD^CRZrSam*%fHNBXTnQ>iz
zxWBA_MgOC|#MSKe65hO-&-?zF8BV-wpWa=~2e-F_`CoAasgCvT{SWJ7cak3-Vvysf
zwFISNk+z0$8pY|NuyqQfuepX58hSUe2FVj&OY|)qx&x&^YKT5Tm~aV^$5)Vn@gmLQ
z3eV0LE@OV5z}}N<#M-}NLN-P`Ns1_j-Ep}qfQv)HnNV?-gC{eLTmiP1)jlg~2V5>d
z7jvCw)5PH|tnNYn>edLBu`0^cJ=hkflb4YN+&=U&OhovPABr{D`L_SembY1fjKd;=
zw2mQSljdag{)ebM)5&qr!+1G-dVu{<#%q0*h<m)1%)$;9BsB-BBd){cDB&9g{V`vF
zyxgQ=#@UN2V3$I!UT~=T2dAmL1-%r}NTeERQqI0&E0DW9@$qdm|NQS2-TA?M;$8X0
z+xu>K<|CK(BTqKqpxY+V^!JiK9tD%BSB9q$)>%mhp4Jd*N8Eoy<<2BdA@$A<Cc({^
zf|G8t3vg8a2%YKh8WXs)`E)j(2VYBH#&aLj(RCS#goikVsFYWnK2TQb>ZOD&qp$3N
zlziu0@;HHLc?Fv3C9vF)i3i40wlB}NOQ8;iSg~VLW?%bn{ysB3?sYuDj@@G(DYmKO
z?Yo?DypO1T7=jJL5cv@jiOl<V15kRz6|~_<o%*BSKka=}Wu>{)nS-TqakbdTu&u<G
z^%-~sG7vXnVLggCx(nvxal!V##=BnGY7k<%C>BZ?rHNvrI4BIoAow*MLQB*#hq-Q=
zr@1bh9}JgVqb{4oGCQP<$4?};H5%k(zhiCk{26w&-XN}Jwk~dtpxGj4xu0S7a&4P$
zbM2V#KD4j{ieZM^Y?3-{lhfC<TS2UnS&Ym=99(U;Nh+U-(I6i!9K+0hvu}2ZZNA1X
z4D9QYoMD`6k#lllRY-|cC?yr6Mk;2Nkl)@~Sd!8jt#<m^)OM|2BBe~#TyjCPE^76v
LOU|FSZ9;znBAJfJ
index cdc09740aedddb573b49285a2da8981040e80754..601f046a062c06f84a8f1e85448137108b253198
GIT binary patch
literal 1297
zc${TY;cDYX5S}hV2(cJrj4{T9#TesWQ{$%L2zN)g*yp4Ui4rXJ{)AFC(!|zP)|%Bi
zPVQCisrp78$+4BY3RWY{d^7XSH#?eomp;3@n4Mi;pUwV?BTP+fp5OoLeC$t)pNAOr
z<Y}cb%VL#wMsXU&>AZ~f%Ajwg!6gL-SFu4Y6W?gUmVo{lnR%K+zIUQF7=6Mpks2dU
zF0nn9Nm62ZpQVoFeS%wzH0104=u=t{JE@<`ywhFnTb0Fml1y$1x<sOvw>d5e1yaw^
zlyjZr)5PI5F7HwQ2x|w6I4j#6zQ&gB?ymbNQQ<#+s8;9}pDhnJB@8-yoLZ;F_=Ep>
zvLgL(KhJK8!hN)J`=O3k<|0w|Bz_(dy9kL@I2vPV!o@g|>kNkzIY)iIPQzT9SJH}e
zrI)Xy%7#18jlM>+P|;YWhSbQ0FPrw(OVn{#4#l@rI)Q#JI_~er!Jpr+=*|yjQ}4nr
z@7_1-+<uhWeU!->Il<P6VZT)T$vBwacr|<qag}r7__V^%aCQHMO!ZdNc-lO>!8Ev<
zFy!evUkA^MOUQ3VmsFtgc{1~<O4X?C<*bpu_z<TUF;VH8g~p9wKl5`LCm4ObKqJfo
z#SSeBPC`8hnTl;+v011LUjlI^_Vt8&>HqfkvF%B(=P9wLO$D{uq}<!myOp$|sJmk?
z&ccv{Q99$>mel|=GnN^4aj#kS>u~t{;7eA^jMOFvIEG$gqiGv|po~xl>PpR>M-@kR
z!E7=q)qQWhJFK`>0N0^YqtmA2(&2P0pr=&<R%MR;p|EZHu&_1zt;JzPwq}E4cc4bU
zr(ijaRtKt%Elxk3z{_I`7!*mC-7l<b4-3of;}7BhfKi&o+ihsE0~q#MuTH*t9<lNW
zaC*DE4fO-CI`GZ`CvRJ`?KgH8T)PLHfE+%;5#?1KcnfcwI#i&}7}TvM)a?eqPsa|c
gFvgm!(H#IdmeZusD!FNLIAJ-9W~;&B=;f2lf8ue6_W%F@
index 246b7b210708d5f14f78b4e8a0152808aed8be02..aa16dd2d8cae44f8b45cbfbe0a34702ba8dbcc45
GIT binary patch
literal 1283
zc${TYVQU&e5Zx||9LFLeA|etNkzms_*dQgeB~-0R4T%Zf(J!Ht%{kF)&s*7DYw~0J
zUpjk6Pue@?X79b3**CM>AC0d9dVe|T-Q4sh-{UEyHnz_n|9GF<qwMD~20eUQYA_~N
zX|o@v(>R^w+{txpLCYkt8u2{xFkc2%T3BF0yJrk&3)3$UB~rt5EEnLwc$PXoPiYKf
zlI#`xCUq<y64)e4i&*PlOlg7Yq<+rx&bJ%hDHFRSncQLM0#LHs`^-s;qZ?Q}fX;P<
zQqRCP!g*}+THSy7d<Mt+W%7*HcK3dwqF+Izmf&a0`WV)E7-{a})GEzpa`GQyvh?F!
zKie)c_;d>gk&c)4GEonBAdV4R28Wda)q%9pe2~bMfzD9QKwqrV$c<)iwBkbP#onk)
zXB%{@Z@|vgbf8j;-J7GA(;u()kE^po7og)PC-_ESGt|$Sj@`|;55mc4d>Q07aKZY8
z-%|U(WwHW}`K!dzH^pE$2uHW$GCW1Fbc#4UEg`a8J^Xa;wts~Yr8|wiYWwVmqwso2
zfu}2XHr!;lwD@f}39yQnqU@4Yo4ZRzv2EuX)`Gs~7cx#@y1WD{>>R{4Mr3k?dK5Ah
zn=Qq9t_-{ou@SDO@UMb*Ke~rwC3Zrwj#lfGk2gy0B%aK)wG}FQQG_#6+VIUzr4WoA
zNCOSnjqh!z(=8h-wRNOt@gvq6XZ;oA6m+Pr)$Bf;42Ss`d+gJ3$tw}!mC-!33R(lr
zN8@OW;8QOWTB08Nkog8X&U}S+3!HqW<wCiDflX4u-%ljtN=;Js*ufb)_&{Es3}>vJ
zd7qtRp0m?)aX<(y_;tn`4N{_lblUW=idfY#%rS)H*XIpV6{OH4XC4YJxR)KV7V+63
z;TXutIXT6=vPa&NBW$HeDwL86tE03UA+Nd~EmBJBwAMPo-U@!TRwPB|>YTi%PDQm=
K<D~PlME4hfI)RV?
index 7e783350cfd83eb3479ef011c381491c7999b8b7..03c2de70d02f3007aa744ffd43ba8100a98f223f
GIT binary patch
literal 835
zc${TYZHwAK5MBleA%rxD$RTnB5y@SzVvGG$`ax}KJv41ixGz%5UNWakV<MZi>Tl|w
z>?CsLXalp8d1jt@+a1sR`v6wc<!G@OEq{m@Qzg{t!z=C9ot4IuK<OQK67yVSX@4#h
zN}dEtigaD!ov}z`LMl$Lat4Yk+>*l`<vB`)@h6NDE;07`7JCm|3jUbj8RUu>-G8x6
zI#hwnQ<b$n;Ym`NMQ*W9i!v2BtiX`VHL9w=?sG5WB#V9pQMN;){B8Mocrn-|EZe7L
zzy1G^ykx(7#)C+Toth@uBkig1G$&j|n@Pg=IhtqhU9l4pEpYqza=o2Up330M%2q+R
zocYtBx|%;Q(0+4i5@nw#EAS@a?5khLV}!e6cP1Wp7%6ydgtKt&0a_2<GN2G};KuyS
zMS`($AH4lJ)E8WBdVc0yxQ^P$?2ww@IL#8<A?9krb9BNDIw>9;8m7FAHeOnOGZ?%d
zo_qON#uQ228^@(oWYu%Ur79BXiVj<4=cnTwB)z0B$YYdYHqX|paOru~l;5H2n0k#d
z-6XL|G!mTz7=2BHfmy3Tx70RVmD+@kW;2)3(Fe=03|50WGfN-9nWMvXsWoW3S53x1
ut2dy<TC8&oZHuv*RiL#3rJD7IX7`wN$Fvr6baGNs=rIi%Oed<%ZrNXjp!)6r
index 79a03aa7538cba1aaaf7690fd66eb60d5fc4d107..9561a51ef4f3c1ce765d48efe4fa9546719f3b7d
GIT binary patch
literal 919
zc${TY|7+Sn6h97;5RNQJaYafwM8tNTIP2`7?1$<yr_^+qw7--w&g9Lei-}yWQ~!wl
z&wDx1j4k2a%Y8nd_vPMYFm@*%eH_hhrqi3*w<v@}MQVHfs(juW>&=e{q_bH`$g(I+
z+P9GcDPm8_C|MMEeGnxfB1KH=Cd)u72tPp(3kjhsme70<G7|F`cA!ug+V~esWwS`^
zDWPDANjX*!a$7JbLlMWtHm?^gl3ZGVy#n-wT!1S2tGTc)gpGZ-gE$R-dO^AZQ-9VE
zMEa8GGqnFhGOh3KaW9b3N{!-lj&sVH>QJcQX&8%_4A_pn$j=o8Q&`Ub9&g>3TP;2u
z`_c1fV|U~gSM$2`q5Mloh9NJpqHiqE8T#Wpw*s30R{2C3Y*r8`b~l(HW%^_P)}c@t
z+>hM*>A;y;56;ZP2+D2VQcn`roSw1E?$uTQJ^L)87(#R6z5Cv4x+y<o<)}>8iNDLr
zKk@|Q?&i-}>6-7F*@IfqI%7MQeHA#F(DoryLy-aZpFrzyH2S*ha2UYbPN&~~&MKJ_
zQsn`L!o^nU?uX-RiT~dh5FtoEy-gR7{>*WT+5DyrZkH>Blo?tX%|bguGtf*lO7J;0
z2sKM(+SdMva_ud8p?!s(Fq?D;E`4g1tP)05iKRJ8PqjB_U3-(ZTD4<BN_xktq)Axi
s2<42_Pw9z`jIH?`B_^(h-6VF8p!D3p_DcCn8}yhMv_?!qv1*t60c^+$od5s;
index 40450f0d0c737662b741e1c393a727be54cbc287..7efa27fc69ddd45bac1dfa008691d9dd4c38136b
GIT binary patch
literal 932
zc${TYU2EGg6cxf4V~h!=gc3p!A%wK+LRJcUD0|3<+oiPLh}|*>V<`4*BIejZR+{FA
z?|s)!WADR8y3*0P=UyLqH1+O$I=`I_A0CFY?;?Uk3AMlGdcQX<HqQd2`?`^kWg<=b
z_d<c>v9F{^mKENumcHT&)|lEJi6lZ+rPCW`8At`u1j3k0h&;ZA?h}`SFJd@=T%kti
zUo4dj)wtYOb#gJWO!7(<cvXP`mrGDp@#dJvamDN$dl|)P_|p&54VcBU;lZw=wM$yM
zO^SZ|{~=kCeR;(FP>PMZjnf7Cl%LecT!pJ~%(oc~-VF4%Ymg$W3R#D=i`+gDKEQhM
zr|<1R?hBRD-PYsZcFg@?HuY}(>JER=EB%E_3klm;(Ra4*j)UnJ&w<wvHo46fylx;=
zW-txzT?)>lH*s&Ko;$Ih+?kJ5%4)2qRuXoMo>@0s#1NTx{)Zn|T`y&&4ns=1ORTRP
zEr@CXWNOSaV8IGlg1P8Hafjc^0_+oeNkzm4*X+<90y(oJ^v;@4e%t%O;G>f%E>$jV
zD4c34J^X`gC(+T*z$1`BdY>+hTzDSLT(`1fN4v~2bV3XZhl9hwVd9_!pSnq?rR%g;
zM29wuXwi;#Le2?J18QrwMs#{Ytm2H)MiC9#Dxyi*`DvXHO{+Pzi^~pqdvHq|q(<5;
n+O!GL?IVd26KCV3N9;b)8l-LDp_ae2OY7LzDM4W@eL;Q$)x{RX
index ca2b439d862d85074a57c56e3ac158e58dcf5728..b52ff0f08df83646d8ffb8029d0e6470a6fcbb6b
GIT binary patch
literal 887
zc${TYZHwAK5MGubA%qa*5D_^R5y@FA_P7rPDO7E0J-oD-^u9<bYckc)n8;?W`V;%F
zI$3*0+JxE3KJ(1WKAZ8(d-UmYx)?n@jTYbH2vQl#({NbnIWx8S5rc4#I{|qfXK8;P
zOAtKqrHIpYiMPga8X;2VIHNoVAtCwzVZsGO9^XQz%<v_butj#~nTwdO5;zmN#9;eh
zEE5bnaB(UNG$%Ys%5BjvUZ+LH5_~AZfQvQAa=!M<eB&ewfBIpz14Df_JUCn(>_W@-
zsX9adKO|S#_b<2~ig+idNwz|rib!q3Ww@Cne4j)2uYlhEdU*4k(<?-Y!zb9Tu0?MJ
z;-pGkG+X+?V&+Z#^1^=8`^qmaOibA)lD@KhcM{A#dsR4wuq!k*;kbiP>fYD++z4jD
z+@)YWy9*y#l-bOY8vzGK@63-pP9QQK{Wsqq-WPQCj-@#7ke#a+TVxgy=dR;r?9zi_
zjqH$`UpQ(J*#YEo!gFB322=`)p)Rutm&3gt4Bl3A$%QP~y2Qnn+4=us2Z3sR0v>?~
zvU#>%1`F3M51r8tvnnPbl?s}LRz=g%3^YpcsT+ivT7^2wS7}pui*|IIbO|m4YH5~+
z>>FaKnAuj2(uVRnWy%}0)vebEp?dX(Hi$`Dx3p;!qS*zi6(})q)oq8^eWEu=TgRES
R;-$B=Ms!*ySP5J9$R8a52vPt5
index c3506c2e8e0ebe2cd52f7de069be64cd4234e7ab..b505aa0a944521a9017f605f2edde83c8d99c850
GIT binary patch
literal 871
zc${TYQH$C@5MGuLLI`P)L*$TS5%Ik1RqWwQIr^YpYCSY9CftjZvL;gvjfvf?Rexvy
zP$wJC9BsnvWWV`lX202trrwiJmy^YCJ|8Z=#Sx@3mZyg|`fYcrHa}tz?r|p|&*LoZ
z&0-0HC%zPMx~}lnC{80ps+{gH&p}9t9wAJ)fXL%p=u{cL<Px^X?mTl5^Hl;RkxLA=
z|HU%FumcyTsz7thlcd@f{o-|6RII>31qNKKL00E$znpKBWZ_Rg%ywX^&r1&uuY{dx
z**;YodjBE0%D#WW{ZPa^IZ3h=&Z&sh$6SV+al-dGSY`CCkROM0*sflWw-tz!BA=(T
z^n=CJoA}k${GkK=Hy0MB>=Q}f+P*sureC}o97EU@)3e~XgHT#!su@g!nM=Wbb{9VK
z2xSiI%8h^nqc_$k9w!i)PyYMwgN~Q6a}|b^?2uYtIqHfY%VO*!yS{#4WpCW1Sfq?}
zZ=3*fIp#UAU;`?G+ST1P;jHjozyG0@OD<%=HY6^N%*x-19R&VepMggpf^3$pm%+ky
zE9Jjvo7uWfh;E_TXf-qg%|xRFpN2`OrRnrm`5L`a-lko{A$J6qdunU8hU_}ARm`Fn
z%2V1@-k?l*leW5zIw91kUC>Knk=7M$I)rFWfocUxOk548L!3S_E=kA0LutiJ+q6Lp
L%)(08vq$~{%}W2<
index 97c2187d329328cc14e5678e59f748e11f0e4583..33fe4b3a0143ca8a42422c4172db9409aba0bc23
GIT binary patch
literal 899
zc${TYQES^U5EjB1V~jDOgb+dzAq2O}LR$JZI!H3FOG&(8dwmIGDE2K8bL=21OY*cI
zxIZ;nZsW4aoX-06-JR}}CNuvr#LI_ZyjYBbZ!CdKFmZY})(7rPEq*ZI-f_pFC|I5i
z=S%>nX(%|$)-~Rpuq=^C9pjFR0=R(W1H>uikoa^9{W>BPRKQlU`%jcJx=NuUQXw~c
z|6(~OvI6C&IzeYj)3jce_1HQqGuGf;4Mvo&LDc8#y_|27=JC%k&Uav{-?k5jSB;%%
z`94!U4F5w46@B}HhcRb6@sQ>#sZ+VroKg{QrYYSQFnSiy-*17lxGrQ>VS`c^7B67C
zdaZjm;wP2mEZZ`Sf|>si)_3*?-|D|8w`9mZ75I%Ededn3*>AuxhFvME1;-u4!t%c^
zCSG7hvuN&Nu%Emjlsrrv;))H21Ho6;N6J!2%*XKN``!C0;C?h9RdRAqGD)jo_p0yb
z<XnWv6!{^uzEG)0;zUr0DJ_6R8&E+~5Otv)ICuAUbTeucf^t!^4Iw8-<kcG^2QC%+
z1T+C2<@0>Ki~`TAyZ(*)#MUi@bX}S)ts%{jW=g|Ij+TkArRmsJzJWW++qiEy=o-ms
zgl)~%B>Mu{YR~GS=b@Gux0N?AQQpMe>sAvXY&0%#8(FA(i8~HLnp2`$i6T?ZhT|e<
Zh>SMs8S-pe`Qc04L<Vk^nPuq#`U@rJ33C7d
index 245a04a5d51ac9934cf3984fb166d39c6a118ee3..9ed0655879ef010bc9ba8b816b38e93513284724
GIT binary patch
literal 913
zc${TYQES^U5Y~h-#u#Hl2_=LgLI`Qsm9+G&>><g#EFpD9Z2A($Q0!Y`=2}5kmgHeS
zc>iK&rH#vGb2{!j-S=6aJQxR)kS<2^{^MhR{w+-)SE)KY^v&z;SQkH1kp6xnp(s+3
z-%L{ll4qfkX}+rP)*#IjM5>u?zbHT|NIpTFaS2JlpP}=_Wy+Ts96_#dwEZt8WTzqy
z6<6?#qzo0fJXD?LkY`y{wqNxInTUUevDiTQ3F#^?r>lMU6&P{30#$votw$RH?A{#g
zL@TzrKEus_NTJp4Uhy!N=|+t*u|%KBPJPH#ydGwJTR`u{z=04M@VpXoj$_y5fz$XA
zo|kWZZ$<K;Sx$Z|!e~AYMqzblf9SpWi%a_64gFy>o&`17$FM0qc3{7OSUJeH&6GQs
z&8B`ou%mG_^(i>B!2~DVCx0H|7-b&os<nh2qnFc{z3d}XatjaaNP%UJ{g-C<()rBO
z3=(@1-hRLD1cIHU88V4o?tJBFPvS*Ts39+aMQhL$=#RehCY%oYp?7;*D-@Ti+-)gb
zJSC359NS4W@C)z+WF)3ywTR}vUzzZmc9>^6gqSr91H;8Q!!R){44dF{ZV_r52EEex
zj53{F+I2i~O>nuRF22N|b>ixt(|)J3O)qpdX-j8|wy(}ni|VS@AP#9=(56R-;gz`I
joYie&;c9wa;`NBrARUVst`?w8dQME*AQrJv^@jWf{kska
index ebd47a6a5785190adcf7331c933f4e6f358d84d1..857cfe63023d1b059308adbfa1945cecb4145c6f
GIT binary patch
literal 927
zc${TYVQbqk5Ea4%V~l4)DJ6s=yb#>3D{a=bV`U$j%*#?5Z^UlDl+h{nEfI6=AgfFJ
zGxm>nmT5dTo6||}-aDO68cxE?h~AE87t`s*?3+j-S3*6Vzi93I6TSE$Kn9O131umY
z{P0RBkUWc&6#1gTy`jicL>i5MQI;STq#q&4xP&z1_t3xLQt){OHOLi8d;emE>^F%c
z#TDFRQieNl`P4+ZBc5f=vf589@`~DkCk+^Lxd7GF*9l?W5PQ$n4znWp870LEEIsu$
zf#M<8XE^*1DK&raj7NzSD>crFIrgcFY>&7~mZOY6lwjA<gX&x&nZo`2@Ai7JeA492
zv2UYzHVMa3b2TrG_pM)C+9-L*6n*7H!6=@53ES|Pz^dw~4Ua2GlwC`$coJU)6xze<
zad<r)1~ca-m_?|d%w@h>N?0?xXTKSoot?h5KXH*kYF$RhcPIU@V4JKAnZ-J{zj8ch
z`n^uhKCm3+^>gsOrSSI7SzXz4Nb~$XyXLqtlxoCFVDS<(0UM+*y$hQ*ygoV}7)#ME
z6_=_Km<k716?G1_miP)k15ZK5#Z|Gmjb}m7bm%wjF}Kwwq}4*R(HyibG!xB2qXfT>
zNvLJC=%MyolxgqK1MS<iYrAAXaCk=@!!b~`O&lGww~0^bk)Bh!tG!7*?Je5#J3E9>
vyS;@1n|Qml>k?wP6>3x{v2ZlqK5<V8rrI~LK%@F;pY9Noc8G;?mz<D4H5UxN
index 5d2c2dbd256fc877e182d35cfd07538def2aa78a..98593e60e2154f6fc0450d56847b504917f2dd9b
GIT binary patch
literal 953
zc${TYe{0(?5Ea4%V~jDObR~o$LI`fxmHt{gC}Sj<m!&k`h~56NGKyl~QZdI4va+<F
zW?yk1VP|=b$0l<+>)pN6=}Ciea23+K(X>CA^rv4%0+|x(>9XHA@Wy)aO@Q<tmlBFX
z<k{i1P#}34Dk-vgjdunjOAx6!UcV?nDoEZ#oN@_Cz!%WF<x=oj3Khr|QoH|Rx$M=2
zL&X&=uqeYFxO}Q3?IBOodRgu#=2@9qgJ(4uaXAN7_ty$wT_<**yB(x?{5_2GC0P2m
zvkBy@OrPQKKcvw4C(n2oOR-d=G@qePWn_EERs1ka`Ko}UKLQ4;1xOLs9oQA^pggdM
zC$O0Pt$QbuPrAxRkGn9Mj)PHH-`NY}P2&fbHd0opqA#7$A4cO(K@%QhSe8=T@VJCn
z*}=_Z;7_e+99{bqnuD8Bg*dnVG(-kvF7wobgf*jk_UXyR#rbRd0~aYI)>U|XfA*!y
zXKz`CId~Rq);r$2WYyl!xK8r+dO^-MJus}BuQR(M*`GP8mbeiVYRC&<(F15M%BG(}
z8#WreIyydW7K%$%W}6BpSLM}9WNV4KegvL?jPmPzeiu!Bzt-j_?J>8}B&1=ZHP9Ti
zEi@C&LZbvn%Oun?8uU>6Ey}ca=z;c4+O}PCL~uH%j^P-{+9r;U+1sQ?yF`y)?=(c|
zuJ$JFYHv|*zqLaMwVPYWvq@){wp~IDw?vH+B^J)6>k;>iV8wkC`!vdrcIXZ<X^U7$
IcgYF)4V7;e4FCWD
index de773820b8a1fa5f7e2733857d84b0a53d8f0ca0..fabb9a5b3f6e76c71aca778a825718107281a2f1
GIT binary patch
literal 927
zc${TYQES^U5EjA&V~l4)DJ7I5Lde{%3vJi6gR+M>^RkS@9kJV&vK7_7rQTdC$jXxb
zi2diCl{Oxm&D}}g-FJ67$sdKEBYHEO_9v76^lO$vp)&P&@uG3yjr8Vw1~OR9C6r|*
zirzR=AbB1snH94dZ~Ix1B2sg_ep!N4kbZz9=MvJ8KS1}I%Z%UUum-t8YUf`}$ZnlD
zQe43UCS_QG%g5TYJK%X<Z>xIQtf)e3@U#YFE@z<X{#qd{>%h))w|*{?pHU*_VCiLh
z;}DBNpP~03QtJ4VXFN(|Hdn)3+~J%m&-Q?;<bIIzMG5xWdsv+-OD6De_xE_)v3%6Q
zn`7TZ@pKdpqxx!I8t)pvxU`Y7$Q6C%M8O~)U4~6qB`~ihYQt&{iE{kQ%W=>Tt#}lV
z0}4(5Y8YNk{9x)_2h#{Cl)21P_Y#(j?%Qup&d<-@etTlE_pCtN7a|8<c>5P@UGN!S
zM|u0sQ-mE1CjHxE`y<bCNV}n6n|>IU5X-{;!f`^W8$+oEyaX2CgU*E`(%0UG%^+SM
z9iR4ol+99csVai0P`OI1A0Asue21Taryyf77PFgp8U*!>e$x(f8#W=0CQ1XvLD@nv
zQ7jZn@N1cbT1JERwB4d@Z5?{3ZIkZWE;%Bo&ZuKJ2C}w^qkZ-^VMMPe?PzP#uC^BS
zyw(mO)NXEJxJ}x7bk`-sa4XcPP-3Ar-7axY2_`x)u|1>u=^ou7CT$T5=`J}Te*o_r
B4F3QC
index 11aae251d3047d2092aa48081d3c70facf7f7c50..632adcd4fc959231126ba8e1b61395f79a553290
GIT binary patch
literal 852
zc${TYZENB{5Z*2!gb;E;iWHHuh)C-7q%Yp5av#)7J&W4Igx&`^jy0Lu<zgb6wdyat
zzjc#HO}Qh?4*SeJ&%9*&qv?ZB=fhcVGU?5JiU<-V)c)>+-gZaD<ynCAc54Y)Ceoxc
z778SfeI-S*Eb&HPBoQJdr&R`h#TBeD;P$c%q=M)xgfW*8P5BC1Ph1MVh~WTog^cFE
zSSlG-;BsH8)(1R}%WLyZyC0|FZ$C`eke3t7B(GfNbxSbdatW$z*(|7yqfoj@iVi#f
zAz7h+^M?DO6l*n%(*<rOk5mU-g)f7cZ!)M&VOy5B4!M{4PDD6?)#Ckn8-d&x)Z@zL
zelQzNhkp5M{?M-e$|e11``#cJJx(jI3t^qF&4S$;LS>=aCRS!J3dSA<`^lU6m`9nz
zT=gPh%jiY*w)4v44Lm-(7uG!&F+}zIO%moZEZ=NqKKR$ax~*x-j`|GQ={B*xa~wQ!
z0?5>WXJ7zI)!{hBr>pDF?L!aj3wu}Su97J(Rn9XM9*#;64~cChzN>G*BalHlPM7mw
z=6U7JKWOvZGBiRA3(Y~((F`<`kP}ih3AHqhx`lV>dEqTu*Bx?6@VKEieng`cVihry
z)(WpvR(OLp+_MTfp_tsFw9V?YW)q^>2og;{#R>+Vy3-=|710}{X<)EWrDyb%=(I`<
JVj{ak{sOyD{_g+)
index f8a65ed18eaa6e2eba3a62feff425f207682fbda..0bd51eb26753ccce9e5bca7f035e46ceeebda6d6
GIT binary patch
literal 898
zc${TYZHwYC5Dq~~DWw!yWD$`fB6ZIbcUkt!eNwOMxoG#Wz5OD`5!+ceTx}#xefeqk
z?=G#bxtG9XnrCL7c{1r}>OTc|Iav(n^Wow<jUg3O96u4Q?@r6ZD+TTywj8pIva~;=
z0ys$m!D+fycxyz{SR$&Xqk@4T0yZ+>4zmonfcP^+3E>d?WCNWS!YNrLZ~}>t743g9
z#vR##@S|dFj7gHHW5G?=Y0*Z3_X-RNUxQHk+V5IM35$LP5!-@Me)bBvG@8R^_2<o7
zmwc9|rSSfLNLJF^z2iZ|=~he<wvq!YBDFCQ(c3s7c?N^?B>j8?oJOiq-G{w8nJ1D~
z$d6_5WtPove~)7sgo~*^3Dg_@!uQ&aa8oAaiNGJMz#E6tXTJ)E2)4zTO*m{J5=J-;
zXC4OY#aje20Xw$iiZ>2>r|s?-jh#WazavQw&#!J5cg;sa6Nnp+c^VZoPVo|%@f6(t
zxbOJPx$rxZgzZ!FE0Gh4?GQ3CCK)u~qWa_D_Mw^y!bK6(h1_hxPJfqmZt3i~9Mu;f
zG4PPh*jg_%EyIQ9smn6#I;O56q?^)gX}UB+8b)%}41~>!hC8LVakKO$ZfG`gk=zE@
zs#q1I;VLrA7{>L|>)0v1fm=7%HH5HMy~1|Ach^Se)km!+ZdeFatRkUOBp^fXx?M+B
a4{06L){$25TNPZxS5nh8lBBZj4f+ivi4J1`
index 3f8f23db4840172065d1899655ea343cbc82772a..faf482a9a97ec3bbc8591194676b3ed55fa5d82e
GIT binary patch
literal 841
zc${TYQES^U5EjB1V~l4)2_=|fLI`fxg|-y-u%{$*vy{Xgu_=r&hGJh+F~ttD+@!y1
ze{qttMq@MFo$tH*?oKC-rty7(my^YCJ|8Z=(;Nyx#p|bc=0!MdoF@uA+HW~j6)lUw
zj0)g{C4$ppt?}-N7P&+;r>}#FAObcr5Du#fxPbgKWQ=ggW3qw%BjJ>+7#u(%B%}8)
zR`Ni0ApBKV^~Z!U?W)>zU8pu1ywzYz_!@+sulF{~h?UvTBrCUIH^1Fupsb5#!ohz?
z)#Ts2;Yr5nR!msAlABSH_Lzw5dCW*%K_`Ztp2#`mUaFnYYz~{%-|OwB{I#JTSGG*j
z#WbEI`f7gR8}o&5M^b7g@Ow9j#_9ASZoxi-t=gUg`z>U`PN(TC!r(qei$o^izzah0
z%wZScbLWmw2DyJ%7n$M&YMYgPpIraA?Z;(sEEY&cxhtHnL>@NxQmDk3RN%vL=nq%d
zAN`_cZ16%@4G&M@d0V-EyjCR$7m8;IsXS309#632@-2M<k^@i6S-D=Oizw3P{DymH
zj%6ZbIZ`|+mK0kGM)GUh2s?&}dyVz5-&hBCOb=ZksjjeVxCSzD3pq^;<I~1k_^h!u
z4#LwmLfCAbU=M{T@NvgQ$Z!>EC=}UJTV5Zz17vnl*FvT$>KeF@PvjtNBrC~Ym*_VV
CCHzMK
index 4b2834c76e2bc1f0714647b95c2bb7b46c9cdb79..cd07983b87035a72c2057c50b87a6416540939b1
GIT binary patch
literal 932
zc${TYVQbqk5Ea4%V~l4)DW!xWObBk*mbUBKZDk*t%*#?5Z^UlDlra?hmS}VBAgfFA
zGxm>nmT5dTo6}kE-kt89+#iKE5q%g=uE*o+$ybp=u7p}&y=WcyBfa@9KnAOYgt8Px
zetatwNS;MXihS1KUSH%XB2A8eU6vpfq#q#3xP&z1kI=j4Qt)X8HOLjFcK^i+*=q_%
ziYs`;q6|;qa@|Ba1D<8gwmMJD@`~Dk=M5NhIRn-7w;RH;A$Fg;?Po>uGfIjDSo+i3
z1d69zYdHQ7DK-D>8IKYv7HXIkQ=C&3*&c9}%m*2ND#5O!hm|gojNx(m_jtWnt~Gfh
z`yq-aqi`5CS94^%YyINV#+0W_(U(pX4C2w}unnsO7S%*;SS=t?cAaX)qxd$U(C*(2
z!@F@mm^k;rB*F~JT;{8}ge9Z<_N%kY%Zu0cM=ml*t()ld+j%c6*rqB&X0goeFC2BI
zcKrvqF_db+OJMOFSdNuYufD?$Y*ZbcoW3>YqFpL3Rh3{WTwGPuHGZHPR`<%@>l!ug
zdvoFKU$I)~b4c@igqIS3#ZSOfka2Na%pT%N5Hw@@O}or(wFzmp&}=jZZ41prv(PBP
zXU8PeGFtRd`z^|}cj$rkZQ8M2azb!<Lmk60Fl(DQI!5W9_9peTw`kYj-66!#JA0e-
xC_T2@TbN)IZ;y6djJcXop~S+~bbG`-CrI{9Y|yA)dO>%HNq31wD4u&p{s4XU4t)Rs
index 490909fc9f955014cd6b90a685061911b9865ff5..e26f81013fbf3b4812c4e470c0ed59395da4c280
GIT binary patch
literal 939
zc$|GwQH$C@5Z+rt2tlmKA%}=8K_qv*ipoI``lL2k54B)&N8u=CO-9`|W@UHPlhVij
zgZ|)dBAU`dA7+O6X6BpO+3Am_4?cb#&U%wcZ}yo*kSL}O?_QZV?kIB>421Wx5g;Yw
zNo&j$2paoJuw<FzPM;-_M)I0w9`qGeu+{;$CnX34(R&DEDj=HDH8h{7V00eC5u{32
zH2%i8s10Zw=bS`0q~eeRjT3i2=HWL#<Qquav1O8W&hzeaFrZ=yDj(U-N}V$i-zM3F
zt$z@i@pn(S9}2cn!<f(YX3|JyKvlRJ#B?j6I)#1SzHrRFO?Se=39RRTuGa~~AuBzv
z?AZ@yqv_DkzvidWHFs1LeQywqK2FQ<62c~3T0xU+V`T@UVC-SQugm?%;q-CR_h!W>
zZ|3V{YeS{P#O}1aZ}05~|4XM^3P7p>m0-b+#-CE<I*V-*rj%siUVr~__LiyVToYHV
z1nh~mpe(-sUvB;6zG=5Rt*`Re$(JPIib&X`p9>M0AGEV(A&=9TJ`Dmwa3Kjx$PPsI
z<DG7s&?F)&wp{7^N;o+`o#=u1J}FB@g-Rb}DXmJ1AMcdxg+AL4KqC+VAM@pNF!Q{8
zr9<4P7px*e7S>{EDQPjZm<U~<ij8o=z_^jw628i;g`1fz;)+>BH%O~CE)_}zgz+V^
zvY3g>nKiKMUX{@W)=4#t9a6(p8zIBiATrF$iiwHVMzM+P7BU@FwUFk*b!6Z&GIiB0
F`VAV>A&~$8
index 7c7b9cccae9015070649b51d55f75cef62296ca2..45751f49078715d961b2ff36fbcae307b61e0a38
GIT binary patch
literal 848
zc${TYZHwAK5MCAuA%qY_<PbR)k&wH3;+1|o`ax}KEt)GPTt7%DYckbsV<MZi>d)yv
z?IdzW+Q95&o|$Lfc1KhHb3m7q#c)0!F20EvQYF;s=|Stc)6)1MKzhfWggh5n+Mfvp
zk|%+ZB3)N_XC%@Xk&5F~&OmVmTXeX?JO`;D{s2+JCB#18g7d<q;Hw1AAXmuf{)=Uj
zVFfNvRo3>HCrM=%xy3py%2eRH3JkeigR1)LzV<RovglV3Wjip+-<A)DtHCZ|**-1%
z?f-}5CHw6w9z;^?)FjDPxTnI?9CH<I#tGl&V4l6bVkaV+!*+GO-gdYV`Bm{yo=Waz
zgUcXXO#Mkv-P9jC(0+4iB4wW_`o;>paX5YU>u`)<S1i+n;|?Nagwt^5QLtXTMSua6
z+00cN2?s{+Om93Net$GSa*;sn_!+y<8OCIX)cnG6zSs^SS7V+-C)@x#56PZaKe0e#
zU0M%=!J~8ThP`JgrdK$WdsojDm#U!a3J+Ul=SRd265rG(;4#QBn`P@|xbVDcz^}B+
zOkE>HH&JX99mPPQ1iz+1s9Do!x70ShDYZ#EnoV4SN1s|Xt41_hCuZrRv{h=Iwo7f$
z+xwd)Aylh3Xv-y?TiUh=saXYBD?no4soM^*dPHjxrW38mY1ODh8`wvaU?MDaPyPa?
CCH^`9
index c285197d0fa605f4f87a98db7f732501798b70b7..24158d976b67340b8828f0d943532d7c59f9c11e
GIT binary patch
literal 843
zc${TYZHwAK5MGuLLI@#<$Z?1)B9gm$VvqZF^n=>edT6egaQz^qtjScjjfrg5s=uUv
zx0A@3qYcbX=9zisZFe;Fp8~p^EQa&>aPdvVkSd{0k9T^{otDNA0n$6}B;>is(*8^+
zkUR;L6zRIc+ar<2h*X?z<qQ;8utkSE%yW<m;*Ss|Tte*gEp%VF6nvGy8RQBXoqw@R
zGOWPmsmj_M^CYRvBDYwlMVShGsKAiRHK?k;&TB8DB#V9pQMLoK{B2(x**+~h?Ei=4
zW&Hgs9z;^?)FjDPxS7J!7;_bE#tGl&aP7mP>c~3B_KKZ|Xb#)e+x0fXjmY0@HI%0^
z(`AFpAY4rSNl@L?A3D%~b7>)EpD6my4!m(VefDc`j9^zR(}Lp;B4vitaOP34U%W+t
z0hBq+RT~KhMsKW7TqF>iPr>`|4_!ZF7dFF??2uYtI1U>-A>?Yzb7+SfVCRY1^Xez&
zudhq%ZZNoSott4FkSucdrj{!%RY5fr9*)Y+?}r^EKBv#XV~}As%ht<q;d#|;Uumah
z89E_`h2o$XC?*Oe_%%#IElsDLQakjz)D~^)4si({eQImAMs!*uR_UYks?-K;mfEDP
z+p7j4RIk;k;}X`S*ES)VU4U8v5))6u=@Pp~^fqAz(Tkk6M!U3*eKZIr!cw>7FQcpc
AZU6uP
index 7757782bb6a0b38374acc15312b639b1758803fb..11cf18e7bd98f3375bc7b91380199b217a2e2846
GIT binary patch
literal 866
zc${TY?~B?%5ZzlOgpj5|4mm`QMMS*oRqhVI9sQs-wTeGl6Yh(YvL;h++clBRdg`Ct
z|DuzKrnH3FVc)!Yv-`5W;dJEF#bDl@OuF-LB7#^8eRz6n+_r}K=7#{~?KcY2R3veG
zEHo%CeXT^iD)4$w#1SGzPpg}zpfp4uA(UJ}H05h(79GCk8rH~eK654bQo@nQH5MEH
zVu@lnfvZCyQ0sFki*4gHuP2l6mmek@$c`XZaW<sjbqX-xY6ZGDvX!^i&qB#I&QIO`
z4@q<V#}n>{N^JB%CQEcCt5o`2hcA7}w<%Pouq(#fNA6vAeGyJzz5LtWdY}$@>)D-!
zAIyi-fnWTZ-?U@Aaz)=czSj?ivuPRjA#5_+Y?RqbZ3V+%>`|~`zkyIY&)(cep8Li+
z0+hL|rC${67`?GSaUmhHM*hS14jYRYSO98`W~1q8bDFTTJj0%37YDQ62q&`-EJlUd
z@+V3@vE%3ym@`^8_7{#8MQ#A8?(-B(c;&JpVJ|{1-{0RqlvB->&dR37#ns92WwD*Y
zhxQqG1S&|z$!ZbIJ+Cm~D{WlcMu`x^!f-JR3<tv`<bqTzLhVwC-sah*wLDw&+H}bs
z!R3)U_>mI5BvxKCX*JIVWqEdJqjgm#7u3A0AiqUvnbm03CZuE|PBPqZo5a2+W}P%m
UQgU)hTBj9a&@18)6Z_ia4<Gsi!2kdN
index d1e68a1b325f12bde88de5a64d4239e36f14cd82..750cb518d0aab12b19f562f3db3034040c3968ec
GIT binary patch
literal 847
zc${TYU5na46rH_<5JH*;S!5AeLJ-Mrw_?S&(g(HHx@g*(urE@|nB2NU$3!OMs=u#)
ztdoeQw1hjCIrp6Vl^ITh#}Jm2#b7=kEWWb@Q_1A<{cHW+pO%-O48{1c6`1ENOFJ_r
zQBWRA!P0ewdqb8c3aK>yAkR@qOg>`FslX(l8*EpKP*RB-#cn@Q!RU(PiAbdiw*JL3
z;i?K$9IFJ)5#_wPw$Am2Jd1yYakj;x1-4F$A{DP+fe{sJlvT@SDfKRivRzts-T4p6
z%ly4F9>#)g<%DM|wV5JPA5j@Uk2u}s*a&c6mA6jZhhlsd&vCQ*d%a#Hj-~Xnon;s;
zrokkve$8*_>n~Km8#^42qUo2QhKCrp#o8>DX2+!&O{3Wu(89wOV`)E)7op-gugntw
zuH*XhS>WD<JL?l=924^~eD|a8&RB|WgkqzXt(Km*gUr38ca<jFr`A`h=1!alb2*|p
z8u&tao#TPUl)vqEd!17o9}3*}&Q-m;S}v)Oh0KuZaAbCRM($pySM?cbf+EUh*?Ji*
z#^Y+@Z_v86bd3<*ROTqtmD$P+Las>NBw%S8_@#HCS$Y$04Tn4sb@aeiAJO2Nm}Sg>
zM(K5MOK*ec-_*zz7}s^hZv)iaCNwNUG)v*6z;&lhtS&J;(lUr<mnq>M>O_YdViQB@
GI^+*$82&;4
index 5731111f2fec6e48e8a5b9a67b1fa43bcd3ea3e6..55abfa5da57a91b2713082940b397e37a9ca669e
GIT binary patch
literal 864
zc${TYZHwAK5Z+rPgb-|yLk^K6h=@(E#=A<t^pmF6dT3fqxPFjQ)@15!yC$+(PyMz1
zE1g8n^o3-0nCF>!W-{5))V~kta<UlC=flNU9z&wII=*|MIo)XyeCHs?hpmJx<7v{H
zaRrizKuMmgOT0DWNsLHY(<#Y7F$EhWy2C63sUUt2kzf*HpKYM?z$9lY0Vj|ttZ4s>
zrP9U@Odd<srpJUR!}hcGNTkuvAWFB8x8v(1?_A~$N-$({4XPa3C`wyrp>&rN6ZZZ?
zvO@pv84n`Kw`wBN6>cVH>K;?kqbJxdgN6_Lvb}lAy~%gNqd9C=f3CL`%41P_UfD7T
z7gK){l)vT|9cWKX(pS}B?1j@$ehm&0Z1c65aM(hmOjO$mWrWjkHl|R07%u|Mqqb#t
z)uV*HO<%rs9m93(1Tvi8j?zuu%ywJ@-=6EZ&fkpVB4>H0ATvKOE+97UgWGR|j-T4+
z32f9)_lfzL;c8+lL=lf=pu-arO#ufUG4Z<Jf7APs)iTAT$}@C@ho#cfrLy-D@7PCR
zF~~5TrR!z57>~>E|3cf>rd}aLH_<FK4NXTg2)Q72gHW?lp-$l~Y8T$5P0b=V1dlsf
z#fMaAjhF>z(Cfl$v{iVWw!2p~azQb<OX-!}q>U;el`4XyqFrJK9Z${bkZPZ3Ez;4E
SEL3TOUJ{MgiB1fx?vdXccmT`*
index f71e5b23ded629ca6a8b6b8d0b397626b9dd0080..93e89716f7cae524c832e2b65c343fc33e57d70d
GIT binary patch
literal 842
zc${TYQH$C@5Z+rt2qC0F4mm_*5fOX6iamTg`k*$oUey*8t`Abmn#_4i*F-k!slTg#
zu#?D{awW_T^L;bl%uaSVncoL=IbIBAv%%u0h#}EJAMf6n*PTfbJPJ_$VXGj^M4EJ`
zLWANm&`Koh5^oMg5+hR9v`aG3T*C&5&LGP`X^1~TB)Nik&NtA0;7ah7gcHa$R<vGY
zsbbiHt7EBJA8{$mu=S!nlxg%kh|(?O?Zi6CJC}L=5)8RogDyw5i_+#<DBUH+gx&v;
ztkA!G!GlPNtscvCg`3Hl>WJ&;X(ahBgW4SSWqaq8dz0@(L^If|{#|b~RL7$9ys~8w
zE++GFQ2v@fv~NChMc=uBKME(`<`p<Zu+7)zz+nrKc2I36wH;2vsZYUu@D~B*QRcCZ
zep0Y!^sV!m3kk7(AAI=L_rAh$pQ<=(&r^0*W0;%n6X!d}YsOv(nI7>BEO_R!D&Zg^
zF5mZh{Ys{}(m8EuJUpGAUPl9`WXVoS_K|6|1NJJuV|#_K=?m}}RG3cF^)g)eetFX$
zwAFAdgAmI>^UzE*3(Y3vf>don9mAmQ!h5t<c!$<ak8}tgx75Xt7_>s1g0tyW;Z52o
zyhT~(szNR(CbuZ<u{y1}gcvS@#4s<hgN3K*wTXK}%qD4CNEWKJOD~B@tHdHUR$r69
Dan1Yq
index 65f0a9b09b99b7fac22075b3043b08221faf0118..cdb9089f6b77c0d3211d8831e9fe0eb0e7a282dd
GIT binary patch
literal 836
zc${TYQH$C@5Z+rt2qC0F4mm`QAR_j96?=G3M<3K$>s8ZY!u3H)S(7<$>6(?zdg?Fg
z-|QrE=4c5s!+hV&H@lM^OoIE6F2?izY}TLu<O!sj>%-j}^Qt{5l1C0|wBIPmGA`53
zlxt8-gj(@*RpN~SPZLDSo>obQnrT=g(e7s%C=JOchy_!S1Z)kh2c|e%3OIsHV@LB}
zOe!BIFm)(Z>q90)nKoav2SUcb!&q)0AIDc|KDn&xm0-lw3Uqm7yJ&5kgyc3YPT2Vm
z$qN0O7d(s=-{`TBOWaJ(REJE*PeZ}B8Po#UmE)ab?RCBr9?xLCe7)XAqz*;vX=RHr
znoojpSpJ$nv}ZmuMc=vMXc$et1r^xGu*uivz<vX<c2I3Av>i>N>4<{+Fq(&0M}5z4
z>n8;}pT2cIGcF*p@52wjdfrz!?4(MvRv`V8nvb<|mpb1WUNi9`$n=n9V8JsJRRMb*
zGx5ILy{%-LDV@`nM(1gHd>t2BZNdNOKQe(^c%9t&JB9D)3$O%KB&Tw<h~}eFdB-2L
zdFfaNA(n&Yp_ynFnoY<VsoI1(hCy3J^k}V!4y~IWX%loe)Wwe&v_hPMv*|?<O?p{G
zi~8-03OS=#+@!SY*J;fq#BdQLhIx(?EcB+=BJMRY8>C?&S*X$uJtrou5{uZ_eMSBP
DAlvz`
index 3359ba898ad019aa2c704255017bef156176f19a..58e2b2a3509e2b783288eea6fc20552f61cbe556
GIT binary patch
literal 852
zc${rgQH$C@5Z+rt2qD-Yha4hD5Rsg{ian$+M<3Lt)~n`<3D*ZHWlg5u_SQr;>#4u6
zf2)(onbMYJX4r3LzHfJShZFxUpo{T*Fq;kL-*^m(;_7hwO7FOnV)KK8^!6JGS;o_(
zJLL)_6M>RES(SKm$dee6vZq}p1H}}qG2srf45Whi14M#Jh<&z(_5+igEd?Awrm&;+
zH<n5V6_`Aftc?*9qTIG#xQ8N*o`NXdKrY8uNv>Sh^-C~has{e9vRSk?Pekc9DNfk^
z2gwTln-@HYB;Tm9NS8R7JX0Gn6+Mmw+h$PrVOPpq$J*<BCOn$Kdim#go1r`ut*4PK
zf^a_Z$3gitzi3~7W|F?H1l}l|-1}A7N3hAqX2E^~k+P6&E0h^d!l_50^5D$_tfP+Y
zxav{D&Y@S<N5%!j=3Vgid*A*Hhg~Y;tnH`HiOs><beC9P7+y2BL&(&KW#BF)uqWre
zlOWOk@+S(qSDpWXw+1{jQ4_G|5fg8Ey?512F{yGUL!q-(di+SvPU64%1S|#_rqgt_
z2<M(x-uWwSU0Q}lh+(1GXgZpKW)gBnY9^tUrqNCjZCWp)MH{+Jt_ivuTERs$S|wJI
zGwDSUb$VGugF5a-m7Gy5b}4N;4O*`dqE!$intqN72729YlS+^1P0}<lS+LR;JtsP?
L5rdf6-6g*PaX9{n
index 476d362cfd3806a77b178e1ad53b5c60edb3bf9b..68c3e522900c5ca27bd8642cb48d4fb8f12e4b94
GIT binary patch
literal 836
zc${TYQH$C@5Z)U?2qC0F4mm`QAR_j96?=G3M<3K$>s8ZY!u3H)S(7<$>6(?zdg?Fg
z-|QxG=4c5s!+bN}H@lM^OoICm7UOw;HtWxSvIJAb)Zy-pdDWg2$s<EK+HWLg853z|
z$`ne<LnT?dD)GjErHMvLPOB`2iYi>|Lc5=3C>183Fy>TZ63{ia9;jq=$?*tMr5VkC
zF(G|DfyzUvS|3u*%e48TJ>Vk#9mZmV`8c*p^T}mjuLL71SE$M(+Xc085)#|AIAP~M
zBrEi9UhpuMY@^0pEcIscN_9w8{50frn_(@$T{+%4_Fm^ZVet&t%h&5|MDkEjPb*u5
z(R>n&!}8bsfu8wHCA@RP(J-2P3o5veag(pj!Tknf<!H4nS9UasrXxW2VKfhQANZc%
zR!<UlKD>24Q^ql|@52wjdfrz&?1W6RRv`S7ny-7sE_J?Bea*y+FjGUCp@q+sUp!Kt
zq5siWa*MUs$z7G>p2d{E?{;r1nW9qVOiO9!DRF!_{!Z$5^aW{xG7?j<T14~FsJ!D3
zXkI#&L5SsO^R$`TENwO+XQXNqa0~;kis(VDhz`_Ek6aV&Zot(aF`z=6qGrQI5ly%(
zq6L2YqC(C<H#Y&=ejREqA%?3#VwmT8f~CFbwTRm#W`i^=T`W|g1?R+sDzS*I*&Xs1
D42$`%
index 1459de328524ca3d28276da8f23d2e794a89623b..36bec6f6bd534f9c187ffaf28af400bf23961540
GIT binary patch
literal 850
zc${TYZHwAK5Z+rPgb>moha4iuA|lpa#U6er9Q~lyvmTlj6Yf4pDQhzIwp|n1tZ%=s
zf2@<pnWH7lO!k?1p4pw<!Nhy;>0&(Z&u0DkcM(CXg+AWBG1{$3zW6CXjSd?HX)2Pq
zGZh*Xm%dgaUKMzKAmRv-g3~OLzUCU%m}vFW6qJVOGlY^Wh&;ZA<|9{vFD0Bnu94CB
z7fTew4qP1z)!L9tSu7hb+5?${zx^=TK-NyI;;eH~*DJt)s}<;C%T`XUpM{cbobRyn
zACl(!w=cLKDzVXHnJjTKS*9}NI(!~VzD=R(!M<p3pK5QinTT)(>*ee5)&q6SsppX`
z{9r!u#(r@%e`wFxaYf%b{%9CXzItUigs{oRX2W3vp|(+NE439&g6W8Y^EjIOSVx)5
zTKZYRp3%4VJr@$9_Wf3G6|gzrNp=vir$j}m_27T_(QA4MJ4-VpCi~d_#_`ON8$hau
zJcUY#j(uWUZQ<(G|D6dtE^87FBINRYxBId4D=nv*E1gkIjn37{=^3%T!dLYLcmyg)
zrpam%%txc*#80$wZJQ-ROdHKbGtf*li;xRau?V$GCECuTOKW+wY1MGa4MBHH9sEd%
zmWiF`EP9nkgI?#+q^xySCKnWoTa-3gjaD5(N)CdgWL#ng6TRU!iPI%UozzWC=Bl(o
OFNr}b#3UB7JLE4HGXBW`
index 175768f7d33234e4952f9b4235e6fc0a0825560e..5b1f521fd00e0c3d873830e3b6232e02d1a3901f
GIT binary patch
literal 856
zc${TYZEM>w5LSgTCK%6z5=sa`gb=c<3tj1#QT8G6+$<yUhHcspVGPB-xnhbPWH~Rt
za(`*EL*vn5PRBiW&vUx7rgQIWfLAkrvRqF5A1sDcGI_jzqmPF3D)_}fxQDHPJZD)t
zUN8xQ@<0lfCN<uhvNTpm%^B3mKvD@Cl^9O)9E61UGen#Uh&{T2!6Oxnt~s1QDix#u
z8p{Mx9jG|gsvU=NUWfe`?J3Wq-$9gZp=`&JwCr5h-PK@7MFO(Ea-*X5&O%v{RyQ2~
zhvb$1?F$}6f^FrDXKS^YGShOXjGi4%iyYb>?CbXCsrI_u35%AnS^vA<UMP+g^}MoG
z5c+d(7SzAy55CiPRN!}3;5y;_o7aRx1lw|LCLFd9NmHp6TsFdaxNtF8kFFo6I!tUb
zl+Ob81iv+1XF2)#!F-^MLp*vYWFdg~pa$AOOrA0k=L0VzXKkXG**-PDQ#EvKhmcE$
z=Fp8{T_gzz@`*@M0C^SP8?d9i#o@pr%HQAId~D{D3R&_EsSaCar^iJ0LcOgoKw}VL
zw#brI=(}z`_Y>}SO+!P-FqPTLbY+IJ20|C8)j-(PG(4)jjjt+i;*M^kYov}_Y^e`v
zxQWav*TC({>$qEa1C!xZ6J20cJj8fFI=F2iq*)3?ntrJ|80ysR0kUq8-a|b@B`a0j
P$CpUQEo7jEVvo^Z(<%Xd
index aa2aabb7bfb2b8e1a6504a8e898180a289f5e0e9..e11946f2181b5da4ee3cde8b80c2583eeb1cbf9a
GIT binary patch
literal 1060
zc${TYZEM>w5LSgT#u#Hl2_clCg%Gl?3vDT5tlL<Vrd>*#4cqHJlrdEMnrd?_Pm=TU
zdB1S~XtJ}$*@iiv?(MnfPU?@wmjS-L@K3L=PyH_}hEy@NJXxAY-BD@WGZ4c?CO}HY
z)7}+RAZQXO!O}_P-x<&(smxAw3=~x`)kv*AOJiMB!FErj1fd{4gD9Z_;xU~<=Y|SK
z?-E!!snQtje|=mKjYh??>eGG%>nA+=9z;9?yFBg}3|Mpx)4R<{P|=-D(t=v$J+7P~
z6%$Yu+xqB!J<H=7d?<EMmG6G~n^bE}isxxLUhhATEV&*%`h!TYOkE`WPH(x0)CW{W
z4}*l}5}IR}SLn_vw-t(InX{&M8-)I7d=XUl`O`QvXH?*4ZZI5#qYvX6EF#E?<vOs)
zAW|+bE$L|RJW+Ny3a^G3kb5)q16^QGix!U57au8S4nlB&pJ3vVu6htKC-|vzPFVu+
z-g&Na0mKJA(F|hpnTuH3m%-uJ<Ib3qb!Var`8;(#QayX@g&@^{N|=QYOcJFnBH%~P
zG$FDgN50V+mF3XAKXiL5LIl#{eZ&^bXi`sL!6KSGKR7(JGyPCiO)4r>(V!vo3<P;Y
zl*pmEX`EO^OHc9D+a`0N@Ay5?7(~dg_~bV9hr?>4zi_YX*akwjt7Th@sm0RbAhd;c
z9E4rVz{jQD#@$l8xMLdVCDOk>_VkAgyo+3IzQFikx3y!`4P>J_CXL#54I!)}HpY#{
zW~jLtYBow>2e(UY;=NK^c>h3WZ53HZ7{A`@;I@a5<rSrd+0^tb{Wpy|^4=kHAN4F`
TcqJwL3KL}F7P63|tKXvEl5afC
index 3c086098d2231f1550baac7acc2d0c3f28e753f2..5008a38eb12de288abca1c9e019afcd80ce27c03
GIT binary patch
literal 849
zc${TYZEM>w5LSgT#u(3p5=sa~gb=c<3vI}^vJXk-W+{m`Y}0-SV<`4D6;tdW%X#^E
z`)89K8kY@oI_|l9o;#g2o_UV}UQYedVlnc6vKSJ{<njK4-s{fF;Dv#34_g6Q#?que
zXA%VEffOuRS9oj8l2{=Xr&A>ZNhNGlqC3hm5EA0A5OFFX_UHyWPgF3v;&1|~RE+k&
zSSpC>K*h0AZB8iXRoH&h9`iK%9YpCCigs+B6rHQOVFiX%tU*>In<ce%7E1G^oUs2N
zl9l>{H#~?0+sY|VS86jwraqxEdYy2ZXVCCqU$wVRwKv61ShRr6>iv3Kp*WV*^U9V%
z=+C@qQ2m-ec&P8Fz@O~EorJURUJVWrY>Ty7aM(g5Ev1%oX@;|K?qaZ?Tt85Cm^h>>
zUj^(5{%Ac=#v$%K<T4jPd{8&pK}?=g5ohLOaQAE2@ltY@CW@Hu6YB?6caEJ9GC83c
zTt&sS<O`7^hsOKh-hdtDbq)s>QU3Y%Zcxi46|!I&QXP&=Pp^pVg?d!qfW{!gbe^u4
zq3^oYg`aWz+A=hR3`?1#Ojl+oGZDH#brWGr({Qi!4sMp-!VTR)H%J`=Y^x7xxQ47U
zXX2~U>-f6#1}5FB8oI!$xQlUzG;za5NV64)H2qR_Fx06#9c14ky@gtaN|vg)jW3ao
L>&QT+V)xNs`c(dd
index 252587211f93cd3ae9a820e7eca3692c297d0961..6c0ee6e030acf0bc7dd1528758aba4253043adbe
GIT binary patch
literal 853
zc${TYZHwAK5Z+rt2qC0F4mm_*5fN*zaxZ>6`a!K{J=7Kx?mkE<d&!))bWLQlzWv1h
zt4<<k`a+l;=9zh(*_mvAJbUozVl?kfr@i@i5kahlKHR-C+pTdPya-Uk{aQhqiX`q#
zga*Z>ua$_G1zzuqI6|c0G>fFKxrP-cTD>#{r6KwZq2vmp8DBy3kt@NUB^*Jnk<s`U
zOBBNnTpbG4>VQjGgpD`tzD&ZOeweHwYbTa**14$b7GS{D5_EB8JEzu9Ldho1Z`k<{
zNpt<1H{1`ESnH8Yo^dl-raa&}d>u%>Nue@>UD4h-)?Q{i5#bb8&wsAB9;ic3J*{lv
z2lMf4<QKo@7wwu`uILBX9}a@?*I5bnA*{2tIj~<ts2x<>NNoq>U^1lOJ`U$T)=}oM
zmVQ;RWAwdq&xM4jeZSEg1#AvD$rd8^l&C1RAN=bd-R3M|CuxSnWEVT%IL;h-0i=4s
zQ>aGp!m$_o#I)K#?eFl;f-RS2340N8`SI%dwv=kFbjG$c9-dB)FNy6GKCCamBTzvy
zNtTOXJ{%T9KhZ|bu?#{i2hBq>(JVBZkTX)Y33UvEwsY^%YVI9cF+Flg@VKEae#D?9
z;^aA-UgX}SwcJ~jwJu8JjAC(%(k83Yic5&$B1jDL96MNenqHH*SH!H7x`oMHl{V-(
NF=?4t#71_9{02f&0A~OI
index b2aa80b6dffd2549201b235d8b656de1257b37b7..b2d6ad6ea2f0967ca4ccbe2c7582deff6d2eda92
GIT binary patch
literal 1067
zc${TYZEM>w5LSgT#u#Hl2_b}_g%Gl?Gi?ZCtlL<Vrd>*#4cqHJlrdEMnyPc`Op^2R
zGxpQ=k0v{7+-{ij>E51u?xewZa_-~nGw=BF^4R;vB1j~Y>!Y>a>y8WKmH{8F<{X4z
zY2scm37p2h<Sdz%{>G5TacOqSqc5q1nL=s}SQ4qC61ICR1aJw_34}4_5KZU|I#-l4
zdK1IONu|PQ|LaRRQD~H}%RcP~utA)LKm0JAgIOH+a|SHDgxSsGNl@OMO_Q8j>Ft-!
zfbuEGl5KT-yPf4>4Ibn>D9f8)o|0;9Nu^m*jOYI65e3)YgWnH1o6EB}y-{1vBh?|5
z;oUH%nSlBPmL<Bi$!!IEUF2-(UHgGIo}BsReg4u;^abVkh3$`q!T8gp0;>?_`Eo5-
z%^{R_T3EtT;8`rqU>sbGFd+MC<oT+=oaHSnp)Nj@))F{RIevzTL%Q;g!;;|V)+uE%
zM0=;1%s3Da)I<x2$k&ud!aVm6zxO+nlx#Z_RhTXl>oZleM@|4j4yk}eaK{9Z$|4+o
zW=s(x8*=2HE~qGmcK_0KH-rcz`TK|rSkSluD+x&?$U7o=2F<7DQ6q*G3u*lF;IQxB
z3v;fXvaAS6xy&gTd1ptan<q||TwV1?pb_vOy-26mfj1hJi~Wt=u4QTnnYNN$CAtzr
ziG|P(YFG%{hK64kdKY&KZR3uvp|?o=2G~&_(r^>m%6x<IL9^A+sv0s;6_Z+Jw}KE>
z5fkHD?Qy97I8?6{z!q*7TE}~ZHt_y|%G$}ZdKkaj>)^J7km2N|nqF7*4E5KwDsny`
YeIL07(wu@4?qh;<+(HJjRP}rG2brTkj{pDw
index 570a179c0a9d3a2750bfa8e1a0fe408425bd80f9..a765a399ab50745abbef3c955a814b63c83c1d07
GIT binary patch
literal 851
zc${TYZHwAK5Z+rPgb-|yLk^K+5fN*za(CEIM?a{|Sr4@(33nf)l)Yr?EnTy+S>JwO
z|5wMznZ6Kahk0h6XLcq#7|$L;Iv)l7>9ikw6A7e7nEl-wtJ5Cm!4Co2->o!cnNVqW
zA`ECQL!(8yDDcKWqzNJgr&T0F!woDk(e7s%XamV7h$YvM%=i*ok6a7>Ea3=pgN)|C
zn9>Y8aJ?^7>q9PO5jJ172U5j9!&t50&`vDUL+7HdSAY@M3oyl%ot)Y@38{6O->~~1
zlI8lhuXq@1u`(m6o^dmWOm)aj{4$h$ok48|+oHXDti3wyM8s2AKL5GiMx^&S^|Z2i
z7zN|mC@g->FWR#<T+?^u&>u$QFS82lVptv4=E80Tv2jstEsYb6qlr(U{OAWE)=}oM
zwt3O8W%R9k&xM4fbH6rg4J-hhWCIC%QaZ_;hw$cmuQgNbB+ZbhwyFD-<IIT{L1u<L
z0~<D6Rwe92%;o#*n-7)DaBU9hTDBE93H!*5UPJw_=*~7+;Td&&M{KL{S$zhcfR5Be
zE#^_+`^Cslw0Y^;B|>Z$%|o-$Y&3_EGg5U3bxS4M%DqSHxp!&J@<^NDaZAhikrJ&C
zH_tirBKH=(%)L!n`=Ub5C>A#<y<&A*D-%*GBS=ctId-t|w7eE6UlXfA8a5_#RobEF
N#G+MV69?H{@*CMX|EvH2
index 22093c0d9288d84bca89aa67c582387d3e6e2d14..1ab40b31f2f05d91d7769488b02c43adbff598a2
GIT binary patch
literal 1060
zc${TY|7+7g6u%uIgb+d~qm(knSxTvMmN~`{r{damvtz5$#QDPzxg~GiX`0l#OTYZ=
zU+912OX`}cgqL^k+vk1WyXy{ymp;9{7@b~UpN_tW2of#y@?>cqwg-iAFF^JeQwd6m
zH0fLk4U)&cmLeIK{+%9=<I-%EM_+Rd6GUosMG|3A3EMtZ3Z#bU48oX8h=zOuts5={
zzl&kz<Qg%W|N2tN5RJ=a*{Ask){WEfyC0@gu#4k<&On6MFuB{Dgyh}DILWD%-lNhP
za5)BDvaJs8*RwpXVFdXO%JSV$f0JsgNu^m*jMw?kqYAEvkA6RtVyZ9V^bWV2N2)!p
z!-rnXGX?b_%u94<mD>p9vdCG}yY++7V0ht|_xaN}GiO}VXRhDx1%nU63M@jH=F4?p
zF@;dOX<;b`!LwM~!63NmQy}h5f8=9<J;_@*3NJp?&K#snC4EAf$J+Wq!kp2k&N&w`
zM0@9%&LprA;6yWs*ymJ6%D(hpd_8InQ?~BRurQq`&PR^3M_vF*_qc*t@E{b^XfX*t
zGJ%BHiX8jKXIvFScmB}rtOzkk^7j$d@O>!7-Y_jQsBao47R-2DjbR}|9zQ>LacocV
z4eN^1T<W~HmACYCx_aAeF7b}v1CKxk=~X(u4MzQbxzS&=({^lw5ZguBMln$=6o-&4
zvf~iyS_XYt=xy3Av`bs2L0%L5b*YCRG3YLF(R@Ye!ER&6s2ap3Rmy6W?Fu0jBQ~YA
z+GeP}8LHO`V23sfZPL9$TXg>bv$pcAV@i+qTD0jAVtIL~Vb+nJg@4ni67L-`_esYh
UhF4Ichm;YMHi$(WtbR*=16iazpa1{>
index 2eda18c4b9ef566597491e2ea396f77ec16e1f9e..b4867a7062d5d2cfc8f70e5bd116d757acdae03f
GIT binary patch
literal 843
zc${TYZEM>w5LSgT#u(3p5K0I|gb=c<3vCJPL)nKUOS6>38?k9WgfSHRnu;k_kmbDm
zu>HTu4voi#xjXB*d!Ca{8czMk052zt!F)bg{9rL8imBuMJG0xF7K;}Ka(viINK+<~
z-i#@blm|+(WL@ITAxmP7l$>^%3=~zc(TUC=O+hM%zd*#PgxIGWXg^WO=!(M$q)Ibd
z|6)QC-GRzusoEG(&dX)%O?${i^ec$O7V>s%o#dU%x_$|URIWjlTeb^o^DHE?q}XBa
zKO`;m@80krl5DFcT&(nD@=R?+RrEUIG)tlG!@g|qoNBN0nXqUMo7LarZHDq#P|qV<
z2H|4rPlEDle&fEmqY{5`gYhVwe)B7Eh+vzK&4I%fBIRhcj4L~whO;pS_i4NcbR8xh
z>8Mu;dxGCP50r6;yAPSlB#;H@lk6ZS&qBtj{TST-?6-YE&eB8^#XfPqQ+?*x3n5h_
znnEQO<TFt+gX;P3-hv(FH4X<BQU3Af_ERNQRH~d~DeXKZPVa~8rG8FdfyN+1F%#=$
zxEPPiqdw!-m17wQS&lYOo2kvxW+QZgYBs`-Vc>2NJ=`dwgX^Y;u90?k*wr60a0NL<
z&c>HTH1SmtElfI>6?B1haR=izY2dnxkl|_&8D>>?u(UV5Hga!}*+flCCks{F!c}DA
L8nTeB**)|JXyN=2
index 86ad5737a7c4573b9966b62050f1651f9f26f0c1..dd1e7689b224eeb2ae543817a770ff08fc7ad3da
GIT binary patch
literal 853
zc${TYZENB{5Z*2!gb=(SMT&?lBI0>HX^S5Y%6(AJdKS$cCbS>qIJU{uE?pDZY<&5N
z_pfe@)Z7cp>@d&F^UUt-4kq5cPZ#5Pe>UsSe~1WTE%g5Oo!Mzm^59v38tv8!(o`gI
zcPca}E`6;;ye#m>K*SLu1*cUcea$tjFwyR(DJTum7YHR+5P5tBtp~0If0A$nxkg6w
zUo24!J8-oxRBJ;nWf3;tv<ET?U;Qvy!=as6#)r;DU9SKGu9l#SBilK(aS}?hI6q<c
zKP1idZ{Bb}RAQ~iGI_$u95R(5*Wt@h@+^g_2iu~(bF95Q%tVAUSUvqY-bSGIIrTKM
zg&)i(-q<gm<`?am8?NYwl0O;-lW$%bb|I_}V{>4)hEO}GmPu^~lVCccP<j~6eXOI*
zWo`YUV9V%x=Z*^rQRgnxnF2NkyvYV4_L!(BweS7wpS_lsu#+@HVzP~$?;P(OxdEhl
z$WyRj!)5ImpGL|(`^>b;p#FDwTamC6A(tPou0NGi&6Pf|EsdM2ljBcfTZJF%EAR+Z
zkW7>1BAAax#ibu<v+h_1A(n&YqM2wGnoY<Vsn~=%hCw^IcWEv64y~Flxg@yV&=M|U
z&@yrIoJ}usZ_;}1Ey~&#WpYNbxJhZ7)o8Uuh*3h280I;4uy8ls7Aaj3vq2gbCUaHV
PqUXe<6=D$^*<JD*S(gBS
index 2508e399a3421f6c1d1e0cf3c8a37d0d5c74a757..d0cc0da1eb856437546737501b9a410285073d0f
GIT binary patch
literal 849
zc${TYZEM>w5LSgT#u(3p5<&<?gb=c<3vJ1lQT8Fp+$<&WhHcspVGPB-rDBR5WH~QC
zZ~ttvL*uexPRBiW&vUx7#xw6Rz{{yWS}aEX4;DirnLOUV)BC+y8T?`(+{0Etma#M$
z%$Wp1c_0N#))n3!vm{nX#pzbbKvD@CmFSJK41|RE3q+g>h&{T2?h_S^t~i`PDix#i
zFO~|TI#6+}R9h3uc@=hEwZ}Y-eg{#yg`yo>Cq?I~ZdidK6>E^ymCcgcJ`1IJQr>Xz
zACi^&cdvL53AU9}p03npicEb%W%M%PG|!;v!M<v5oocU(ov>&Do7LO(wnK3&sppj~
zgV3LO)1dk_fACP>QGq|$fjbFj-@F<eBG?vdv*56WNLorQ=h6&k;oQYwKe>LO>M(Ig
zPreA)6a3zKpo~M@f5>GnfcT&$*+ER6QxRw8V{rR(*!5C!mL`gr?i1@fRWrv<2$`JF
z3=G&&UgvON5#=9mZa>vBNrf!ZhEzwRq>;}=iX576gL_A&r&mPwLOrUlKw}VLI#1Wj
z(0AQx;Ah;qvJ4F&!&2rb)0G*@OoT2_-9*^ZG~6w{gIlGya8q|s52@o0+v-Cat|6<;
znYdAU9bc8+z@*oxp$n{vI~Wg03pZ_qG+Tj4(=SyAL!G+QMfMHS+o)}*WT}d;@g>r6
L9T~_}>^}MnWS9Qz
index 2c09773e452acb616f57376d00c980f8f8e85fc7..75ff40b7013e9cdb71e3650f20aec43e5347acdd
GIT binary patch
literal 849
zc${TYZHwAK5Z+rt2qC0F4mm`QMMSK<iWR>d{h&5yJv1#Q+<lNz)@14}U9+-T-+o^I
zSvQe0M@yI;=9zh(*_rHU8a#%0Iav(n^WowLOCVKDo$lY6o%XZ{eld{#aVsIqm`J-b
zra)32D#_Ayi8n?pO*B$+T4gd+RKZ3k+QTdZsUZ0RF{cuefNr4mL?xpu4rh=m&1n9M
z2}yJZDo>?qeM~to!{)2@h>Q4l7>h0B?btfaJC}8X5{#%^gDS6V7u3c@NbJ($hTZ>=
ztkCbj;$bY=R!z8A>CNPs>X@qdWz6X=gIWNGvb}Szy~}sP;yG+qZ`a$1<f))uR<;bI
z#Wa|N<*)gJ2j-qi{J{<VaWwrFRNxrHHeZ_q$1TLl(P}%c>}VRzd<^cBzX)|5CLU?4
z7YPS~-#ZVKaY#B3JGGNQ7N95DLqeW~Ofvg1{Pc6s3Iw@G6HOF{)cH>J%!wC4rp7db
zn^>foBA<zpJE*-4?k(6;UgdCPG36h7{az(gRH~e5DSdcKoL><+Nd2h30!=_hVkXwh
zXyN<iz|XjO>sSUtmZQznW@@vv*$7>ss*SK?7`Rh-57!It;F{^7JEV_3cJ+r0TtQBe
zv++&gO?+E;3zPOu1zllX+{U;?>bT}2WVjkchIy?!So$=*7IJ&YY@mjvlZ7g7;%j8$
LDzcER*<JJ(LuUTU
index 156c9a1f46f62e7d7b988cf06cd271ec4e86a7f1..c5889b34b4188565acfae643afb6c8c943974f16
GIT binary patch
literal 1062
zc${TY|7+7g6u%uIgb+d~qm)v{SxTvMmaPmCr()Y>v$9r6;{0KV+>*EMW}4KyOTYXD
z{(b&OUQ*XoCA_?Q-#+j2-rZm{`QYQ5ORqm3_r0$yf<!X8K3nU(&Zsc%7;twr=O6@2
zlkOFhz-jDD&XQ^AZwzT1mu9;>`jSeRDWv9rC6OvBVLN>xfJ=zZA&e=9XhLVuzNVbf
z+ZZ-ZDiucSUth|JLZf_L_GvwW4dOKX?uY3d%;I>IGhpEuX1BYOpu9VqCONgzds;dJ
z%BLVpw$;(yc9zFAc#!X)EI;`CH>u{9RGKBlc-{XzqTt$l^!p)ab9ou3w`$9Iq&lQB
zydTCi6HuSPvP8Ewxy^vDi<~XJ8$a+ylS{w6&!5`4zMvdGvwe3Mj6O~(unJ+GFV}+A
z971WQg(WNnp2gA(M!}Vf0om8C=c@v9mbb8ky7*99OW-`^_z5Ns>BxHyOM;(T?r_}y
zc4A#n7DIG+k;#k$@jwl>fQWoac_iAClx$lQRhcdm>l0POM@|4j4yk}eaL)vh$|4+o
zWK1z48+PP@E~qG`?*8H1-7q4M<PRjOLXyqM8zOlIwVm^s0Sg*8Vpy?|#?Oy?C*22O
z&ebcH6(K2?d2=K0>Bw~Ry2+BOTYe8T0v@DS>GUS>T({imFWl`|riPGdE7@0~D>0N<
z2<@SUg|KaC_+_E@ajVca?&unNjnr>|9rYm%A0S(quP{D7Xg0K}hD=n&q*mFlAcR%K
z#JE=54b^u;^;!XJ;dY^Qd{}4$A04Z#y*%p$#;1pE+;R{yoV--i>x!PC{<>C0&O4+Z
Xp{{{6r=Wy;m>?ZDk%25#{TBTO5Qsf8
index 8d4c4e9bce6d7180099748ad417ad491150ee1db..89b53511b33d79a2f27038502b39914a5559e845
GIT binary patch
literal 849
zc${TYZEM>w5LSgT#u(3p5K0I|gb=c<3tiT4WgimH%`y^i*rxpu#!&5Bs!g$jEa&Ct
z?Vn9{XgoH|-C57w^PF_jbnbr+@oE-Kmdi=-jU|vuCXaWo^x<G$Eq*W%-eD^s&smm^
z7EFSmJd}c^>l*J)S(+%M=Je}iD5->vN(?4>4njim5n@gSBtG3h|A7idpE#UADix#m
zFO~_SI#6+}RXZ-_yk7QRw5L3ae}!?jg|Z!6r)B55?zRRaD%K$DEt?g!dlt%ywA$h5
zKP0d8$1ivo3$~Rro;|6_l$n-GW&G@NTIA67VPChmPPNzNOjx{x&C}oG?MC8QQO_e=
zg;6l~XJLIczwxcUqXNINL(h%oU;G9fV%U~rv*56WSXxT0;L?od(Za)EKX^f?>M(K0
zKt2oD6a3op+~wr^JL{e@4$1Jokc9vefI83)67radB=7qfIcpQe%=W4Em8wH0P6WAh
zX$}VLDDQAMu$c0<H{<uCpLrvfRLHWzkjgnSJ3W`C6i4!bNKrtm{=Fl6p&r#Ipb3a5
zTV(516nI{J;78oMvJ4F&!&2rb)0G*@OoT2_%S71HG~BPEgD<OS;g0U00a9*^ZS^4y
zH;`53Ox&)bj<2d{U^2LDpbM;udl=u44sP2BX|@89rZ-gwLwVilBl{ZZUDP#HvQot(
P+(bHVAp@C;Jw$&1`8WQJ
index 86a003c05b92a8b9a0c61f71fd52f5445069f5eb..ad01b1afe84afad0d6e9194938a18b589ebb6b05
GIT binary patch
literal 830
zc${TYQH$C@5Z+rt2qC0FL=KT7h={#jkE{50Pij-^Rnua^^+8Hmlc~4dnw8CZ>Tl_v
z?Id!hw1nBoe&5VDv$H#zh7S>4P8P%Ye7N|*Q^+*e$NM+tb#Gd3esNI2VXGj|xy){7
zT!UgF(u!y63U7~imLgK+bSpB_Ov46=-Z0NWX-GdpBA9|SWE<!{GR4_SzzJj;Gdllb
zQu$bcsbi(u8Z#lPZRb^cBxLd&C2|WzIlj({%2nK;0%NAupsSYcGPQjclDn+z@b*6>
zFZKJcc$6r<)e|9CIGKWJjG0cJ#)9o~Xoj$_$~&jnn_?zBnZsuF_juc}I+m&Dku9Tm
zF%2hCbv3`~z<gnfzH_5s98bT7H8>=&Eym`+VGD_NP;Do)9Z%y~K*4<s77@l#-}8I=
zNx|NyZ=Fw!3rOvU=)=!}_XUo7snWa~O8>0pW31d~&Nqg~OuZO#J!Uyr@WMnxz=0=B
zyua%YYPn`g7qq2u@w7a>jv999uN1K7`uXqP-z$7UpMj;IVmXuRWxNQ2>U7^}=gP4R
zLM#W(Lo?AVG@FnM(y$4241;z{@6l%I9ojNI(j&O^sf!;mXpJ}}XVc5loAj#m7WI3V
zHF7~QxI^ik-=a;I5W_`~7-k(SSh$*Am$)~?Y?HQyWT{GTX`Ps~K`dfp_BHtfNOkw*
index f19ac2e943408503a54eeeb8646e353c859e9ab8..ab8ae8193977b89235e2912f5c964ff8f8c1c16a
GIT binary patch
literal 826
zc${TYQH$C@5Z+rt2qC0F4mm`QAR_j9m8;mNds3TPubLJUt`AbmUNYw`U9+-TPyHSJ
z!=1#QDJ@}U*zcS9W_GfpX?PdW<zz9O&xeceJcUeieYkyPUUjGC;gN$1_8SFx&Sln{
zaSe)zNGqPLD!et~S&B$i)2YZvGYxAby2CsNr6K(QiC_xSkgcI}&lG150*)ZlSke9$
zlgh^qOdTrK=9mdl9osM3BO#NYQ6e``wBxI+=v?IuDlleh1-cs9E=yY{A-T=U348w`
zd8yxj!J|a+jh+bkfSW0p`k3kDX)M?_heimys=af}y)JgblR2y({$6h@R)@0mw6bLs
zFQ(xns(#HcIxwG^qHo+N7{}8uVGZ^PY>Krxu-`zU9aP&2ZO7Ai7Eo~SgGGdS)c5?Z
zep0aW>1*dB;{sCqE_(N4;C+U}PO3ETgwj8$`Iswrne&z5HB&E!T#s1}7CbXi7qI6E
z6K`+&?`yecN*A=H(Ro@PUx$lR`j1k1f8wpbQ}}v50ZT!}awb>Hco78E&A!q0rDGX{
zSPq(pW};bWHX&!EZWHPl2JMv5qm42;v}t;zOVIVHiytv)jW{J|(~B~i^s<Z=^}81}
yaz-(^P3eu_qz#u4!$pu7<~eq-(3@U|xYxvNk(PyIsY-kFoS3vuEMjBz75NQxN%mO)
index 4bafbdaa4663d79357c4e1b4a7eee4be769d630b..5c3491bd7e1a13c464848304eb4318c1dde18c29
GIT binary patch
literal 826
zc${TYQH$C@5Z+rt2qC0F4mm`QAR_j9m8(c!?n!NGy{auHTpy&Ay=2Z?x@KjwUi5eL
z4|fuKrnH2aVZU$Yo7u^Zri;6ft|rUjd_G)$=Lw{m>%;9U^Qt>7504yFu-_`kGA`5J
zjB8L#gj(@*UE!?}PZLC{nodQAnrYY|(H&+PC=JO6hy_!SEZ7D*_e^p2Am9ixjTP;G
zF{ym)z|^5qZH}1`)v^7eJrXkh8OCx8MLWJui_TTvpaLVN)}X7A?Xt9W5|X>LoUr#F
zl9l@X7d(s=-|C5w54f3vsgIeCpT>giGH5Iyui87u-0NZ|Jf6em;qUdfB6TQBPb*u6
z(Q>+&gw?P4MF-|HQ}m4+2IFY@Wl@8D4BKLD4(zuOYX{YKLfg?angtZx`(PPj9`!xH
ztDh9)K7H+cWL!XE--Yjf47|^9$fZiM&O-VpH6L?jo;qI{UNi9`$n=<HV8JsJbpd-G
zGx7GO|Gt)KrgTAD8l9)*@pZU3rJq9X{fW1JuJHAI0+xV^<V>zt(J~0Cn|-70OUE(@
zu^coH%|x@%Y(maR-6qsA4B9E9M;m2yXw&pam!RuY7e8Xq8gWX_rWa*2>17!$>US?{
y<cwl+o6;M<NgFO9hKnFE%yaBup*Ot_aj%KlA}tHaQkC}TIWcLSSj5KaEAkt9KK5V$
index e27fceaed87759dd8d6f59688ed3c222d6f4934f..380998c9c7a4452761c2d2c3ac72886833064191
GIT binary patch
literal 826
zc${TYQH$C@5Z+rt2qC0F4mm`QAR_j9m8%GSxF@x#^{Qzx;rbw@>?L#F(lsla_0-?d
zKio;|nbHzwhW);oZ)PVunud1~T}~Fm`Fyze&Qr)V*N59z=2drE9v(TUV82n2=UisJ
z8P}kgh_vF_s=`|%o~4LXHJyr#G}Ev~qC3oUP#V$?kO-zA4cQtx_e^p2Am9ixjTP;G
zF{ym)z|^5qZH}1`)v^7eJrXkc86|Q9MLWLAiq2KupaNs2R-mhq?Xt9W5|Z1joUr#F
zl9&4Z7d%Q7-{^^u54f3vsgIdXp2mW0b7+LHtJ*uq-0NZ|JekA#;qUdfVs$7>Pb*tS
z@nRZIqUzWDq671pDf-5Zf^j_k64qd!z@}K61N#jm+CjCg&~`kHX8{HGK3GJUM}5!l
z>L&#|pT2fJGA<ys@1l1<2Hs~l?4(NbPAL78nvc11mpNY<UNiM#$n}`zV8JsJbpd;x
zF!A=L|Gt)MrgTAD8l9)*@pZU3rH|(QiMRev;p_PXECm(InOrU7MG#as`$pTBj%5&H
zIcOf5iDseMgq)GOO{ilSv{OcpHp=MGrs<I`LD#1)e#D?P;*^|CFUn}r%Q9Nj?_Si%
x8O7u_r8j<)He5ms7eQi}=h(qQZ+ac#UK6uLS{9O}D(%s8V$wRXh>g`(<TrVz_Fn)1
index b16f1ecd96676cd2a8bfae20e629c37a45208f4f..78c3db0e3c0dddb7aa5e37ccfbfcc3deea670d84
GIT binary patch
literal 846
zc${TYQH$C@5Z+rt2qC0F4mm`Q5Jc?tDp&ELaP&cKYQ1V&Ot?NsDSOG(Te@atv!43f
z`sX@E&XgWuX4vnW`DS*q!%1`()5Ul`n9T<BA3TFxbG^TPWnOhA<>40x74Fswih|3$
zJLMV_6R}o2UsiZ9<avfjRnxA>SThYPBsznl0Hq=O2&rHSvWTsqea{qU4+4%L(^%2^
zACt<*4ovMU)#iu^Q5{>)+Cw4J-*GC}aA?Pu`Jr=_*RQ~YsU_%YWV<X4PC{~%mlJkh
zAVsO)d&c8b@wFZc`GA`_F!d4B>ElSSO#zJvwpDxQn0tNL2~TIRdiZy}L8A6$>1kz)
zIGInPaa{eHKeTT?F-70FaX3mQU!xlAQdl3>=D=<Zsdi9pBeb1Nl4(f6y$|Ox=274C
zJNi+<)~BzXPmBx5?7R5g&%XBs_FJj4q8&;9q~>F;+~&?VhS$uz1PVQ31z7OJL|wp+
zr%b%P>AkNNnkjvtEsf68^7uLeoYGGvPMvSygH{`8y+CgLt-=@e8CV7?kyE)`B=az=
zZu_0KE*;At#B$I)G!xB2vk5sPb(>JfFlf7s9&MD-p-s~x9fGb$UHphaYs4uzn_iUB
zq?cv1sNcD$ku!?PElO|vCT+Nc7%qauFwe1rh2Heq#JwhFKmrTNQk8b;IWcLSSj5Ka
GEAkhR5&q%;
index 3ed059601816adcc54706e2367bed94ef720e6c1..5952d3b82dd3bf7d4c8ddcf1503261fd3d56742b
GIT binary patch
literal 850
zc${rgQH$C@5Z+rt2qD-Yha4hD5DDq^Dp&F4IQpPAwO%zXCR`t+lr@?2mabXZtf&6I
z{;_UW&Xl%<nPI<g=9}5c4kyulj2GkiU^W}fztaqIN#)`0m3b9R^x=_$2=^NSML~Jq
zol*&cuviM3uPVGfq<N;0s>ZL#SP}_qMFfMQ03jj!04XB^vWTp~e;|UAC4(bKq^jur
zjd9_r4n!O()z*kGRvkMp+C#?EpK;1JP`0D1yzE@%^(!zTVg<4q+191)lMvtLdcy8M
zNTKz6FL;~^x{+hXmufR5(-;w%K8+aJ7SN1fSG9MJx!2`RXgY)S^3V0Q6LHX`r<E<@
zWIl<;arJ9{;lBAy1b$PC!%;H%64ha!!lqoC1N#l6(ot$#ChcUBOhXK{hj1RNJnXq%
zAfE*6Jp9`ENGOBMzK`Gi=)0fcu;U^t{D^xeHBaU8UG97(>YACGKp{t@01KW8YcSZ;
zl(4rqz1w;riI632N#$J0kFUd5Q+kivJk?_FJt?*j{0F=9c0#?XPe3vd37_)SBAJI_
zb>nZibLm(HLYAY<Rc0!)l-UTKp@xmHV;I=i(Zx+29o#Zq6d>h#xTZd2;5u?NXX6VU
zO?;`Ng}vaSj?S=3?qGc5wQ#eBkWo`0GR$+;!BXCIeN?+fW*fCFMQT;t#plSx4P+r(
HRbQdsuQ>m8
index f663fe4f25eba255ca7a1c2e56f1694dc593cfb2..e3166cae1896e7cb48dc9f875aa6ecc014f442d9
GIT binary patch
literal 846
zc${TYQH$C@5Z+rt2qC0F4mm`Q5Jc?tD)#Ez(Fe8GdeyX;aD9+c_L8Z$bj`|UJ@vQs
z&vg<xQ+kA%VZU$Yo7u?@r{P^hmy^X{J|8T8@Dwu5_2KrFdDWSghhH4jc)wAQ=Uisp
z8P}kgh_vF_s=|XI&r(FHns!A-nrT=g(HZ19C=KaHNCZ=mhHMS(d!{&h5O4&U#){Ve
zm{dM?VCqn*Hb+c|>ezbL9txTKjuN?nq8(plMdvE7Ux6`GE6~-*c3B#ngyc3WC+xmJ
z@>2ii8IKahH+mxE18$~Z>LaF;$B|&$92z0)s`kz?_qx~#Pv)?G_;<ZQtPW-AX=TeO
zUQEMDRQ;Miv~NB!Mc=s5coa{+hBeqHuqoE&z<vXXc2I3Av>i|5*_eWRKVC$bM}5!l
z=tl)RpT2fJF)kpr@1l1<``#Bg?4(Nbb}0Rmnvc11mpR`UUNiM#$n}WjV8Ig;bpd;x
zF!8qczE{gNQ@Wrnjn32Z_&Nfd(pR9jD)T@1T5X~A0=e~f3SZP`U@53r&g5ztFUI5Q
zw%=*%(y<IeEC<a)Gtn$Gn~*b7w+VF&gSN})(MA~^+B7}VA?R+Xiytv)jW{J|(~B~i
z^s<Z=^*a|eaz-(^MQP7((uPZj;UY*3^Bg-^=uNLp+-qV6B(RVyRcV)=6O-17MQp6T
GB7Xs+c>U1;
index 84cd1d002f561de05edb7f4c1dcad545a2b9f0c8..441fc73f3f898adb3a8edca7b1c7a5f23ed3658e
GIT binary patch
literal 832
zc${TYQES^U5LSgT#u(3p5K0Kegb=c>3vHLTJ|&r#rAxdKo9-cuq1x9}OtFHjG|8{o
zU)|ZE@z^k@v%c@{yVFUdX?P#e<zz9O&xea2JcUeieYksLUiPNt=81y}_8SFx&Slo0
zaSe)zNGqPLD!e`7S&B%N)2+xzGYxAbdc!;ir6K(YiC_xSkgcKnz!YbX0*)Zln9=zc
zlgh^mOdTrK)|d%VZ9A{pBO#MtQ6e``l;f+cs9ePjDlleh1-fe4E>qhlA-T=U4*UNh
zd8vQ<ibsj!8$A*75hqhHjWN^7^H{KL4$TmDRe9$adsWPYCv#Xo{ypAytPW-BX=KYN
zUQEMDR9($)Ixt_DqVL=&7{}AEVGZ^PY>Kftu-`zU9aP&2ZO7Ai7Eo{>f<=UJ)c5?J
zepaya>09R$;{sCqKDzli@V>xdCsmqvL+PK?e2kU5%=yOfn5h>-uE#6~3tpIL2-x$4
ziTBqZZfdz^N*A=Haq+Y~zK%L}=_}A%l{Kp0JAbF}4Sfcdf{Nu#u9op42&(gar=1JO
zG6=C8G!M;0v(Rip&Pc;1)G-X&ExkvZrFUq{^hl53a!XzOh(T+_DLI>-m)@iorMIZx
zJFk&5ioqR9ul*Knx`Y@mg2XWESi!>8^t!~oB4(SkEhI}-+NX75(gv}JjoFvv4;Uo*
AAOHXW
index 0b8d3e55a8147c3d1bb8c3c93017c7584ec1e41d..c5a29c01c43e33e4656ddbdab10f4b861c7980f9
GIT binary patch
literal 838
zc${TYZHwAK5Z+rt2qC0F4mm`QAR_j9m8<pJ(GO}<>s8ZY!u5lcvX@M~rE69;>#4t~
zf3lOvnZ6Kahk0h6XLcq#nud1~T}~Fm`Fyze##6{N*N58|=2drE20u8cV82n2=UisJ
z8P}kgh_vF_s=`|%o~4LXoKBUDG}ExgM0c3ypfsfKArVYL8nQKX?wR83LBJ7Y8X4_>
zF{ym)z|^5qZH}1`RoH&k9toNJj1swlq8(plMdzw+P=PU1E6~-I?ULF$3CV3%-mv!{
zl9&4ZXFN(2-{^^u54f2kQy(*(JdOq1=FkXXSG9MJwb#W?cru6e!=LMI#p+N}Pb*tS
z@nRZIqUzWDq671ZDf-Hdf^j_k9M)i;z@}K61N#jm+CjCg&~`kHX8{HGK3GIpM}5!l
z>PH1TpT2ZHFfJgq@1i%~2i_+*?4(NbPAL78nvb<|mpNY;j+uHf<a*3-o)iRV@Zb4b
zZK3&BbZfyA6LkT5o-pzH=54>0Yo>I;wKN`{mdB^#?-ahIkHAt;v7E`(GF}8hHRV^@
zzH}^u5X(XH&`dN7%_iiG)NMi?!=P8C_h_T^4sDtqxh8n@sf!;mXpJ~!&ZZZoH|b^R
zE$VkKYUGS!ahKAL-=qzf5W_`~80I;4u<$g!4smaY*&;0qlcg$c({p0dI<bh2>>l|I
Dl8^d_
index 87005b265f827d2ce22d0f80ecfe560f929c0c8a..71f7155356ee277a65efd7aebe7dd9e2c3e4ad98
GIT binary patch
literal 830
zc${TYQH$C@5Z+rt2qD-YB8SKkM8saNa=r8I=!4qSdeyX;aD9+c)@06GZq3SOJ@vQr
z&vp_yQ(D5zWWSm3o88$RPJ;W8F2?i0Y&Mwx<O!sj>%-j}^RhcB7LOd1zuzdxGA`5J
zlxt8-gj(@*RpPB7PZLB+PNz(UnrT>LqC3bkP#Tg?5DTUt3D_Ds4@_~k6mSHYMn?Nz
zOezmMFm)(Zn<FMfxop2`4~2}M!&q)0Z^u_@-np#nmte%y3Us+;yP&pCLUNlHJM8_3
zWQG3CD;~y*Z}eEmB~B*K)JIImPb0y$88iaemF=Bl?NvS#9?xLC{Cm8uNF565X=IBq
znoojpSYFL<+BaXAqVFo9KZ+*bf-3A|*yLk#V84M_JE*o5+KwjC)TdB+@aG}cQP1_d
z`bojgqi>zhj0;HY`|!iBzWWspJE@Ya6G-o*=3%YerOtPT$4uM^GCg7$Sn$F`l|OnP
zJ*~D-JN@0&1?+ju#QW>p+iIqn(mBV{=v*z2PsZCRd_iA;C7>cXm8(TG_x<v8KWO{H
zu?#{i2hBw@(JVBZkTX)Z33UvEUKY`%jUqa<X}aW!pu3?J{D?uT#3^z%Jujk3FN$bU
zuX|o4XB3Ouly<!)ZBz&`DhLw8tYHTWz3FyH<(il+(y}mFsL~Ft5tG)5MQmjE$RB@V
B_aFcO
index 0e189a13497cf529bc563dbdfeaa4c19493f9ad9..a0444badb867ab3c6a9997275e3917c0b716cbef
GIT binary patch
literal 821
zc${TYQH$C@5Z+rt2qC0F4mm`QAR_j9mFv~F(g(Gv^{Qzx;rbw@tjScDu36cvr~ZWg
z>rNtPO3N}c?Dx%lvpc)PN%#=a#dtoL%?9)DJcUeieSG)Ayy;HL%})+0IBXT<IhR>)
z$~7n^BCU9~s_@p3XDK38O{XFw%`|L~=nnE6l!o*JB!VeOL$-m=BU79$1)M;pv7-Gi
zCY6sJm^xOf%@Gr#+P0syhe9U5qC{??XvbGs(Yea&S76N43Uqa3yDV*;h2$<PPuTkp
z$xHqFXFN(2-|DfDOPox>)JIGw>yco)92z0)tM<+*_qLb`PiC-L{ypAStd3>rd1Q+y
zo=?JYR6WgadT%~4MPIp5Fp4K%!WtYB*cM}R;IM^6JE*o3+KwmjG@#%<2J;B>>Uzy{
z|Glr(4yf<>UA<PY_vuULBjW;6`yqPsqwjr&<6f#X?}XAnEBlx$_nGsR;gwS_hFp(W
z4i-EyQ5SIF2@|jH-u7#`W=a>drO|m>o_>nISNL&00ZT!}aw=Dgcpe1RrM}VjwPP8C
zSPq(pW};bWHX#?JZWHPl2JM#7qs=lp^xE{u4MBHDU0lSVm&7SKn>Na5QooEAZFR3|
y<bq;yhtitgqz#u4!$pu7<|THp(3@U|xIJRFNZUfPRHZdqCnmij7O}DVmiz&luJnHZ
index 5c6e18ad4c3607e26781b99ba4547509d322f8c7..27d420f21eac1b10b3dc8606662e957ff66f86af
GIT binary patch
literal 819
zc${TYVQbqk5LJaS#u(3p5=scggb=c>3tiWJ+NUJ*vUG_zV$*#HW2p8m5mT%nD|PY%
z_P=*_XgoH|>Ck)k-brVTrr~`=my^YCJ|8Z=^As}8_2K;s^Qu3sHa|J2V82z6=Uirk
z8P}kgh_vF_s>VAbo~4M?nqEytnrYY|(I4hHC=KZcNCZ=mhHL}92c|fC6mSHYMn(5u
zOe!BcFm<S1+hZm~z3o1GkAzHqMTy)(*^aNWvU6Q`SA#KAE70|k?Mm7?8OdE%opA6U
zl2`t>&v=w5zSR>UA8|4z(;PFMtjB`wa%hE6)a{*P?R7a5p3GtM`1g1_u{u=J)5w-l
zyqJcQsQxv->8<(16n*7J!8o3N2^+9aU|WvOf&CT|?V#IEXgi+9vw(v85G<my4pn}!
z<^rhi`F*`sQ26wv^N}Hx+V|0$A9vnoI22N)c`uay$=AnPS!B*vh8Iq~7;-&kIau(-
zL{q??CrrG)dHb%BYo>HbTN)Qn%i}xo3x&_-6R;FiEN61Hj2A&rU+Ej|UOJXRh~;2-
z7$$~=VH0vjnl_=1VbFe+J=(6aLoZE_ToGJusEZ#l=s9sJ&Zey@o7AteMLYeA205cx
v+@rMNw`t2I#BdQLhIx)1EL=^mN8AB1JEUtNS-H{%Z4#4S5R2HTz9xSFj2`p_
index 8fda80adb55fe424597727c2ee93f1f3504e71c5..02c7688806fddf329bed4a6936125d4253827a70
GIT binary patch
literal 834
zc${TYQH$C@5Z+rt2qC0F4iS+fh={#j<$9IA9DPu0tyfKp3D*ZHWliS1rE69;>#4t|
zf3%axnWH7lO!k}kzS*7K!6di~>0&(Z&u0DkPo6-kxjx*!GA}!mV)4L1jrJP_S;l4B
zopKF|iBKz^u1dT);Aw(L$!V9#P%{l{OmzBL21-Nn31Yz%BmrAP`<^MzmI96-)5vK3
zi%I2U2c{0CYGcTRD3`5g?SYW-?=Y4d$lLK%ns+YidL<Y!wE|sk*)FKflaSn|#SXjw
zAz7h+^NfeF;u}2{a*314Gu0u}@#9diZ3guKc4d3#SbLSvgvT>jFJF$g8L2}-J&kM;
zM)OH94$G_gLwn{EQ}m4+j)u|XTTp?044Zsx4(vA&YX{Y~Lfg?KnvN*A_oI1;b=3F#
zj($|I^XY5nGvfjh`!0O<tLJ@%!%nIsYX{Olsrgtdcd7H8;V~00f=mxt22~Il_#b_(
zworTVe`~=L6IB6w9y9Uw`u&GWrkT<?&(i2TEsxK}-zj`WUw|c`A~}_-MKm9c$`k&e
ztqaF82(cVA56wig&}>4^NYy6PF${WHM32^s=+K7gkt>4khPwC>gI0)B<ZN0iqDe1`
zXi>jYtB^B_#T`o9euLIsLJSu{VwmUH!9s6(ZQ@=Nvq_p3CJR;CqUXe<Rbmkv*<JD%
Dm%RAr
index 0e1a252dfb78b10567203cb24aed1b67e736e153..03ade9a70404cc185352ce07e948d2a02472d0fc
GIT binary patch
literal 824
zc${TYQH$C@5Z+rt2qC0F4mm`QAR_j9m8<wrxF@x#^{Qzx;rbw@tjW|{x@Kjwp86~L
zmph4^DJ@}U*zcS9W_GfpY4{M)<zz9O&xeceJcUeieY}5V-gKws;U@<b9JUJboXe~?
z;~EqbkybogS9oj0vlNl4rc;rTW*Rm~bccBkN<;bq62TOtA=^Obktxnr0!|>)Ske9$
zlgh^qOdTuL=9mdl9osM3BO#MtQ6jfcwBzfn=v?IuDlleh4Z0fHE=yZyA-T)S348w`
zd8yxj!J|a+t)2+E!p#&+eav+7G!|@^LnDNJ)!sSf-WEII$s9JTzt`J})v+u+uWT8`
zi)lECs$cV)4$Nn!=o>c*#_{w^Sc5|X+hT1F9JY{X2i0~$+wnA>1r*%JU=d*+^*z6<
zpA_tU`r7%(xPa7th~E7ec%R|8mnzLWq4dvcKIY1O=6q#%&D4t_*JGB01<y>>1sr(7
z#M`_6`&zD<(gkg4be@){*WuulKF{1!xcB!8-_9psDX3V^<a!w|f}pzBH`=~-EQ1is
zLG#c|Gz-lp<bu>~LLI}Poici~QAUS0O^<X5x;}OBBL=Mzr{rvURYsFum(ikr_o_xN
xC?>Zlz4M#2;SyrF2ol4*#10mE)9VoTmY6NlvXCrQX^&nKlh%nvY^=T^e*p6d^>hFL
index a723d4f88dc5f6fea5ed8005f98f59a84c125c48..0e59ba56ad4a5f9c34cd7b4ab9d76ef392454f86
GIT binary patch
literal 838
zc${TYZHwAK5Z)U?2qC0F4mm`QAR_j9mFv|Hg`*$TTI*HQV#4)<l(Lu1c}v%9*sQ1i
zrvAxpB4_$Sm>K4IW}exd>~I>~hOnG02J`t~@tq}@DyH@~FU*VXv`iit%JD9fnCDES
zy%|#|DG!xo>8iq8LzX5Qsd_pU87iu9t%>d+&rvE&K48qL#3Z0=?A%ew=sm{+NR{qr
z|BDIf>j_luE7j(Ra$cqFXYC;u@y{?885ZN%DlH~gb^QvAs9d3{j%=5$t)r0Gq~!^F
z{~>v)fBlSyv1FN=aB;6UQ!w=rRq^A9(@l<z0Jqh6=TLiD?1aU0T;Kn>-c}^{W$STe
z%P?9@gGpHZnqSa2pQwaaZa5xA(=R~{cQIzg+8o?v7%NAsZMd?dX*3%Hx_9G6sO!M@
z{H}VGxb@+s^N})+iG3Ts`O)`2<9;h-l6L~(AJu$aE4HcgmFjCIUWB<C(Ht#&qP)&=
z$70G~U%h=-%N3QXpe?1Hr^MlPG}Jyr@!-GrmE2(Suk6O(O8t^PAx%(5VkTD0XfYmF
zxBLd}bH_3Wu^erlHdC9W%_ii8)NKNeVL+#h9yH46K-2U{muPnluKtJtHR6<<4QFLE
z;k=9%_}#M_IRRbV2DtK@&~OPcTn!S#Jk=8{?M<&k+)HA%NXyb>sR}(fB_`B~MQq)D
GL4E`0MEcbL
index a383b1703d910fed2204c95f46b86659c3da09ec..c48407cadc45a1d07bea0c75862f25970b777af4
GIT binary patch
literal 831
zc${TYZHwAK5Z+rt2qC0F4mm`QAR_j9mFv|n<vyuRt%s(?gzE<>Wlg5u(lwFIdg_nq
zf9)iqTUx@*WS^ON=4E#{2_GZ67|#c@*<k*ir;sVG4iB%)o9?7K{Nx~m{YFAj@I32H
zxdO>Vq$JN)8gC7GmLj5aI@%d2reKYZ?w}|@Do8&<BAA3UWNYX=G0E9dz!78$Gur=R
zx%9CDlLyV(95EsEv3=qmiahxhCHV%*a(tDQm33TSgE5mUP`YKiN^PBq@@-ai*!vGD
zD*pQu9wm}*)L7(8+)U}IkC;lHM}ln&XoRrS<(*^fZMhSk%wWCzd%dk#9;(#y$`(;P
zpM>K`U(IjYH(!{fZ`>#t#gi{#4fY9a%C$ML-$0@qWZMd5$CG#(P;j4ud4zG)_x!GU
zmay~bYv&W=0@AvkzOWyocR%`_F!#@dK8EMJ%=yZ2($tHgP$O1=1usn01?+jk#M`^~
zA8LhSQk8B?q4HFId>|e+>ff<tQak-T_&bSD=rgbsWSmd))gqn;fgbN0ZC^W<L5Ss`
zcqk@{g<=zOLFzW4j$zPFWj)%gtV0{7N4f;nJ$3OT2CWgN^4avNvL?N*tVR9qRgGLw
w3~p0;=QnA?CB$$MB!+p36)e=I*CFmLF<Yc%p|fJ8J$gw@S|=8<G5d!60S|2Vt^fc4
index de8b4d8003c496e1b86c4a7bfcd99bf7818571fa..2239da96bf271e0b30e6509700eba1e138f28b2e
GIT binary patch
literal 831
zc${TYZHwAK5Z+rt2qC0F4mm`QAR_j9mAk`l_epJPJv1#QTt7%DYclngTNBx=r~a7!
z*G?k3r6tTv_L-SyUUr9*@F}8;@q93w4dy?13Yp^S@c7QW=}xM{FAg%;ZzL22&$Hf?
zE09b?O7d)_@z#)MDIz+jqn(jr3fAc84vGS#g7gz4f=Nh2wua6#lbkID96_cqqx~<I
zOCKvRdC;uQ5fefm+b8a!$dlJ7$v04z<EyN!tmFC`jG0`4(k<InYU@mtZ?mey-hW6@
z@jsmKD3N@l#v)(hW=c<e#8mP!5^P&QBZQqU?;K-q%boCK2J7YD>utsIP^F$%wus{S
zBpgTjYJStc`Nkyu;6}kHo_q~!uuou9uFZk{1`_2U+g2z$p2X9Dg8LlIBaEZI=XceM
zgq=^{JD(XBkk<9|h5Z!W|Lk|d+&>fg7@qGk=NrRGQ!j=>jaUH|yfIN1u;&RAAMg5i
zwL&qeO1Gs@c`83X5Dy#m@7Xe`oqituox~^f1y~9)&Zqfm5zm7_kN2InuN})E#BxwP
z6cfclu?e{#b(>JfFleW;9&J|Ep$*d`U4rU?y7&=;)`(O2Y<g8$lU`TWqJH<PMlL7@
vw<*2zo3!B)Vz>wr!@R@_7HZS$5cigtEz+{kS+UX{y(A{B6N}iGeM9~L2~zi{
index 717b28b5c3a6ce7b158ac7190e09095c12192702..dba809e631da846be1f5a0173f440733f86e92be
GIT binary patch
literal 852
zc${rg(TdtY6rCMH2w_M=SY#1df{57dR(2QP_NAJp)}m=KVPB+_F}Zbzj)_dhRiFAP
z{nbt)I;Ab)&Yhe&_uQK^8BL;3F<y-4!`W;&|H?ARC6kB8SLRJ`Qonp>Aj17dKv}XP
z?@yToL3u0%%U2rj>TN8kgtaR5M=Yn}pikNg$W)mYZUvNcP3R5F5`={8J*1op$RfIi
z?h_S^E;$@QDiyKwH&%$wsdmJR^hcZ)8>r;iDz9eIJq8*~s91s2)7W)s`z%y!^Lm2*
zKS){YKb-J56>KBNyjUt{s*^@QW%?X&x-Fp@!A`d)NA7Lq5=&>WUjAusI}wMv^laiH
zPUe$n9P6w3g$L#f75I%4he0y=9NEbvnT8(hQ`l7I5ZG@Zl|*T7xx|2d=P8`Wis_Y-
z3YkDD{hd%3`4MOaA}OZD%JqBlS-{T6uSpophTrbV2g*2P4ed|ajSBzV##j7emy<74
zxsbV)YCub{;Dz!AhdoOve|tB$x1>68WpVsvTs6A?jxJO0w0T@4^Dxxk_Y-%n2{8~N
zrV3AmrNUN05V}B32VvJT@J*dP+^VyQeZxkVNG%O)ss|a^Mdtsonosa`oh{t1vyD5w
zD-T^@Mebqz;J2`9ge*sa$S^J&1lek}>@ITp$Y`Ukg$%P+#dr7$S-6R8L{#-H`VBFq
B_{abN
index 5e1a757739a73772e3c4f21717d4b25920f8ff59..a788f12da3aeee13f85e6eac7f404b41ebe1b95c
GIT binary patch
literal 849
zc${rgQH$C@5Z+rt2w_Qs9CC;pK}78JdfZvx?n!NGJv1#Q+>4a5CR1<en#g87^{Kz3
z|F)CZGo>wIc9L(u`DXUp3@5=uNEhSzU^W}fzla1<E%f33m3h^jlpo&&D1X0Ekmn*x
zZ>B<n;xg1qq^k<=RIj1t8rE3q4Mob;q1tI7kYHIQ+#GQ!D?)dW=b$ts?;)04K@#va
zbRM}9d@11wa*f3H-&m&FFSSFN#oxm?+dv^FR%tOy)uUg55mzhF)iicl+Bykk+q9hE
z<{u<4^?NUP7%Q>SW0@_{nPR6t;yQjBNxsdY5x}l$&yL*d!X**UV7>g)-d3azW$DSp
zMHtN|!8ok0<|pl&&s@<rPUw%K$)~`MCehTd!9IpfVGe`+24c-nb1O9k>N$`8JVa(K
z*Ielca_#LDUgSsM38*NWW-Hh0>L&#|kG^IfxR8+4D`Rr|A-wzA?*y55>f#|i+okL?
zM-vja5FPOxEO_R!E@3ZXF5lkvdzQu>S7*mR#=*(GyWTtZcfMalbKkEH_k*@C88ZlB
zCPodz!mu$IA!nrF5b9b6y()7JPgZ1;UK%zzC%Dw9i4QTTOU(aaC7;n|nJwBXvrXIG
ziyAqjNbXYF^O_VJ5z9f47{+;>5gS*_?hxmO7%kGVh+&qh^p;)_i#CW&7*=1CU+3BO
A*Z=?k
index 92e5a27b4056330e80a056794c9ff7e1a0252db5..29f84436c29ab448a3c0ff531b6af2dfb90113ff
GIT binary patch
literal 1005
zc${TYe{0(?6jX&VMi>)92_=*wObBVym9&Iy^v775rd>+wjo9>`GKS*3rlN`!WTi<M
z`#Afalbtjko6VEZ>F)e=@?}4`4e{g6pmTrU8GPp>NHo{WvyOdubjLL)CPJ-vGVU#=
z3euFzq|whwPaISM(o3E&wJZSN03)L-$c;{#g3>U$f><yGqkv7IUMND%G)xS;{=gJx
zLjfxy(`K{wFDBJ)mkCkGYj5_KLdGv)ET@otk&lziv*5K0Fk)&9y6BMPQh#G4XGz}V
z(SJyq`=7kwVXXL6-v~K0ab-J|F4OUISFl+Mt#yvUYyyhMMJLq&=EcfgnH**@@c14k
z!@u+OBel#uHz_@a(V!pPgvFgLt<Ux=Q@H7cy>8V18kAuX!!(P}g~b$N?Hae4&?M?d
zcRdW=LvIioo)?>QnI17M(T09jFsFFmy=Gj%h}?$9Kic&`(v2B46gf}aZ_FHjREi+g
zU6w+1?LyBl=rP$@ubNG|PaJq<qV^;eZO}K?1#OXX1_>#rX+^+-$4tCywLe@7o&X&x
zU@s}1bN$Q{%4kM~O&(XPlhEb`^-n1sOHH+;JV{_>=%0~ts+rPRcaAngNz2urOy|m6
z$QNKEP?5ZoW9uieev!v$(CZap{>Jq^&#@44TvH`eWmC2(#}q+m3sqc%J=;P@`CLM~
z`Rt-YQo?OyhEr^r7h7l>yZIhL)qJ+mUOqdB9_*CSmX)u{K3YFU+sL)67agD)s-tss
uf<Dn*T=fvLJ)=Vw*{%@mn9(jZu=f#>8ulG*tz|7#!8Y2#4kpI&J^BOa-X~T7
index a46bd0ef42497bad4927d38dad07981d42afd7d6..ab439ae8dafc45324e80a418f13672f478b6ede2
GIT binary patch
literal 1012
zc${TYZEM>w5LSgT#u#Hl38j=GLI`Qom2`wL*7ZZ0rCmzvjo9={8AEZdiKt=)S!q(n
z{>%Qs{^HI~6OYa2bllr>caL;A2yY_#a6Rna-F1iG#28W|%*%P#K4}gL<57U_ujU%E
zOsMqqRv6G+Mn;QtQu=F`A|0crtZ8<$477pqCrBjMFb??)8f8UfxPcjFH}1I>d?aC=
z$PEVT|N4|>*n#Vp65yc6r7X?*rr)Jh$y1c5IpiaVNt!n)^E#z7=6V9A9N8^OYg-_-
zNQ<dY|MO%8{@aZ|O0<}pYpF)aOdhHBxJjlx$rl;4UnvV0GteR_C)p2SSz6v2<Rs@s
zBzG_y{mpwV)-MI-mbQl|9uC6msJye^);s%|YufUoelH$;2`jKlV4m~o!D<eP@epkx
zjT;Z*+dc*VzCVmG&rfhKoRPACHO*ARlF=jYiVF#2_a-{~-f4u2ZNV6(sAcMX<+%Ph
zh#@mQo<ST>fejZDGNv9`cVW~l--Jal6N!>oH%N235W#_GE`L4Zr8e1XZ+5}j=kCV%
zc)`v#Myth+*bjF-I%{39+6OjKhKV%8)me@rm73R%suETr;qpzp^ZrVT6xc`uf6CZW
zn5jq^FLGhaX(cmUn|yr7;1L+Le${NL@y0#_AA^q7t(rW<!+yWy`6q20`nE-g?V$uH
z6%-rAL2(J$Ayt=9&$8%op#yqQXph#NfSeLMI@HIXSag?oMa-r9g|_Kop&iPO_bOz^
zDy&M4yna~QptQ*j=)O;g<zo)9oLy|_;Asa<;=d(Mozxr*7ES00trDB=5r?=~-6nqk
D;3_h!
index 916c6701cefb6d69406d314f427338ebc00f08a0..33f37265e7a01b35a8ff72efacc128136cfa6082
GIT binary patch
literal 1040
zc${TY?P}XF6jg;WMi^s438jQ0LI`Qom9&Jh^<yl}(k`X-Mr``0jG;KUiKt=)S!q(n
z9%s+7SDWml@z^Y`F1kABNcYH>{op3V57&dv-Cbw!jgKJFT)&)k?8Bp5u0b&oYQ>Xr
zZ#h$trd%eCehzx%po${B<Ox$RMWJd6Bf~4ejZT_^(lGi2v0w^D0h>a-V1$}!m>P8b
zo+-|T0#-n#&1UW2npBl86QZEkUga-^jGw|-&LBIHkCRNZz_p8F#MBscaYK?*s~aIX
zPx4D1{Z~nI{gc;v7%M*0*Fp}BUD-~#%XB>H3N}xnwe~TXPeJjxxXEq+i(=)jL=H0>
zczg%b;otsNBlVJNZd`f@qd`Bo4vRPYZGE(#nZivk>~*95m!Jg87-pG$E-YsdYuBjF
zg(guyy6s``?t6pK;Jn!MW$uWnPaAroU_tS|d&Rhb5xEJEzqjjwq#H46AaaqoUzurt
z<VTR|E=wVbCO`*s0V$P_v@_Ronsq`$nDST(!|NxRT}Gj@K9HVY(Bm_*vtBlvbe}lz
z%tY-`D%zm0unXEEWdTbbGx4U?et#u+0(7W=J*9NP^@Jys(ToEd$F5er(&h!Np3<?@
zlqae2Du)RvXVo)ON;OkDYrxTF^0i$3>~x{bn|%g00u{+yIktWf>nC}L2EAV4_b*)E
z^BfBy$2H-bD4DQLI3@@}Td3?J?AaDN%CnCud3I5a__&SCbc!uAu!Xj<o9_{{n`ayC
z<=H{>V5fw(tbA3fqV;FE2RU~&&>^a$20BM4=mV|bT@NAKGdyIG?J~iRnQgy;y?2Pz
VaMi)qn$|*PY@;3QU}6;CqCcw{G}{0G
index 8ace8d3a39f403fd8f667db003facb48f60dbfc7..374b3154b452207f3a3388c1f019032f73e34034
GIT binary patch
literal 852
zc${TYQH$C@5Z+rt2qD-Yha4iuA|m#B70<gq^+|1Nb7)$UaD9+c)@06Gx@Kjwo=WNO
z>)+}oa;CI|nPI<g=9}5cj{V?1!i#A*n$Jh!H<m)Cm^!?FWnT6C^6<z&di#xpJZB>7
z&zJ&9d88!ERu$eJvn<s}Rnx7=NKplAP4q^24pKq-0TNCnqyb$+_kl`AmmH2DRl1_{
zFD4|>9jH81s;vp-ygGJXw8vZ|KcYlzplHWdS<$)5yQ{#M$`z<;WV<YFpM=CVD<|y#
zhvcRH@CA<&$u?@r#ZqskU>XyulBWr$+Z>t!?5g(8G55OI2}|a%UjDt_b}SEN>1kz)
zC=UH#8dbmMHy)bLRN^<a$eYCe=b#Sz1UALm9N2FlQI1yIa%IPUJo7Nr9=tFr@_v#V
zG9<sqEhaAMsV50Lf?tQ;o~}0>av~ndXsg7!n2bcQW{Kb;BYsxgvXK8s8Hd!qk8Zx-
zbpt_8jfoZ$yUh7Q^+r-RhFnc(4i-F9-r%rj3FU7G?*{c;QK<^rQrfvn93K+dN&T)q
z0Zl>1VkTCLIP|>g&R=oo(y<JLEJvHG&D3UTvk^K&4I5#{FmSJoF1{?IgPW#{u8?*E
zT+<&i@Huiy&c>}WnwXT)!tLHg9i3sF+{L&~TDVz5$f#)$8Rog}U}<l<T~zBMvyD2I
TCQDUZ#|>oS3uGZ%S6`z)HM##;
index 26359f85dd71818115862255efd45eef3df51e6e..5293ab89ab321dd41c314f55fc42e53083daf2b8
GIT binary patch
literal 899
zc${TY?`zvI5LJaS#+b~65=sa~m@K3}R@#z&S=fgp^RkpA8?osIVGPB-q+*I?WTi>|
z`^gTC%Z53f^zQE6`APlJ^fAEm;jA~A^k%<U42fcD-+gCZwnxQb$w2zMR6>?9k=%@#
z0!ewGBuiE$?)6y`Yox4cmBBz!1#2B>_p%J6g7`B;oJxqNbPcU1Dj8jHIDk~?isrwV
zkVJQ&a$mAG29)#i*nH*ga}oUsB9TJgj;)fsbD7sE!H~)osB&bxDD{p+Vv`gT-u#DT
z1^@jk9z>F*YRJVxE0afR1FE9u0jHY`>QmU3?VUsJb*>4ECa_+-mDda9z9>CPHV?wt
zXgUnat9fs9%oi&0RVDBT;pp463cCo>Ts8-GDMZTAY#XlZa1@Sx43#H;7U(=oT+&w0
z61D_i%={f)ryMdOmZY~)Vx7-J0$8(1aFLKvlK)#y`h_wMvHcj_{qD4;f*jisO(wR9
z^POrPVmE|L4QK`yyii_S>MLv0E?L+YKi}-hVK#F0iFhB$N+_ZPVMzj#a3NB!TjQ`}
z5#=9lAMUD|qEh9&mePx>#NpkMt<=x(E6^BZD8^zn4`;q#O7sIa&mGG^$a1u~+DvVh
zHXET6RI?Fw3<F;l-o=f=JNV3W(KXV`J+9~v8Mum^B4*=y;Z1yAcng#ESrwgNo!rE@
tO&YjfLCC0R5E<sF?qKQFbX%x$i%buBmJSxIxP?!ViEGG0wywTGe*x@p4V(Y~
index 8ca322a41f88528dcb80af958bd2465487f63b98..3dbad431e8c963453ce46b23f42a03879cff5745
GIT binary patch
literal 1037
zc${TYVQb<*5M7rLLI^n#ks_rmBI5Nt@x&_!_sM!`&r)qMp<l{zY?G-Cx5>(8t@@Mh
zm)+mENkmib2(v@pyqPyUJD1b>jZYu17vtG%y!a7Ekm^|PzWy;Uy3^w4IR@ozR|>K$
zmTCVs)}XlXwTjbaiMKA}G(x1z>5j7ul!oXVgn}!G<~)H;nc-`$AwhQMfvcE53D^_4
z#$fwjOsdlf7otpOD9F{W1lk9^OCiHwekfOvw-7JWT%_cUN-*GR3A$|AE>cPBSV^wa
zqV4{FNLC2+4){Ixm;g?ufQJXz4^_O<*Frww#PSF`MDTtE(3o%?zDxvPXE5;i64cc?
z4f7GanFhO(D&gWNk_`@|J2eCSBBO~+HQpj?&S6tt)!FO!@=?d(43ej}PuU98u24U|
z#G@Z9rt@pRT!VMU7xR@X`oZ<RNie;e*I*mMDwlR(yMj<VSZytIeYQLFWCzpW)}uf(
z_rY8Em_%8Xb@hva4WsWD-j*jT0U49eY`oSo$(v(7BylJOUUr)1Bgz%7cq|~YZ~RX`
zN1eH3M{S11<R*3QIgT@`29W6q&tMqhir^A51$wPgmanA39>varS1uX?wlPvZ4n7Z^
zJ*Aduu5_MnX*{Z0?iZVF6z=(V;1Q@m-pb`;u<*QcF2CuZ<(dv5rh(?7)zM5e3(Y2^
zLQZT#9mAl#!q+J)yh~3lmkbCV7qp5WF=&IhMa-sWg*R!d@D^>4PHKcuBs-*YMo+7R
z7}Xpyta`&H7M`X%B-IhI`lMrFu&7D9^n{qSNi1Sx?vQjb1Dov;Mk<wa(ri-`i&Tt4
MrbhcnI;W)e7hw!LD*ylh
index 8bb053abce90e86c3b174ed83b9c66a4f9f906e6..442407b13cb58054abc98373cf833da87875889d
GIT binary patch
literal 961
zc${TYZEM>w5LSdS#u#Hl2_=*wLI~;0O4oH`Y;2HZUY62kBR1WKGKOMbQZdB}veG2~
zerIQm$A-B(>AAb-&Zp~-#y1gt7*2Y3cfH9EkwRvK*}m`D=iO0xnF-M0W~m|1g~~2&
zg#pcFWVFcU72c_ik>LgwnA+-#EXAmbr`yYO&<4^^kVvi}9rFcr?zt9xDq#n5gB<OD
zF{K%@alNhT91XaX)wSRj^Q<Ubf!7rnb3F%B_0oRsr7u<TD@xQ7-12z&=NJ1*N#I#U
z*4k&NRaUls@gI_xL|4yvlxVRuL#d`Xvcl6CaFaX^Bwyvw9K*U|_ja-8#rQ;W2aD<7
zb8p3ZTc+-(`w+#G(RdhDZ}#1KYd>*K&-^GH#G|j{I&2bH7W4FAvxLNW$hMNkjYsiq
zNWs4kClSU`7O<{))UamsWD;)pVkseKYQ}miqZUO!EP{ndlvEiTWyQZ0q@THvkh(X~
z%b(Ysv10pj49V0w^S*JMLmI@8n*q;(ayq?A@YQfBm<F@b87o#qV{3Bjz!R4<F=JiM
zKC<bF3o-|`>zJK=V6As-t_(9+r*P!^HET%N2&8>+`TA8IVQq?njzJX|wcAv-*7&Ml
zfTy5ib*ttN@gxkZ*(us#o?{W>cqjpijpCrVgw#mGCDgMmdQsYd9+lRkhgLu?392{L
z$B$UFPQ23R(q?IGdR$tEveUx`so7TjpxvyY?lg<UQ%cWU$Mnc2#P%_OSm<(zgW3+d
b#J?t1o3tEa`DF##r3b{O4dM_Nv#-c+L#iX!
index 0122e5b20e5a50defa9f8a374d3210000e248cf9..97d3dd17efb072c3250fa35dea7ddf6837d3b97a
GIT binary patch
literal 949
zc${TYVQbqk5LJaR#+VR738j=GLI`Qsm9AuCY;0?qd0k5Djo9={8AGwJshDg9S!vQ=
zx1Y5Agq_{A9-GbSbazkh&QCrahvyN!KAQ|LFNc$FGKJhqd;fOm9Q4Oka3jG4tGR)q
zkUH<x+sFzF8A1*(qy-~XWR1*cHK21U^As~RPk&exU@W8`AyL9W8j1|cq@3j?Q+;+&
zCu3n|U~7`zl`v9F6+Dm#i}3EhIc+$07v{dE+!+a_>hNeib-2jD$fPcGABQ|uI{6VL
zdJbN-?K~CqBCke2{4Y~f_~XZXlo&a;XG%{|p0d&&37g!Glvot79m2A1>px%*N?B!c
z3EA{--8-?luZ}*cejUY=ad;NhclL|Eaqfhn&l*uMipO8V7OWDOm-_gynnPlJWLqff
z#pC!QpwPGqCK2NH<qhu({+>_wJWvJjgumk{<xSqVw+5D+?oEP~$mR+Pu5b8oVRcqc
z$s@>QqLt41I4{4rZ1qV<1*vx)z4$)pg_=JN!I4ZabN{PAb<$=Gg&m0ksGw7t(A0%H
zq1p;oG7;+e(aS-ru)^39=2~2uRzLh<d};9NK7&ZX#QH+duH#7%)H?j6J?^`V5Z6a*
zqB&?Tnn%b6X*URMI*c7vzR7kg@3U>XNsb9FuW1Wk!q_J9tD47lD(^5}d6#wex3|cK
zM?JsSChG@-{yO;m0fYU=$_WMs>%cw128WcjI=d7}iPJzL!VuvR7guMqPa3ZX?UJrb
USgV?ZwOE@tY>T+W!_x!u2Q`xu4*&oF
index e5a3adc92d31a07b4b182ff6f564ec108f0df983..4f22347f5982272ee29903fae5564f6f9b0ec486
GIT binary patch
literal 1019
zc${@oQES^U5EjB1V~jB&gi=B=Aq1!ELR(4+l)>7}>rz^G#HKH048^{t-dxMb%F;aS
z5AA*bZ)cgrrDZm!v%dT8?$gN^)8Hzk_m{Kto1635w={uVrgD8Y)epR>+B~En{O3YI
zS*AQ6U8fQR%R(vAe9_>8<};K`!V{+UF48<fR#V42FG~;-l1~t4Oh6K_Cm7r@k+OLP
zHOM5^=)cCe%1sw}Rk-QZov<uxwkHiIVqyWZY3-sICe{u2pwgMfH}EundBFZg;zh>e
zpJB`kFxBU70IP=9+tT<lSH~E=K}wZ<yurg*q=mf9_#DSqMLH8E<Ht$HmL*tqbo^4(
z>%;USu~sSD3Ezj&Y#LmK&At8A#`-TNER?y-q#gQ`XnGs8;5mk(8mtA+1;o;kyuLyD
zj)KMKKM*scX>{$|cm6EI6vy@Cqkxq=c7tW5W>g3+xm*`8+9Z2JI{fHwN|){f7aMXz
zu|BgjgT%ZFkG`J_0`6|LxY&TNa;r|UZj}n_E5msuP6VZ#uoBw2ioQQQJo;1XbU(N`
z>Z<A9@XW2@ZA*;*SMeLNH*9TLtx_@}tHy@J#a#*f*S`QuKt%kSFYcq6?>D3VO$R;8
z&<HVFXl*nd%|N3BpN>hWrEBy+`8IWxZ_%#ikYj?&DQ#OsqdN+xbWeGm_LMiMx4*kX
zh_2Z!r%MJzvpwRNoet?Anut-SgIm&f>7I=&yW(mUP7GXijM^sAx@6xVTHC5#I-(t-
M(_LZ^irr7hKPPZHGXMYp
index 4daea8a02066240c27bf0438552fef07cd8d6b3d..dfcfdb1cf82412c81ab0209cd1e661224fec8523
GIT binary patch
literal 1022
zc${@oVQbqk5Ea506O1t-gi=B=Aq1!ELRU&DD;qSK*QK=Xh)utgF%<ifdUGu!D^2oY
z|7QPUe{N@)#HC|4r<2~jyL&o&H1V$k`fxS9yuH1geoJD=WFj{g6aC1YsKYz~;jME4
zMUn7qc#}vFEDfYcvPF&e>un&JgeOexj*=`!R$a%vED8`3;!hBzOhD|jC+OcZk+4|`
z704vk=)K0c%1stoS-9@i8M8F4kEb;!WMTobZtb8LCN?$qsMMK6x9~K3dBNUR;wa_O
z&miJCG}LzAhgD7M?r40OscQ`XK?;?9vc-c)B)Pmw`3%QbM%rU0qsMW|mIatq^!%l$
z*O%#rVxv-a6MhK7>BPSZ>hJbPd#^t;VWP}sDy_g9hm$+M3F`>*a<C?>bBH8;L&4;;
zAGoz8uRdlYoP;-?b?;3BOtBqTJ_=YlXO6!t)eLjNC6}8VhR-Zr!rj~*(7{J<Te)!N
zTx_{JhWVK#Da4KI;NADrzR#VV5(mrkRc2Nh=A9B_eq}hV*bbqPV^%;bQ_;7_$0xrl
zxy}bCLsb>s9b7mSyzPkL|H*w#bqCEIr&&lQWZBh_xLDh2D}lfJ7ho}nkl*mdLpb%k
zdfLBeziS#AAx0Ceg{Gq!Xq4d7ZV+nf8a-0JMIGgvw4>SNgy3>cTMeSoJ%v+xpuA4I
z${W-@+}|Ta*Q}=1A$_7*F0t%(oAi#)5TkY*kEG|&0~1+h$<<1n7`W;fHEp7G$e}^B
UR-=6BkhY0V_lZF$c0VP50c*%QmH+?%
index fb52b1ad170fde30a6f39d67407f60814b12ce26..9207958db83f6ce499ca2092336ce29f05703c07
GIT binary patch
literal 1035
zc${@oVQbqk5Ea50V~jB-m{LL!A%wK+Lf4g2woynjw{uCI5qteoMp5ib>dm!`tTfGE
z80=^5e@%9pxOB`$I_cfL)4P)fo_`hK+sjG+`no^)p2U!eM65n~>S5QbHnRk{`;>Di
ziiBmoQ6hlTG!Q(=<~81_mw})H9wfCjNU~T))p@%8q5v)+{tQt{ImAAFfD%mRS;=^j
z?}qY(PE%M%QX#SSYmD)enj2C+2T`BZ9MUwc6A~$g@>LBSmO7K@8Xl%E3v6#B4pJ8V
z3?i0;UM+WhSk_^!Z5Uf*RT;g1kfLHAZ}1@ENiHr^HkIuwJ<gDd=zf^eMFGazd-hV)
z>)Ki&UsaTChi`*$;`x_BeQ$r1bM=vOL&{vF!VKJD=#70Fo+8N09vbkJLnQDUV?4N$
zP7LNFO&2hp>7f^nT<fMk`sUt^FU%Wv5=g2=y5gS0lAIEMQL5_YoCzjYIrN^H-F>|O
zYb{pZ_J6|&Er_@Wve`0;ko7wvZ2Cj0BIoW#XF+C+Z&Gc~F)nD5LTq{2EXicK`c?4m
z?xf>0vMo>^!Pzo1)>PvwmEDhx^)Xfmg&5KT8d>Fidvx^P-s-dqLAfYHG$AKTuxD{g
zF5mnYpfT`}joAD)oVae?^53}AGBgDt&6dNFLzP3510(r42EwMQ;N!|VxKmjh6U9cS
zNKT({Lq`hUt#FK6l~r-KvKl@-*xix26y0h#4mvoo<jQEG9>#4&?;^uO4T)geDVJ@6
o_e_LTv*aixUNKeaH9sJwiH<a+H1zVvdw2(_xQR4`rHV837csm%;s5{u
index 4f02d1a56bb67c1675290c91e431fc059cc901bb..a9854c54ab4d64d489a920a93c0a01a2866c8aed
GIT binary patch
literal 846
zc${TYQES^U5LSgT#u(3p5=scgm=N5q3vKD!o)XW?G7@jZrh5ouDE2i`=h#73nuO6`
zwm-MCL*lU^PA7f$-FMPSgHiA~q_g3)KbiEW-+2O=<Z}Q1je6~ls?8Gz;qTT0ih}1^
zZ_FhKmWERBY*FLRfM*FJbxyYqhLTBGVZiMd1qcbr2Z&Q9APLwCx{pk7Hc#OIGKm?T
zf3aNHSb>Rst=jfjn%3LSQG1Z)@y{^M*HD(@i>$0%^B!t2VqyWZKC)h=IwzrglT|0|
z{f88l{{0aTW5L&QnC5frOc`l<OvXzuWt#$80c`8?#({fN_Jqe1Sk3=#uM>%Vm3nH~
zER3e3U>Md<^P4`XFHF$4X6Sp-=u6OmT@358Z3gVt5K9BqHmTI3Q8e}`n2-K6L>{#*
z+m%ZJTbo`PzBlRrxHCR7o<h<Ma{HuWBPZWx##e^dORNYA>9GQwXbJWcK16Xmn+7i|
zZI+PBuk2s?YXjHS^0k2^A<NX7{_ghnuJ>GM5>ZR$hc9Gr1^%c{z!DHqKF$}jXzKg*
zZNJgZrJ*T=Xa<^vrlM(RIw5DIsS|1_3cabkMK3CEP)D`MHNokgnmC9;8^ow$I&D>6
zrR~aV^wPa(kTZ(p4y9eYO<N`*iisdm)N`z$;jCI+V%`$fA-0CWN|n0woT#)(G@@g6
GkNg3O#Qe+v
index ab9cbc62d4f80c560610404017b78fc513e5f9a3..9fe2be93a8d6acf7cdb28a15282f649834a7b4da
GIT binary patch
literal 904
zc${TYVQbqk5LJaS#+b~6Qc5UAgb>oS%i7RyWrHNkvXmwpvFSd9Zm9M(5pygft4+h$
zf8SXl@z^k@L+|drlb+QdPj3S{AI*A`NpJQbVo0^no0~UwyEQhOCjn~snkmS0A=A#C
z(4cq{XeH7`iP!rgjS(q1&9WG1u3?3RRxi&%X^1~UlyC*{l&_$9&z0bh32Z^Gk<s`U
zlZxR4t~RCW$$%$GxozyU`-zNx29eC57$+8KF}du!F2Rti1?cj~uA$cVLh?B^C+z%(
z<VL@{!-GhPOpg-zh|Uz1qXE~^a**)n9BNZom*c%{??vH>h$gUl{M+7os5XYWw`?AS
zv+;Bkl)vVkb#1?JMb9h2a1f5aOsnu3K~~u2!D|MQ_E7CP(QY^n?}ijA_rqC$eU$mE
zrI!lU>^plxM_UYan7CjW6DiY6k)N?&Y)fY6?+r4~9&XrgdgguNB7xYw4X%D%H>Z;A
zhhm$O>(u+o(T&&-A=d+*LpxkTF{RT%?R<9~2VQvcVI>tHji*eez*fct6x_K`#df6&
zq1vAK_VTjpXoP$%w~vpl6~4vKz++IMypxN0I2#U2pT5z?spnXPI39+NVPiNLE+Gfx
z$R*UXEP7$GPftwtXv6kNo8Z!=75s=rtHd)km)1<S>8Z&MWv$~XIiT3wr1XfL&{~BM
mtAZf0>_eR3;A;C#Qn@5{ozxvH8dch&hs37G#33%SJLC^qj1fct
index cae4f1d0765262cc96471b5dcc488d58f79a03c7..ade4eaaf15bcdd8e8ab27488aa34d80a15f1cbe8
GIT binary patch
literal 1237
zc${rh@oU;Z6uurIgb*Z1ks_TOB4S%Bu9H&QuC#Twvs7D5=r1zHnY?PYn3Ky{D`S7-
z{-r%*HPS8N<#OM9?|a{Sxm>rqcMk2}_O3detKPT3he!o#e)h+>thAHOa{#jSI*|~^
zfrx7Nfda`xN68=>rg-r>h<rrSoO0@P6jv}tN98JxK`QXSfERKJewUA-{KRFz2O%s$
zt}vtY9utyb1uo|)>u!^WVY*##2g7JlCI#zna=X(p$iUl3c1J;+Zc8g+*P-x!I-Zz7
zBjt0s9D+()Gn1%%7iK8~DXuBRG)fw){e#2_b9IG3VrOGOfeC!Hf*nr=6LlMk0nT~h
zVJi<#B>{3xuDnq*<kJ|=n_@hfqO$|z0m%2N>n%P6c{7c?#auT=%x;7n^Kh*puCIa~
zWCzqp_)QTh<cSMCP*a(HMQbVWWB~-;|I1c4og2r*mGeaVnyl}*y>|E3NsnGryU<^_
zqz4uzO+%G&T1~h8(9OcD2a|<B3tlJSDZ4X&82rE&(`~!=Eee^ZR?opmDk!sAMU5oP
z7~QjOco2eb-Z>w?H_BbX)<g_L#4NHNIS$yjU5Hha$FT2?fISOYs|68@S4vL@+-D&?
ztHTkGd={f%WLkA*zzYw{n8Yf`8pI4!#UA@*mX}?ygU<=xpL{zrvq&n{qFjDWe^{@7
zG896#63f5KM8+wwnZz^v6}S)5758GO{Wkk<uhmK?_CY(T*oH-jp`&HcvS<dHiMEZV
z5wb;gOhPS9r$@<}rG;e8(6VlmI>E;&&EQRRnj@LSr_tSHH7H9~lNK*_cgU8W?6wQU
zBFi|evAmFFKVhL&TBGOH5-r+<Xf|dMP0!{vV&c=V&xw6Z^a3dvM9(Y}Ds+b!G>?oL
nvNTW<(XgimDWmu!!uF9}&z|N^R>dy$Y%RC0{PtpB9_Ri7GrMto
index 302e13948d08271e30ad69174a1d9fd82dc95647..ba1a9e0fe5e31a059ce448eeea4ad953e65a61fb
GIT binary patch
literal 1220
zc${rh@oU;Z6uurIgb*Z1ks>08h}hPOD^g0^b#0yPEY%hh`iqQlCa;<;=HznL%Glqy
zKWTf$YD%|+m&^O!d*6NU<#N^O-8yt|)4%L?FZ*8uA0ic~#p!S3qS{HErvPO8Whx<#
z0}<8l0tJ$Xj*>w%O7YTF5c!CtHI+2zD6U|Ff$C)(gH+&u1~23i{2reG!%{96X?o?6
z%YY9<SY>gASou9BWTC~wFs)j02cu}YO$s(%<@RP1kb##53hp?FQ@6Ypb`=WmhvSJU
zG*dp8%MqxwH8aV|_h6nfkkW=i%%Y^R`aejVFxS@j12!@N6qvw=YuNE*FjY697~-6l
z5w?!t5E3BQ;>sJhLOzS(tR*JX83wyB8G?MTy3yt%kk_-wTaNL~MA@~F6CQ3f#Eo^*
zz3hS-3%?~Ig*<Vw4{9dUuV}3V9xs8w`~SAJx4}2Z#FdLg`-W`bxcyG=#z~LfC+%E+
z=92DboOa9Y-1oBZ;=y#O%z~FGc*;VyS*Yyp;(quYebeo@cWnxp$9CVr0xBr8SyhcC
z%o*Lau6YoGZ{9i|zBMa7!8UvhQ^Y*79ykuzw_S);i^s6%j)6T1S+55Xi`Pm|hTLZ%
zJgI{*k9-!RU}Rc%X23HK%UHy!ti($UE5$DRX;xNR+5Sh|EQklwucu}fIi*_emfx@+
zG#X7qA!IAD`ngOboB^9lJi=dq`ygF$Cr0$w!0or&>Ae2X<Em{~gcurH1}%%GqZw%1
zXeJ?BWXB>jqiOUoS+lg5tQlI-ZPFn4IH4xqM58&9Nn$1~B&$wYvKq8>Uf3a9TH<XN
ziM1@-OUh`C*6CTTOiMN)nvH2h)3bRKg=F)(eMamfq8CZoAey-<sL~yx(>yVVi7ZXj
kK#&+;Dya65usuR_J$sTn#txF}LeJK7YlpnP*cV5+zlL{l0ssI2
index c6116a5e4eba36b64abb97e4241c2c5991567059..5ad806743a35401e7319b7ffd181dcad071e7452
GIT binary patch
literal 1230
zc${rh@oU;p5Pp4x5Q0dMQk;l9M8vjMT<J>JcBQSeou%4hLVuAmp2=0S#XNa=sg<$6
zasSfJSWW4sT;9FA@4ox)jF+9>jZFvF{fln*qW|c75Gr5IPyQI^wN7$*@<Fy=rV^sa
z7h&VpS0H&{E9r-$G+s?zTX6*wEG=L9p@*oHr*;uVAQgCD!40?sug53A5XR;F4c7yg
zJ|70KL~(_&%KMl|$ox^b=#<tLTRaHTYx7lZFP?z(-86BK7CT&yK&2v!&e)GqWM!rK
zG7#=h+Z9tV6SvTVSqdZNHBQ7~GFaoENR*V<SMhrsWCAEK3Gc7Mwk!Rqx(>t;_q@ok
zRR))k1h!gSx#L#A;|NY$Vls^}*@ejv<omgrZ9W2d6^HI(jc+!}u7sTMV67o)u0VIP
z3u-L9mIxK{M5R8cSf;;gW-0J!5%Asrx2?ZTrdujIa-L{klMQUA-|1c3>8tlyJJX-J
zq`Mg`iUXCk+bySa*UQ0+3)6+b47^OiRaSR?H~fK)>2#diHihg%yKf_s3d$^2Q)3A;
zMz=Fp+z-GrZ|slX52`)E)<g^;VisoZIWE|<9EenlN3i3JfjtS?X!s$ER!WbD++zVe
zsl71|Jr<#0WLiyTz%vg@Sj1`{8J3A{_RFj+Ct$l@u#+DRrjI8%<dbUAsjz0=Yc@X_
z3PY9>%RiQhWHGRr#Mk#5a1W#-ZpBFZZ4R7%yPYoUgLYK2j0_=$j+RBsp&4i<+9sMt
z$Og%02+is`-A~ROEhT4`R<#^y5_}v}6Td{KTO^z0G+InfgR<l_Y5A;JARBse+bod`
z(X1^EJ1jrQv6FDnI&IL?dWDuPLUapjh_*ly6Q4%zlvsyEE0KypbaPoyqj_S`0x=Po
lBL^smU>9_%D1D!>9lUGSasFu4>|C=N`E}=4$2vdE{{^WBZ^r-t
index 48cfe5b6ac7e7d144c83fe32fd6a80302da21e5e..c7929b3795c7d70ce60d7f37b1833d03ab3e776e
GIT binary patch
literal 1278
zc${rhZENB{5Z((RNC*<7ND+}BBDVF!D^jG_J6f%_ma4^seksSXCZq0M%*tl1_2=F{
zxk-G9*XzP$cb=Jf=4Cgn-r&JjUhYOW{r=792lF71Os>DK^!rLLRwfKY=WQV%3>goK
zEf#nzm?pN`Ba<MgZ%cuA;#p3Pwxkl~7*M$hLl6?YTX20Uz#Gsxl%J_!bnL?hq!J@a
z?=dbc%uK~PVU5VxG>CW;FyE%WpQ!b1af9U?1alAkoEZxfwX`d&<#YG9?eYaQ5_*S<
zDafQ{J@(2CV3jbC;+}#pgSfHUe@GZJS9kamb~XnrFow@}u<Z)Akas>G<5VMywX@(<
zVj$b5(w((^x(uP&=JQ3A;G=O|MaCsY_F+B-@xG<{zvhFvb?6jCcNw_RZ5&)ozRN`~
z7*4j&V59Eu*Ftqp{e53yeMd1AeULNmwRs@XF)WNgE=3Y)Y?^LH0CPXCwt8qhc#@7-
z$Me{ez1YsEH@LHt=ln;x)LyADFl6aV<t%M?+D>mc$iSNmi>N>Y-WK3Wg`55LaQq98
zy3=zWI|`(qJ0lx?70a|LawcG9DJMpkG9Nts!T$2IQ66w>Ph_DBUj@b!#Y^){2SVAV
zA)GohuqIs8YAmqAU8UND^HUzDvsh>aTv{GXSO8uIeT0mnb9?X4_4-9hB4kRw`Q7wa
z>My}s34G@FKs^u+f8<m3?Awbo>U5F;oT%3oGnFPJrJ<N8M<^*29mPOV2(DwDD2Ae`
zwRk^L3-NBMWi3Oh1V0x_T1~4&Q?ta3ZHk(Y_mpbIyRH_y`C~$~SThPFO*Vc<WV@Od
zsFO<Mq-eEfPC3sKqgqmm83ZyBtZHUXAv%6jnOl-MCt87&QbdbVr&aY-JtiqN7x7|6
mb<)5%?Cgq^3HfwMtW(UcnXPPNm-1RO>)Cz&?ZLeMp8X5z=Ywqk
index f58fe68dfdc2de5d7e61336995962d2430f03145..163de87b19c7f81df1fe80123f70ae2cf273766e
GIT binary patch
literal 878
zc${TYQH$C@5Z+rPgb-|yLk^K+5fOW}ay^7T+>=^sJv1#QTpy&AHJQ_;F)N$()ZgBh
zjw>dmB}|6>=9_OOUv@C@p8~oV&-=4kfBr+nkZPfik8iBI_QV`s1gOzrt02pSOuJK|
zLGdKeN~Eg-Zwy2lBU1FViejL-h7A_l{VW5eA^rqW!WG0m-$3h`E5VluoI$R!qxml;
z6~hT!9Sha^kS9rTY+keniHv>)k=(**oLHr&$px=hfFV~a(8bD*X>H^}a+jJ7yZ<4X
z(SNw$L8Qc1j}y5>XHJ#skn3nYO!zK?nh*P8ynE($PM(Np2Ak#I_BKLwG_AR1iy)j&
z{BcnHn%}f%y>dn0m4neRoP6~waEM@gvdx9V79#DU+Ah&fI0>gC3gzd~JU||09&78h
zf<2>e-OpSk5Iax7ho8NcFIg_akRtb~`;Ft*#a;-R9`X!2;Tl*ZaffsVEW7L%=8)X!
z43}i`h4GY`YhvVbYUM(GwBeN}6)Y%ylCR~I_xJZ7ZH<tp<@t)Sy+Wxkz++IMoXXWA
zoR3C@8{cX3*0oE7*e-^LVPV)94k1^h>JaLdO0;9LM{6d#v|)MVj^OKomhmAaS|P5f
zIrPS4i`GrH>23R_Lar#1+myCgoz}{Pl*$N_l68#}Y<yc@i<Iw))ga8qqEV$ydQB`^
LB{p%eyG#B6wE+vg
index bc450d96aa68de6cd72fd113fe27e6012fe552d4..1badf043e1823aaaa07bae6f2ef6e599fd19705e
GIT binary patch
literal 872
zc${TYVT;;85ZzlOgb-|yLk^K+5fOW}Vh=wY+$XixdT3fqxPFjQ)?`kXi&@#Mr~c~x
zg^nwl(h?@azIpRz^0NK0{}j;qXx5ufd$XS+hExlEczkEwHOJ=gB0vrI8wFV=WZIqx
z4T>j$Rw7;Ic&#te7?HfEkrxBaHLS7F>}44!4e@7)60RWj`5GF}TnWBN-~@7w9rb@P
zsTfY+>X55e2RupgWBsh%Ph|8OL~;YiablSsC+ECw4u)JULFX$wrnPnvlH1g5*!~a6
zjQ;%@4<aQtdX&foI&-X)2V6(1LBh8gRD9Uw<J}Xtb@W6;Q&=zlwzn3lgK523HV?wt
z*dGP?ulY^8)*Dy!LopZ*!tpo11p5d!N84Q3Zy?exs%;bPgyV2Bq)>bw&I067=CP(;
zDcCXk-u=Qw0<rTHeEQXG_>x^j7*gaeb-#1`y4VXL(*vGCD_j9vDB!P5q%1q{=bs?C
z)fsNc<O|~|Gk3&jU3jkHJ=*ZblM<pzAB8KI`o~V^!PW?QTAnT!+bPuf3OoiC%86Xg
z!`X0{`|yL-Z(X}Ui0xu{7#4<&;Sh2~$_}A!p+H+Ed$eM*OKX-#?g+l_X%Qb%pe5p(
znnQ0)wrJI4o8C5WO5}<nxk+h*RcWP2NTG-zDOlGy!N#}cHAt~TtQui97L6*c(`#bU
LGO>w+-EHy*@1zKQ
index 81027b619cd9e51e0956b084606d87f5b506048d..57648fdf36cd3297b2e56e371f702c0720514246
GIT binary patch
literal 872
zc${rgQH$C@5Z+rt2olmDha4iuA|lq_NtJtOxhG9iYtdXW;a;SaH5qlen3c`u)L-7$
zZelg1En#NZZ)U!k{j#Hp_tnRX@q9R&4d>rk1c_ww`1nTeb|%GP#Xz`+oq#lDJn2oD
z1VLk83YM%(yg6b?q>!?wT_$}=C2UoqGfYzu5~5EK##BJ$(Ji!}sbF*&!wIBPb+rD*
zxM(;uj!RCW22yb>f!3LO6!Y-K5BU!AacrIBlgqk?5)7zVgDh9B6s^q*5zmrh!`?qg
zTJR6fxE~6(ljE2#l`?sz=1>`KoS0@Q)IHdj<IPj;U9JfWXRuxVDQ`0n$D;Kj*}@Oz
z6L0L7zvd@?&|j&reAfvkPhJ%cA?$L|OgQWyl&0d!Vu{~js05Q>>RQk4+*g%0>Bx<M
zJ?WBQ14Mw#L_*T@B>dLy4|*T(`}c|II<w)AzWJH57^1ev$z=#p6nvkU->ABKWCxH+
zho;c^AEN=UH2&}#<(W*?9SC0$N>*7C=4{p}`B+swLgr+KRL++C^uWkosQ2~-XapkQ
zQ@&mVbJs1kc*3n))4&KBmNHwJrc766AasRl6@*O<<C`MdxL!mHw{#2LA>{_xRuH}}
za054rsNvfp>X>wHs^|)<!ZyZT(!g~SA<a}E()8<^fpq0HtBuU}NN=L1ffQf<;SR1M
N4cCyawy{tT{Q{PE3AX?M
index c954ff0adac83529d175d9291096cfdd90bcbc16..e7192d34ce7a02369942f970d47e4167b9bf3f7e
GIT binary patch
literal 995
zc${@oZEM>w5EjB1V?;0}gi=BgA%ryRLR-oxEBnx7S(ehIBR2g~#!&2Q>dm!0SzVGZ
z`w#oaJKH1<9kV#y>AB}#bn;*_yYcA5cz!*dUeCWqAtXA|o2!X=(w!8C#|YGDohrz(
zNGAQ;NP`lwr&W|JE4)*go)#LOF|;*^k`P%{p6+#)fzl9ugdi3Q!kKsmjx?b*Rf6VF
z#PMG0d!Zt+h@lJ;8nO0kOcuGLWs(=JVlOJt7itN*>g6QwGYY2gyx6~Bd)wk5mcb7%
zkSW-Oc{qbrMQiP7@+B#*(f<d@is<t#?gc7J^*ELb9AEBf422G!hOv0bfR*0M{ia^`
z-tyI^2-!{e!Sm;n+1RVz?WghH{3R59!?4kpSl7JK(4XARTv!K?=A&b<P9e~amgO6=
zyTJ`|Y=7e4jwsabM{^GYD0g^QKPg!8-@K&sw;}ukFO7bxq?US<!p?W~n%q66$Ly1c
zVhHUU@9f(}XD0cs8;&L9D(RI$m^i_LcZ=`X;T314!M+F_VaUpS=l?D3_>k$L$iUtC
z+)N9lbG)7voVTZ^XO_k@Un%^PKZ6KC`SMmSAN=`fR1NYE?X;L>5@I<hbrcK5MllF}
zjT)hjY0`^A*C{WwLr)Aw&IxXp)W$_j+8|EhGw4yFE!rxyO}o9r142y0t=F2QLkzb|
zYK%1+q<6~jR5w@y0n+C5$VHx;vyB`lHtrUBUF0=M-y)_>%SGGtkRA|=Hi?a7M&6OX
Dm{=<e
index f43c1b0f12baaf69d3e50b13ebcd7c53ef4d637f..097ceeea4dfade38ca40ec84dca61f4a54ff7df6
GIT binary patch
literal 1011
zc${@o-)q`X6uw+S2;mZfh!iO$h=}bvaYag*+e3BESy~+?^hL(FCZ{%Anj3DewZ80q
zf5QITog~wA9ZNX(<b2=xojaIJuUxtq&o6IoF6Upu0AdxYZGWPlwkNr97lIr;B@)s!
z6mjP|R3LfeDjCMB5^oH`I6$O~X_cg_xPk{H+LvhxQbF(m{D?~kru+d~w_JvN89@PZ
zg%Qn{n2-)u;Bs4LJsk2VD$Oi+xQeqfC3u>Z4*eT=SU#VkSNeKfu0WM-H+L-#BH@2`
zeUX5ff7Yk4c{cCfO|0X5jLttunn$1QaMzb%qQ;R};`%bCHss2`A4Ytg0xQ^y=l#BH
zvf;^X9<tx(!u95p>DVp*+fVJC{>UYL#jw$Jq}Xh5H5z)Bi^pU(t-zBHNw#4IPYL+S
z^d{c*h=TRVqczO#tlQDtMMvt`PFvke*f{i<edJ*TfqCV=`Pyqug|pA%po`eVKZ+{O
zdnd+#+437^?mGq8`I8yR;?i^yDU?v#1a?%P6(Q_1$6W=i@az81-S!|=L!LrqPxXpv
zvBuv;+sFM%s<>2HNHxt9zV3F<428C>L{Y-oNW9gbfCnHwaV=I0Z$288OZ`P#4a?98
zF$@$7rHW#rFcgj8Q!@!=nn8QHuF|7iTl7S?$r-`pEw%6^2CWe*=QMhlYm+*;X0&xu
zKOjWUE&Y%*iC$@=RI8-jspyrOW>?W9O@|)YglKl=tz|f2c$&!C7X$-O4Q!GYFKy5+
PJs>8n6Nb(<IVZmXfg~?9
index 03bb4fdffa206cd64df47a681c9f95a3be85a0b3..45d24b2d9870c9b68ed0815c5d292179164aae8d
GIT binary patch
literal 977
zc${5PeM{Rw7=L<{;|L*yA|j>8AyPW0rOFV-a8SFb9X3i6{71&PrO)a?nsk@z)X%cN
z_u2L}c8O`v?I5}Pz1;J1&-pm~9FhCW>2NX`PQS<*W?Jg!55H)?H?F{Ui7I$nDl7__
zXI*=Yw9vRPmd;3|spSXPQlk>-d7h^zGAs0JA<{}_bIb3Y%WP&Cn~xhtsAp?whxlkw
zZ&(zlG|oO@k_v^hP%QA{n!L>msf|mdw?Y}g<Sg~>olsJIOY!BBC@uT{bGceqAFdXt
zWMY%T;U>X4Y?S0nJXzCGqU2IvrujG1VyW=8VzN|3S+|^L<(t{K?<^S$HAiiqVGxKp
zs*6>Yl*PWPn_uK=@v6UKur}SO3F?P@Hp(+?!W8aHRrgUm9fy~Z9q?~*(kTa#=-|gn
zq=uqDg`%Mdy(k#P<C~B?k!SMOiO2DE;NsH~6YbSAbzes4-38OgIGYdBHQlUI4TL-V
z?CgxY!Dur4dUE=2ilf2cm>==u<No{psUKsZN20*1_yKuQ89CNYZl0@}2k%w!-n0rW
zlrFC@ZGQYwnK@mdn4yaE>wHd)>pq?afo<^*IoxGFB@G`4_@4Q;2>^7q2-$Wh+pqR*
zwpZ;Q>yaiLfcf=_YZg$p3!Z^MX~TmSp$!TZGyo{nfOS0Bf{n68*bdvNAvB@6IqpEc
zYG#9L&mnXH9HSmUhqi#3j1IJ#K0u>K9p*TW-{!_l_V(NEz~~O~pv!<(#WKdtWgpsq
E0n}m@ApigX
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index a24a6eb87118c5c43c2865c1dcc6a99a18518d91..cf3a8fa7bb3f04abc318d3f34df1a131b3a26936
GIT binary patch
literal 792
zc${5QU5na46rB!1LU1LBh=?qMh_$UNYL}(#K53k_DVmi`TnbXkthu^@n1so6xBjgD
zy1sUzwUIu|OmgnI=bZT%+s+q;S5tR1pO4&cfe(=k<o@or*6Gax34(`AiXht3pNW7p
z4dSR{A4r=3L=Lv|PbRs9ouV`>9)@RqqcjB}!Joi7<N|z$@1QvjB45epn(ap}0{#@j
zk;bKJZT*kMB2x>tQRb6dT<4(2#TH~POOz28`<#oqr#uU#xC6CUwvH1Ro?x~XK_aJN
z{G`qxtB_Mgr8xk7%C{iye?;pn<XK*FAB!Ci{|Tr46X`+BK|aU66-QD<OY082=9!8|
z&lU4r+nKWbI)349;f0G5qn2ksIEH6?GkU%0@gxcNond$Qj`%U8(OXH@f~U`=N9wYS
z2tvdHZ;V9Up~N3BA>-xLS<c7Qy(PoJr;j()31yaRFEZUCwdSMm1CxGTC?h(#Vcy7F
zvRm@k=_pPlq_SsvYPNU^)kEp3-yd8>I=t|(cAl%8N-ku^)w4G8D%7j`4BQ9d#j|+3
z@?1*ujb7k(UDq)}x~7J%MiHSmsHPQg38ThwsazstD7=Yksz^|^fe<PpTrw~shgCmx
sw2z>M3hL)Qu9y`QV^qePW|pf8G|P2lXf1rHE4YA+0&Zf|Qrr&u1D*Krk^lez
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 9ecadb834344d787551d18db10c54bfc91a69d14..e2a574e80136229c6fdbf7a5b0ad1dfe70573eba
GIT binary patch
literal 969
zc$}3|U5na46ulin2oi#bEQ^Q)5sBM0SYH=P)n={5kCKFak<yNObyH$SW=6OE`%e6d
zEPZKUX6~GO&p9)9(i={`g=97ey5n&-_z^ELm9acL_I1}89yhBPx&LR&QHYqO-YAyH
zX%b2vr|TTA_Gyyj+h!hyl1khtB{z%W#TYm9Tg7@WPM1n6cXPTzAeXrOf{TQ5Tu$f)
zZB<73A?H;l_<CdbOnFS_37$C0h^39U7~|FGB^Egg+>6zBmEWMcTDV|a{B(txh%+gg
zTnn<pbT0XD!Q-tQBy6r)k}>T|MtL8Bwoli{pLXdY)44gF{lxg@Mpv{iMN>XT`NEcc
zmP*wVQ43J+c-~0!<T?wZU^p3s`J)}Qj=rbd3jKaGoK9*=V6P4nvD0f=J;oBGX(1X$
zBfl7-kbNr9Sg5Dd+59(oZ$0}#sF;NnO$3&<oJl4RTLfbNdL!m#Ea$A~+ULN#Qd;sq
z3ErM2JDjeZR_pUWsZu?iYiD!I^!wxP&yIKL*o{h7Y7R!zUUy_>@rREkA*s?*w>6}i
zth0~(%GIy@73mUr#71mAivr)zn>iy7HN(^ZOrnONMhVncE&(YQ2yu>UiPVp)K^nRS
z51^(tv5Hm^2&sUf7olLN(1xaFfM#lUcNeHi$|neP1N19g%VEvP5?-e1LLH!>5okh%
URKWsx*B}M!-Uc9!GPB72U;Ohes{jB1
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 41fb92d6ed48724c0795ee81177cdf32969f2a66..1fc5ac3b8d915612585df0fc56df13e1d558ddf4
GIT binary patch
literal 952
zc${TYQES^U5LSgSCYTUHFr|c|nUIB2LRb3Mr!+GqTa!WT^`(@d+LuI~BYTpZHvfK-
zv&7l<AnEko@!hBIbT^rOiSX0?d^DYo=FdC@p}F4PK08-~Np)Fpkl}kFK`EY#?wDm+
zeH}h<4U%P%mRu}rykCcrW*XLpDY)YzHB~ijZ=@7R4e4E$CqJVkFJQ2TK0}f*3F(Zj
zp;6`gk4$p*lEE&;v?1^Pi{%pelf|LurHyzph4stvEB3PIU^UnH`FFwOw!Q}kfq5w^
zDZ~E|Rq4Lo<541cq3^T&#kjJ65nl?crY63r!I;S<=-L!&Z2C)tKV~{vjWbp%@OJb;
zEVmVUc<56U&nL6{sGi^_a^q~6Z03bEN_mE@%rt&S%_tnllW#LW+6v9yLn(9Fh$rzw
z*nAA<k;ydHmfKTisEPL8z*gW7{wPgjP<qUaj&M93{kU#@h3#7|Q?-d#Tv2VZRKl;4
zn`U&^n7*<NQ<duBA1T8fF$G~Km%6ZFnYUov#=?%fFrP`cm1a`ghMp=5khiX-FG^*;
z5Y;Q7aBzqQRYgG6DlfBCeAG0tZqZkxDW{2KYSrPw5Q+ry#Zx>F!`i4Nz6@NifsofU
zt7R5J=mhyKgxhX|xYgMr-Rf+Ta|fdfWVQh&)bF0+Q;aZb<Fk(2G$hz$FeaVOamqhV
y`JIZ1klxUsCl(DbxxAqG+(F27s#1S&jU41Ty*@cbPQPP{&Kz<@JVZ=5M85%t^(RmO
index a4ed97f896dfc5a6739fe5dcc6a172823f987aff..91c3aff037d22bcb60cc36ec2ac1a11a52a04b05
GIT binary patch
literal 828
zc${5Q(Q4Z;6cxgl5KJhcgi=BfrG!w{rYmDFr4MOlLPnB;?e!&$q1ZR6ieec_>6$;-
zkL_pn6}z_6Y1@O*z1Qd5b9Arnr;E=qT~4CWd_Ic4iVSiq?Edz_>s`%+1<hq_wa7Q&
zYoWmyq4L4B0<8sTSL}|tlrHVNFt*&n78!$)F`zAEpCFZ7L$=^sIJ*~lhV5O?{v+3d
zuO!qkZn4Mt|23r<61m<xor|%;P9>WEWu*7zU)0T;i8$4wuoJ0Pc*9f`P}&olymac|
zA6zlvdIQ$^4C)TcIEki<N$f`V)4K=?jxw45!ZkIWQI;iO?3f#9#o;)aJ}jEaG?|61
z$1sX93)Wmn$h^C|!0roB>tZ-$=1J{j##X>MOVzft@Q&rmVya=Y!!a=U<CDpHS1U&>
zp&IN?=Zxn}t)3yZOs$!H0#>T92+F1YKt?V4hH=6b%>Bp?dt<1#R#K|(xHweKAqdCw
z(YKpu2CpLJ5;yTu4nyT;h+fg=<-wo1yuN;a^=v*yhby>Iv%_;ULH*!@TD5H~*S4Hr
zV5)k<V!TYEFmxmT)$RC=1|^LqegP$fv;#_8%?9aKXFyJ?vq^fsN6(3Wa_SL+q3@Gp
gLOjYS_3HElxkpFGZR(Le_G#7Cj;o%LRz)3<-|gZGw*UYD
index 0713e201b59ffbbfac0a6e288916155bb5fc76e3..4c58ef1bd36e327a81a57dd294c533fed5acea57
GIT binary patch
literal 626
zc${5P-Ady?6dpqerG!#SDI&5AvWSSb(hG0AiZPTdZ5NW@O%a(Ur!tbxl$oQnZ?KoX
zo^P`!P2I=_GQ)f)-{0gup8ran#Uu%4vmkkr1t^rbyE}4EhEs`PM46(I>LuE43|K3*
zIt@ixHph#2&sj+@-@w3HFbKs1<fSlB%*7hc?xiY7sv(>=j1&dJng-{O!bq_!p{5F?
z;m`juZN^^?X>Q~OC#7Ce)Ld_XlZ`ODM*6Er0#%C!_iO4^Wi9g=te4*_EYd8A=aaO#
zlTYW&dl#mYMqw8Jp0~3&n?{|-C`swW{)|RE;09jaC?SV`I=rmiX;eX^Ww}sXFJB=?
zu2&p)l)26}90Wy?fyGc*@S|`RJdcwpY-KLWP^<SUh*ow)E@W_hP`1}MH{;=}^=pya
z<dC81!VfoKdlrSk%Atj{bWzuTw}s{n-0fvwD*8g@pjV45iK3?b$Dr$Z4r886ugB=|
oedcsp4(slBk9GFD%ld7{9WYvakG0vUbKK+oA1$|cQensJFDG-(VgLXD
index c9cff63bbd54ef85544482ff52453e6ff804a631..096b2d50e6b2e2764323461463dbffd181f31f5f
GIT binary patch
literal 1016
zc${TY?~B?n7!E;7ks=}@A|gc&sW<1GjB(uU2kMGAPH)(9`yj`N?K{b+jihmRe%XJu
z|8HrdM!G_pJkR^)d7n4Qc((ZJ;nj3Gn$JheCmKR5s5spHEwr6k27XfD?#qrtl28`+
z@2LPzB2RD{Z#3VWkSNlyqnDl_0=81Am#%0qhwb`O(HSKPZ~@^L2qMBET#zla$21OQ
z0d1l4NH`_y2vnL>V)0d;V|;M*H)bpX66-R<QyDMdbSI_}Tgxs2wu96F-NdOyoo-75
zgda3<5?<`Lz-gcZjRibwWGVTZ%U-p<PxuDJ%JY}A#njWMO^r_l4#sc7YojpqArTXj
zfVG75giD?~@n;W<qCfNR-O{7G^dz#S&?F*B@{P+LxHwdHoCzilJ20Kkx81Q5!?Udv
zoNl+DPj|Z4`HbvHhB;O`XB<*HgIq+aiCG-NOFppOM}kH)hJ1yD?Rfx}JDHDu46TRt
zF9^gR74Dzi|L4^HXsgtV9KqBByt8|1|C@ltiQxM{zJb?+!Q0k~WqXd*pDfi~Rku?)
z`>&i0*Dw8A%5EhQgp2e}Od)^eQ)&Ea<u6@VU*dP%s+vU;qhe7GOAdq)LX8r}Wy{2!
zY__nS%|$#k3g|sDYPN}ta>+DNyL_94P!kzQ1`9_01HQsl>=aCdN{YfQT#@LV0<{W~
Z;97xt26_rKGcZt~(Ll#fa(&6&pnsGZI=27-
index 110043cc83d5c3d1d7ab064c4afaf0a9de060d03..5c34b759b59c366fc9fbba711737281ec297a839
GIT binary patch
literal 1919
zc$|fj@oU>g6vtl=A%rkOm|%=C#)uFkC-Xcn4W(O4oW#jo5;xc;jM+(d(p?g*wq>6#
zMH*&|F~%5Uj4{UkiTyeIe|C~A$!&g^gzlv8=iT?cd#9sb|J4wU&jy`~i_YNMC3MbR
z9)9*jIcT1{oH9Hea^}wOy1{}`-*>&a*^7g2UCMH?dW@&j{BtLN9dgX+OsuFMxpU0I
zoV3;n`VTY8Tqg%<<^he;=6bEe7~U}0i@aUug3j#CS`3khh?4U<&5rL=#wj_W&J;6B
z`glfPrsAdNyIicp(@V?*5V<4X$jaN?8SGqP=3;wF6E7UC-2PDW*mmlEH1(XfL&sat
zy)0pxCYIZ&Jam}5;Ad0M7EO;xJte|E7S!0R)x~#|oj%N+DECGg^;3_{Hg@5+(xBJu
zg7SNh9D8#vn&Ovwx7oSW29!Ur{G19&9pm9>(CeQK^MB%B<?m{TkmOX3u}^(KyV?SC
zk!oIG^o|A#`5k5o4X9I@VeZ^h{|%1Ltk8@!vm};}sL!Ltnu!~hJ^2J-RU8)$WZbY-
zjBSi%F(A8Un9bGr#+Zof+G-d{JjU9vdpzpB?yIBT=)9|4bq7Q7C1G5N*5V+x2*Uy<
z4i22cl+N$?JzDDAOMYbO#S6ulVWTRBw+}=dI}@W(F>#!aTw9LSsG4|X($&(k%wQE-
zMe#{i%as)%OS77Bz45$w;JVdJa+IxRn!~iviF6Vay2lrtH|^(1$C?Y~agT=!nl!_Y
zL#<juKaRAITCH|%e1mQ0n$X*EH1Dc-*WM*tVrwMcnrIKUOX9I9jYePW+X?ochQ9B&
zKYglWI}mGaTNb<5YzLnN%TO0HA>zew97os)pR`YzvP_lg`ymP;#73?fZx(s_QuM;M
z8q2~`P<tsY!=leI<I%Y)Tns2sqH+qsgiMH-;%f9Dh?*XT+wsdr<HK+(2okR_l!G8Z
zp|o0!M}uxR|MmV+_qUZTP+@CFJf?UWDgd;qDykKC;3}RQFo<UpMzVyy2Qh$BIO1?0
z#fnQg)FilsegX~=e6t4SLrsD2U|-ySCh#i+U$3FSiB>@{S!?>ChTtZXS)KqvJ(K_V
z(BWqU_Gai$iTou3l7>d|FNwU3V6m2ssPZc8WuTf_Z-Q?T{GJ<0uu6-0iJ+CQkf8;)
z@MD6u5HvT<YEb%rFwGnHKA5jTH3D@&2`~`+wprKb5M<!jP4GOn`T-gMMNps#hEfu9
z3CU2B$^vQtPxh3eQk0A3qE^`fP+Q7h$}>qvN&z9ctUN<n*{lOd!l)=KQgkB)bYXFV
qv^1_=sXXSdbfmTQEaY*(DJo~U{1|_M<P5)ijL!wr4nWFc4&Xlt6V$E%
index df6a5e37bc2654f693c520531dff020c4660c734..b44d4515e6af1557aeda21d508a254480cfd090f
GIT binary patch
literal 1618
zc$|e&{cGDs7=CvMBedfXB?uFY5W)B(@jTarQra||<2tEJ>;}sVV_6$6^3@iVCGB)x
zRp`I4ANHT_PuQLOA>jrpabNHAywANKcQG8lb<y3`q&FJ%Chz?j3xzMfy!=-`Zw#};
zN1yRQ8grH;eiXK^eZe>lT*3Wtp4*)ZKcxIiZm9HW5ah>NzI6o^Y$>HX8?Etb$+++3
zj3X&Flk#~0E#>5UBer}fMswav62=9a-9(8mq=5!El+z`Xx?{Q6J<e$%sKYV)oSzz7
z@7K%=C}%U}QoE(xrw;*J8>v#Q?%N^`)vfbI5P6?mFN&FwZ9DyF8LuR;AMEii-C|){
zyA-y8XIkB@+4Z;|i>n}dkVRLBvqfZ3nc-9#{CTJ<I;DKhL|(SefX*4eT!o%WqmWVg
zGUB^FIP$P8R4(akJ>KyV6N_lpk3u1di8cJV^Rg#Qta#o{ypGiQEuKkBp5UE3oealU
zZvM7@Ed7B_P>;k^$lJow-;`H+v)P2H_td8eOE711md0AIOO{l43zi%tg5R&Lcumw<
z%Dlr3d{0%QEk)X>;<myYmK2_{L?~Gtuy8IGhJ0KswL|vVSt~W_y?T?lgZ^~*Zfs14
z)9V4b9ZXz#($mwYUG3E?)FjPz=9jIqzh<+&meZPdc+em9?z{0?&e=qeIATGC<H_1l
zKXl%()c0o0^JS?AiAQ7RvcFa=^jK0^JN~?2=}(=`Q~ghQtD&YYdar#*jqJi|F<=GO
zo3(vYx88J$whw8&`6LmP3snPM$O)y|$q72szJ9%%P6mU#EC1*(8oH&Iz^ckolcP}r
zfO5Hn4sjKoWorXH&(<1xA(>;4lTHrc36kF%H5rh7|NXMrK!)WsjNZzDAEn`<+L0XR
z-&0dGjDGzd?KQea$LRP`+GJnt@z|8w4YUEUPT&-3!~_FOWP+(_V3x{Y>Nc2$117cr
ze&`ZxU=wS&jBV^-t8$DiBFkw!(|*@lB?86)0<EgGWVIa|K$G&7k_PIRvWK9dHdtHU
z^GanOFQZei$(CS$3wOZT!OpjE7qlIG*~xlJcKK?zKnPg&8BAM5g@+0P1(9b!(8Up0
KK#sOrK>i1APnMAY
index 4f76a9b1f6d9ca986917b5141fd39cc97e4de4db..c969f5d7e0f081dc1f2b7b850da58d42278262fa
GIT binary patch
literal 1467
zc${rg@oVBp6n-}hAq)~qkx+^!p@`VldTv*i-Cnnxy0+(1ZBg4_q%31H)nSuNn2g&B
z`|sTUd6U?fuy+ZQm-oH*zIpGP=?%wUr)YjN>5fL-$rJZjsJPnv`Hy+k7^coMXL9fw
zNfyUkgieo#RBm#hb;}i#)SoKJ!)1<F`qcMxw>ec*ad*UmMUn1E(|Nis->RMmlM)u_
zK%*PSOe*GmVXjXl^Tsq_^+zf>UHEJZYIYIUe#L~m%4+XL%#$4I-|I-gbk_+DRJ&5r
z!a%jGpyvzs`_vT?Bk6CuFM?>T1HTS&@+QG}U7R=*X2KFx3QFu6%GyZxIM3jzD|w`D
ze6i4?CJ`r#=;2bJqXE7Q6J=&pE}6>JYY*s>$?J9KCZiUVIk*;br>CQxprAwC&MNNY
zh^dwE`XW?1F}8=#yQ=nX%z#Pm<`Y#XOs!>pT&3*@&O_vBB+r{qXOrRhW}4r!-;GCf
zYDH9O;;<yylD$U84=SyIDtE==!#DelCTC=_SLWI;LU<8#zw5S3tpsV<UC*1bSoLYl
zD*At`c;dxGUoZAr@>#f4tNq@?&G=!|8%(U}pg$Yljmc~{yB%1MgUK}UJn<54thD6r
z`GEfra&xxezRx@q>?yIm;`sAtbZi~B(zMj-OR;y{+U|jm=cU%k+<U4eW~0sf&iha8
zccnpp)ctne*!K2Eu=W-AdC1P%?RU*Bc;W0&=h>%A^h8qbsMyH1N3x<^ZU}XS49SN1
zzIZuXXv3N3#59W6i9Dne3aM6FSxv`NB;r2PN8*wFSW&4G(M+X3`1BNA;-5d~v&mqP
zAI~S_qF%Df23UuBRrIRr<>+M@08rjD&_1c)zf$YqtJGF;FSUpGvSh$5q>hCE|Bb(D
zpllvpG{7=Uuxbb&9q6@1Kjvs%qjimrp$S0BCY(dfECYrzLQuvwlnny#TiYa<AYv0@
zH;`rOmPiN9P*bzu5(4C)CJ?7`2--DZ-_VeL0pmSDxCJE3`)J#Rc!Hiln$t0X9GF?!
z!T%?<!QQ3V|J~;t&@O!4O2sfgz}tf+U?zK9!u^SvG>QrY1(FY7;xAPoU{*6OF#iR7
C!j-rH
index e7709c87eeec55a85871035ec6cb11e03265f4f9..a66fb2798d406755a4dcb39eb178787e30ef821b
GIT binary patch
literal 1287
zc${TY|4-UL6n|ctrfHgn5YiAsOd*7Ta|M|(o10F+su)2-(I4g(bCeUhmA1P(HckAG
z_J{4?*tL}}nQiV~?(=!?-RHe`?QZ|VL3d|^R<G9@eDlU6;2wYaxS{M<yUF3fBh-G3
zC}GSC1MAY`gks;})C(pn+-!RRrcW!N(80dHI_@|ebI<LO*=RjoNra6>qSaNE6&Z(+
znIMi@j1kJo_&Q`B7Yz2VF~u_?r1XWUF8CAT`k0b&3|4M2_3+3iDTw2^^8Z*!Vf&?`
z{(N2UR*O=+R!(_wMcWVEAC4PFWM`>rp(TNv3)pd~7x6Pc9Eo<tjJaThiUd%TWDOfn
z2tAz#ZY*(4t$7;K*;=Wrv2ePgJ;JBqxDy6k^oJSUhh?)G%X(&ndhYAd4M;q<wNeL!
z&*`e$S}Od`84kMrGiUWC{z`rHMvpKTX#$Os33-g<Uzi$<)B6`#A&<n}oMG-x3A@K}
z6LT@0dTUlpSB=(qJS2>FFe9pX0OYYCkW^QUv26S1tbfyM+XLOPJHzf(UmbRbm$rUu
z4;*pQd=gCfG{eL69ZH9XfQnMFs8+4o*IiW8YgUpsvC*7oYE~MOuUU(rYE7>v?sd)X
z^jh~#`Mg_H#43(bDdtN}%;ZzdO;<D<dx3f7a_rm8#SwAH&p8QP!YXM*J&d`xjmEC^
zoqd^d9v#%{OpJQY>ZAFDMLy<rHVuE@i<9L}ywBeF@ZH}2?uUIf(V1l&Qy%w5;bN1X
zpYMhP+g{D!kF;m18AFClUaU>A3Sw=^0FcSbD5q|sc4D{CL1GK&II($jqRDU$Vl%YH
zP6fS3N9dCU>36&-p>0$Z<ONg!R6~Pp*wS>6Ku0?05&~UTKv#00s~W&YRZ}HZSCOiy
zIaM=CB4$Url*+<MQW2oMR0b_yE&xa(X;zjX{y{<+P>>~5y!bT@W1ZI%eoq0-R2DAg
cYljBpmUQkl-2}9xPhZpfg40SMFMUez4>N0KZU6uP
index bb1813c1e2a5e429fc1990ff4a1d986c4d5ade58..107ec7bd991dbb9dd0a13797433d60c41964a667
GIT binary patch
literal 1618
zc$|Gw0dLwy6n;HfmStHMvJgTMLRN$jWXv!YMM>Ip1L|Z{fkc=_Rnsjyn=808ws&`I
zsn)-=|G2XqW7I6+xO;x@``+Dq-`#LLee0mxi`if@8O(n57bN69|MK#Ma%5floKPG%
zociI?zK<zk%#Xs>I3<1Z2`z%=&<`>FQUq!v90Y~iaX99_Hz8|xH*H^}EyV7{mdyf8
zQpj2WuLq0~%E{t7Vm=oL4z4l9Ya;5K3e(E*H^d7tC5t53yusARZa}giPVySx#v%&!
z0i}4S@ZLk))6JSt-z$Jzj~PkCDB=g(gx!W4c}>G0^8RqVC?=h48+q|*xSxj|kNPpc
z2qIUAo*-t9h_cgwnr_y!@siN<P3R>(?X+i}M|8cT4eRBkD>@;36)i?l$c3P+GXAtx
zw>~3$LkqRFtd3h}J{wOjoZ?OVtNf0>Ls*Y77n_F~B};N2%YR{t+zR9L?g2oaLhgyT
zx5nIC5q5_Yfy)UY%h0R@Zq){hMW*ElGr}suofF0rM-{Jv+=DTEcQJi88QL@5u}Aaq
z)l{92=a;sAW6vDn)iHKm&%=ok*4xW{7YkF}dScZA5-$0w#G~vvOJ`@NEvx<1|Kstq
z=*i*JiKwl&t+f8s#v5L0TiNN=ww0gXYQO3}d;Zar@Uz&7W{)O=yS|$#Yd%~FGx-X0
z(-YT^{m{JfI1X&);g~q&&kYGZ!kSq|H%hSYd%eE(nHgJw%Z0SXr~6^Wd3@UKGVwS!
ztm|%;EDkX5vQ_l=o$xGg>Hp*}&VD>R`r-IQP1P_M$CM{Gt#GkOU%%eYXSQ8Dvw!5n
zhFYpBP%_2b7qcN|Qvraop`fz557X2(;caRgaG6>YZZsKv0I^iH+HoDup#`lyc=%Nf
zxCSJKDuynG_|B+Db@&B3&?%^8n14$JH6tI^;SC(X!7h3BzvPdC25MCU3-&b~WYAF=
zbV&kT)<9QkpsNPJi;kwsYFU+3O|7X$r73cH(r;2<R*+mmNUBSHWYk+GfFw5ElO;$7
zlA(e$I7LRz>sKnfcsa#?R*+#SImLQRc!g?Pxb_%+jifF7{xLihn9&1y%jv;?F>9kB
index 2bf8283f033101c9ca1a7f8c41ebe62fb16ee780..01ddb1595e814304919a3ea3b43c461d9fd50397
GIT binary patch
literal 1576
zc${rgfo|eP5S^~96<S%A6-5Xkgscc5AgLiFicV>g7C4e}3M2v&RhPS_i@gEg8Jq4d
zZ6e)I^?Uj=UE49{?uz7HX5O2bH#6HEjNVPq!_~Mm9CpSZJ(mU2lP^F0le?%5V&lnU
zy#Ku7Ob9OwtgaVO{*pOLJ?i_JX<vJiaq3Sb_kwxmKbS}=J!i<4v+Z<yDxIr{S*dCU
zMj>pefLccg#wBy#GRLQ!xg)w{7pe0$6rNOc>fchX098N2tM`<9bmp@ph(?skx4w`=
z<5lr!z1>G^<6ScDIT=t%%Xa<H`8;vL6(jNARxezx)(ZHx$AgW~R9+m_PTdoSdn<Y6
zhch*{2(eN`sf``S%Hhp}XcSY*=S*hfYV<-iz@+^x^?f>L{Bj*Q5wbOa!ez)eW3`mA
z+?twbr4cuL$mAk)RdT6_B0qTAM5P-ZvuM3p&GMMZHP4o&Cw*CWD_40k-os=%9*nLg
z*;^anKhQq@i*jQ{rOF-XoXy$uD#xCgQ(RK%ESPwtoYR-Qko@tLWxOK0kuQnR?I@&{
z@3`)i3E889={^hQa-lQfP_-)c+}LwT;fef+A&BoSJ-O4pyBggMyZx~->G!6Cn-Q4~
zrq_MrzCWHQ%amdAsI~KRKy{;T$GPHL?cJ=~Nu@&FPMNj3R(~M&ht}bt-i*$srvCMN
z!_H%SmI$z3n-P{=P-!`8;M5DO8%L^r#*!!O&ov7iCaOt9GmNkwTdgDelhBhw=p&+p
zMimNAJY4n`l=niHy<bSVI&C(EdPHl{oUP|#<x|-di}3G9W!cW$``L5PkB(0ckJ=>e
zV@F8JWi-8<REM^|kIvAA_T|gNblmS}OZyj}R)|qTU|8zgQ(r}WRRjR$4nn(R55JA?
zD*h$DE4Ulq7QWRrn1VV=`pM}5K0|;2zteJXIYLEv{oxCIy)g=kd=Cczq@+U|_H+|4
zn8*ZE)4;?!n7JaDgaG`|(g`Le(TGlpgygH5QC7MPrOP-*zoUjKgL4S90%`y$luH1b
zO1_ID5sHNI4(QkhlJef<^V_%?<HtE5`CLl*A3_U?8@TvA+}5C=km%gd#^2LU6h>+g
z(X<V(2Jsln4fNq_6<=F+%rZ73MDM|X@)`VAGoq%^R<*5)Z@|F6T0p>vidtzlF#ZGD
C>Y@Yy
index d068fcf066c8f3d0c15701977e3147140b65264c..093d532db7e650dc289328fc617d40e587716163
GIT binary patch
literal 1846
zc${^Ti*DLF7{^Uyp$J70icnNlsER6tD1$7m+Fd%@4Jd7?3abdKrV)Bhnz+nUF32$(
z-R1GlL!7rcP6D{193o@;|NE}CTiyPZDU2=#&0eoL7-JU&6w}9d|749yH`zR3L^|^+
zK~aRmz_`W~5!-8pp@-~%1APHZN^mgYda-SL9^aPv(xf&;K1-psaA1>1PHHj2P7nF_
zPjl}wJC_CLbuFvu&wNC%^Sqh?ic8^or5QztP~@H=$Fm7?`?ilxm*PzrValv*@5Uw!
zun;jX-`WJ*_Z~`}?AWBVu7#x94q17rKhFqitLV#^rV~!l!BRFIf~WMt3-8(C#Y9^Y
zmLd_1jy*x-d=@xy@FzuR=OOW*6dM^!qmQJA=-1F?B~f-*(RLsG;5A8U&XGABbo&=3
zzx98`IV4DUQEa+ydUS0&LXpb0Lln_?ll^WJDP_V$z=98yDG6yvAE!u&;K_+#3Z6)r
zb)JUlV-PFvkN2Qn6<#W>PZ#}9y;f%+o1ONs`>~%Jc8Av;`L;7K*{(FQ&c?s?Ye#=Z
zmR28+EO#u8EOY$6B**JtM}M|PcKv6w{>7-j9alxmc>7wiW`=RJFIw}%BmJ%t^Ko@=
zbZ7mrBJ05lEHZu}JE1?t9#Wk!h$xvk?7BoWM-H4|IPr7y-;ck4Ug`@g?c_vDJJeUL
zE!izw1d9m&W4FrC(Bl*vtzsbSljPD>9Z!Ogp!jqPx@SkU8@Om*(EXW5v4;aB>rpr(
z4r=J}xo!*?gKK?x;+sttP+hGmds3&}YyNf6xFPJF5sFcyg%1l?t;;&G0|!M$D!iPo
ztm=lbuYZfO6YNWA7X{t~#J;j>Ls@kprA;U-D53Fl8Vv`X4u5=RPT$QHpa=>THmYpY
z*w94)Kxs=9w&f~(NM;@0Cvy$D$y|Yom<8Vf`-4&q<N(|iK>X#w;+GJmq`=Zfa45k;
zA+rG-$nb#4nP=cM4^NX&nKfXXLxb5r_jq*)UnM!#J+8jOtHfg+90%|?Nxlvmm$0!h
z)SGko=6UiRPzFGT5~u=AQkkX-Dp1*8&B{O(^FYlN0mxJ&8OW+E$+Dc6i#sKuu+5Hs
ziv`GLa{>U+5;D0h34k3*0=dEt2X_mgB|zh#zW}WSv^cn4fDZ}yz`@M|oF(9lgD*g3
zGEMG#y9nY2b~*h!CoDf$2HUV)1QL{>Qe=J0@sx*osAS_B0rwgJmIZv{!Vt(z@VM|9
O<e5OYa0`k|nEnUrJ;o~l
index e825f46be15a53a8ea874088cd9a2004a24fb356..d4d7222984f5dcda894fed4887f4a34c611cd7b0
GIT binary patch
literal 2445
zc$|$>i%#Q46dkO{vZ9e?S(X(=(JG1%%BESbH>5PnLdb&vK}i-RAwmmXYMdc><=D}9
z*oD4SRc(K<ztK<Vj2{__$QF=i#^>C7&b`-@R(Ehb63!2Y&3?Z*{N9-&k2vK1U0bRa
zyWz{VgK+0=fl&}RzGwCvg0STdZs!O)HYYataYQVF<}^3gwp^FvWkxu5AI-0xl5F|D
zi!6^5Mof$dcDxzK^DW1-@I42LO}foIX34<<jhfOt-bIy%jV(Mwgj0#t5HTMvQhQkP
z<McWO5GH7P;s*|)(UyB+VQY@4)PQcqgx^QDYhg5H;Kszlj&<dt2((z<`eV$;rM6G2
zk3@MnpuDt9j7GM<K$Qd@+1Oc-L)X8eV`EG{VW>q2m>p||@WHKTGw}yS<PUs2f6zf-
zCPD9UACVh>N=qWN`2a>P=cDnkJ2)KiOY^t%R|+GkZ;=~u;eQdn$u+0bXryf`KtbxF
zrBh^#0>a)^*9u72o1!})ezveM6C7bKyn<1Ny1+j1$^8PQc6Wt9a3zc`-=x`MvSWoU
zn{27F<y*FFvE@6q)Y$S?BGgJDesqI`*J|tZaB$jhb%tucd3HHz_D(yHUS;}m<x!_S
z?!F(S$K7$SBTqWR5q(oGN<W$9n)!=#VK?{0i!Y_rM?<##`NDCLZu?$9@U2b1mxS(+
zEtHOon9J|(=A%B0WgiJQp$9L{TM@U^-7%Q(lTnP2jam4ub%WkaA0swa%~;M=Gv>E0
zaa_kkvJv>V*hV`Bo5_=cjOZE3w4M%$Nqu=LzJzZo)y>Vfu+#20FDpAInBFo>92DgJ
z>sTS*r43o0jRG?QUN4qWuS~OId<w*wGlx+#8t+A2)(@ldRjPvtyFusUVW-3I-k)lv
zn9fNm$TjG5K%XP}9IF6;;}@!sR}bJ_xF16j?nm%*xHlk9iQo^AQnU?yprw=y*pNjD
z2&t3+qQ6Fb*lW;834#qcNUx<q8mtUcw32?JGp&*=XP*vhB!_?YBH0o=p`ujyIT?yp
z)_WP|P+sY<_t>Efd#vpA+H*1#&CrKGG6!R&L;bOX0f)4Mwbc&w|2UX>T44_6iiy|b
ziJLGT7QSNQbvE%ztW{Z|)rhq!U)O3dt!k`Qm1XgnU$2_TJ|{!bwql1ZS^n@p@gOdI
zYw7Te3`MKO4z(5Y*pFpvU!TW5(<;VVMOgy-tthXU<i*f7C<CCfk41kVS(=#@3Lu-(
zKvvX2R?2{EdL4i@1FAqRsG6#)8FhWV1b|MHp(u+0K$l*eyad3uB!S$EZBBSGu@e$I
zocI_MlaQEj;vy!-Au;B}4>55T5@($F1PT=XodXM5O#WdV6kxpoG^jzP0CcFcEdw)9
i5m{M)XI%k}B0qCr3Umtm%7Gh@p}=n(xCZMKkpBg~_Xjlq
index 7bc09e1d85359f919035016d9f15319e1875b9a9..4363f9cf572f45f518049166b522d46461951e61
GIT binary patch
literal 1643
zc${@pT~Fgi6uq%5%d)H}imV7lQ8bMZ%F=*bND*a$T@nlgk$@7zON3TKJOsCnZH))m
zXw}!g^e6OB_9yg?6UQuVtvGk)ew=&G%yp+XxEv|t^WjOqe=@xHJr)XI%s>8RTsC{@
z=Fw-|`5JSUBz_c<jvrD!&mG%WzF?dNBf<S}n)@4==%FVE*~o(<K?R#(pm~xcj0@(S
zvPnQW^9FRrHts0*=|jL4PAafs{k<>ZwJr^U9J3`s{YjtA9^MkRm;5?W6fhd*f$D(0
z=DYQbNGFIUzl|nQ%p^B|8cLdZo{`4wZZwOZG5i0z4W4I=`;$BXt*pTfvY#=`N}C+7
z+)?67p)^<}$g?0>9QCIK?VOcM`IL$LfY(l`pf?<oxR~1xoicv*98M(ao0BAG5ud&3
zlGs_&HSaU=6nWh!6o{ErdXKA%+E@z9;3c>Hw<rFd)=oxzG~s?M&V%RyheRqk{QmIX
z7uK9vEat1mHKg0i2Zmff{K_V8F2r2m*W4#R$-VX4@27M;a)-Ua`6wUoKeapUg>vP`
z;>hW`z3V}RdS0eZVS0!Hm001{)Mbg7(1aysz{06`(qoz=hTC(m981QAOpd)Gj29X_
zvvTM5d~n<EIKz?*cCoN{=L|>KL1&m@2qe0#Y$-$|N2Ez;z!~-CgoScsP^I_D+}-`9
zZSNW<oYT4Kbo(b?cC3ur0WlX1T{PK8DLawJh!batf*&4PR`@LWLx!3pCVogb`9QuA
zHfGxkHTTHk8;LXYxJ6PK2Yejglixp*EYFmxnODj(_p-%*C^+K?8nRciVA}kEFiTIW
zNjgj{N}{mI*_3^aw^qelw*6B%5tIulN*7YuE63rxz$T2l(N#26e>hT)j`Wwv_r~tf
zaq?UJSvx%_8+8Cfg@RE*yM}KAUk&#<+9JMHfCAJ_P>PzWUZl36wo_YC4^mrKZM_7S
zfPVu;KA@_bP)TFO3hYC=(krmDSXC>q2A?-gDAur}s#gy|FXOMHw)Q@Q+1jhsp$Mj4
zDnnIM!Ay6@SWk3N6-7N&4+$(ES%-bEU>iU~v>jMS!ZtLT0E%ASKhr>yA;iIux&a1k
zC^aY)Y*jO~TBE5L78d9!G0TFsa#MnJ)F4wY+*KdR6!A7KtANXbqA#+PWv1G)U_}sJ
jd+6FmV5_YR%XKIz%`%kAOSHc~9a|aT{=b7~YNzoJ&nn)C
index bbc7bb00cc45f9f6b716b594175d68ee4b764c81..f4e0c5f0d562d99725faf5e9d30695a8cea45215
GIT binary patch
literal 1090
zc${TYe{0%67=CwzaD*TdL_|am5o=p#t#n=4#)i67EY%ic`;QbklbdGC54oJfLciy}
z#`X<%iPgw<aJjtC^FHsdyY66gW1(q(+!+o#<0sc)fpEq1#}2-#4-(^>%ec8&aTY~x
z7&LEP!8r9S!QEhy;+3u&I1))UL?V<wr!MtQ6frKC^Oe~i<;)pTpOt#l^HQH$`fCX)
zm@lK%9w~R}++$lE6_Tv}i-r92F8qBMxv>xR?j_?hS#O-F5eIbbA@k>l4YhiqzgkP#
zf5dC2qqWbtYo`R1JDk&l#;Uu_T`#nMSa!H#jeRk@5)!z*gDso8E7AADxg2H8kR2l%
zOMnXrxQiejz=ZMz6X|5NBu~qv3&yY4fgLw{Fq^`4$oIn|((n%^5w&)TJ3eG$89Kc%
z5YjQ)-Rzjf*P3>xZ)+tFD@Vpm@u@W#4@P|}eKUX12lXfA8J`M!$s%;Bdn{OprOw%c
zZC1rsd`9E(<s!jnTLMZQ$JwUs(TGJ#o#Z7lVUdV!qx;YwJq)|%IAfW;$>46JO$L)&
zGxKPUEom9#xVcTFlH+OljJ~|g&zfw*?E2BsF>ar~d#{_lVQ1F9y|KtPC82@64C5zE
z!hkS;C7wxA9+|Hfm2E9&OSXC2YMnQ~N9YO1QE?p9hy>*#E)EO%QBF_Mr|D#Dn&}{Z
zp^J)!vj8|RcR}u=+$E4Jn*o$n3g{#`OQ@EdMO07DJgVv%v_XEdSj)AWnHEABR4G8R
zet#)RQ<4{O0-$6uw18j(Fc?S&Ls7v{HGnrwtYAe~R7ERR5k^v}NKsBzC4>ynQ8@=#
njdvqSi(cacs8@h;psAN|Swr<Q0NM-pVgd*?@}L3A%gpF6YluW$
index fd21fadc54f8e6285fe83e5fa20d2ba1b0623caa..c6617439196fb75ebd2ebc01303d5d2f9d1fff64
GIT binary patch
literal 1514
zc$|$=VQbSs7=ArM3E>E(gfK=Kp_I~gwarSAp`vD8H!Ev5nz}D@j9YSM(KIQSt8PER
zPySVZf|sOes!lN>xx43m-sgSpy*nCD-`VKubY@K^*6iAMX~=#4@WPT0yJtS9j084k
ze&~(vmyE`-ABD|vO8V$iR)EzZ34&s2u5+iW1!cZd1dJm;B<!I88pYJ+gwuu4t_hMW
zY8Hj|EXK%IR_<*^6JrJ5Ni=+CLKnB&?p|4OOc|%{MHKs703^5|j4Y@SnTnyA$B(HK
z5JueuY+MrNliPr1AW8D-zhe<IhtXoW61l$@g?g@f6hzKv+liL6voVsFPvL$J+Ya-W
z{4|JeMc<Q%kw-+~6c`A=_rj!2bHY5zizX>)9dkrH%1&0HlNjFezH<_>O^Xe&SZsA6
zHuH>gHlh43a)(jK1u@2%C*%Fn6}iRsuI%}2JUz9GJM&$dqkYNhBdcn;Zgw<764SW!
zg)mSTggbXMR+of}f+1$qqxVZa=Imw-X~{f;aX>?l->F8I-czTk3&A;!c_OENSefSF
zpf4v8Mcfp6zq{7HA;~o<^{k#EI0s&(x90X#do-Mn&!@_KJU<($m!p|2RyYf*t!^rl
zj^ZrKt!`FcYF)`atKTc9ItSi*GC1hr(Qsnj^xN4kd#liQB9}fDr0%B}XKZw>q;iKL
z{c2>yrm@~?$M_f!FE(10m=ng6y~$ksr2T#L@@hUCjf%d0lLvKKFUg>{#n%yER|bIU
zj*ND38;;Vk3vbe~1Md_Goq_n3)Uv6-E091cLHhi7y`BK52&9ZtRiFt7(4!pm|D0n5
zUP1#Jk8&CrM^d0J{FwjplX4JL|HVNHJpU^P{i5@@=R{`;9ROTXp$|1xgEDAH15Hvv
zD^);~b<h+8G+YCCVyd`|HLT(a*0F(Wdkv&xaR{=I*%c>~ydrrARp1%YD^dlO_YhL`
zKf`@wY{JH$;Q>-N;kVuNMDfPAJVUsGYWg#{XyUd3=}vQjEs;Zn;iQUc2v>70gnt5X
Cj&4B!
index 0771e9a7e2a9205702bc78adbb4993ff28d07871..b3d6c08a8cd2ef06c42ce475159ff6ad6d8b37e8
GIT binary patch
literal 1071
zc${@oi)!026ulM37|)mxLKvk45kkoN2qBa)wz4iw-7F(XOYC-oGKOkviI`&rSzX%C
z*q`<jCOdJ|4km-H?zxY1kF2xd<cp7P2h-ko+?#%95ltkMj~@os`_?dbeljY&hozut
z%6QV$M_&?27b>MQVv-6HPwp2~uux~<GnNqXsDZsciDT`yH-)|wESYJ%uIeI%=mA>2
zG^Ik)=$wWz5j2{R1#R9C!N^@q*C3IqwDB*-#mA!dil;2gA@P-pEU4nn+8nDmn<bf&
zfQT8Dnid*G?ODvjUw+7!^l;m*Xp+O-0`^0}mU0mDJ0&cO;3A?%%Yl|A)SB&_q2A|;
zI=QFY%f;vX>zu_J=y+sC#l?LRW?G&}#}`~Io@q-vMbf1hQ#t2R)?9T+>mzbU<5<mF
zG~J!hm7c{}Yp7kn{CoI%8L4~?-1@<EI2ri*+5ABr^EVN-oPb7!8gzh|>wEoRcsa3S
zwqVi@hQY{l=);nR(!KGfz6v=j&gYyXY~VL0KEaOHANPKAO94$~pQN-JalFbd1Gn(E
zh_~DAwYOq&jtP#}q&VEL;<S*b3iHgPPN!Q|sE}DpOR5d8gnERZDT$~E_=wMpg9CJg
zPHuy#=V@WDjN_W+A^_Kd9oJE|1Zq`FfXa?#*K=F4cXR957+KH&wY89Gm<CvO1svrf
z!+_1&9G*^}!%wF#;kSqX32eN|r|m((P1pxTV?Z1Bj0)ILK`y|~q2bt$`x*n7s9rU<
q6LiWgvkfNLja@YkdI$Sevsp%6*t5XO#?C&w2B!TQY`Y3Bn12D;hB&MM
index f98664060dd148548fcb167e51551f2b16731be3..150bf44319a075aea7b87889a1ecf97e3c907384
GIT binary patch
literal 1376
zc${@oe@h!d5M7TY9N{=5NDv8O8$?ongfxhV6|IS>P0=X1*cPNMo7^NWZf?WgrqR#P
zKl)Ys5juC?<zh?kU}xveo0+$>+w62dde+@V@9gU8toK#;5Ex;e-u|>ts-4&w3DE7w
zsfI8VD%i@lp5X>2NU2>41DZ?EXc3GvLOsE|vk7Q1%mS<_0<NDjpw!}0X72tOnsE@-
z?sGi`lPRfSs*hbVq?(bl3K0m}fPW4{$u;<0K7q{?Y)UnJ@P=v%`FOk0h56DEKXEPi
zK*Dn_H;8TijVVn|(sDN{6cLHb8w^bV4;{5D-@ZKL?t-7PVhN2D_J&$a&4pA09Ay+?
zX#|_cK&h#LKP=|X&ei98Az=a3+k6cA{VW(pa+c(?_exKe<c0N=bgi$z+$+DO0)rL8
zVrR4{SGnW^kP?+G8YDN`R7wI5va>nQ;@R!gM{0)OdHr6ed*NjdYbW<E_k-(lTpQxP
zBA9{ewOjqpb=TUlL|%%CF!q#(VZPt#U$$5K5SkVb!GXsq42_G`XVSb$Y{UK3?s=H(
z%$2%V%3_qg&aq?Wv|Cqa-y7$HXl(dsn3@@;MvOCG)oL|1kEX|@Qq$hQ6!|RhnVK<+
zzDn|{?8{PYF3kN>)-X923)9(QV$9sD*BjqPT*xB^Ke(J>*w0vuk8r|Eg<@gTh!6e|
zLsvaODl*cu%LeEK$}GS%F?!hrEUZm5KHK2J<{B^X18^U7UtOxP^@{H7SbNs-UBB0E
zXSei=9&OnLi;w~(D+L$rI>E2FL9CKX>27S-X(hHU-L~?iL2x;+?3|q=l$MB#u0?Ys
z`I61=(`ESg=}WkB{GUMLt-V`p5Z)&>f^8_a-lUA=39|}>tkkKScMIie6kB!dg#vWe
zsDo>fItLrYHA3j_;Yw_+V{+u!`;|lcgxDk>W7`{XLaiKU)U9>0Y7-hAFZyYf*ilbf
TCIw<ALApsDvX(kq=oJ3|=O~j?
index 93912a27273f4261d49c1688c6b08db335b1c7fa..c88897e3f7671e9a88532f27e8a75b013dd097b3
GIT binary patch
literal 1355
zc${@o>uTFD6h0Nk1Y=AHrGyZIDWQa3LdZ%f+vqJ#+l(eHvAYe*7>cbXS{*CMO0%+u
z*aPi(_P=ki9lLd$rA%NS>FE2ubJIzu_rW2z=l$bu_qhLs`z%ykJ-+*uJF0b(!yRX`
z{e2=?6mbzYF1cco2EFN+N$zDA8`;)TRIxE~*H3up^Kh66m0L6jGGwX8X4$EB97Rkj
z=ASYzppyALI%f5kfR2)=l!5o-DBSC^@qkGr@?jW<bg3LNb&x7ui-;>k)8Lv)R70s)
zw3ZPv#qCAKg~C2k$>|_q&sot}uDa|K5^OA%%EydYc1Ju~ke}z2X5x5a!tB(Il8K|y
zrb8yrrlA){S_o>N2{~RUBx<CfE7@ggB>a{L6_ylLZvM^0zM1$qlFU&}gPsJ!yHCP4
zQ<vjOK2hg^7+}-mo89H^X5%yxe)&W)dOx4KeJVbUc);e4wa(pqZ$8W4I&QzyJ9n}N
z_nYkN4^*0B@Qr!Oc%Z?QSuaYZ7kic5Sx&p<cCLDP7WxT{@YUpv#I1-7x8q*6^Dc{2
zi$=`)*zP+BCR=1j`vb%_+pX^L*QSXN7{~nC7xj957K__6u0}Ss13F*<^KB2C$-^nL
zqj?>^NRT^?#+ynY#Kg|R7N7I3CkYjhB2}D1PT|j<Nd#Un>NDwzOEJ{8wzQoca&YVR
z+wH6cKlFp9Vd?;84nG4{%mUgqz*Q;&Dd~o_k=QlMPHe%dYB|^j{543WSSf;GRiJ=J
zofweQ2_)<3aCrl;ggN?ow6uARxk#@r{*SqSjd?npW4236i6AQVAro<R*Z|OTI&8wa
zUH}aWB##A|04p_J*Yvz@maB-+R`a$7T5R%=kBtdtOvOBqN(w+?3eicqN=ys&b4kan
zdE#%^fM|P-XD!^;S9W8g)uFj-y|3(nHE+m%xvUwmn#1nakd+53J#OL=hqX>(vA;J;
BZ~_1T
index 227cf1e4eee2f221829d450cd2e79fc978db9211..6fff82aa07ddf564273392735a26670669bbb55e
GIT binary patch
literal 1363
zc${@oZEM>w5LS%{CK%I&5K1XQ3#DXz30VlGWTh`j-7cd^OPp?lvJKU~q@s!yWTh{^
zVITHa`wuqRwc~VSHu!YUJ$Luq$?b0clWSa`4UT)g<H0xPL!g*?`tZ{{sCHv##6UWa
zQwd?nM6i(^T}2g4G^KXV6iCWlC0Q`e2=xT-&n6(5mjy_h1ynv|z*>iLp1I9qZN@=V
zdr0LNRHme&Q+?efL#i1$s}O-875FFMaVo*@(+RAnV4Dl?&h^9;^6_!C4-X3?ex{Pq
z8xAkIRB3GeZ%jyZke0g?A&W?qU+T~V^w3ee^404hx99wn6-#KOu<J=SRcBn>=v77$
zl16m%7+7mdpm+1VlN0gfmT{N^b%%~Yp3VX<lCvP6oC-NvkQdfd(uM4Sx)pv$1WH#3
zOWo1DT;-hJ0OwlSyg_oKZ6P?&Ae+s45l^nBzNTjQwL2Vi`)6+UW4+0>bN5u*iFVs{
zI>YWo-`Fx(p0f#4=9GqEe%KwJJIg}|RfmRP!Q&J>W$UUluHGlMVSjc8u1?0kkwGwd
zmm~Ycayq@^AB~fnXjS@0A!4S87!gW*QLEL+L)4XUA*O?WDLfh&{1<A*EcqhItCFt^
zu?MDZ7qUFPLl(?{gz3I?V$9sB*PGu*l<^jUd&*}z>}M=OM|!IZg<@f&h!1{Cd*TjK
zjVUEdo&_(<0iQqRMnV*HNUCUarqUnsAoZPn1nPqvigPhG-r}t-W5?LP9u6EQyO>|N
zwP6+vgbElf6>M!+kbX+5$XK&6-j3}GuEf^Hn?@crk^bx%X3oqZjMtE@T?6M(@+61n
z!$tV{@HJdH_)j45ibwN<hIdg7={6WO&^jh4kBCt~XsM3vyj>_)qu8=#&J}2<h%Nms
z;rec)R741G?=8jF*hl-8*{rn8BV?j{jBT#Q3AJ*ZVHqoE*+e)RFM4qmnNd$%Mg?Rh
PLA;JFR7{->?UeoiBIb`m
index 61e737e14edb7adfd1e75091a4141fd149232d26..f632aa928e370c30c40f4025114f86b89cc7ff4b
GIT binary patch
literal 1216
zc${rhe`^{+5Zx??$RQ#UBm@bINRTA8#-yQ5Ly4M;wdkdIm;NA>vfiz_<h+%=wKgBO
zAEN(vcB5WWa^TL+o0<1!=FWD{{p8`h?yxl&w1z);$YRCS!}~v(vs%wMW6q@WdoEd$
za1q!0Tro)_Pe~q6QhYzXdWtGGgVNI$_>)*)eJUqRrG&LKloo1`NyWk|7DQCC(4{k0
zY4bP)skFA-p;7ci`3setjw1G0MHOJx|1lw}Yw~s^f_pCzb4Gxg%7>K7HnGNPM0YV`
zk_Tyc*JaDpE4L-1_nToWeL7-M#KH}Nj@FW&p@kU(QX|`3!(JfyTy-Ncf_<8X))8p`
z5x5dxr#xaC&W1xLOkOYIK#%!kVsb6yj7A%!q_IxAkprftBJ7A*0Yj2|lqI+G5J=N`
z?mU0kbGu&p4ZO}=W`0qb_neO3yK%E~nk1N)T$VtKW?b9v`F*G01Ja=h%LCOSQpYRX
zEVggE?(LxM4D(-{p$8l`k7Finv49p=Sts}qlibPiS@YdV&gl$VKb!TDUM+zvBF4m&
zkVuI6bKH;^{97pM_4-n8iY&RB5=tW79t%kTQ}cMiNU~mGDHJC2Rip9dYD{@_PC_1%
zmn1buKTU~+A}@8I)7<B2Q?5WdWQ2}&N;*O_Ud%>thidH-^Qr0Al-P6lN2wz8DV1Jm
zR>47*5;8tA8ZzmNzL;2thxp>oA39F@p8n$IzHJu~va|5RXv?<2ZX<Y#1%!(^j1P?6
z#ua02Tr;+aiIqoZ2##}HDwoO#<2_`9o7LD`bc9e2I2)*n&{iE)YQSh^GnrkqdcetJ
z3(f*=z`2Vpva<uq_@MOR6kTjGzh7!JOG?^UdnHqMWa_NF9nd<(C}RlfR#|Ie+}wyj
PWQA3+h4O1>ADqHJUtevf
index a3cd8cd9b7afdb16974c102db212dd13935ddd05..7f710b15364578d276329655917a914fd37a79ab
GIT binary patch
literal 1473
zc${@o|7+q%6n_pOgb+dy5fLe&h?H(Co|IC$Uud<q=ThyWxxF9Cag52-&Th=eWZd4u
z{ww#t-ka1o-X14rJ~N;9<@4T~8H}eN=j8Ejc0HL~&;H;E%M@4N-@bQmkH*E}i8DF+
zYb{xxbCLD#xnh#010hmIGh^tO?OajCRv3FY;90`6rAc&jo##v{mfWy7rIIC6x?-&%
zO;Z!DefTod2@Lt64E!W=u8^SVCn_-*tI;{S+q&jTqM(UuPT7k&UFgzyJYlN^lSU?@
za>>-mzR|=$yObWJBK|s$#hSUrww%Ruvtp9RCZrWT^L%eKpQ+?@k+RpOsV=|$Gbdz-
z)1vabi96Z#Ty|QBhb4_E3ZgfnOD1nOS*$bfiG;U8uJ#6%_e!S+IbrHqBtwxY96(+l
zKkaVq?B~Il>uU`pqhEKP#~7Y$Z^M**cuyBBO<A(@JD4%Gk>*|W%MRwT<ZE@8iUr<W
z(c6vq{h6n1=jy$>guks5WQ@q;JerNCcXRV%Ppx<MH!3}`_`+fpEOez08|7~^Hn;dt
znEk>$&T7RC>JD;$J{m^jhpC?mvBo##YRrAq+obB3E%x1L9NmwCh~;WXbLM{@&E^>7
z@+{-b6&uAFc|$^PG@M-j*{>y{+wHz+-FhMlJni+)2hUuEu}D}*pHM&4N+HkipKVY7
z=Yay-Q#DsqDqV-8a0y=|w(={Z36qhy7fb6D2lC$f@#8U?jYeinf7^o(o?`<z4t_pV
zoCabGzW^!#%|jq<+YgQlYz3VH8^Mv~LJx2`Bb`Ge{h$pEJldoRj!l5T0TjRXm0>G8
z7OwVvD_hq2mv6}in(f00fE^GNJt97)hf0^&q;U*jSvPQA1LE~N7j=YE0$NP~@{W{P
z(HXEy%z%Ab;1d^o%LCu8>THf}*{<!`Rh`qdyjtjir=bc}4HgO^xUaSV0-etOZ$Xw*
z!%pg`?-sMF5h$=u;4;*uSeFL{T)BY#kYeA*!mabLq0v1*XjtA^jZ|>0<64ELg9ARf
T=v->EcGW|JT50KC?6~?rdzz3|
index 02dd86656ce4296faddbd13842e9ae302dc66ef7..c1a95b39f8a66454e1bd2763f898c24c0a391fda
GIT binary patch
literal 1525
zc${rg0c+Yo6h03LAxJ19A`&Es6zQBeSGwX#X|=X<R4pcSj55Y)UhS=Eu3XN!LjU0Y
z)$UGX#7^+N%lCcnd+%M+9gMzu`0i?QJ{+D;e$W6SLB-4Gzvfx%nhM|~>@pStiTZz@
zIm9t#QGK9Q_Y`;v?x#mj5CKn8QXauFg&PW|vmrc9w+rj%GR-5UPeG?g!Z3ZTc4-vQ
zXr4AcOsjmt=O9w5xt`k-T$ZFJt~4S1B?VATngACNbVD|K^k(cCEPbpe#0AVk!XX%u
zCpb;O8x~U`>q&S+xFlpZ#XDUN<Z-k7L66CqSGu%kad5v;9B*I9?mmwHK;y0Jy(OHI
zX$Y%{i1MxNVvIL7GbWSit=t5b6)WI^eS4rGY-VZo$sG9QBAO}ZttRdz<4;?g#;rs&
z=0gw<ERcH&=@3`1$rQp6f{kfAY3t26eHK?Co66Us`sY^2o##&mqbo1{?uOaR9Gm`v
znXuO*me+Z#QR6q^w%70ZgYl?1RTn;9h;am)v%h57*VjECV$mZpSZpCESpLAj?%P^3
zh{_x70|zi@^ud%W9oi~<wB@BQLh)gp+v}X*hxToM;>iIl8buWFJM8BAz2W)Kc1b(C
z_iVvC?rJ2LMbL3qEnT4+ZWys-9k&p$X0y3e8x{km^ZQooQ$7}i3$=wQWN?>Ue$-!p
z1i*cE&E|Lhq~A}k?Ynt;Vma7APFDU+BjXfgJ}?kM)dK@JY%_nV^Fh9?b0L3{&EYd7
z!v!uh3r%e1Teu(}F*b14MC)G)WZnXqw?O7Ckl8ie0d^GsDOs6z(IG;%gpN_utRM$f
za0OMeE~*%1sW~!j$FA6}T`sl|GPBlx-NKGaIb2bxgk6=2xU76IRzA`}`5$2$sj7U|
z+N;WD)?Q7=eI4rvb@FY5$|Z!Xnu(F6PT0*CwLH^ltVvUmxh=AWG72iLphi(!YN)iO
vs>^*1yl2W+a8y<HY9w4uuuipLD^z)Frj{_rl1Vw$Nb~y%f4Iw+G++M*WY&NA
index 9479eaf56bb28094574022321f501db3366a1676..5755ead955814b8360cd6450330e007e47954550
GIT binary patch
literal 3279
zc%0o+jc(#b5Z+h_S(b$&gb+d~vJgViB}WJ$X`0I~2}y_oiGZNCxof(%H{gr0(RxWj
zU!srDSG+f9XV*4{Tz^vaN7W&Xhnf9m=bLYLYmL@LN4h<0A2pjt?GKho9A>e}yPuSc
z<%S6EEkf(hBT78aa-CxIx5F?aLx7YoEk-D|TjL?2mJuQHHOnzAryp%p3ZNZEAs-=^
zk35f1M$8jp*q9Qtg@+{DB2P1&dze~Sw}}tI4045+IhShC6VpjlS3Y)!qcLpVBtw06
zlq&SJ`VOC<i)o**h~_Gv%`#qAWKJ-{*VG*W)k!fJC5$;^?Pg?xC{aZroU3NL#zV&d
z=yKFH!YN{Xcb@7?exc4a*R=_DqH44nwz&ooh6GTe)&4Z?dKT9U*oFW>H(Uo9MM3Tu
z+xCofb=)WPbnF<sct-c!sY@Ht1<)WI&g|`#!<sAFBy8ZC$F9Qw=;dmZ;D@O2O8-cV
z86EPMSSPkk%qb)TdryN(NVsEAYsAiMSBJaAndf;2%Ndg?R`oHroo>6)I_pGN`<?O}
zf5cREMQ_PUbn3_5##KwTiPL9;#V+yKG4@Dm<e#iXyli;LN0j18Y-J?@e8)Dc1iq?>
zg&^99?d=7B*VRXCkBKL(EC#zxQazp#_>?gq#)FVVDoY<yy48oPuUphi7;qD?Gg)*9
z^9(#937_q)Ji?wQPY9;+kA%9?+t@ECS-UxF-85_Uc0!!X-Fo0Ff!_%Hw$g2MFYC2O
zc&7IgP3Mg@cg!^RUbDII#ME?t5!-)+xOZu(RI(h+cHL1gKzgC<o(3xb5vv+JWsPtN
zVATv*R0F>m_^%SZdb<M$uqEV}ZyGj}@3CcPeGy9jLFJ?K2{P{kG9l9`Db4aU*RdxW
zc_s#bU=SHZ+LbhQW23zNby=++H;?WrrS5=4^F{S3eazrq>+tH5uxvSR%jI=@z}RSK
zZOw!GH}*<HII<Ghnm+D(BO9|dZ{R-NK~ysO)`4a2ZB(n<o1014l`?+GWCkDYiNdQs
zC)gyk>t4G3+itsFk8bO?x$~2>vX78*2v!3-0lNlkgLT19!QyB^IS1cE@GB;ev>1=e
zj_^HsApE)fQTToNKJX){f+&K|qm<N=8j8y%I*0I3+LyCAIfle<@i3b!$>nTr%TFBs
z42flV8-TUf0#9BGJbf*Yp(;Z0LkaDmRjGs|gci1?xb&thDIBXv`E)`>X#~E&{Z<hr
zGAJP<sh}YwN%<lwWKcm)At{9t$sN8Hbp3Qt69UD87@?$&VjQr97Sl1mUPX$G;#@Yl
z0vn*1{Knr3#Zst%VgW#Y&+9Tsk~!Vl@6lCX(tSaIvlq=@M?atb=eeJJ&ONRaL1`6i
z2^u8?=b~H{UY$;{6v(e;kQ&Gz=lqv4XvycVa{g+>e|HyTD9Yc3JiY+}#W47O3ga~|
zW>KeO^O2UOk>6$-@_DX5pGW0qq2$4GU`enHSPBZ#Vv^i+0}&?Y!_0h`nh#_1VV;X}
zX!~ODqsf6n`I#g3vq_MG`;_=*LJfXcUPxw9ZmL9>Z;5;|I>Aekh^U153z5&v3DW)_
n2(tR;f~@{$f^`3iAgO;zkl$9}G*sd5&H3qo&w2U<z3g8BFN=WB
index 337b0f21fb53e1adeb80a84564da747a9356ced3..debf8d770674d0d774f13af8bd23b5de32172398
GIT binary patch
literal 1413
zc$}qEVQbqk5LJXR#u#Hl86$+Dg;LV4GhQg8Y-?$grCmmoj@WD;$|!20rrI1U$V$8Z
zjQzm<mz|WjD%-v-!FNwjcTaaGyE_<tO!39(_;@%x9)IOiRw%CS-~RO8wFhQ#&6(`~
zSV&fuTok0s3o7p|5ub6zB+XMLc`>v6mW8RJip@c**`s-G`4(tRA<3T87_mFM-^^}!
zX_xKevSd=R>3cTGsbtd;oik1HS)tW!<i0+UPljxM#iR|$sGKpiS;=&BG5MZO#De(-
zChJbRLgb7VRu1h}DW9l>Ga<^P9X`;a<O%|5{t%#RBh~(Ax=Kj;bjIY#vY6=TRU1@8
zaw6pXQFfVBLFaPF)Qy<-M4_OCatpLLy~^36?9D$pA@~05+RixXiTPp)RjtPJXxvc5
zz+P743s*M}t4`HRI+1*#PIGYucW#<mk8QM^Gs!1bFIa_Mq}g~dI!*1n^~?EyUj*Xn
z8=I(TAwff`d-s;g&{S~Q3DbTr8=Q~U>sL`Vjc9m(Zqoc)nlG834YISoL$;mmizs8I
z>d}&gpZnt!lKrpb;DC4xB13IRn;hLiOC%R!L3lwZxfU{xV}P29328eA2bhHG7a-{O
zhR2tkIJ;psl9bg%>cH{hWs-FEB~wcYpT;V$O%%Mhv8j-3x7M4M+x?3nFG#Dk^DjE7
z!+BEa-aG}SuEhG3NC}uYTp)new-=hE^J{V^;YL0%I%P5wXJU4djr)B&{^#zS*FhAx
zDDvQm;PKsBv;n^9q8e)MxOmt1oy7R2vupf@6T2RIgTS0%j4(pJ(?%Pc;3JIM=ou!c
zj!<n2`}JlEShv0r)=^!%_W=sAv!`L#z}Ffc8Mv?Ep@ALH4sZz8Gd92hig2T52n_?Y
zQ!V$A`FTgMdWUosK~)7tHC+XUDr$HS;ipf)cVcIa+yFH^<m(pf-`Paid5Rq8nbQLM
Yq*23LiRL{-%r5f1f9hM^z5mev4PV)XQUCw|
index 952fbbee9b44fd08ac97c05b2049749f687c3672..1d084e239702adc828201a078358e153e6726e46
GIT binary patch
literal 776
zc${5P?TXq!6di^j5<-w5vWP5$h}chD*&j<key9yLMN>$!`$yU`nyU_t89Nzk_hI@R
zeZ5|zcGwP_8Sc5~e$FTeKgD!DiH5V;F!~}=$hFXqZ+~0eUQik<0m}ciQ&1E_=C7wh
zgW_4NmB`nI?+uFrl!o*JEHkbk4fz(@Bax>lGl{wnTnWC&;3VT3Lp%R-Qguz@SaS_q
zjBky3mOU*f*7?z6$Xi1uT&+Qy$_#tq>d|QX=Sjl-7L-^T2kBg98D(<$JzmNk3@%i>
zRAQ$mnOxuwjvl)dHG<W@Mw=lVOg85fF^`id2q&@G@E`iT@{=n!_Qy%^Ido9J&$OKc
z$<(KuF1*qGB)p%E{K$RqqxdM<aqJ?cFDP?vZtv~}1IHiFhTjIY1PVRo1+<e5FtK8+
zxHR)_#YG0`8^$<$&larM$bFVF1$wV?)^}G@z3TUGzG6`CEP3{l9X6l<O`fMn;CHfx
z)Efpr_B>-+vc87}ls=ZNYP{G%;W9r0PeCPeD%bNQ@_jSwkak+G<q%>~L<Qj@st6ll
z5j<B_LhTBrtbAR1vMaPzz7B0TF6j`wdbIA<Jwj=nR7zj9LC&W%?Wd+iYpmu~iGAH9
YggQ0PqSseWn>5i&+q6b3%-JP>0m~ELxc~qF
index 9c7855e014fbb12dad64e2754e7ed82a8e2df921..42814f00cd0ad522e568f865b19b036913d0081d
GIT binary patch
literal 1128
zc${5Q?MmZ76dl75LI|N0ky45brAYCM;)*P;y0+cuc4@0L(Lb^*)8w`roMggey6RKx
z1MExgBkUxaq-%a;?wothJ@?*ZFq(dIwTJ6je=_OMzJ~$CGL$c${ur0tQGQv3Ae`q!
zK$?a;?u|nUg0kr<0ulOEVy6mSNhL%|+Zs~FD!e@i;~<QeRo!ksO+iQqzJSlDfM7}^
zAc{uCOQkz}^K_+9>NU%IDndGE@T#U#VV(CF7oEanz_|bD`aA(M4=;+uEl<NtOxdlH
zM4;TVMv7SnoHL+tWsLSqWx>zO9u=_bi!hPbjL%iqS%wrD)m{!9D<E9P*_J#imLRL8
zv<3p`W4XlkkgG(zf)eRDbP3{W75iD!Ys0skD3LEEuW`jic_Hc&tqqv=iUK!c0`eyh
zG9N`uw?>P~d`#!Sn3||Snp1eHHetO^x_$Tm7bAB`p!gN=;Ci#s^xCa{u$6YG|DvLv
z8+edPOHo%$+O9M7MmJNFg;6L?Z{&>~3!W43rT)aZwrAfvGglEbVmZS}|Hn}$F988b
ziyqTjR&YpD7|gR>626jzF9;><jk@51FwT=xQqQ4-UhhL)>4nUchEy-|B-H2s3N!%W
z@iAZGy*=$fJHzMa58ljis!<$#N(@s&$kfq>X{xi1)YGUTt#0V{c7E3Ft^73Y2G$Wl
z>ebP#npH!(y@^b9)v$)%o-$a6|9&om96sy5OI-fG%oELb`sT*Eu#I*RGBk{i&^B%$
z12r@Yp^Y9k48v-*H4`hQeqtZy?N&Wmy9k#)7ig!0w>DL$$JRc=$jIXzJ3qSiKK_WB
O2GXsX-BJz~!v6q<S4MvT
index ba3016993952e04be69f5eac0eca3cec676d1128..f13e4ac004901c0174df44c2c8e402dca5ef1c40
GIT binary patch
literal 1467
zc$}qD(Q4Z;6jg;V#uyVqC?SL*N+?;|6*rVp+O@1n-8LghM;!K2#!zB4_2yVcR<~ta
z|7Gll_8t3+T|2RzmBAkNU`zMt+<VTwQoB2N<>K3`;d#G*K78wYJXF4#pZwC>&2Adp
z`CK}mBgx~~7vWydS6s5dRniZq1-?~mUBwiiLF#7P4?SQNbtoWA&I@k!f+_Y|iik@!
z-&)qr;sKlSdWQu;!9P2XV>sg8YZ3bj0AMo-JV;FF2XO9B!$f_=<dmyIyP2h4@JYZV
z_Y!_11KWX^d~hcqY^2+|GmF$bZ-w5B-}8xD>GutjJ{t#oQH>>D8c#7H(Qa-yvzdy}
z42F~xXcoo`k$PKl_8~WM)Dg2tJcQogxOQ^*02TXuHeS6k+hJ2KFCW55;&H`p{Zhzo
zaa$C^*~&O$JIlF|eXj0>*AbxtV!YX7V;%(D%X97J&9#LHI13B$+JJv5qE^<mJCS~*
zt^zTJmz1<`E|6PyH0%zp+~OT}w1Fwo*_%-0AyC>!CN2Is0%U)=wk+4_jJh|2a%ybE
zV^zs_tx~jnPUc*Qdm+f_sYOE}r5_uk?x^Qz_x`RXLau+|QXp*O{Zf+HVKKMfI71f-
zlW3nrExbc^PRX}#m{yhrAk%a@{quLNMk>fX8fP<!D{#8xm4oE;xox*B5K45)z>_M`
z(G~pYCkYe0=FH=ABzj`{ePQ;P-U&&YH0y!-Azh4vKBHghVkC6ubP3*OytgNGoV*>n
zC_^6~fBbjB$0sGNqz`E4b~JRH;>LcGmuE)BB&cG+XOOi@71ky}2vs)-rka7z(zS_?
z(zS|@iG|t-ewSF^)Ax{p4^S0CQ>zoh+{QJ-+{Nqo1wPEdO}t^44P3`P{1QOxPi76T
z=U~p<z;ysGkd2ULYUmI(v=W#qVGWgtj?mhHrXfw!^vx}VbkZziOpnUdb)dJ(z)W_S
y?Am3#m!#FU%Qf->ZRue5)$y9%(klofE&c0>hV?HEV^ss^8l=zwiCp9Qsm5<@6|YSI
index 54835177d466428ba4cc691bacf21032d13ac6f8..127c9d157e0110d95787a3994a0f8a9ed59e8c4b
GIT binary patch
literal 517
zc${TW!AiqG5M7oflu)FIh?F8yO6f^Nym`>3hEi#BNQ#%@VVaC(=_VVeTdAMmFZoq|
zg4?upMdva*@6DTev%x5OO!#aV_a~En{46spj5P1JAEI+LmIet_w9b)a8g5F$)k^B3
z>z;`LgSpl8MwRkKB009#w`oyqc?aG&a0;|Q<CLudDCIg?$F?FF%mSs;Ws>R=dk5$N
zQw4-s1UX(Gz$7JEnxWEjP*r<7kVPhoh1=m*vswWmEPvd$$1q2w?0^Guxj#NJWaZ9N
zeYc|f1SDauaAyOIr8<8xO|xVgkD_7X{xz!ejjy)byf>f*RK~+sp_fg<Qj;0zytH@C
zrg0cL+2{E&Z!p0at6d1*K4JAHKRsg1<6e#J<LmB>|0>x%_k|~fqiyYb>|eBM-=&nK
A$N&HU
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 00cf1750645703c23f9643976af0dfa430fc05fb..2648e0e5a00f521d7615a64eff55635f1a28d01d
GIT binary patch
literal 1378
zc${5QeM{Rw96payju1*I#g!s*h?JtPMCVi(n|(2M9kxmno!~aPCTDvr&6Ug5mw(2-
z<GzR=VV9;!8Vk+ue$VrJdGcJ^y}>sN-gSqqe!n&R$z1A7CSN|?qZ8wTNh*jpm`|x-
zj`=(jGzb{?>%B$Q1EV4ZYw6LFMAE4$+2|0@OYyBX^IhhT)Aq)4g(Zc;S2nbQfC@?7
zGwOImP<KG4^iY9p?1zJGBF0pvb51&ZI^%QSO-s^YW$TGaXVM`7t=$m8$jGD7Tp|^{
z{TAZ_E1^WZq$9q>daiiD!Y1NfsnRJ`>O*O<Rc+2aO8m4D>?NIXz2)#3J&0k;5o{*A
z9v>+eLI%f-lC=N~lZ>f2pZiX@cttoq=VH1dBrxKlOVOut!rcz{rLrQ}Np5oWI;sQu
zlxBLQq#BuZMjy!BlZR23T<CWuV`}p{Ytfx$4|{{Im3~71U}I^$O#_*KBtloUsx`O!
zxnP+cyLUOzm_M6K&F<M3rcR${)RAzv)V}TxuKR6sShz8VmMVi78v2L*kH<&Hy4mTs
z?hlIL%<xL<_JrbKu?7dR&XPI_8J7H6QtCOuKF1?L$?sqfJE|4aM16qOSBCxhbfkQ2
zV7!opS%Aw?|9ivOM^eqhPeOV5l@gZ<n_uuTdgRQ#vxlaczWF<3Y-xH40v*9M9jK_Q
ze;EP*YGnx55z?Yq);1PV*YF~iv}!I7w}5)=z)G=Fgh*S5x=KL~WPg9}o2&5a>GF_;
zL30^@WndJ;KQeGJhOaVkIfic|cw_BN4zl@PHa&`S@TN|ytmbu4Q^M5J9e{IHpn)nZ
z0I*iiAq^Eax0MUZzx=|c)Qdx?p;D5;TrporUp*#XPcuX@AwV-j;DkU~!e}03@@5m3
Wl3^J}8P|ZD2%<_++lCq}z}$bnJ5_T4
index 154db380c11d849b36b5e3af5ef2c4824b9e995b..940ebd360aedbab6d05f5384e77794e2e6a8eb16
GIT binary patch
literal 1318
zc${5Qe{0%67``4s4hbQM6cH(h6p^+oLCPo{Tcb8@9cqiox<ASoS98^4F(;R^KN$O<
z`xgBM+eOW<3g+&8p67k?+<WN_#$R1{e>LfjM%~E|=F?Cz`TFS(I<tmMQbB_8YC#2?
zIxkB>qlodaJy@$A85J4W%C@c~k}i~_(I-KW;msZkeHPBL_LHt6W?`)Lh?r5CQKx;r
zSn^fqXOhh6cpJ@?Liy#ADKQn2`WJK>5JCMhS<tHc%;a?5ClPJk5y8kqKsP**s%QT_
z#syYEiFnO?za+l5JYsPZ32v2iK~;+Q6^)*t<X3v`WO6;u14_co2OOnFNxM7cOWH|b
zcPiLYUIqL?9WG{Y!l;yMz;eipipy0vjdSGAfiJmO<Z?w;BDxVHD(Bqq^H8dE(Ls8#
z`P-?F>2p@;n<Vwk>@MgdSq1WBQ>Ewp&SXOEeJf7v-t{Jf@s*o>QNQ8Q_9i?UNnPnw
zTj_}i?eMeVI(=_&GcL1mxsqjX;0+y}zAWif!b9yJFz%d*t9Xc^r91sm_h-k9UE(`!
zdvl7TwK0y8WEHg&GM4nVlzPr_$nisbQ_&g5>sMhG;p#^5!Lm9?st)`t)O@Zf@u~3m
zkk8N)Xa2o6ah&Wle@mTxWFl?H1R5}P^{;9GfM!*Ly9gQk>$Pgs*Q;*qX(fn(dbDB9
zteFrQyHHmph?@$(nw^K=&bJ%000Vow4ht|!;OhcxCh+YB-rGrBwlyf$$HnsW;C;p|
zVbt<<3$#@N_0l8I)asxN>d*jS=RiYcWZ)Jwp~_QQ&jY4TA7L3)(h6#NshpB_LcE=8
sdBU_Cm9)n$^x(7y6$#5eDR|h*16ESQf>uq*f(-;w%`}>@3=IhX1H~&!XaE2J
index 25130703ca2a1f57481d193926d7c06ba3349727..626e30c102cb824a35ef96a18cad176fe0a42a67
GIT binary patch
literal 1080
zc${65@oU;Z6vtnWLxO}5L_|d7kRoEcB3&7!+sf3Yt)<#x!uCTM<4mp^78ALgRr^ov
zuiF2yOD<{3e#qVD-hIFCJ>F$Fp5EE$>1H;VOa`-`zQ;o0i~Z+6rT)piFBqqREw~>p
ztlgTkIQFBkQ=l!VU@K|qj#J~a&v<d$9MK>sj%Ne8Ey6_ZP`+TI@SKmL)jHaQULh%b
z?V%rfvV%fiwYR=-mm?apu5>Uin0Lk8fO6(d>56r}Q|{Awz*LY5ndR{RSj34;O!>a3
zbeSi6jAB1A(cn=^S4_?!$qUDCf;?=y(VCs+VcX^YTHFNDT#hZdA^DB0o(B3BT`+#V
z3Ed?ByZ*>^#8>a?#r<6Lz$Z*BBX1OiLQWuVOxd>RSywe1Y9v?enQj7crcQ6q^TQYU
z)syYa#?u?Sc<R6CE*q%BVxh~tQdWAQ93Oo(Y-{9<AEwAH`{8;c%Ffuiw-7~ho$c1l
z6=;igXpdgek=CPg*Z6MDY^euCP*1l;lfkc3GfA7im9u0dPAic(Z>=O<c<v&vB12px
z+F_=V>ym^KnR7;e#}|a8Ef7B@Ri*gQ?|;;UbfA~=HYrcGT>i7SjCzba(S5YgcWK<%
ztKEFf;K`X;RxtvKdo9h>@PP>!OhbNc3;?8pQB~LABHi22OLqfKPziqmxeQUQRcm1l
zI@plM#0-4}6*yH;hO&Y)APO#XsKGY{b+}T{fNKR!xRvk)+5oydcA$ytlIo}maBzrq
zU9UC>GLdYvly-&S@C56c0ZoL;B@IE-fJTN5LmCy<4X9;UJI<h6GQiB(G@z1U#gLsV
SETb+y*05G<!8z7(6{COoy(qQ-
index 804fe5a134a0a7487104010ec6b00cfcbd5a2a50..ccf75f39711f14619cc9043d54cd315df062ac98
GIT binary patch
literal 1730
zc${rhjc(#b5Z;U|WLXxntOy~5q7_0B;!?!rXhhTNUHLINPT)k?<f==n%7IN{6>PL#
zE_ct-hv?(<RqhSiS+BudRV3K&`(|e6^Ni__-S-~cUCnyaX>ayhxMYzC#g`xd(qA{m
zDR~GPcRp`8OOh~-T9Z&P9;`gU!{{;BPjl#rK(IBIc6!JkBMJS0KQfVDSRDkbRbEo<
za~AxuFYFHD^(Nj%%lv{o_t<+5#o}oYB&_1H=R8pBhtU#E<z3pD*?t_aSP<o@yMVi0
zGafGTKm$86F4%I&7OQ}>r5mi->21Kn;C{uF7zj+P|5uB7<Nw@JG!^hKx$tJ!;U-Q(
zc~h{u!TL2rL$Vn;+b8T~ZxL_U`A+s0Jlu$@ReX<IkP*6zprur3JHaF4qiwX1_aB(1
zqnNJ``X%jM(lwtl@f0ryaU{@x(%cW|a80J_T~QktvWH;15*@|%%li<DUFc-~?X%x`
z{%q`CdHHMhr}nFfLCnq8>a#>>{}AoPPlZnbhaU8c+4hW4Z{j(+JD*HU+}l0lg=^Q*
z{n^~H=kCxMja_G`e{^Qo#ieRr^qhe|zIGvidn1fCTVbl#*6_#v#4*|D4O<9!0d06`
z_vcsceA;(r#an0QVU_U^tP-XRzGVcc`Re8OKXkjMGnn>%Kewb!`35%pCq|RhIZbvG
zup{<NQ@2Hl(4{3$=`;n>qm9{I$ZPspIsQJ;D5m%FuaI0)nmVRoLXTC(ckT8oU0?-$
z=D3}AELbw`$CLO`{}hMIJAdXl`DFh#I*nr4(2vR{emgoTQ#=9BCVnq;LddY9L)E6>
zr{@Lq)3XVq^z6XTnoe#A{`>;8MO%cz8`9KH3MGpiLy4rHuWwPP9teb_)rLhH07i<<
z6q}e>wn!0<j}TcYB8V!NANQq5?Q?7h8mU560UK-uDo|0t0xJc_1iC5M*F#%nl%aeW
z`1%&ITT4(<rAKg?0;oYvg$yv1Qir-yO!O>)G7Tp=A$uYpa!(G1kZQN&jG%vww8^Pf
zBd4SWC>*sk`_w+GH=#^$4TW?@1YUPB;X>2QLIJA{tzJZDiq#CQh^7>&BOyjc3`xw4
zm`Jh#D`Bz|NG80K>2^kJNh%qsAlcVlO0uiz%CvGu%92<av5@4eQ(8OM@YPV-d1~We
jIGOH#tMBvQ%O<6alq9KUq>9gNk)ci~ZNUuZh2#7e?Rbk}
index b213d378f439266cde4c33e97ef7540ae7d14037..f4d761c178a6b09bf18c8e9c89b898a79d3f97db
GIT binary patch
literal 1441
zc${TZ|8Lqx6n~sN%d#vKp$J78LN^p4+GU7ltm?WhEf6Pl6x<5C{1SE1#T?+x_@eWX
z6siBu{=NPQduIYBou#{b_wna_-WNajJ^wNw*B7JSaM&Atjwd`-v0DA{gMHTW^2;>l
z(*1HLd6vZ@Z5C#rnBohh)CMd`3cS&e(@C7p3itL^thi)Jpd{i2lOmJJRROemS;nQ}
zlQSMAO!A4(7QFN5?JpNx#!<mO+OYeHi2ey8amVf4Y>t_X*=@qtGE8am_n446T0Bd2
z3596407E8cToq-UZsL6uS*$f#@)4C59MjuPv@b-$Sz2hq@z!(0&$Fc)7<0>kj>~3T
zo-fl#%kN}Q&xKs<gv&Y`(g!)@YAz-Nkt$3yJM{TO5xM^9X@eWvmWgGWcenjNB+FAd
z+2BDW<2!Ych+F)C`b~AfR5TwXY?<+@H{FgweZ<vL7GvS8J&!dIM?=22-5sP_IG5sK
zOKyg8b&k`JB&#iU9fTv#zX*z{{MWcN@0qmkS+e8}biraT**){Hc5EE^x$F7k-j#QD
zbJ-jBZahD9FWk`$LZ94n;0{9XgI}5IFd@&B9eUxFOSr?o-0?`&(kEgLCb~=%x!?0r
zbiwd@+G)TtULL!n0Hrn_W1UWml3##OgFb7~XLKGbI$hU8Z}m);e{H|$zWD8T#~loN
zHz$92DHah=XkH4P3Q7M)rFO#7S^F^q8i_Phav9;QT0^Ghrq6r_e*<i!v;LPF;ha+?
zS2Wu+&7LMgNITAuTR~JRowcQKqYn}X^gU-2E<<r8X2wr{8ehL&ha=Z5di<mLrt3Hs
zlpGsZ8Ne}c)p6}Z3820Yq-xsMQGV8~c7B$v*TjH#fZG|dP1^+9YC<`GXIUMD4Z}JH
zD>tC~XrTD|*%~?AZam(<z1=Z)J-)qt3d12BqS1#YfVofLIW$NO4gg9mVjj>V0D~N8
z#!CVRuk82sxp4|7ZwL?_@f7#U9tM90R(`$)qJ>Zwg^U`qYNVpY43n4@dPE!tV_SK3
y*qMIrgaN7sU~uyCgme%w_jd4C1h!YFULwa(v%uD!vM3O%1r?}%4?eG#!1)h&`IZ6z
index dfb5f06afcd4c9adca8574b717f9ca911f34b451..14f4cd2f65e47c052bc9737f040ced9a2e33f688
GIT binary patch
literal 1356
zc${rgk89#c6n+jtf=Cb%5h-N|MZCS9_1bPJ-u^gEqs^YiV$x-gax7Dw)o?K*lX1KL
z1@~{?OWc^=UJ03b?|a|8@4YuOaNG|bc^J+5lSzN}SFqrb3e@hmk>2Z!1H~l^Jtc!^
zX@A>D9>;-*+D=OP5^$M=t=#k!Q+$n-lYSg?srX_LiuvE(Tx@tLHQN{nmQljVk6q@V
z&*YM;T!s#Uh{;{fH4#`~Q90$vVqy5K#!UK#&qF5p!ewjT`p9I!9z(tdnL^^pkC>3%
z?|l!12sw-Lq)nGU<sQ7tH10$kB)M34hZ)u!PbYG9=gVOfEnn`2*hCoa4w!iukJv_O
zft~*$aXPirgHo11h0inCo6BIMMxl7b+e#udi(q#tP`8+xudI-5W8SsdlFQ*XnkPj+
zn*|*Txqj9}+|5W+IpJz07M6$<Rvwr4iVvPYbKH@aKbvWBQ2fdy`B}f~d!FIhmhVj6
z8b3^}frIb_reERp)x;KM($XqwCB+kB8vUu{JO0?N_&in?i+P!UWnr5(f+)hW_d{%?
zC%-$@!Trd+pA77o@zI`nC`dS=W!swcKc9aX_MLH$-Z(eZo%;0F@u}mw_KXf4w?7{L
zNeAPp^~VdW>An9W>uS%+qgLOyZlA^Mn;xF0_9x4}OBzSQ{pi*={S~K5?r5Cdy`J<G
zu9VvJ&dy@Ip>5n*&&9ff|Jmbq8E-<S&f=AL`ix#@z6{<6i?<iQUcA13UBxU?CDYLr
zF7<SB)O-}eH1_s|fnvXOyBG9H;#<DuY{8{3#$s9dM&D9%6_^kH%(nA;`$xMzE!B<y
zYDFm2s<@Z%KL#j3y$+;NDZ-m{KZcWZuR<r?kKkOZl1sql9Wn4DMKDPf-I4~sH(_sF
zHw$~Cml{`a4p2e&3SMaxbfCn5Lg7-Y=oRC*0|i4Xl^f79iJ=z(2zq5W%}ov0CbUlw
zDUkh&S-XVj#~G;sTDMJF6m@8d{U?`}o3AnxYt@cOO((^q4X6_xDxi_ZOJMmWu=y`U
CtbA<%
index 0618fa8cf5a0b9e4b045499158a9d3d83339dcfb..0ab66956e7a27076c64830877a49f50fd9b7329b
GIT binary patch
literal 1104
zc${rh@oU;Z6n-8@2q6R!k<v*CB4RryBDR!nl-Vrp9My^m{iTd?jc*zjb8<P``Umd+
z+9fuoZ2KYa-hKDo_r7;`xf)HrdF0_{HXM(Kv+v;?V;RcrM_0dSkFv?n5QY1)7MLU<
zkGr>_M8P6YiZEUjc;hOJ=L#wIw2DPfGKnj-P<L1q6?l7?Bq$`#zhDqCf%6Glp{<md
z*cPnIoHgZ1C>6k>DHDpRjHDY{_e_NBF~Xe+ODWC2F)pB)>s&=V_~iwBjh(%8E||e~
z4l9)mNR5VzIBlWuH7G!zi3Q4{cOxs&bJ+sL^(GEdOK;rS*IcaLbdmIO(w!KiT=KcY
zW2wZF#@;jE#M$w5|3Q+>Vn4^dK!j^~6Y)oNOX*6@VKP`c5!)nqIKk(l19Qjir1ujB
zV_ZGHz3RHZ6#RLAcMV@`Go?N9;Q6!B<i;yr%{zLjJuy*LRG(*L^4{`X#~<BIj3*Xt
z(C|n8txM3vmo)~`RJAsdBu`dW425;?&OF5?Hnoo}hiw*1X_sHe)AQFP;p&|T7SH+0
z#+Lxs>DigCGamlv>tiODRvNm~5uJ|8J|@y(2{!yC+EQ%oByZsJYteS&zk-e9YEC#k
z)=~L4)6ljnN<qj}SC=YSO7ugoH?W_D`Z>NLo1^ggEnhtNGuJIn=Qrth3`2vGVE`Ca
z^%3>e07_6R1F2ArTx4U7G_uhk9ZiQbP~j6XsYyX22Vkfvp`<l{W_y?R$k8t85?dwb
z&;X!S0xdWo7F1M$CZUz;ApkiuDXBvxB@mhts0BJ$idHH$Db=Z^XeD}X*PukS`cYYj
gJ^{UZLfWR<V=5dn989eTCpu`UFERj~9D)VqKW+3)0RR91
index 6e53ed63eb280dae709dbaca8fbf06996cc60ae2..8df619722ec51ebeee737f56e12d12667eb1f670
GIT binary patch
literal 1162
zc${rhVQbqk5LJW-#uzVzP(lgCm@K4S7D8xC=}Kwpxt&LohS>B=8AEk$iJ4;sS#Fzu
zKgp@%vh9QJ&QI^&opkcGH~H@4$J^OxJRZ${L~}?)BsO0_yXboP$FB&u`?}_krV&f}
zcaZ>2V_)znS(Lba9VK&#lsTPp(-&00N^Z0q8pkEx9i=I70rRgA#+1W+LRVl(CCWD?
z>#|@?SsDom(0EF@WXeWV0_yDu1?-1x4ORg^&@C`<=>qsomV`=WTa&8Lx?z0vPBk4A
zq<cOFv1D_HB|`R}cBEEBpJI5I-ToV6yj_&Oj#>CSFRsoSEfRGL<<X8yFra(^qP#vm
zPqlYKEKBn1>HmYIx&E-g{g6j%aT~KIIVH8T=TH$YotS1R>`&mOEPpTqk@0do#x}R7
zfG8Zp>goOHTfvgEmmS#-_$F80A&-7A^Cq```HDW0tLii5__-m;0n6$5lj*xo;N4I3
zXBuaqxzg!@7u>lR40v5bC=6LLi-nn21a3aKGhZfPi&%%IL$k$FShY8Qa`qOaOg<h?
zlQ~;i@EXEe4aabu@#yDJ8&k0~mFZ7CGWBW!q{5*o*ufGk!8cY~oZ{-OXxIL)pncdV
z2q%Xc$leWQx>j8(aG`WHA&n_TKMw{c)(e+^%r~HO-~qd1i^pK*y5$vpAjdsJH&8{_
z<T4S`_v9jSH4&<yW((m1qT!3&H*q`nChk`?bcUq4#75PqA`R~&Q+^VHyQipgv<-*Y
z+6Dt`%itVIZL){aKB{9AVOgMw39dB|!e>SmA0Vs<MoFj?gbE&N=ooJageU?rk&aAU
wS1N?)q^@+xdB>7!RlD8LkQCDUN4Q&)cx{KHT6KVW8q!qb_!Q~5h3csB2c`E_;s5{u
index 9313660cb1d49a86bc4e116c1e525582b1b2d9ce..f886681b13ef40dd9e22c7cfbffd37a242c4829b
GIT binary patch
literal 1388
zc${TY0c+bj5WWf{j0q-~5<&>Ym{9V%E`(CL(v7mlb^9`!bi`&GlrdCCO}x5Rk(G7*
zz3-2_lhVXlmmr;Vci(s4={y*YKgHzca&k5rolU-HQ(mY{J->hFTy%%#a+h%#{eG0Z
zEHhCAgRGcl#jJ|$R>4>?#UC)xyUG-oERU7M+$y0RvOKS@-LtafQt|0IPje>ubj%*O
zj}@4F{xd6^6`Hql?(14vI^qwvoATPpJS(d!?5`?(W)itkRGf-Oe!6yxGE<ny@^ymI
zu!?_SOF%zjGcGR{MXIxxa+yB*7eYR4pv(R$=~|Asnu}>D3Wd_k)|fw4%8obnR}Cgi
z&bZpevKhP0`9`76YoCyvmC8Xb(tD%RF~`H#gw?eAFOwMvk#kmT40cT>7KIr^?=Mej
zY8<TmaVoP%b(xD>oV1QKLZ;Grn6pL6_ptBj%iC5}b|zdcWc8ucmK-=XDW2BeAd%08
zYVB!#%~W-}iId52d>L1tYiOO*UrdrWHF5isr^@5MQ~s!{JHJ@I;I7%P@BHXn7=2EL
z*W({c4mXZMef6;9wSl^L($$<~m|R7K)4N5{C`7a(tYIsQT(y;!y!KirzWXJb#7O0&
zbDrK4-}3*dMd9e|$3d`8^9`yvsjt40dcsQ;vXTeMocl^X`{k-j??p)0cji3Lg*_KJ
z3#55K<jKmOY05)@RGP+CxVgyjw%<SUpCnHDU(TjnCgMuWZjwn9RWJ6Rb$V2HYOv+F
zxV8bDIxY`afUAXT2k_V01=1xh{b+1J_l(`92bK*V0Jj0D;U8SO3)^h~f+!yv09!k-
zjV$D&3D>A^*F6Uex<>bPX6sev2a|!69togM=@IPox2o$gwE8-F3L0Fe8cdsDLz6V2
zX;Do?iA|b>YC79;JD$BX6sR`XS&z^Yee6I}vv@?aAl}kwLM)B62K##$I|s{H%k8yo
n=)mzIIY70fvGzj43ZQR;t6QXpbyP>YCunHZGguBRcWD0)piz%p
index e53476d44945d75f5b7d69bd27dd23ac2cfd9c0c..acc5267ab8edd0c5bc5525abcf0a15370c6e58ec
GIT binary patch
literal 1533
zc${TZk89dY7``6i$U+DrB1J@kNOAp~h{#s_wz8V0t)tpv@{K_m;~G!R7IShr*ZJRn
z?_C?ycEX#xd*0`L-XC|4#?vnWzPp^AO(tiv@9~_aGM2l4-`Kb9u|6zfCj37e!Llso
zX>$~(^Eh1=zN5k!NGjPH9Np_!GC`9-3g8w57ow@y6+rte%b1XCe$JwV3O1k8HLH6x
zNeT|ChpRYy851v4m8SqZDt8=B*!uo?xt(19mI_dYqJoHTn4802=@W3l#hNC2R@TZH
zql8DlH0N}$#j{v~_%psL+tSpYPnS$wY|}_l9^0a7+sm;VF=2AW=N?Zb^pKrAFTLn3
zq+-eB5mXq{`-DAHYQ4s|7`%=v?x!|o55+)w9$#;^(8TLW^`5S5#CgJKS~warCby!v
z+va{Ue4Fa~>i&gfdSLw=4<Zq7<YmI|;Ylb@)uS?6c?sQS>=@=Sf0}2Jwfka>1zv}X
z8W+V3{$}K3t&SIan*CS-JS4#%icUhY(}nDj#(yuL=Uoua#?#B7_+LznEApEPo8SLr
zk;MO4ziF~%W%egx8&!wvfAjp?aC|fU@fhm_zNd~QNTzEq!{$auTj4mo_Aw)iZCXva
zpKIWa4f(f;tV>nz9(Q!En}soSov;2Z09EW7?pxdUCTBnT%{|f8ap|xWvP^n3V}o$T
zTq$;LmUlXI-31r#;<S?2)po6D#iC!O#nVWw6-yFsu6RPr5GSNkGbMZ+kb2kaeQ+NH
zJen&;=S+nBnlFt{pKQ6?Fuu48XTD#I?Jc<)mMjY$ST<N0A<F?PfwjO6!5RpDwKl@X
z*e0L#+9Jn#Et8&MqmKwaBWxO`foyVw%1wkYM72;Ap@SN7Km~u%Zi_VSO36h!+9Dmr
zJbc9*Xa-0+xQj}JoS;Vkpg0cEVPAPqkqRym6-*k4pa!m@hG8lpf(fo-Q^}b|`3Oiv
zE#~8CfU0V7KO+Rao}(AZD<z_I9jtVr3#@z?W92oj-8%S2of^V=cVV7SFM7bKk@p%f
r%ALBc0pxr<!S5@8RrVfKF}kR0B3sRZ^bscQ(+a|7J{s5)WvKo?FG{<s
index 96330998da41c95061dbfe0fd5dcec5eb13460ff..5471e32a108e38fed7772b768c7b91c269a9a57f
GIT binary patch
literal 1390
zc${TZQETHy5S}cH5W)y!ju1i!dnN=o%^72kBcyjBwxi@!Y~`?Yc}aU=Bd_i4$=a}5
zCl|Q?(4W)y{-^f2BiWAB*4WyenQy*tW;E{m!OtPNy&CsMqu%&eIT5Lm=J}^<=VQw+
zjHwjb`}UwkmPwT!me<g5BNhl@eVKCoTt=Gcn8<Wi610cX2+fnwX!MuJy#Y^>(%cQi
zQ)#t&Sthg*lM4|iT#HG-7oxLf>MNB9o|fq2ydD{k#NxhM@WF<ppQ!k27^?^26xY3I
zF0)EwH(X18pNN$hQep0YeM+Bg=su}T<`|xQ!pK5kQPuK-<w9r~m;7-2lDWYb#juSV
zwF*bxwVb8-V9V@|$7e!cF4H*Itdz(um0nb8$T}O)wH^sGSCfHC4RU2C)%lbf5!W+e
znlDpQ%e0tt`+uISD6hNmhq0Cq<|<M5_*(PG_JEssK1ld76Gx~zS<k2JV%wj-EY1E{
zn58b4sJ7z6x1!b4i?<o+=YqD(`~2@+yA7kUA6$jy>fX}6^T?B>upYT~ee51bM}9o=
zgPY#azqs>*$h-2!cW8a~+|V0D{&nC)el+x6#d8sVy~&e_XozpIc*uL8r_3I4Gk0&i
zafo2TDEp!24Mx4YZrx9(GDY3STB*gp_$lhk2`j2#Q>EE&{E@d4p3d596pK}w8NG~g
zr>tSnwE`a0BaxW_&qNT-1vC1YWt*-~3sa_yR}-CSqVOp*Ol}}no1DQm_^2DT`mec|
z_@>i2VNV)2^P}Jsp(8a^Gy3`ic|*T{zm3M8S5EH_dj78F+GNY61Y8Ht8lF4&bIBIK
z{w^VVmSdk3=Z?LyYxXg5pbPjoCDfu8IQA~ojsPr5p$!LgA263R0Je@XYBidN0Q6$}
z6#yZv&JH->5`dGpq+7?NdL__+`a2*sII_XXsqH3!y>|+YLdUid+1SayMJ2X<kgFmY
zs*+q46^RA89(hmC>3byHZj(IVKnKr4s$Y^7_8H`olrktj_IZ6}L#w`34FGHcY<;;r
XV}G}P`Tfto;Cu~5y+gb@@D~07rZtuc
index f2156581167b3a1835ad8220605110bfffbe24d6..49aa2cff8ac17e0b109b573eb2eea625370ed397
GIT binary patch
literal 1476
zc${TYVQbq+5Zx?d5kd%Kj0r}B#TetdK4VNMxm*d2T_tsim12qBK{&!%-m`U;wPCex
zn$PzO?&tPXJG-$hlNwgznfK<+?97fP;l~KyUC%D3)63c4>4N7fRZoBX=X~r;jPp;*
zW$^7m@}fvZ-W;X*BF&d2)-J(FF~!#a^lwtdCCefufm;$fmqo#);*0k@$(ZDekgYid
zNhY64R!{4s$&|0>hoyCLy3DnH8T7|2%MRRll@_Jj{>)^`<{5vk2dW}(y^INodb_?p
zL14|H_b3q${9+##MXGaIwkMd*cQ{Czgh9ZTTwZPRM6(Zy(kmg?2ie77N4k|$u2y0(
z7P*3(6|J4-C=<ySqk39iJZ5sqRXKdeum;<4kA%oL%gg&WLjG8KXNPlrsp*d-XJ7Uk
zZ0_3-o7}9a|4XDW-3@o~D3R%dy3WKL7O#=|n5kqn&e*2lUAW(3JHxW0?zZu8bGXEl
z8CM%wz9#os8FnkhW7%OWpG<*$#Q$@ZW_<77Me%GBUPtAl{@;2>zB1`TolT~kuPobe
z{Mr@se|e(X;q86!*EskTPj18e=Un<S;6=e$yEQ02$xXc~{Jk{_^-u)g68@lX>BN)x
zCU|anAH=+&bYQo8>j&~a2eSwSJp*uwsnwy!{jJw|MPIqWczSt1Z0%L30rPX(4F%=D
zL@O~b)R+}Kj8~j0`9zD|M9z(y=9JM#-8!A?*W<8EteCUnSthE$l}anv3O*k2e;W*b
zr;idA^?|bmm$A4J%e#0M1m$4ATcfk8?V=;wfm1`s_Q2M`9>b}?sluTMetr$%I`+t0
zV=3txTPH)Sg3b_pF0ex!f;`efb%VL2XRJf|09SAyRS9{6j(bO?dx~m3oqUd<2(A*;
zLJi_03;EbbzJ(DwY7%T=ALHW_gox!0sur@eX#x%gBdk-QUr5z-q>1=FwBou|OJlVc
z*gL?SEmpxAgJQPEF}Am5I{4y4@2J}b%9Z{StKuTNi8Nx;k!=l6&fnlu5XKEnu{4Gn
c!xO8I1~&5aI7l1Wr1KWo*fa!LyKIDi0urFC4FCWD
index 0aad3ef27048504a6f370a52e6f84db884df7fc6..e63aaa0604d614707ebe36d81c33c00c19f77fb0
GIT binary patch
literal 1669
zc$|Gx{cGY#7=CvMAxIDjB1J?75s|Lj^Lk||y}h2*O<Ru|i-zT(EM<&yn!A{h$++GA
zc7O8y3HMI?NUkj>Ox~I2dEU<%`$O-yDS5b=T#ZIolds{N$0}6MKYu8EZV%JLA0e0S
z_qF6n5{kH$ZKsMUzCuZ(AI9@AUS#_2U8uNZk+)fK83vip$&Q#Ri4GawzDg1<6`z0R
zLBu4Vdu+vP0~SS@<_tCABGwswCKp^~`I>w8ek6jwrh!=VLb^R4h}Bwb;(6wq1?=b!
z!eGQ#vwVv+e;Fp(@p2#gUL>JHfJOIAVtLqzuCo1B=&Hw`azp#VWXNU_-*(4zl;%rJ
zNa!3=?GvP}&^?SUTL1^n<a3sw>#_xx*PA%dp>tX2wUDb^!AW;78p{z^OEDjaSYheO
zd43o#C*3&ASI<&+eew!P($Xperh?@lVw;4weEEEhl}6F?;jNtR{icBo*Xkw`Gkgu&
zvp(T!BePd!ZxwhOQal~dhp9gqdN<STrT%30&2LQFIEqcA9FHd$9Wz%v;eHSJT5Ycs
zgB*?y(&O2mJW#esjq(1M%A6-@Lga0Qe9X1+pG0x$4*cQRBb>aa?(YNlUY{Pfg|xi!
z<4dgI5B)p0_{E(}5iERT(S{RhyMxiy<7x9y1y#DJ_=2`QK@Vs`(^}&Wg8Y?~mVE4Q
zz!HAzFFC~mX|f;9MS2Wl%JgQIKL0dU7F@G^p_UW}ki10><Csg$zD15VYD+qpQz~7F
zrSMb4bRW7ucIlJEfA=kCb1r>xCl(L>#C5Zq`oZdbatbwgSE%DM0176q3hpUd3s(VG
z1Mo*FkcLsQE>qjE+Nq`1DY4-K@Y5s5)#EButkzCjvyM|+w@#2YNF5_u9WcQ(bwK#r
z?Pd5mSbH39bNENpTRZ)A4nIS^mDhiQ4uF9*ccEofp#)XpK-DNi)g%D#PAsEjI7ZnZ
z%{G8VYNtmfC~4z>qfHsg+7KW*4z`YQv>#|a>0@WL%288u<_qo;x%!SXh~`KYY|RtH
z)(Vr<iey(Sz=c!NkX-@W0a7j=sDFM<DI=xI|Dm9F{*jy=A$g=FB+r$4uORwA^6qPS
RuZJ`3T2R5fC0saze*xIV!)5>g
index 2dc09c9a635a06a07b4adadd6e4d5e686e120ab4..9e189becde6a569e6a0333777c9ee760f5b42ea9
GIT binary patch
literal 1457
zc${rge{14M7#@cpK_rACB1Os&MBKez@oec8cdx98(PmF$G3l~LIgY7LHEhh3N!+fV
z<o?*tvEOgsOd8Yn&fv`ZKJ&c4o*C0|KYI9fJReM_gZbaVl0`|7?B4yWUY<;Xgb5mY
zi3p;V{p~@pI1YH!aU|(JV4?uqh3O?UVH=>d264<p!j@*p7hk*ue_$19cHkgbMJcBU
zJ1an+iWN(WGQ<obDs~0e0ALAC6_ln$!|+*;dFdfrgjBGlOE;|jiHd;Ug)9SU0>sv9
zjEnBm+$QHCqfwFc&}EN>hc5FP*E|l=Tr|9f3>yZ~X}P*{zn7xzi`@u@2*ceTGxqZE
zZ6q5!`419H)sFX-^86C+<*>I9!9y|*`5oL=dP4FOm`(z9izbV;71C|Yx;9-gG1^9p
zwCQJBkP#P~XG6r@oHP?tmaO^G;!y&f$GJrAcEd!lC`74dtu+0$;E(%BZ#{qRxMQz)
zUO&pC@>eSGFY5Kc^EA)4d}rp?*gjDM1oJqwv4(4|@hy~-Bj`z*8L*1)_!C?AS)5oj
zW>xl;h8@xfq6lWoly1ndC+EPt8M`-A)1GUe?70WkFvDa>-t-AcW4F-jlE?^hpM{XS
z^s$;LrC`VcFBu<RGO`?twA<{QR8LROFMjV;ZEHICr}uF*a3*~+bcV#8`Q*y+iQ~HV
zoQxcIFq!;C%*o99^M6>g8~-)yJYyB7*1)%}o}JmlKExCIvt?hW5(D98eB~Sdnvq28
zNSxo1nhtOPu1Hc%)dZHh6q^`#oEutZpK1{GYxlPvc@*#lt{7c1;qwV!>EFm7#8?N$
ztv|Qz;;O$Z{o_jQ5TRNbm1;Wd75Fz1DxrEE;f7vDALQOdZ{@C|Gr1q4j&gu65G*Fv
z;KOA^unulTLBqpRX1vdhOKJ2`4<Q}gbM#grNQDRul}cxduIk#+2`XtyrCLYF2G-Ov
zLKwU%>J_E}YXhCM04d>?#NS__r{7VEDl&lrwazhCyB*v<f{I6y`XZ}RnBClLKwuLe
asJNUCglbqtEu`T3Yp@Mq^)+Y!*!T%pE}r-R
index b92be31aa54bfb5dc5ad1c5b74d718d1a77ed951..4b0623594d5738aff5b37922a9b48e1d84a6c121
GIT binary patch
literal 851
zc${5PQES^U5LSipOfV*dP)Z3wgph@;D_+>s_LQV<mXV|*Hr+!QLya$~sA2_4Y1X&?
zfj;l&Zn8T^rGAif-`)3pcjv))_ASPX(Y!yM_UAuY3Ylj5;maSl*BuwZih+!NZzU+j
zM0P%58YJbhmMmLayknoSrW!Ve+U+X^QbT$HOHL)EGrED+fMuznTJgq^a{fZ;no34*
zI6SkcHdy;LCS)$o)>-ajxt}bUP`L(eU5N3e^1;@kcG=#5i{)Ls6k9keq3_0I17^|!
z?v-%7lx(X<T-=xq<QY<COoIhbDa0BB3H0u;h%lmSke9n`nGf?~E^;a4hVp}(3d^D^
zIR$+y(xJ$-QBdLky$^)oKr=hW=?wNZ@}E0w{J3Qt4*rWcnU80q*#6!p+;Q)z4B}{*
zjIU<Fg(w)6WSmSQ--zwF4z8nlY?9uVDuv%We-S2rG@SN-^{NRdJ){b}6=l4pG?hAs
zJZ+BVK9?e@bbovme<rEO-f9B(l<y2?GlVGuhgtGyMY)1nA@Cs#Ka#yPYxoK@1(}G6
zSTB-!6xp%f;PZy(ItaNK9l5T#E699RAK}2mxK-R0TrX}HH=PPPMdoPZdQcA##x>-c
v(8;j|Y9r(st*)s-M;&zBG<r_8=3zg4hsX&+P7$57s?HfY_6(h1A9?=(oS+cC
index 6405309ad341d2c07bbb07a69b61fed7a35af3cb..cba9b6d757d699df83424a73c34abf4f4459e4ec
GIT binary patch
literal 1664
zc$}?L;cDAR5FRf=2qBE|8B>fgi!sLa<$^Gwgro_VI8N#kE5Xv`4njHB*2dneEQQ^*
zbAdiZDSegxxR<+K#m@SA`B{N9ns2`OW@dLzhr#<0-Cm4OMx&GQ2Nu&*GWmG;%{lH2
zbLWmxKKT2dQz2NE?p`uUIY~mvSvoU#+x&)-NV-s|^*%`wgEvoE8mlBDixoonqoLFS
z`e3{rt;D7yx|nRY&^Zx;a!KPeI!y?taX=PSgKU=SvW9uQVP0o~Nd=JPnsCKdBj}|4
z?E*$1B78<=J(@GIHQ){5j7$>xRF!DC*7sP(VduH#rcyY~?kV2DDkTT@zOQGF#UGFv
z<>$+Es*7yZ!{-@aY|SA24e5%HsGMhUKTD;O5&rs`g5`p8HZ^0kHhr8X+4N)HNpAy%
zQ_k+?MUqX_{pyIDle$VYULT(k>ONQ4zGLr6qw(8+@3sE>oF(*mF>b?XJPa;Evu;1R
ze|XvCFFKX>ityrDmM7HK_9~AQ!$Ch9UImQ@jTv$0o(O?{cB5f*IY2R@75W_eqU<t}
z_y{-e2ulvIm}ko*#%U(;oUACOE0Qc#TQL@!?gVBj&THU_p8pU}I3*vEC`DArJ`uEd
zGZ=@elWI&wKCkXVE4fSrB=DY!R*WJbj9z<#{^;b-o~;;;ZszNc>+SIKkI>4c$|}yK
zp45@*ldRPK+&yABCvr_Tr;8tm*i!DSi%ux+{*TH8_IF=G)p6{<glpYSv-#S8DVVCQ
zJ9sIuOk;Y-QW`&PiJ7*X`@i^p4?l3Vy6-57DUY(tY-Y9F*3pr(%2;fD`g9wO2LrR2
z|5*FJTe1+8Z1p;*P%0_gKu~~M4WYW@pv&Agke}NUdT-fq0O}JUx9AqZK|4@Vu7y0X
zZFK$y?HljiL9_$w2fZ@*uLgZ%&@&sF2z9rKr_jsYx6lS~Y#X|O?Fy8kf+|q4Y5;|f
z?UbF0Q)@H<Y^z*-g`upCtK!OZpr%vRj4D+nsf<DgIiTnT$11nl$a`CERf_;_Zx;&4
w(oHC@V|h?_z|ljZV;x4j$lG&o+_83`>R#K>(o9!ds3H&Tt#cHJRsZdO0i;v=Q2+n{
index 1b64b80716b8d4362991e9ce2b376416a92be341..e1019ed8089a5f77aea976af089f19db32c712a0
GIT binary patch
literal 1531
zc${@o@oOSS6n+lNvMgH>5eXt;5D}BwVAF7f+$DF>n4E`hg1e-JP|E0zI=yu_%#85@
z_h0qL{!{%A+L=`|_L>Ur+xNZid*6FA+v)qC0`zb*x*QHKN58U&CX&hLw|_bp&3=|l
z8Rfk%kDLm@(&T8sB;_OyBxlLY;0^N{NFwP%NvmBF#|E!;SQ06bX<PB>%G9x{6aH*~
zmhQwRL%JC6j?lamf^tctD>{h@r;$$<RD*1mXj{X)*fQ@@!K4C6d`Gxqs};29bl1Q%
z2nnB2Sq<k*>@0XsI3weju3d?4SN|4EIka9pw@$$%eWZ8`D@g{NeCub9rQIVl%CDEn
zM4RmR;p>zyc6Jc$E$NmIshp=#H%+8!Bifs5>ZEB*Nn+NhZ|CU5>Ev@Z$?+BnCY(LW
zn>Zb-`_&aUBUL+`lFu)<dZ;|2&1ssxTSI@jpqx!i!CQB&{yb+feQEL#grmNH6POR~
zJLeZK9sf=z(taX5f0br}$|l}sm3+|ahW%R~tKQ34;&WVkBtq2Q?yoe-n4<69upbV3
zC_=PEUtmYGktl>z$Sx5yf8QGgs$V&xBAZfiTqb<tduxZ1*bXeLzX4%%kl&oB*Xs^1
ze>?WpgE{nx#Lkqkc&Z;~7#ksG3C_mDV||)<MLESuDzVlq6)Upltf=^0>bV@L9`Tbp
z#OX7Zb0RllvjtueVZ^v8=IJty@R;KEf2d60+MLx6Un~4LcnwYH3U797PDw22!H55&
zt#@x8ylN}?lCH1CoJBFqe`vRV!Yi)6myeW0l!xgcomq{Bb$)Jr{rV7&dOh=5{9&E7
z-GYUnV5`4_a)pA5`v`JSsUTE!9OP$lAGNbsKm*H$cc313$jf_qaL^$XRB9m?Y#V)Q
z<&bOAt5e8+f4$#DuU$AoE!c%Vx^Vn2po7k`^a2_Hj%~vsV7mlGD4`ORtO`J`X*)%y
z<W%-+0Jc>u?_ntF;HkO_4X9|T+D=K8NGWnn<ba~*9IIHbqtkcAdN~i^9Uno?Qf4Pe
vWsQ@j<wDf~M=yvzXaZ`Xy*J*y7wQDc-pGcU=6X6p8SSAr8;t@n+JpK(6d=qL
index cf482c2fbf83f1f4fe0f28e1ff823602dc35cc38..914041a6c14dcd2b9e42522a9c423af1fd822837
GIT binary patch
literal 2870
zc$}S7>uw@96m~`<G(rfWQG}u>imV7lG+_}TB#mfxyCESrCF}}FcGYaVHH?8tCS&9=
zxl~nu^ws(peTlw7d+cE@42fD5<jZ{i&N<&XK62x%b>7i#PTB{Tmj~@1ZHv0X7SG>x
zjQ#S3Ehr~WM{wI6HlN0vdY;YP;+Y~1Y|0~WJ=%5z5%eA?xM915KgTQ&Jdbigts~lZ
z2&Yzy+|xB+Sr8!dx_(W#O?nRXX+(f&A&D_w18?@wm65uH52=Ve6r-ak`f`gtMqew3
z#Brj}LLjZ-u>M`A&&D*Zwv}lWT9bRq?S5o|N`c8o&~s0LrOa>ugJK0#nq)}%@x<-R
zL}EGNW5(}^6PkOKfb@Z1QZZuIA#(-f-~}QYj5(CJu`E7~Y=?#wU%MbZ>NwPj?%--{
z!8T^m;FR1&7BYnGP9h)GK!2yt?Xfs<SPyzYCbHV5V#1^Q&G?L)PPcv5I_X5s^QZY+
z>Va@=GjCB(aUifUCZ3n=G!MIHA6i*ZGjYV$bgkyP)DwrqquT8h+ScrhzcY`R%JS=$
zzPTBGRF}eC9pez*&WF2tgw{f|7DIPJbf=Ef-LvjRGi$L&iDboyI*g6=ztJszgZs>)
zm<-?!up=u>Er9&GVQ<7Hj)h$&aF1g8MEesco|CWwU${3B*mgZAlkX)kjhXF%*#q?1
z;2HPiJz)kmY~b_F#??vd>ax*nXRn*>4wTUy5ZkF^%l6|>y(9yd<|22c9krlvBU{Aj
zQC7hvw^Tjwqb)|5ypVm^43CVB7&HB)$DXx){q0)~{~i=#8XpQ9h@u0=eIQxPSVeGg
ztUSzDJIFSa;9=5Z4^fES*NO>ejaSb6Y!i$=<DB+oM5xw)vwOb|gNPwUM9c_@dIiHn
zhv@@xCU9zL-(<G8cE7FeWSWPU2VbjS{2T0Xc1LG4_?IU0jJLq&#D!1YMxo=8&u7W-
zLSn(@dikBt8nWam@hj7K?Oc{wF|2t8XjZp9t@d04PNgNfkE{13O6ELhw|Eb_c;W`Q
zFED8akwCm})01zw2}fMWC&mykt@=kH|MbNc_uC>QnTqtLQmNrb4zKYkB^KpfcEN@>
z-FCAXy?%dW>${6a9U)^0#tIA!qX44_!$1p03D$iWWwd}$A%nDR+Caakbsznt))IP9
zYaM;j^BPAm{i>zluNmk<E5YZI#8%{l<y4SUQBDFutaKTnB7(pR>u7ZiAze3fd6X(`
zEG&bn)Si}CfK#nX^3p6h1!p=MOGaKRBYjcJ8k&*P(2}O3l$Mt!D{+&wp+h>0Fmf=`
zFfs_CMU{b$8fs0Wlv*?Bomv;cga1>Xx$v`GDWy&;XgL=!3h$L>U1GUf1!SesdzdqT
z1=9RKS_OeEEr)*CSV)~~xzIt3r#Ll8Bb@|y0nEtUa6C6d<u=X9Fu|QU&Fd+Vm%p0G
zDj!L~`n1@3^+-t`D9N`ln=``E8pLiV1xavE3QB_40Gd)|;lHVLUs2gBAJ3{hRw_qI
z<<Ijf*CBQ{sdD`#l@k0Ms4V__pP2u*PhxHHV$0~Y>MPBHHbCRYnI`$``{emtlWYV{
F@(=!S-g*E4
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 1636463b48d26f83b5f8f4273b6dd8ac98ce6fcd..09af37f82ca8b02aeeb455956626d68dc7c40917
GIT binary patch
literal 1647
zc$}?Me{bSO5S^}8$XZ!eicl0GgiwSKG?W<Q5YnEm5JFN;fs25PswUTTvG<6t2BY<+
zN>tr<?nmg@=GR?Ysecr+yWTf%X5P%M&-=qSV{&&j>I?>*(R<Go3+1Vo?>kzncI_!4
zxj$CYTg-aTODV$83l`;mO#0vnxdjX7-h#`QEs*PS-`{Qz(e7fHt#4^-94oHG91Ydz
z&2t7~KHUxex)X*%D&gJ)p{Eew{tcIWE>PbP7jva__%s*Nb9SVz9WR9Ab1B@2o$pA=
zca)ZHx%Bwd7YT_+35s80fi%0peEEd2zErpF(?~>3+Tu`LXFvA?=eMyFEJbxw$y$F5
z7uGPQjR6}0Z?=efGU0M2)V6Odj%N1wOvuZpg%io$QGRe4$W1>BxS8)XD>T<0Z{<L!
z$H46d3x&k6@NVg%(^kE;mNa&xw^UbtFvY77Y10$rZaf+Fhgak6o%uSY$dMk#*TtA~
z<vfZo^*fikFBUWPs7o;u&&v!F9+KDWiuAyv6G;~;wHPSVa-rOD-6Uty)-Df4xR2mO
zgeuywm`WQqnK8Ut;yGWp8um$(PaRjBw$4n_$RT~ld#_SUgwV>JaqRwKeL9{Q<6d{t
ze>-H8{^Yu6-1bIe+>!V6=!m>BDz!LryyDTb<A#kc=vqftVv;(oTbU$noY6`*?1mlv
zZDNxXdeS6Ka!OBIq(#o?nW^`>gU*B1PQIwxQU)qeFH5m1yO4CHP$?yZ;~4(dH0!mG
zA-lgo#q2&x9?jM#%BR$ESu8CbDlS#j8%^PKHyQPMI|sv>HcMwxkS^k=;;7*;Qvh(V
zpCSiZ6{hiO!Y}b!gI`&SECHvYz6bG7Yr`R2t~P)EuzG=ZhQJ~6GAx(P!7F&Pp<}*m
z^d!a)Id~0)m9f~)WZ)cr#E920gb_^OC-@oK3H31t-)yLvc80+P#<_u8xK9Y~E&&x#
z_y|6lB*LH-bui&jH-LdbbTB9ZBc*|%<-uSEz*jY0W16lJP1Ew4kuQ=o#a3t-U_V76
zc_2*)?4f&!XnIN~<bV+NFO(L^Zz%bHrhG@phO(%}J*I2@K%0c>#Lz6TOL+AG$Y()5
n3sfc)tSm7I&937S8dZ&5!m8QdtBxyXn~FE}(*IEJ|E}~ee{X=s
index 606e18aaf153833bf247ca93b8dbda63781355dc..06b8268412796a2bae404c228288c7f3f833d97f
GIT binary patch
literal 2223
zc$~#l{cGY_6utX+gb+dyDN;(2P()(eNnO_&%JfsM?K)Ij)Gfo>PB%5LHnY*l%j?pz
zGyn7c344>64@(QPKdlhsz4x4R?>qNlv(x)DAfvN>quXutZycM=gd?8!-YX|YCk*Z#
z#@kPG&V1kTX6Csg7`NPk;LdE4=JlpCv-oqGSZ`Ubn}*v1VF_p4Wz)N?Tsi$20N4~e
zZlIKn;%R%M;romWW}mRJYjI}xtSLK;lb4?F2o$i~ON(Ox=L_oPD~mhUoy#JU6+lWa
za~_9cgL5l0c+kw5%z{bMWOZ@u-s6;UXPg#F@f1zh8~-^NdvjJ#1%?)%Fp(Za2~pLS
zH=REs=cOB)Ntdj3yIJdAYRCKNvtSt+zY}+2Pr}*sIE_YxiOrUWW=HmAj@z~-jGsQv
z#z7@x;OeQzlSSzmOf#<g)tGU?yG%TIHi`=b`i0JY!YcNec;xB2_21?;{!E+K;u!~H
z?##uR>)qjf3x-vr%xEy|cY0@o^tSr)jBKfXcqdiPChTdxHnqg~f%&&quwLmeixXdU
z*=!;nv_(m&)_(q_u7uGFl5Zm><&0Dd4ci_vU$iWr6<o^~ote#^F7DScA9)>A{JdT<
zL%u-`U2&bMBl3@kymw~IR-Ay7PuTR}pl*z=?VG>ff3Fy$ch~yOQ5e?0SB^>sDo1C{
z=*#ShjlXcFALu*AC}9S~n76a1b7m$@5DBD`tC-PQX=PMydcMFLp?59cH}&w)+MwMU
zb}o9#uroYwYgg_503&ikx3<VWIi%mdX%#aZKYZhDRn1@&Lt7lT_U1VCH!Bl8nWPbo
zp|)Gy#%=95`ZqD>+!LO7p0h<0Jz9ufDMx^vF#WDtt(jkaGEu_8{-Zn9ye}*+g5Amj
zzedA;yPe*oJ*|1HXjK`sB0k6XH1Ro+0ic|h$%=YR?!xy8`4YaH<PSxHuYg}gWz+mX
zK9j?B2tV7$s}jkP9F(zGl{ZbB{7w#63CSsIdI7P@ngNB)1sVXe3b_u2pg<l_QU+z6
zkkv#c#A8xjfGCi95WWSCvl)1tdW%9K&M)Tr=O|%k`APK^AqiZl0jS8@g>5B=#2i_H
z93_yG49Lk6z)v3(m8vT$Q4Lipm{cpF&l>uyexyCRjheJZfRyPrNac+p07cm~DHwtR
z5OM{S?1F?ik|#j-3x!M_2i-u74lCrN43a9xF!goNB^U|BcpcIQl0fdm&6le5d|7-s
zs)r~oSugzr8k7#<S6vIvLzen1_1XuGoR&ZWtrV+)78r{65)GA?4Gqnd7iKP5DgTI-
Slnk+LWMzo^Q7ius6aEE<(f@A%
index 4af601f3278f9da52d6f356cbd15a856d3ec3ab8..af9a32e805a082ebd0609028b919e71a6d1ff85e
GIT binary patch
literal 1649
zc${rhZENCK6h3>ogb+d~p@>M4i%5uV$IUv<P-gn3)^;7LE$Ws9r<By(+U(>-Zf=K`
zo%zrEWxwxDVodB-NN&z^p7WfSd+ZKIUnXdFG42e9o$;;f(15%A<?{#S%p4@fgG*We
zdC6!LxnV%MZeX*Q9B5v;oHE;+aOMV!9N+2Lo|l{Z6K->NKBWGAQO?LeV*>R>#+pds
z2(3K5*@+^`ICakG+_M>VMz&95&|L&^L@rY8FlHC3Gj43=+V>t!BSi^eP=Aeu>^Mts
z9Y$`<vAt{I@u_Gn&SkBd96kAzx$|8Apx9Pk(9~uN%Ax%l$y=&t8M|IM|2CP2OR6NF
zRxk9IPr~tfRJ-dMHs-pnJgYa+YGv?b&fF!x@WOj>MX`ru9x;Uk*zJX4+-cLfuGO~}
zl$}2X^Vn0EUimy^>#HKd@C&nwtSsV+4Jm&N9U;yIF)9rn)=}BYjA^_th07aL{>1V{
zP}AbcA4^9dId3+Zjt8TQNxrTB;y=+IW)wwgl<cAO-Davsg9U%A_%@$E(&)~PS3_lV
zL7$gq$8pl3q($`Xh(_9qsU)XjwSIfwRv0BmWLv1-rIE<eJv-uqz@g8j_1D!y?K5Gt
zxduc~N#vN)h{xKB=lU+!Nu!x)o7g1Uq~Dtku13mqFum++H~sNMSor9uZO*<rw|{^5
z*)V7CzLMLM#BBd;oYYZctI<r`!i|}>5;Ojn+9ISIMqI218Fon0h}!QBJ9n+q^nco1
zvXF=TWl2{WB<+qgjFj+e0>87Y_szc|bc+^x#BIjoeq=6QcyA9KqGSBy$80+8_w%bb
zl27+#ZA%7iUp!6mSTX?Awq;aO_wjjhTDY5>O?;+Ea0$v5L5J-x;=uS+AR-(gz-16G
z9pRF)wF9VHfz@x#NICep$dUmo1;UC_i{T<o5&%JX=M8G+D$)^T=&Fi;PTq)ogS8To
zU<54yRYV-Xu3QEU%BTWmEJ0aP0e<-?tD0I-B~`69v1W+5>0)m3Cv<~aLR8vDpqZ!z
zs#&jr=tY9Ml%@s=A3_Cx1U2IwSE~iTC~jA9Ou;#jK~?08rX+V@SZKNlZ(8kyrLTvN
e#-M}Ig=?b6m7tAG8`(aAj(;~m1>MNhK>rUI!L4ur
index 391eb208b8dcd358a57fbed6a3ab99093c4ef4d7..60ba3d40d31a87a5edf1b8daaa7eab37e4a0041d
GIT binary patch
literal 1979
zc$~#j(Qe{K6uljdENf&@gb<1%gscc5AgN(fHbU7X8z3ZQ6-Wdmsy5wb9hiW(2BVpw
zn@Iatedzb}5BdqcwgE$whkYw(JeoV_+<VWNTW@tf^vK;sx7Kdgx}TgOpDIT^zkAEh
z@~z<T=y1_|nh7qY<4w)FGquHY6tFHG#f9zmlyIh_D8AQIwsHn-K6zN@ryI8GM#mjY
zH$+}kDi>Y)8TbS*@-->BP<(jC2d*vnuwzg7$ufBDNk<{vcCT%L7ub$}pS!h%V?Ve&
zB-uVB`!ePUC@%zb<`XWQK~z4wEKqm7!5_VWH{*UI&S>iQ6yYjSuy2bISCJSNP|FQ(
zGMi(fmu3`KrPn>l)P%6t9Nt?AUCIl3F_&S~6a<P554{YXh}h+(J>uegJ{|ZsYhG-f
zdt&9ViHFIWfwH`0T!}VUV{eGb6#`|d^|)eXx?Igg^iI|FH-G7hc{3X#F6wN5DWEqH
z&P-jn-UE)2uVgt>UG5K5#4tkSU9aD5buN0*w0_mTkX=ItBWMUd;!iW}Pg`tHY&95j
zd2joU#ug_Q?1syyBQ;JU={{tnYQtflOVzL?r-CQUf)yb1G;cE3nK+8bG-AT8e3WE3
zz5IzD9~<HLlTSK-;)5V**bOPf3szW)7Vc<yKaUwgscU%>^_z>%O}pOg#(K?0zjf7N
z{Z{|78M|$Edw5E?wp1;@R$?YR<*DZxXM&r@Cf(g7N92Tl`vw{FZUr+PX~qgx&|a|P
z{27+tTRyf_Rkn;~qg}h-H*oav!A?UB)~dn+XomKfg<J?I1>v8{<%;!1ejF<`J1mtX
zzS~@u9_AxCb8S_UWAE!do~*&hdG8F5f3Cc(zNxaHk%UyXP`=f=!p~j5+iXT}d1cg3
zj95j3SO(Vtt}3oWTt^xJq!SuRvMT)?>__xtupiRjgZ+R$7&<(Hk<KJff4#&lz4doq
zcYgfqpN5gfB)^>+ng-cZ17R5hk_2cSl91LROCY@k!SCPqIYRdl56P272w+7B|2~a&
zG(^zc>vSE)U;!{>RUmJ~fkK?bAx;UzwIalI6XHw<_+j5*l*JigMP@QRRiv?PRLfAU
zaX>zh9bE&O$C_EP1A5ln2B4T6^#+Xqp|?Qk9_WZ826k3WrPl5-u!Wcu7Pd6dW7-lH
zdmVHQ<_coI4(UR11sMjuZ|{*`Hj{6j$^nY4%p~W)VEYKpGR)UQHtKBDDg&cA)D3KB
onGKk4Yen~M)i-So?9>-_Zdj>*kCl}6v218%fcsu6{|^)X1HC5MTL1t6
index 3d84fc613e14fb1f2a098afd5520b3a5c056e043..6e4962de1f5302dea78b8a700244a117d503fdae
GIT binary patch
literal 1654
zc$}qE?P}vj6uo;H#2|z)W--Q?AcD!-iR-u~EXy_twY^U2CGiH!4W(|HPNb=$R$q)J
z-OV%ff%<wKjqS+JroSpN8qK-qew=%y!Fck~#rgTPe|g!T-UL36Wgs8F`<os&$NKPl
zz{TiGDtML!N!+;zBo{1nr3m6hfjfgBX5z5`+OA|W@Gg0Dx9PvDc)s#1V%LW(3=6_(
zKg+m~+`me)Kq`QRS4^;otF#lf?G@BK1CLak=Gx~2_d+JPuZh=81ne&4OOWNU8qcvr
zbcaclJ}BSkmBLP62)3c9vCc9G6Yo#gOH$r`Dt29>hMhI6(rMsG0l^~9Yn?H%;Ifc!
z>S)~&TX1pq5PNx<8x>d267i(dQHN-wA6a+p@kv~Ad7t>hB$kSpbys5=BuU6wT!>g3
zCJzx8fwwWhA5&kYDS+NugzJeQmFHn{r^cSE*;iTo)ocoWZNfhnCu`|7cW2Y_<lHSj
ztV6@c11r;?j~y}T-Sf=&i-~f^)8#}eSsDiNmgU{ILLM*Vy{-7SiePF}*=cq3OOrI6
zO5gWqJd;C~aWf1eWzNa^t)^^lPRxxNX**2?T;vwMftz~HwmTZm#-AqUY&^Rd+1I0~
zt4?@R@sd~teDG9d$T7eWBTO-~bp;VeNe&M1n4FwIN7c2#c1}(l9XhXfsl#wubMod*
z`(<8fO(U(jH5y*_Z+q61=RetO`MY&ek;p_orhKK}5q!bFq-|&3)`D-G))Dt2cH28#
zdK_xrH{I^Hoj<Z_%s)HJfX$Zb5)(4-9F^*Ur}No#G%Duw4}E`RmK+00b+sC5?Wxr?
z0H9np@HK7V&w6j-Oz(U6lWoGUpdNLK@9_g()NFi*Z?T76JjNsJtW59V8t|7FjK9Gi
z0IgGK!w$6o!9ofavB5G-fLHsJBBj)(X4N63sw#)5a;S2w7zCC#z6QiH*f{CDA_K!T
z080q84ZAPXt_(1(Cz_>|RNs=jZFu|C)GX44)kVGsk~4a6x=R{$0Nl#8m2V0J_bXrm
zsjTAx$yGa6uG-pGT?LEQz%sRZYo)$QYk3Dyt2h2T)eh9~tmpz!nX1qG@Rh?4@c)E<
K74YLrg8u~tcAKmK
index 842878f4b4beef49154e735f01eab638df057963..27fcb7909a57a29be4cefa08d3174442a2ff8840
GIT binary patch
literal 3698
zc$}?Ok82~x6@E7i%d#xXvMh@@jM)lT_;iY+s^&0P-$j;BzLT+aM$$RS`L51N8e4l=
z?W((L#|}pcp|quxB$N_D2&I%#LJ6Ui(!Z<!KxyC1YJcd?mt3JXtC@Z8&G)|V&3jU-
z)7|Zpqx-$B{r#=pQ+Le#*o`lL@+<XlwIg0mTo$%3W+96rH}EU@wjVn&n_`IFa(ySf
z%surzH)f&Zb<d_ObVs>kY1{F<{I$j*+|fRp4vRU~=EwVS==!I*y^MLrXvul4ZlUAU
z=Ops5_1rjc!c!J6#<MVH<9lr6IUyT&ohbvWbCPLUNh4ZbFnYf~3T8|Z+sdI6y3WvJ
z$x-AT_$x2kf^fOV;<GTX&Gjz(Ag6XWML!54mm@gd0iK&O)XS-CZU@uZ8TylwyeOo;
z=zh82tswB2;}<HNB}~%@Np@;R0m4vkJEtt%IrB%HRY9V?6NJ+O%c!0PJq-6*JPF3z
zfgdBosC3VXor4g;!uYa;$Fdq!=Il}@S86|+jnSPmts>5NUX$Fq{AjVW?1#f=Y*e`H
zrMD-p$Ffw7R9Jr$y0iGc7YwnFxWc7Y$ej1Hzztr?;LIOi)j?&h$@R~2-143?WS)n(
zsYOjPY!qAg#rrzy4|<*M{eC`HpUVG~&Yh6lR6XXO#uKt-L~NF{jxxavL6sB3*6hzb
zH-6iVCwuPHjfqeC#3es7BW^y%dQRz`JEdZ*iqnQ1)JRMX=_wvRs3iw}G+!I?zJpn3
zddPY#I`d-UNh4=Qq6AnRAs>=A$fksQX%>7yLIbPBPF$aj=@0H`Ya(#f+8U1sEQ+_C
zh?yck0*@wSpa_2{VR0;8=*^qTRv0>$YBJIKAb8~Z@sAto@o_wHBjQNTFw&6+jt+|m
z)0sc+VA2bj*OT0(tG0Q=zOk0njNUk+HCyd5{?(xM+uMWA!>%&u4EEaEVY}DIH}X^+
zO`LEmwnl-ERL(|NU)c+SnK284IEXKCtRv4IG5Y*D{SScJ-rnCjZb)6HTRwQ$?+iMJ
z?c+{&r_=2W-W?>g*RrGY8rUH_Wf!xWeN+>Ldurd1hC#5-MpNgw@n&-BO%eM>z1~=R
z7AYslAtV!1Ty;EQAyZr~lzN^r6$K28D0ae_*H(`4Lyv<5h+L2#k}AD<M?MeS@zJ2y
zZs&c~FZUkk=5+v5#V5vR7p|G-xW0qy1+E8h4dB5t5L=7Y&&7J7{#LB#>hFjQe*yfs
zPE|$yW4c*OH{Yb2FVoGR(~UCUKr6NUCf$6+H)I742}bDy1(rVUDheEa+!YZkutcQF
zztzvazJ0zef%yB^Tj)}yt6l#?3^ZRO2EIS$-S5I_{o{3z=!UGo>Rp;Kn{S%U*U_W?
z{<{clye>GuO!y?*F7hr|3gL^DELh~1EIPM*4GjS8I)z)XMk}xk6*R)Nb*e3EvQ?*M
z8N1NJXzT@J1!*sL3COsw$Z$Y0UdH$b5+%vM`V5xU9gtN|feKY%g^FG+H|d1Gq(;8p
z79J}TMQ?)z<-5=`tR)-?vVcp;9M=a+{jdrZu&S^E7ALPtoV=8huh4ZaK;i<l^{XXN
zkYRl;LgFIuZ82Rz$_&>3|8feFIQ|u~4pLc<=d#L)tj8#;Y}FMLQ<*wGReVf*@DMBu
z7P^en3y;Mfn{WUnT7ojP5+b^>`KktdD{sIoR)%*7lm%8p0X?ZeHPgwV<pi1%eHEn4
z19}-G3;hbnKZg*pY|%M3=9d2|4sK?_^U&{uf<|WJVI1z347(E8pcg3JgIhHLc@>Nh
zU_$laqn+9{fx>}JXzc#lD&m1T2jVdjdWH(z8sl2W^*!zzLY4bewC$lN{TCFfV2Ydy
zNEG&jc-(9zT#PCV@zcl%6$uy$)ahKif%Li`@e>BNiII<a3SEUd7z^kYk2W#dEJVM8
z7RK`q+f6&n#tzf5!_1_^uz@tws!OJUUDd>=#=mn!HXAQea1=$XA-er1nv|*pHE5Od
zYCXZmBXmQ78qF9bLz3&kAu)IW9}|NUe4@Y;6juYIe2;EyjwwO+9~89YgSD~w9@ItM
z1zHn1@REt<EYS%s0W_h3RIJ5(Vkix0ifp34@e+A~o)dA%;Bua0z4=jo&wO-J9voC;
z=9R;Vz{-&dXuM)X)2uo%PcVUo$21wg_CXV=Pnwug%ksB2UjA7u(O=?!i4WvYNg*~j
x;ZN{q*likUf^<0x;UqQsH#p&uUyw9jSic4BRX;MN1y0GJ@BQ6)WxQ1e?Z5q3<QxD1
index 0e2b04fa4125f54ed232545db7019167d981ecba..8431419b39b8c9eb3772a86400f85e0be94dac09
GIT binary patch
literal 2180
zc$|GxfllK_5S?3DmStI16h#(7D6$Yj0n!lB=!7Uxl3buUksL~LsA@{-VlRnX$4=MI
z-SMsciGD)I>loYMBbM#;n>TOf&2BpV;m0wVUX9v=L3?!P*vt!^@ad<2m5au;6EaTS
zamXES*88^PEC?LmtMvux(P2CV&5q+y{*(e+UFy2&=We<jhcsjhl&D85#~QH3LsqKV
z=A34fwo%%~4$`vCb!WrXf^o-6shdOgHPdK22pA8U{ef97<;)(^1v^i`8$WPDWKs8q
zatxqi6i-}_SY$b4;FfZSKDaCvqfzS4OU&oZuD@8WQ2wPW*hva^T;KY8Z23!8f9@se
zK)_}Kqr3oG2skq@n%RW%84J@<s6uVO>*I)GH)+XckIopsTzOU$$@IN(>GS7ZF!5uN
z8A8xZGCuJE3+KL#;vo`)Wb7T^cNz6EJN7xh_vYuNjp`|IlsFn&+*yWKuK$4NDzc`<
z$aFjz^@msE^Z>TyM{+=1EfA+qoio?<Yi--Ub{0+~v~-=YO9K|jUnmECK|^cKf^xu?
z@kVGa^Jd}P2qNM=jgFM+M!8zNvlWkhHRGi!I679k$8`D7JtRJv6DG}B+1zW0Xich_
z29}?&K$P9Yb=reeH?=^htK#tL<6d{t|1?x5{mFGtzwM32_(kpv%lEL%%EAVvxl>+w
zHhXkDW=jVL<WxF4Bj?H&-?1B5HbXVf&P<^jwG;c2&An;8m{dwQ(%w|-bqDSHqe=W9
zZY;SU`r*@(txcJn&DghP-JI4%_jl%Ai&+bLe{>jU917kK&E}7dzi_xA<zX}dCB(;c
zGV1lx4g05beyUa!6)H`<kMTai`&0#h)}~6f^keu_yiehG@jih+6q!5#KAH;1WwHUV
zsj097yFl>TUI#Xa2Bs!M4K#sai5M%v`lmqw{NK+Sfm#v&LX#q~f{=3YMx9b&@OYTE
zQ4oeszB%$C!}_l6h#m)Cd(7d&<W6Bm<PtTDV#21VR}@8`O43a(p0)bDelvb!01fB4
zHZ%ZqwBEwT4UoVfB`~Ba7;**R-I1b8dP%S96?0dr7<hzqJVFX4He?Cn3+hCIeNu(n
z_wS^Ss;m-ei;&U<d0$NXRV9`3Gp#I6pHY{t^KkyFDOmcmW9b*7M~oA=tm*sPAZC-+
z%GLXg=x|;o6{1%YJ)%dhaV+Rs&AT?hP=s@J?c9jHqwh-VmG@ksBVxc!Is*yo7%!*r
hDq)lw6$$Y?T5rrFrWH+uwBDG<tICrXa}l~k{~s8%$^`%b
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index c6b0b79382a27073667862f161604e11a1773034..fe5e1ef17b35a98a1c0720d27056caff55ab32e7
GIT binary patch
literal 619
zc${5OVQbqk5Ea50V@wF9gb>0ArIZY^w(F<CJ~^HVE{!{E(=VYI#l8j&$1>7wZT?(;
zTjiKmVS<x*ckjKs(=tx(GP+r%!FnB}PrQN#IUasqThn=b1kW5~^x8^Lii>8EAwyoS
zVZS|1&jY1EB2>SiteJ!=VS6}V@}}a=&iGs!Mdt&1UAVgE2$IzqO3gKd%SR?T+t$!q
z>aL=>_&+D)G-P#cRJR|4WToUSu4=K>)}?5n8<FptuBD+*5_mDl>qS3KcQmS;$sOP(
z%hNbnW#+2{y|Di=>7~$3@3&H*z(Wg`gh3XCdHj&Ld7R%zgU2Y%G#Uj}m4m{NDe$6j
z9Td0T!}br9xad8uOVKEle@ngJx0{>qeo-7<i(;lH2y3R)Z>d+3co;YEGV4|IuZvS~
z^(pcdGKpPB2lX{X(f{=(Pov1}@iz7y%OS*ab$B{#qR-GHbYMH~+41$<9=q<u8Imu=
fIh#;Itudv<x6Y3xdqgPFMNOJ^HA?J}hBNXGOpC-3
index d0e73d27906d950ae68927f1f5c25a31698d853c..8a4cb6604a59f5b2a73aba60eb036e115e6cbc9e
GIT binary patch
literal 628
zc${5OU2EGg6cxf4V@wF9gc8CqrGyl+HtW-1Pp)TzN8=9L^d$_V*f&ALk&Se>E|2?T
z`)!lsZ7LI7iKBDwxgQTn`YET|brx<mVfKaBAdutf!<{u-BxkVaAmbmM1f_T@mN_!y
z)dr5c*WZg!DUb;DN2nSmp-$Nmt{%9kxi}b~xyk5#;HZh)M~)y_lcUsHBbYxk$=R-f
z!BSUk#r6Mxt(--yX-wAr-$wFE@($NcyVKTH+d<zVKZw4hkxx^2F~}Q|-oKvFWED&v
z0JnLOCFwdhtNKZ=?e9!_8T8%zoouniQwNrWQ65J{@|3zoQar|^=QztXnuK*-fWn9=
z@Zx9_miOM%?kiNd8ax(3$51atEQ5W+4l1~r55(R6o2dFlyj`u{`DJ;oRhEJ7D{7ch
zpQRpD;%O=1CHUiYbNf%{D`XP;(hlltjP0=WZIQ*X8R*xg?^q5YmaD_lVH17E9-$-K
saVO{3a|i6Y7tWZxA<o5=5^7B;CBAiartAr!M3Y)H>p4p7OAQ0^8~H%T0ssI2
index d7dc3f5c9110059537f85570c19dc799db792df5..66b45001732f4edb0d42b4bcd561039b79cdae11
GIT binary patch
literal 1853
zc$|$=|7+q%6n`B;7(xgk1SujCLJ_rIv0f?V?&z($w(C-D(cJ!U<&adTZjPA9ICi)H
z_5BI=CVrV%3cG>HywCf*_jzyLOs7BmJSLB~qxN9X9{m%|SRx|v`ul=jRr?uuju`KK
zUvjouMQKt|=2(P+Eik0oMm$fXsn{z?N7DgYJTa~Uf{@RdC=S^-73z1QWELfJRj<?y
z<5&eW?;^o?7<bY%W?`a;Qt&leDR{Px8w-wd$}byaT(H?kHjP8hX2Wp7u6NFdbQKAV
z3gd^6BY_f<-xVFM7mP<!r3Q_C<}Q9bO_$8uxxa)PN3$2s8NXR4Qz^fx9ZJ)?N%<mI
zZq?ic-SYtxU(;DPO#}{O<>6>T{+gRVibvs7%yM!kZ+$7hcsp@5+t#kl@svkPaT}*k
zI5F98eShNo@XbwJBY&TYE&p}c-{UwK^@q1(^^$6OV7!F!nz{XCCBkIN?w{!`OPcyi
z$fePezjOKf)!xlPqP9C{3ELczCO9c)$y1Sv*CivTGN5CPd)=UaKeW@Qf7w(_&UZ%3
z7U|{@Slc&a1pVNyXR_~0<S7cbNt<-c`z+r2(i@FY$C*sB5|fD=ZF^0hO+48;7JqXl
z);#h2>W=c#XAisZPX#{0Gu7*<U-OAas>Pb8R6MiS9kj8rfUQI~T(OekerYz(ulMp>
zJ$c|$-`gCh<_CNJ{gV4qHQzyl3t5K>{CVFvUh5|o&KM8UyL3)p(rES=jCwtFNs-w)
zb6rgb*T6+_nYe6RMO*||Nk4KcxVLlw2&y`%8ztu^+gna2+bhl`G2ssI_dqJgm18J5
ze?Y|pFi_zHN_qjxP#_)@v?{=nuN!5<GpfZhfJU^&Rpk<Sk5KqXp(F(=$IdmBoe$ta
z6|SU^Nu&@dU=t`n43Nn>(R3Rfa&wL$`{)OWd<qtEKBEbyn`bV-yx5SRq%3_;R(nSl
zWHM0q5EdwyAa#tN)%ovFnP|9&5Orv#qy2P05`pF(Lew!b9s7slavEw*zsY19leJ97
zcAbV4DgIdG?2Sm#&0J6{T#i(0CJ@~^f)i_FQaB+NAUwj$uT!wIs`ZOz#zGzJeIUit
m=Yf$26b1Ic+yhPK<baU}G!G7Pnt5Pt>!59I{b+7NhVVaE7oNue
index 179d4578eeb66e85d26bef9db5ce276430063f3e..7080a8977be8cbfc9c4a3dfabf238ad2091b90cb
GIT binary patch
literal 2117
zc$}3~e{17L5S<7igfKz~BTO(xHNiM(YK#dXTrVMU;^ch9PO#m(wz)Q4%NtvFvesQ~
zdQCa{?fQ}We`jU=vZ0g))>^&y=FRNPD&79@?O1uZ8C?tp7o(s284ZOmUcUWX?>77K
z%ac!e@Anm_QRK6*k#EO>2)abcq1^f2fG(#+X}#-*Ge4Z?HmzG<P)>re;E3l+7nOv+
z<iPHbe$L;T7x<WmGF1+q6qDwH3E^`p+DW1=V*w>$9#x$z{AkmeazSTT)C&lwvmsg1
zvlP5%kuOk1f_uV|KugKPVJ1l7vBy@_P2qQB4YYe?PWkn7=t-A#3L>}eHRH>IYt&9f
zcYHv_g3T^jDDX5<^^ycZq5Ej<lW9N;W_#Nh<9lf(-GF(Y;#!P&dyw>H_*`_Yji`9$
z`8;bEoRh*dI;q{*<NiwA1Z;{kl&(kHjn8N8^q(@rc9wQYx$ou9rL|-A{lX7uCVv=D
zM*ZQ<IKPd584LUIamATnkB{1Kgq!2u<)nW%)K)}T6B>z25>Y+GcG|H@ysW7Gp7BqV
zcPZ6pbS13bauu)_O08Zv_d`l~iA_IJPZ${SF;Y)Y%YGOM5_*(9Ib#yg=pIMILVb$f
z=8|{|j8eaRF$W}+gEc1o$!*W^7)J4D5Bm<~e&TTVRJx1J&3C=g7z<UtR$L?Q>(!MU
z`O**Z6L3?#JEB26&1m7TqEhd2aPio2Xi_LD%{dKa3#)mJ-?ZDE4xZo5AvZmvyWiSo
z60dE1U8cK#vV|8K;O-x7ky&Tm{cEIJ*=*d?(?X_n5+61+o9fIemxuo%-%67lHIMuA
zKjStX)<@6d|M(yAn@%BqPnNt!=ocBkJ~Kf~PFIZMTO=E4W9zt(7gZPd<9_D&MZBS8
zM)`!@vbp-z>BD5y>*ZJeJLBxQ?AXeVQ&zxf;cDPgan*1&admK+$ZHA!95)r^KvVI*
zwtRN<*YUHdzfv0T3*gU8F^-HQQ1xSIx&T^Bg*~XM6>y-U902UpRn5^3c549Yx$y)}
zyLE`$SH>=8g@clOQ#$s}u40}b;6TR)>0_rp2KrcQA49WZAH}rFhOq~RekivVZY}*>
zMm0c2Ni|5NBIyrDfDdStO0c#zH7U|k>k1~p08QF!6&a?<Fc)m4p_W}0WtIfK$264^
zoWyQs=2qKG85d{iKg-9DuOa^X;arB)FvN^Q%EbaISU^23prX|a1(<OG8lLkEg$UKL
zgnE2vD93K`G_(?wK`DW*;~0kaj<KtP1}aKY@ID45im;i%qct4kNZ1)MNr*LrR6C>I
orBuQ}J7unssUlcTf!hQyQ{XBA>=byD0GY>I8)Be_H){(205}FfhyVZp
index 0141d3da42922e592e33e7a909b8bd12e219249f..4b8e13830299c6744da37a6809036faf9b416b14
GIT binary patch
literal 1688
zc$|$=4{PE`6n`Bggb+dy5fPCPMC{fru3MIJcl1_m+I6W`Os*VP4w>rc=7<@YjNR?G
z-fyt?CN_;Nh26k=^Zv~Hz2AG8{&4)+C%2c=-e}aD{u?e>EJOM5dr$w+8m7)NWWxKl
z5iChU9yfE-msGMfUTO8vU&YGIv!^N@&PQy0$3%W1pkl?O+YjSK7_agU$5)|bf=0d+
z7|&s9!Iv<}UDb*S$rk5q9#O#-W4dN%S#ZLWP~t5bO{l;GBC34n5qrE{GZD^nwCb3B
z%{^#8;bhhRoNt(ug>UFC(DCSsiHmJKSIu@zs4|@kF4lX^lTLQ&T8x<d!WRP`OB^|I
zZ~;_2?9Dl#QIxwUFE^HNs);m0dKa<1#*LRTF0!HfoJWktIdnH0$DfOEBQGO<hig}J
znY&1P|Ig)h^}n7ozV(CYaD3_KZ)U6A822>VGVPv<(u&1w$4-xN9r`7UJ4(G%s;kud
z;zn@E<->-NBRgA_%Jh`#TfR34hSy`8-~Gqta`rAWy0+xIhf*5GiKOwIT`!Gb7+iTK
z`?kR=q(}PJjW_kN++ad*Q3@Y#@}-FrY$N%PU~(&B$8BXPhc6v$>>f#cbjSGsNA96Z
z9MY;DIys6{KKJ~=bU0BIO>Z#jAusRm33B$%PxJrfgozV#=}>3+IH4V|L=I@einCd|
zf!S;i_id;1{%w5rMDCG|+ToGw>^5-d22c6d2|ocIx<xdER6TWx%K0krWqe|E!9>8X
z_)5R$;o>%!dS3o3f9Rd#lBE-{3=|W^LMfwEP+XKMIj|adwg~{7wg`EnSB+2U**4D7
zvte{d1IB=AO5CDbgsSlY8Z`jj)xd#@W<w2ZQU|-x1URT`dQGqE&2kl>Knl&S+rfOD
zl;B*4sseC}#wpZ{-=Gdn=qezjg+Rnc5(q$aP{kT4XeI{KQ7A(C=^vHnl%Pb6D>T8<
z_A_0uE_TV!3f6oLw(trpsA4d+=dN7>3lxs=t2p2PRE382+(jHS#nFG6kMcm*p1X)+
zq&VfDuFGiUdpc3YWh~ZHn6hTH6iDUgAa7oPRJ1e%75gOEqt^Vx=%fB<9OD~twe~^#
IAT=lOKbZ%eoB#j-
index 278997e4840be927b5edd7f3288e1867174111b0..49e281390e5e69c1a03365d02dc123706f1966a8
GIT binary patch
literal 1700
zc$|$=4{PE`6n`Bg7lMQkL_|bF5V2dgxNcd>-O*dMY1gG%F}bpAS!AlCn<HjqGIqBg
z;J)vEgnbjWv8AvZcyH$Y`@P?LnQnjh(I>Z;<IZ5v8Gi|9ES8~s_^YG8YxGlN9x~y5
zUkR2ZA&=|X)t6MVC8jhwXfI-Q&7!9&98L#pdB;SS5KysT((Q)vEQ}XfhvTbIGC?C>
z3iM|%mEdcbWTtAxgk-aGHjSuYvmsrw@{oPYQqFcMBc6m39W)wIfoX`ZvRm6u!}XGh
zaGDiD^RaT5?@#%PIXm|a-8fnvT`+O6j;9KK!-T4<bHT-OuU*pGC0&aFlVAC)$76{j
zCk`%viif>9do+qN^W^!)vQ5>IMo8}>w%54!+{eXk%r55<qj3h^-i_l=MYxie5x>K=
ztGV(UPjmmzWp&kmpEADngK>X&>1S`|f9;cTPop){?x`p&Sj;x;^cdHnU$VHR)ElMR
zO1-sLf=ezRR*W23yH%-3N2#vqd%d84J+%1Ue{3ozZ+4fqCHdx|6#8)@X*^}ub0g>n
zS6-fdUttRAkgj>-jeRUPm=IhP!fhs>=W&8{BtHu#*CKY@#xCUWxr2?}BZ-ghI2+)|
zJ#>jf8s$SLLvhUQYK!Nd-y8QwifZ2L4LZor`!quC-uY?v-<&XUVlEx(%(s(T0ZU|$
zCd{5p(oIYzd-$(gt&`XB*(1p<E49lb*V%01&<!5rFB5+RJalcm2&sDN5|#5!;0yV{
z=!}VgU-5;0&%@bmF!sFcm;Pb2jtizvz%)?uC?-k~rG(<5l*xfv!?Q^M;Iu)=E4^%d
zOwXqAK0Rwji_~BQr~=~Jt_@}59n>lSx~qW$CC!Ek*rW<}t`2Ze)%1#9)$7GFK#t_<
zZMTK-DzV@~hq3~2ZQ~Rw#-C7yI<yrK(n26&BMAf`I;die<g`3G)R8Md`sweL<ycT4
z#t^SyYWtBkm>)L5D+QZ>2{!ivEU040Yfnwf0uvOD@w+%b{!xX7_S8h2e2Sz0HXmhy
zu01so$4GICzg(Bm$o6!iii=pRr!Ym$Xef}<uR&ft11V{#3rg0>%^tP-nQ@M~YaHVn
QaWxD6Ce4E;q~;iY0xZy<?f?J)
index e53a99c3a528422da239494de16791d4121cb695..018e674f55324064dd32a7fd2041d609fe11e572
GIT binary patch
literal 1703
zc$|$>|7#*g6n{5emSqsThy)RlWf3tKFL*Y0gtnxoW|Q-XM%-;E4Miq8dRufyX2;y+
z_x@x3kNPL{&H80E1nz`4^S*xG=e-@<-To(^++Pn{y<ThhS2*F33f0puKU!zCZemPB
zF1@cy$>TT_Q8iV4#S~v)O09+VEYfNkJ=fuI+~bP}F4Kg7$r)E}JB%h_G)p_2-h_%v
zHusf8e+p9yK8JB?>Q-DTKDp%MIg@<SXA55J^Dk-2#WrOi;!vT3%?C_k8sh8h#->w$
zwcs)wr-e}8Rc`bBu~>3v>%L=aN5f+?F0WS6Si`TGFs(XQLN4~&#f@#!t?Y62Sxh=2
zQaEz#-~yO@+MBb(=JV7%d%m%BQ&pr9vWGd}Yg~Em6SBEw?T=-+RM&IyfZNsdGiy(M
z{{y9+%fBBIyZ3`(w}0)YPvc+njy|&aikpv2TGu>k=Vv_PYbI8NqibhFA8+;1)W=V`
zr4&l2rzIyR_I52g(#rZ?C+ObxZSn9oAFI*Zt<toWSigsSH;NUD#{70lgKlu+W%$=6
zrjQnCXYahBkL8q0DP%s}WQu79Cs@tZpOUMUj2ySN4LM@!U}N`0;oCY*xu3YlE^$b$
zc<iJo&e5gkcZS`8rkL?My%zHF{um%<@A9AYvp8YwFlV|MtnTc_)!h!$BB2}>IqNCy
zfXAxCVxAj~lA6(Iult)u<K3I+VmHEuvtIIvyFoa1gI)aPv37vRZVnZxbWcm+;e3(!
zZ}`aBgv&tOh?(^$!pVIw^t|+g|3FXc`79-n&7fpaY?K0uf#RYR$*XJy?>Yg1^BN(q
zts?!H+;w`9+!fj&73c#VL*nM$JQV4BsFVOK*8~R&W)4b_BW1`LRe)Dz(<)hIt9n!f
zFo;oYx($q%i4B()6g7aGr{_?jKSLR+(9}Rk3xP-uNgx2RKo^_DFf-`Tmzjs;XMNC?
zW5W@lH>iSb?ME75U#)|mG;H=ISmOm)(8Z9o4$YhmHfWs8_u~Bbn=Z^)hbH1=6CC>8
ze6$7BIy4a{li(D-xh`5u_jIO<3s_7On1V%X8pQZE$m?eyhLyO$$TfpKYSmw98_y5)
Q6yJzz+F;;Ri7|lx0Yp)t!2kdN
index eb98da1db777221c61a30b01123dc868607e09f8..56239327419eb4d61b9f3797f05297dd65475f0f
GIT binary patch
literal 1630
zc$|$=|7+q%6n`Bg1PLJ*L_|bF5V5T%)+@_$yYyCF+jXh7nB4ww<&ddP-5fC^ld-$~
ztMC4VdlQ?EErs2{o4hZd_jzAt2IJ}HfZSZn`jbh2_II>oiHzjKyT19RHO`E?h>6kn
zjbLdS@uaEMKvK!p2x;}vUL{J^(YGobEhcPz%Y+7mRIHfv2T`(&l9jGd3%^FG&hA`B
zk_j3IQXowGRVgMUTYhAVm<qO>(lx72**6V2%OTf1jU+l~d`$(ykWit!kJQucnu%zk
z6QTW-nd5^6-!LzCf1x`^cSKiAoNtqbqTh8wmFk^yvED0}c5~2`m@xU3FNZvlICARY
z0;qV<#cM+v$9rqWS`odC*&ci2rH_kzmI3E6qlwP%<vj-r5pCo}%x`g-s`=BGccJgV
z+JW2qH>WA<e?IT{CJ1Na=|!O5%rC}u@t($8X53RzTCs%f8aESMhk3!0t~yTC(No87
z?nZFQ<->-NV<%sgiuBbnu!GSs9A8Zxe)|tw$oWaG^c=}|FQYV0Qc05qySgie<M481
zvF{s%kUkmMk6W?7jAjASl%hv0zq4?LZ7ly1Om0Qu`K>(U@jDMo`^OTWV@Hp0>>v8X
zBdzM8r&&B}G@SIYn~<e)NK@v{=h;N_c}=5!?RHPjo(erOtBoA{-fo^lKYWV6Ui_)(
zq3@z1q^f92JiKoLpTH+ZmrR8GlCR8r9xZRe*=VFM=3lehF4-mlyNF_;*eGR`3W|?X
zB?oo`{~ZDVr%ggyX4M*G|Bm%O`!}pEX}~AI<C6HU??Tmj1C1Jh=^Nld#c-hpE~$fC
zXaXG64YOv}&1Sg@P#}d)&+lTqP8>Khp{fXc*Ln*z>vyO_6MBjW+d?AZViQO}Oi;-N
zDHug`s9&K3*=K%Gmghi;Sm&sMZR|&SV1L*JKPp=5HQK@}w4jo~GM<}`12!n0;?MH@
z_lHU>8qZDSu`(X>r~6SBn8tGxd5RfN`G@PWT6#~XD!GiwW=2ystd=6F{FvnE1xdxo
ZTu^aNr@FNU_=W>*as<#mIzaO?{11_3i$wqc
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 343453bd8099a60f797bb8ed9c012b589b0dc3ef..b5ef604356c8990e264e8c410215f05efd7cf8f7
GIT binary patch
literal 617
zc${63QA@)x5XWN}rHoR>7(>R8Fl0;w5nsiJZI)TtI%vyYhDh4pBvPA^2In6AvcCHb
zylov(1G!6nclXa-Mt<-Z(d8r@&St~#Nn}uHp|`i+v@`Jcmz4nJeXJFfrI5wdRA^8<
zkF*lSi{X89j5OEqhNXjHS%T7#-9wsl1zEt~fQ>}K)z+l<5M-!jUh6No5<JP_P{%c9
zo&RT2b;mr<jZP<kjk#S{eU7Beffpulb8IR~m00UZE)$$4m1}SgWEsVwA50?i7oW6m
zy>sP8-Z=K>0Zr<$A5T5E(r(01>M<|DU3g)%OSo)_qSU-dL9Pg8jyIkSpKqLb@(QW$
zC(J}y#eNa&WItXLiPAf5TccTE2P|QCtbh%xULIWBvOj7SXB&mnKLF1_#d0cNmT~BL
zW}vUrwrx>DEDN`TyGC#|9YWnYr3dfO_TF2xTWgRrg65psuI&;^Te~WZ)tba6XzDh?
TUhBkekQ%X%pi_ZUEM?>eGP}C_
index 79d34c44dcaa216b92af11904b04015fd0274a68..ac8ebe143e93c940d24c69a988a6d39f1251d9d3
GIT binary patch
literal 745
zc${sKZ)@8y5XMyzj4{T95K0!x5G4ff4`JkO=?lj*nMdM+ZSp3JA=}qZ!?lB~Ez8H=
zH`v*UQP~ET<on(8oOIGEj6NrHzmC1_){DQ00xBic>Fzh3x?vYQ3Xs9CgM_9Lb+y<C
z1(KJElA?Oje6D{J#T7iGm90d@<w<8gT+FMwE`e7%F^%A;BiCyhkP3>Ake6IS5%FiZ
z#bO0+sSh>ZaVdCK!db=@T4#T=THg4)EOqf^Up&dBIH+}5XV^_%AHY77eUipuv`+M0
zyc#T=B=FPlAu@h)IZUBZK5u|#V^KAVS2@&=&ZQ|U4bx3vKV;t_SI#bo6SUEHgfh#M
zlAo3r9n)5J7TbZp^}a6M^c%4D%*?M*B7fxA#4LNM?+VSce@l!oma09Usc>4L8(yj|
zd+)Fdma%(Q!LeuVn>&{MN6U^9AMF$H0%Tfm>Zg4g2Z6qvEuCDOHlf6}aSU-7ln^o*
zQaW-79e3-H-gK)?Uk}D)MsRvhjgc`TgkHBU%o!H3$N)bR;al^{Fo{8|9^77l(*uT4
V3no2qTVP&k%e1ptXc?0^`2$>{*E#?I
index ac67743b38a2f318d8f4b6006997adf22818a6e5..750b04f2b3a1bd376e3286c474e93f786c6a0705
GIT binary patch
literal 1058
zc${TY|7+Sn6u%uIgdid!t`sRjL|o@Y`fX*UKWLVUquOE8{!+#`lUJK9=Hzl6lWqU|
zUap#RUEt;NKA-n_-!8-P^pj8TN3+3XGMIgdBS>W|*B4{!Luag<hZuzSb0r|lVxIP{
zV+n#Kz7%n~(0Fqgrx7Ar)7GRfnS>=0ok5m?kPv-@Fku3sDO*CrWl5rg+jmUFY@Wb#
z43mhpUSeE0SdfXe*0r{|hY1hA`ypRJUM^mwd1W1EE8e-8e}ixbCe1?6pHkIW?>{6{
zX}eqeGq$n>+=qgXwy+<HcqK;(pW~i##@RABh5}A>V*wKjka}%(m&x$aP1sWgeUB|b
zTs@^>zJ#59G`!_Xu8XxgS6nPvQnZuxx0)L<0r|)ym!}c~v;OA#hMXtBQayg@x#{yf
zXB<voIS28w$z~wds=K1_y&ufR(~+<Lo7YCq{K15I#X05mK@<g$Ntb0{gAiO)<Rh#E
zm%KW>9Zhd1LvL30JvSKNOzmJCTzlm^Z|0*%q0601=hvSLhdXhaNtTAd9~@rOj`jZR
z__XA?lfl=c-w&IKaTmPvW+UBJ+qg*elrPtKDVGI(;k0*4tU&!?4UN6)_m8WEvWl>f
z`CyjBSFfnDlO&)2?R_xwJiVKko-|8Vi4cpTmC-6_RWyU(vtJ^#Y?NtJomJXUXN5ZI
zEYW?_CT(&^h=KAxaR_<UBl|5>cFkJb-Xmu1jL;UbG0rqAU3x$dk4R;Y*o3MS#vVDZ
cV>zk<Xq{R}8pP-v&_)f@*8U}_g`XYr7ZNK=;Q#;t
index 3985e654ae4468f088680be159a7e4e8b5d1e3c6..02e618fdfc17b8a8afde235e8c0c0b0b9187fc2c
GIT binary patch
literal 945
zc${5P?~B?%5Zwj|;Rqr@q=+2Big@L)a@SuV_d#tGi_wzg?u(SNCX?Kjn3c_5ueS7K
z|CRoooy3cgOW17Y&CHwkcE|JOXIELzoRMvhoUbf^L^8P_{#E<Ec^-reg!OYLAWa!h
zy5+Acse~<-^hRk4LPGEf{Fn*|mUIj4F-roLL?uao!6XP8yHX&2LU~68qnj8G?NlPx
zd5&?>n$S2dyG-P#VqXH83Kk`qpb{KB%^Y(c15L^VxhzC~LHaFVmFx2zTothE3$~N9
zm~T*VmNAPAO3Q(_<v@>$2xMt>V9^M~^da#xGbg^xDHmHBA7`e6qG%;-koP>8@I)d_
z+FZipiQCoYJNPHY^n<>S*(EUFhV2H#b3JR<bLPvLTi)uMN>}|sg*xS23F|CLB~5(b
zVNKq{PH@Q^qag4gl@pqRF}|HGZ|$+=R9$Q0%~#7aZ|*Iu>Ye4d7-=8gU%%6>i9Pyu
zRXcihASyIVBr-!T%<)6?i^VZDUu7--!lzn14BopifBzYp#eDN74>8ftW4XtJzd5E)
z3QO@>wQ;OA5Ee4?pk?zHXx9vpB7sM<5ZSvJB6h+Mu06-H%5%C_UN`lMPDn+;RmD}q
zW#Fn1e41xO(bcM^=DVRa^1Y@Va9yh_Rbt{xRBZ2%mxR1%lST_W72{m%;rEg#=R{L#
fD$$67)n}^Ks*^*QlT^Ccc1U#cL<O}}Nt^r!^qVO=
index 8dd42a916c80a5edea06d6c61b9ba5182e250262..1ee775d844c607e522201e911535ee796a11c6db
GIT binary patch
literal 101
zc${<c^z#a4igpij^!0TNip@+(%`3?)skC-sF>)*}PAw`)O$kme$}A{x&&f|p%n44;
hFG%Hqh(rg61bO<o2O~5wF+_(1xw;|*c$gSK007}MAol<O
index 9b071d706e755808b478bac41a25d1d5f60e1ab1..54bbad80213e2d599a3e5d3d4ca70b40af01c6f5
GIT binary patch
literal 377
zc${5NO>2ZO5Dh^@L}Za3dn%>usfWGxq&A3UwUA`@BBf+?S^}<0GL-GD{pStq7E2Fr
zX5O3ctgN2|Z3>=NRmxv<2Lo#SeE6nU>(p8>2;C#Jy)w|%>IgTP9y&d|m*>Ja4d#BU
z5sc~u8mF_<WWZWI4tINHv^w-Kw<~no?SE}F*SYHZKV3^GP$3-Mn)R}5$!>nH6Rpt`
z7X5f|H?-pf(X2E=^0F?(^3y5tKa?R!wkzsgl`$R*mdo<F4rM8~EZ#FN9E(_9rLUXB
zqB1DKVt~#xk~6l<`bt&-@dzQlL*NiPkjN)ApuR`XKJ;cDT)5}aD2!v`%!>Q~7J71N
index e29492eaa0840fc59673ce021cfa2c41e7e632f2..ae581c7a96f134d79ffa12b9e3fe84edeb68e280
GIT binary patch
literal 422
zc${TW!AiqG5M7rNiWCtMDMciR<Rl)%n;@h%4G|klws?s>Y?5i&n(T(%RqWq8X>B8V
z*qO(?H*X$0jN&Io(=hQT6F-@Y0;CmoeLwHGmqQ^7A(zo+wh*AnwQme)3&oUcUV#P8
za#h2_eyohJLP=ik1u?eU9nW$tY8#d+<K<@4-7&9xYt<id%cmNVw(FaKFF}t#WZswt
zU$q8f5P2<RmRqPWpgUH&`gPab{oi|3(xTLO&jJ-F{<+g+bYHR+<hB*}wqZR?CU{oD
z2=Wrm8^^1^Go@2DOQJYr?GFyRbmc6RqVLWp*Xb+?f|h(6bO|B!xKDd$^ax>xlGCO-
Rh{?eTMe-2exkE3oeFNehj?Mr8
index 2482306d8c8ad63f575f5757c6060926adeb9558..2ddb1fa4566e135d369c711be05dfdabe8d013e3
GIT binary patch
literal 316
zc${UAL2JT55QUc^h=_<35%CyAJbCciQ=$?gm_s)75<HBXX}fgYmCah}59<GHSc!r?
z4exu8$GkYrb{xtikM{d0Kgf!-lkWQZ3)5Lt*JK@4u`=R|3v;G0mb#MqBlWR&Nw()r
z7T&YwqN@x~wERbEU$JQUhJ->(-deSg3oFkqQRaxs$H!}Q;&ZL=Qd9rthK0R)${jj7
zHJ{Ai&`LZix^<$HM$ev^u_Z6^G)wqn<uC~7r}K@rEb{I4!FMkM=rdr91!I5-u+AuG
N1RM6C+Z<qC{Q-x0XCMFo
index 68df0d08c3d2e558f4a11a79ad88567022254c38..a5174aebdb61a25e3d606f14105ef878d66bffa4
GIT binary patch
literal 239
zc${<c^z#a4igpij^!0TNip@+(%`3?)skGK+5>jz2E>0~fNlkIe$xqG>PR=h#<pML6
z;1c<zc`1I0xv6>>BE?|!MlkW<<f6=i68D_^q{JMsjFMAkUP@+Ox+mDew9M2ZG3UgR
z<P7JW#M0ta9*BCSkfKVkXmCklNop=oWpr>zkf)z}Fv6j1OiZcKAwjOL2q6<b4h9AW
TCIKcO$-u+L!~&$a7{ELLz@klD
index d9f4411ff67bfa8747e6e0b7c5ab36c5de8ef807..f7cfe6338d314d33f6366c35659ed296d431816c
GIT binary patch
literal 419
zc${TW!AiqG6ntGmC{jd3L?lQMDLse>@#ZP5X^7Y$N$Dkccuii*!e%#Y)>8l8Z9|Oc
zo_1#5?99GtoV;c%kJ4bV2+|K;k~G|WJ?D-Olb~rx8!BI@5U8n4u%i2pd`E4eA)OVf
zrpJ!X3e9U13AILXRQyg^VLN&|<+9{*8y~YaoU}JXA;NvFscE>94<T+z&p%~hEb94j
zf6WXUs;u9iD_x=ZDbqat_sx_vcC?xFiNC_$xV71?M%zw3KWaZRwyim?1+_cC!^?Mn
zIi>S#nZ`+!^$YaeA?;AOJJjw*seGA+VXv;PUB-aH0GzYYC9o^UW9;SxPT_Da033k9
IIl$1OZ}4o79RL6T
index 13b6485afecf964b17bfd97bafdec4609a217826..9ead2d6c214e05cf6e56d0e5647523f4d95bb30a
GIT binary patch
literal 373
zc$`I0O-sW-5S@k)iWU(O5y_!=kRC*eS5Ik8LyC!#Enb3$HJR3h&2E_87XA0G4KcTU
zA2aXGF4BC>yfP`GEQ^W{QKPcL{yd%fA<QCUkSx~ESV>M;=e)uDo_yovphaSpZt=0F
zSw*6?iPWE59+hdYyz|a_yAY}tYL_0fwgM?!aw+5Qme3fX)jZ}qq}5(k)}bz(|2^*p
z53}52;}%R;ni?+u+n9Mj_(~btFI_LSvd(B`L*TII;YGM1SJjfMH1Lz|j*@MPG*8&@
wF<~&q1DC;8>)^nt+!S#<sOy`+^T3A@_~(-=@UFcxfD-_?bR>)}0LBjd0z=V$r~m)}
index 6a2b3a0de4d271bf025bf5e2a21e4eeb9fff64f5..d94ecaf86b1d4f4161c686f866e07db5867ef462
GIT binary patch
literal 411
zc$`g8&r8EF6wX2^LxzZmh!hzfWCxMqRS>$_m8z}Mj9rR{XZtn-X)=;H^uIS<>FOcy
z^8Lz}H%qc-MvFKP(=^OKc!kn(`}^?XU0u((thn4Hdu+{7lSya{YKzqqmI5?Z8Ps^&
zf$yN*)uLvl+T!B@R)$-yB#48cvE6q(D>dKRSg21Bd*`@gR?tQTa}Xl>*=jV#1x+K^
zpk92-vWac0Kr`O-8fL*_?TU{VO4t9MHq*}drc<<Es+uclozP7BkM=otuiTkjF{|Aw
zdVJKjF4!_pvY7RY3;ZGOK=^B={2l0GnMYC2u7V@#QI8A=Jt2fpO3sN-hi)W;GwOhm
LJEzANgkI7=%y5g@
index a91e6fb2f6115bd5d579c194a7c2c6b542a2d98e..08bd0983b18ebbde962be4dd531918105c3846b2
GIT binary patch
literal 373
zc$`I0&r8EF6n+h(3>_jOBGSX~AUlW*ub#Tul@42_8D5Hq*uKp`nv^6C{qN0IYHs;{
zy!U-Ci>z2vQl({_=W+SL8<dvY->1`21hd!})E1j(tOe896s*PjfqY}yL5rH!s>8>D
zrnTmsO@;bo;;2jq<(>7`+Xa^mm%HqkwdJUzB@-g~=`<R{m7FJRhkErbYwJ)S&JNEz
z@1d4iY~6zCO6it~|2Aem48H0d?U!nnN?K<$Gau;pJiKr><f>ZjDtUg=-%-&`nH4GZ
w9}|V)R;e-WnF#kxSDP|Pyt=*#34sv=K+XV80O0a~f(w8#1mt{jMaVV$0Y7hkssI20
index d400219ff512eb4b9c7f27d84823c6302cd672e5..366e27d86efc9514af085cc6d4eb7b13891d0556
GIT binary patch
literal 197
zc${<c^z#a4igpij^!0TNip@+(%`3?)skDB=W8_#|oLW?pni8B`lvz;Xo|B)Hm=m0w
zUyv%}oS2j2T2WAxT3no&pQnak2A3q3q~-#R(C`Esl$M!Vgpk$q$t+1N0vb|Ml$n=~
z5a)r|5FH#6<mu-gjBtbq3rA{MVh&qcetvXFkgF>~Mv9ApfsuiUg^7)UiGv9MSSCcU
index c1271fb8e8c52c4e28a1c552485d2444adf1e179..45313bbbafbd6819454e2138d073d27a8ad28b92
GIT binary patch
literal 398
zc${UB(M!WH5XR3?hR7HqA|gYE$nZf#)Hffbn_a26BF*rn_;78{5lGXLWJCXJ{{&-8
zEoh$Ze&3hNmzzcL6K83d_{*iAyorL8754M~);m3$2~`NSjvDqZNW+D13~5WnBjpk`
z6)~1{*})gouC=6jUe$EdVV-MI+fY^+%0`)V$}6_k@f@WLK59+Ih)P`rxF)^WsNA})
z=hMFA7A=)7*JM%Y66NpH=I;N!d8Mqgn(Jrb94O;WNm}H+Vc15Tx;z3iN$v0OXUh3s
zR_T<lk|+*&zpRnRaIi(4u96_=adx~50BnCag613o3;=cxfbB64n3GNz8v`7*^49}=
E14;vhWdHyG
index d368bc082b3b4b1b76725abba8f86c8b1a39e6e0..8b65e0f6cd94a30b2c39ac71f8e9f977bc309197
GIT binary patch
literal 524
zc${63!D_-l5Qe8i2qIFX6e&eY5D7i>AiWj}+Qwk1TC&oM^sq@ryArdq*%p1OzDJ*`
zn}n!!56jFy|2H$tU^IDQIQN78c-#*@L`<m`diU^Sxt)PXW05XLg|-l+Zu?nAN>lty
zQNk6)6TT*JD)pT!7Re2{CJ;PKsI+k{WZFH|q`IrPH<PbPQ%OJWWtoW_<;mWV&vRde
ziHxX>S?OJ_-B%2Yl-OuLks(itZat4LNe#c!C~tMNP^&2Tq)oFjW<~4_rCJ}2%z70(
zRb$ehGJcY&HW$g-C0wP>G+a@nz3oO(mKlGeT&B(b+2(8(j3z!ioZ4;J-&`Tt3n^_G
zu5gRH`7H3fgXOn#foOqwcxgThp$!c@2Lw2~MnKC(wDW2Wunx9kwVE}!0i)txMeC|r
OL+BP@-GER(ss91W1feSc
index aa461147f37f48d6b4a166aa7d0ae0f246708bbc..5b6d505c434d6a64ca5239ca0ce4bdd67085bbb7
GIT binary patch
literal 393
zc${63K}!QM5QWE3N-0G|M8s1mA|4cqR}a$awp7|xc8izdA<d3;Ae)rQRO)Z`;!iNP
ztQ7-+nR(y57t$Z454oBRv)*LV%U-BJCnO&?pX&6Y7Xq?iagWAo#v;`vcKYNBa*NRh
zd?jSKthgu5kr3qE_$6Lf<J>SUWoZ3e+l|t$lxMv~yNO;P4_3|ydAE(zKV^I1xzzU8
zICLxMktZl`zPR&F;!8qzOi|Z1U6sgWlJ$}?gb22_@#is%^xWbf_p|>q&$E1*jnZMh
z`-pL~X{jV>2nMNJl#cW6%6J!~ZE;OT+xola*)&U%-PZi5p+GeNK(*pk00&S9*xQF%
SGd8hQ$2E1L;1D+F>-HO*X@e>N
index 1f531af07fc6df7d796c67d9947f2d2f7d05062b..df3e8c3167f7b5958474eefcdc630214efe6d0d6
GIT binary patch
literal 379
zc${5N!AiqG5M7oKLI@%v(xVh9J&IQkHl;B{+9=uLC3x8EPRvTW8zx(^AL#%138pq7
z;GEvPdGp@PGD)8p&EqWGY{KkKNzhi=!~Hj%Ojg|T7c>o^J>0I91>|+Q-vKHSeKiPe
ztBjuYgF%?`9n8bF?J&p{h?*nFBY8KFOrUCPT$_T|Omth*rP5OA_vA0URDkmlj!D<g
z#RmvG62Zx7$|{4l;#v+j%w9PvUes{P=e85y{O1hjY?~!%%*L-D1GhBB{p9GE3R@eL
zX5U!{EeNBfZ!3i|-)2!XuHd;xT|x;V^pesmpPYHbagKdgKM%z5dQ29?@q6qoE&}%#
Dp#poX
index 62acff47f3a56b6b1872417477964f3055cf837e..47153dbc959545b7933c5bd73fdb7f1bfa59a7d8
GIT binary patch
literal 217
zc${61y$ZrG6otbjgd)Y!2M`fwSEm+Bsn8BdaVZXIa+N?#N*V-T*C(-9MDW13oF6!O
z)tm%$CC}<Q;}@gRMH8Qg*OKhAal{Z&A5mEuP&e|9>)beP+^zZ)uLi^BEQ67~#knS<
z5Bu*@s9=UzTHi}6lpipio$dd|c-M)RS4}B?A65x_$N&<0P+iN5;uqzMgaHr&bb^sd
NkP^ly5Ju?)BX6R6LZ<)#
index af2c9c2c3f2b9a3de46b63aa9b2f8949ee013949..a9cced1441f6fb74eabf8b774ad4e25eaa00ae46
GIT binary patch
literal 371
zc${63K}*9x5QW#Jgi?x#h=`{kA|5;huO1}TG(=34q<9G)Hpy5AHoIkZEA=;f@h7-V
zh!qD0hW9?^4Kqu!hk}=J9;RuSzhVQ*qW!%2;-{CPF+diYd#I%#Xfn~l*$h>KYMFH4
z8v?PbfqNF@2n$rydIi^mT-1as8%tdY**X5;yoeqRBC!OTuT^bPt3FO_M}MxV74mnn
z2?pqiQn2s3xzozJOHA;H&KELUw?J4&n-zgE4xIM!7cL7$CE?HZ^Z%NrvRLFv78kom
z_@4J6Xd<yiJGNkKxyYkv=T}E#&PL1?pSpI_0rME!+h?N*XMC$4Gk(JPA?xb<_6IxA
Bdg1^8
index 753ee7b0d7916b776b41c2f734e7a1a3fb5be9b3..0df08a720804e1eaef5273c4e4d5658947bb10cf
GIT binary patch
literal 413
zc${5O!AiqG5M7rLLMb95BI2QlNI?(5tDvNsmWqv%6feQUHW}l<X1C04MgQ7QaFdd@
zIEP{Oy*KYIGnyt(8P6waG@C`~JC>j<+MnAi@9cbpszg;yTkHdYhLJHq7RpB`q#!60
zQ3Jc~&{sk3ZGo~vFX3(jYl9ZG5^^JG_HH^pD+rf%BK1PZc5~1%Z(?l~#-aimuT;_a
ztiwe!4#t}59bXf6q8FNh{nX`yR@QyrgwN=BA(K@Nghl+lBrwJa`|J2imxW>>VaNUA
zKc*?q=IJz<WZOdx1OH2qFR1ECtkDJ*jLqk19B(!1xW~EAT=9L^e9jJC3m9i??|?Jz
T^*Q$%_Jr|M<{h!Ne((PPj5CO3
--- a/js/src/vm/HelperThreads.cpp
+++ b/js/src/vm/HelperThreads.cpp
@@ -116,16 +116,61 @@ js::SetFakeCPUCount(size_t count)
 void
 JS::SetProfilingThreadCallbacks(JS::RegisterThreadCallback registerThread,
                                 JS::UnregisterThreadCallback unregisterThread)
 {
     HelperThreadState().registerThread = registerThread;
     HelperThreadState().unregisterThread = unregisterThread;
 }
 
+/* static */ void
+HelperThread::WakeupAll()
+{
+    AutoLockHelperThreadState lock;
+    HelperThreadState().notifyAll(GlobalHelperThreadState::PRODUCER, lock);
+}
+
+// Uses of the helper thread state lock are not included in Web Replay
+// recordings and threads which block on the lock indefinitely need to
+// coordinate with the record/replay system to make sure they enter the right
+// idle state when the main thread wants to save or restore a checkpoint.
+// This method must be used before any thread might wait on a condition
+// variable associated with the lock.
+//
+// This can release the lock, however, so the normal way of using this is:
+//
+// while (true) {
+//   MaybeWaitForRecordReplayCheckpointSave(...);
+//   if (doneWaiting) {
+//     break;
+//   }
+//   HelperThreadState().wait(...);
+// }
+static void
+MaybeWaitForRecordReplayCheckpointSave(AutoLockHelperThreadState& locked)
+{
+    if (mozilla::recordreplay::IsRecordingOrReplaying()) {
+        // Unlock the helper thread state lock before potentially blocking
+        // while the main thread waits for all threads to become idle.
+        // Otherwise we would need to see if we need to block at every point
+        // where any thread acquires the helper thread state lock.
+        {
+            AutoUnlockHelperThreadState unlock(locked);
+            mozilla::recordreplay::MaybeWaitForCheckpointSave();
+        }
+
+        // For the std::function destructor invoked below.
+        JS::AutoSuppressGCAnalysis nogc;
+
+        // Now that we are holding the helper thread state lock again,
+        // notify the record/replay system that we might block soon.
+        mozilla::recordreplay::NotifyUnrecordedWait(HelperThread::WakeupAll);
+    }
+}
+
 bool
 js::StartOffThreadWasmCompile(wasm::CompileTask* task, wasm::CompileMode mode)
 {
     AutoLockHelperThreadState lock;
 
     if (!HelperThreadState().wasmWorklist(lock, mode).pushBack(task)) {
         return false;
     }
@@ -181,17 +226,21 @@ CancelOffThreadWasmTier2GeneratorLocked(
             // Set a flag that causes compilation to shortcut itself.
             helper.wasmTier2GeneratorTask()->cancel();
 
             // Wait for the generator task to finish.  This avoids a shutdown race where
             // the shutdown code is trying to shut down helper threads and the ongoing
             // tier2 compilation is trying to finish, which requires it to have access
             // to helper threads.
             uint32_t oldFinishedCount = HelperThreadState().wasmTier2GeneratorsFinished(lock);
-            while (HelperThreadState().wasmTier2GeneratorsFinished(lock) == oldFinishedCount) {
+            while (true) {
+                MaybeWaitForRecordReplayCheckpointSave(lock);
+                if (HelperThreadState().wasmTier2GeneratorsFinished(lock) != oldFinishedCount) {
+                    break;
+                }
                 HelperThreadState().wait(lock, GlobalHelperThreadState::CONSUMER);
             }
 
             // At most one of these tasks.
             break;
         }
     }
 }
@@ -326,16 +375,17 @@ CancelOffThreadIonCompileLocked(const Co
             FinishOffThreadIonCompile(builder, lock);
             HelperThreadState().remove(worklist, &i);
         }
     }
 
     /* Wait for in progress entries to finish up. */
     bool cancelled;
     do {
+        MaybeWaitForRecordReplayCheckpointSave(lock);
         cancelled = false;
         for (auto& helper : *HelperThreadState().threads) {
             if (helper.ionBuilder() &&
                 IonBuilderMatches(selector, helper.ionBuilder()))
             {
                 helper.ionBuilder()->cancel();
                 cancelled = true;
             }
@@ -660,16 +710,17 @@ js::CancelOffThreadParses(JSRuntime* rt)
         MOZ_ASSERT(!waitingOnGC[i]->runtimeMatches(rt));
     }
 #endif
 
     // Instead of forcibly canceling pending parse tasks, just wait for all scheduled
     // and in progress ones to complete. Otherwise the final GC may not collect
     // everything due to zones being used off thread.
     while (true) {
+        MaybeWaitForRecordReplayCheckpointSave(lock);
         bool pending = false;
         GlobalHelperThreadState::ParseTaskVector& worklist = HelperThreadState().parseWorklist(lock);
         for (size_t i = 0; i < worklist.length(); i++) {
             ParseTask* task = worklist[i];
             if (task->runtimeMatches(rt)) {
                 pending = true;
             }
         }
@@ -1173,17 +1224,21 @@ GlobalHelperThreadState::waitForAllThrea
 }
 
 void
 GlobalHelperThreadState::waitForAllThreadsLocked(AutoLockHelperThreadState& lock)
 {
     CancelOffThreadIonCompileLocked(CompilationSelector(AllCompilations()), false, lock);
     CancelOffThreadWasmTier2GeneratorLocked(lock);
 
-    while (hasActiveThreads(lock)) {
+    while (true) {
+        MaybeWaitForRecordReplayCheckpointSave(lock);
+        if (!hasActiveThreads(lock)) {
+            break;
+        }
         wait(lock, CONSUMER);
     }
 }
 
 // A task can be a "master" task, ie, it will block waiting for other worker
 // threads that perform work on its behalf.  If so it must not take the last
 // available thread; there must always be at least one worker thread able to do
 // the actual work.  (Or the system may deadlock.)
@@ -1641,17 +1696,21 @@ js::GCParallelTask::start()
 
 void
 js::GCParallelTask::joinWithLockHeld(AutoLockHelperThreadState& lock)
 {
     if (isNotStarted(lock)) {
         return;
     }
 
-    while (!isFinished(lock)) {
+    while (true) {
+        MaybeWaitForRecordReplayCheckpointSave(lock);
+        if (isFinished(lock)) {
+            break;
+        }
         HelperThreadState().wait(lock, GlobalHelperThreadState::CONSUMER);
     }
 
     setNotStarted(lock);
     cancel_ = false;
 }
 
 void
@@ -2345,16 +2404,18 @@ js::CancelOffThreadCompressions(JSRuntim
 
     // Cancel all pending compression tasks.
     ClearCompressionTaskList(HelperThreadState().compressionPendingList(lock), runtime);
     ClearCompressionTaskList(HelperThreadState().compressionWorklist(lock), runtime);
 
     // Cancel all in-process compression tasks and wait for them to join so we
     // clean up the finished tasks.
     while (true) {
+        MaybeWaitForRecordReplayCheckpointSave(lock);
+
         bool inProgress = false;
         for (auto& thread : *HelperThreadState().threads) {
             SourceCompressionTask* task = thread.compressionTask();
             if (task && task->runtimeMatches(runtime)) {
                 inProgress = true;
             }
         }
 
@@ -2449,23 +2510,16 @@ GlobalHelperThreadState::trace(JSTracer*
     for (auto parseTask : parseFinishedList_) {
         parseTask->trace(trc);
     }
     for (auto parseTask : parseWaitingOnGC_) {
         parseTask->trace(trc);
     }
 }
 
-/* static */ void
-HelperThread::WakeupAll()
-{
-    AutoLockHelperThreadState lock;
-    HelperThreadState().notifyAll(GlobalHelperThreadState::PRODUCER, lock);
-}
-
 void
 JSContext::setHelperThread(HelperThread* thread)
 {
     if (helperThread_) {
         nurserySuppressions_--;
     }
 
     helperThread_ = thread;
@@ -2562,32 +2616,17 @@ HelperThread::threadLoop()
         }
     }
     cx.setHelperThread(this);
     JS_SetNativeStackQuota(&cx, HELPER_STACK_QUOTA);
 
     while (!terminate) {
         MOZ_ASSERT(idle());
 
-        if (mozilla::recordreplay::IsRecordingOrReplaying()) {
-            // Unlock the helper thread state lock before potentially
-            // blocking while the main thread waits for all threads to
-            // become idle. Otherwise we would need to see if we need to
-            // block at every point where a helper thread acquires the
-            // helper thread state lock.
-            {
-                AutoUnlockHelperThreadState unlock(lock);
-                mozilla::recordreplay::MaybeWaitForCheckpointSave();
-            }
-            // Now that we are holding the helper thread state lock again,
-            // notify the record/replay system that we might block soon.
-            // The helper thread state lock may not be released until the
-            // block occurs.
-            mozilla::recordreplay::NotifyUnrecordedWait(WakeupAll);
-        }
+        MaybeWaitForRecordReplayCheckpointSave(lock);
 
         maybeFreeUnusedMemory(&cx);
 
         // The selectors may depend on the HelperThreadState not changing
         // between task selection and task execution, in particular, on new
         // tasks not being added (because of the lifo structure of the work
         // lists). Unlocking the HelperThreadState between task selection and
         // execution is not well-defined.
--- a/js/xpconnect/src/XPCInlines.h
+++ b/js/xpconnect/src/XPCInlines.h
@@ -497,17 +497,23 @@ XPCWrappedNative::SweepTearOffs()
         to->Unmark();
         if (marked) {
             continue;
         }
 
         // If this tearoff does not have a live dedicated JSObject,
         // then let's recycle it.
         if (!to->GetJSObjectPreserveColor()) {
-            to->SetNative(nullptr);
+            RefPtr<nsISupports> native = to->TakeNative();
+            if (native && mozilla::recordreplay::IsRecordingOrReplaying()) {
+                // Finalization must be deferred while recording/replaying to
+                // match the RecordReplayRegisterDeferredFinalizeThing call
+                // when the tearoff was initialized.
+                mozilla::DeferredFinalize(native.forget().take());
+            }
             to->SetInterface(nullptr);
         }
     }
 }
 
 /***************************************************************************/
 
 inline bool
--- a/layout/reftests/async-scrolling/reftest.list
+++ b/layout/reftests/async-scrolling/reftest.list
@@ -47,17 +47,17 @@ fuzzy(0-1,0-60000) skip-if(!asyncPan) ==
 fuzzy-if(Android,0-1,0-197) skip-if(!asyncPan) == position-sticky-transformed.html position-sticky-transformed-ref.html
 skip-if(!asyncPan) == offscreen-prerendered-active-opacity.html offscreen-prerendered-active-opacity-ref.html
 fuzzy-if(Android,0-6,0-4) fuzzy-if(skiaContent&&!Android,0-1,0-34) skip-if(!asyncPan) == offscreen-clipped-blendmode-1.html offscreen-clipped-blendmode-ref.html
 fuzzy-if(Android,0-6,0-4) skip-if(!asyncPan) == offscreen-clipped-blendmode-2.html offscreen-clipped-blendmode-ref.html
 fuzzy-if(Android,0-6,0-4) skip == offscreen-clipped-blendmode-3.html offscreen-clipped-blendmode-ref.html # bug 1251588 - wrong AGR on mix-blend-mode item
 fuzzy-if(Android,0-6,0-4) skip-if(!asyncPan) == offscreen-clipped-blendmode-4.html offscreen-clipped-blendmode-ref.html
 fuzzy-if(Android,0-7,0-4) skip-if(!asyncPan) == perspective-scrolling-1.html perspective-scrolling-1-ref.html
 fuzzy-if(Android,0-7,0-4) skip-if(!asyncPan) == perspective-scrolling-2.html perspective-scrolling-2-ref.html
-fuzzy-if(Android,0-7,0-4) skip-if(!asyncPan) == perspective-scrolling-3.html perspective-scrolling-3-ref.html
+fuzzy-if(Android,0-7,0-4) fails-if(webrender) skip-if(!asyncPan) == perspective-scrolling-3.html perspective-scrolling-3-ref.html # bug 1361720 for webrender
 fuzzy-if(Android,0-7,0-4) skip-if(!asyncPan) == perspective-scrolling-4.html perspective-scrolling-4-ref.html
 pref(apz.disable_for_scroll_linked_effects,true) skip-if(!asyncPan) == disable-apz-for-sle-pages.html disable-apz-for-sle-pages-ref.html
 fuzzy-if(browserIsRemote&&d2d,0-1,0-20) skip-if(!asyncPan) == background-blend-mode-1.html background-blend-mode-1-ref.html
 skip-if(Android||!asyncPan) != opaque-fractional-displayport-1.html about:blank
 skip-if(Android||!asyncPan) != opaque-fractional-displayport-2.html about:blank
 fuzzy-if(Android,0-6,0-4) skip-if(!asyncPan) == fixed-pos-scrolled-clip-1.html fixed-pos-scrolled-clip-1-ref.html
 fuzzy-if(Android,0-6,0-8) skip-if(!asyncPan) == fixed-pos-scrolled-clip-2.html fixed-pos-scrolled-clip-2-ref.html
 fuzzy-if(Android,0-6,0-8) skip-if(!asyncPan) == fixed-pos-scrolled-clip-3.html fixed-pos-scrolled-clip-3-ref.html
--- a/netwerk/protocol/http/HttpChannelParentListener.cpp
+++ b/netwerk/protocol/http/HttpChannelParentListener.cpp
@@ -41,16 +41,21 @@ HttpChannelParentListener::HttpChannelPa
   LOG(("HttpChannelParentListener::HttpChannelParentListener [this=%p, next=%p]",
        this, aInitialChannel));
 
   if (ServiceWorkerParentInterceptEnabled()) {
     mInterceptController = new ServiceWorkerInterceptController();
   }
 }
 
+HttpChannelParentListener::~HttpChannelParentListener()
+{
+  LOG(("HttpChannelParentListener::~HttpChannelParentListener %p", this));
+}
+
 //-----------------------------------------------------------------------------
 // HttpChannelParentListener::nsISupports
 //-----------------------------------------------------------------------------
 
 NS_IMPL_ADDREF(HttpChannelParentListener)
 NS_IMPL_RELEASE(HttpChannelParentListener)
 NS_INTERFACE_MAP_BEGIN(HttpChannelParentListener)
   NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
--- a/netwerk/protocol/http/HttpChannelParentListener.h
+++ b/netwerk/protocol/http/HttpChannelParentListener.h
@@ -54,17 +54,17 @@ public:
   void SetupInterceptionAfterRedirect(bool aShouldIntercept);
   void ClearInterceptedChannel(nsIStreamListener* aListener);
 
   nsresult TriggerCrossProcessRedirect(nsIChannel *oldChannel,
                                        nsILoadInfo *aLoadInfo,
                                        uint64_t aIdentifier);
 
 private:
-  virtual ~HttpChannelParentListener() = default;
+  virtual ~HttpChannelParentListener();
 
   // Private partner function to SuspendForDiversion.
   MOZ_MUST_USE nsresult ResumeForDiversion();
 
   // Can be the original HttpChannelParent that created this object (normal
   // case), a different {HTTP|FTP}ChannelParent that we've been redirected to,
   // or some other listener that we have been diverted to via
   // nsIDivertableChannel.
--- a/python/mozbuild/mozbuild/action/download_wpt_manifest.py
+++ b/python/mozbuild/mozbuild/action/download_wpt_manifest.py
@@ -7,16 +7,15 @@
 import os
 import sys
 
 import buildconfig
 
 
 def main():
     print("Downloading wpt manifest")
-    man_path = os.path.join(buildconfig.topobjdir, '_tests', 'web-platform')
     sys.path.insert(0, buildconfig.topsrcdir)
-    import manifestdownload
-    manifestdownload.run(man_path, buildconfig.topsrcdir, force=True)
+    import manifestupdate
+    return 0 if manifestupdate.run(buildconfig.topsrcdir, buildconfig.topobjdir) else 1
 
 
 if __name__ == '__main__':
     sys.exit(main())
--- a/security/nss/TAG-INFO
+++ b/security/nss/TAG-INFO
@@ -1,1 +1,1 @@
-94bcc2706b98
+dc4500650617
--- a/security/nss/coreconf/coreconf.dep
+++ b/security/nss/coreconf/coreconf.dep
@@ -5,9 +5,8 @@
 
 /*
  * A dummy header file that is a dependency for all the object files.
  * Used to force a full recompilation of NSS in Mozilla's Tinderbox
  * depend builds.  See comments in rules.mk.
  */
 
 #error "Do not include this header file."
-
--- a/security/nss/lib/ckfw/builtins/certdata.txt
+++ b/security/nss/lib/ckfw/builtins/certdata.txt
@@ -2140,156 +2140,16 @@ CKA_SERIAL_NUMBER MULTILINE_OCTAL
 \002\001\001
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Visa eCommerce Root"
-#
-# Issuer: CN=Visa eCommerce Root,OU=Visa International Service Association,O=VISA,C=US
-# Serial Number:13:86:35:4d:1d:3f:06:f2:c1:f9:65:05:d5:90:1c:62
-# Subject: CN=Visa eCommerce Root,OU=Visa International Service Association,O=VISA,C=US
-# Not Valid Before: Wed Jun 26 02:18:36 2002
-# Not Valid After : Fri Jun 24 00:16:12 2022
-# Fingerprint (MD5): FC:11:B8:D8:08:93:30:00:6D:23:F9:7E:EB:52:1E:02
-# Fingerprint (SHA1): 70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Visa eCommerce Root"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\153\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\015\060\013\006\003\125\004\012\023\004\126\111\123\101\061\057
-\060\055\006\003\125\004\013\023\046\126\151\163\141\040\111\156
-\164\145\162\156\141\164\151\157\156\141\154\040\123\145\162\166
-\151\143\145\040\101\163\163\157\143\151\141\164\151\157\156\061
-\034\060\032\006\003\125\004\003\023\023\126\151\163\141\040\145
-\103\157\155\155\145\162\143\145\040\122\157\157\164
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\153\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\015\060\013\006\003\125\004\012\023\004\126\111\123\101\061\057
-\060\055\006\003\125\004\013\023\046\126\151\163\141\040\111\156
-\164\145\162\156\141\164\151\157\156\141\154\040\123\145\162\166
-\151\143\145\040\101\163\163\157\143\151\141\164\151\157\156\061
-\034\060\032\006\003\125\004\003\023\023\126\151\163\141\040\145
-\103\157\155\155\145\162\143\145\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\023\206\065\115\035\077\006\362\301\371\145\005\325\220
-\034\142
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\003\242\060\202\002\212\240\003\002\001\002\002\020\023
-\206\065\115\035\077\006\362\301\371\145\005\325\220\034\142\060
-\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\153
-\061\013\060\011\006\003\125\004\006\023\002\125\123\061\015\060
-\013\006\003\125\004\012\023\004\126\111\123\101\061\057\060\055
-\006\003\125\004\013\023\046\126\151\163\141\040\111\156\164\145
-\162\156\141\164\151\157\156\141\154\040\123\145\162\166\151\143
-\145\040\101\163\163\157\143\151\141\164\151\157\156\061\034\060
-\032\006\003\125\004\003\023\023\126\151\163\141\040\145\103\157
-\155\155\145\162\143\145\040\122\157\157\164\060\036\027\015\060
-\062\060\066\062\066\060\062\061\070\063\066\132\027\015\062\062
-\060\066\062\064\060\060\061\066\061\062\132\060\153\061\013\060
-\011\006\003\125\004\006\023\002\125\123\061\015\060\013\006\003
-\125\004\012\023\004\126\111\123\101\061\057\060\055\006\003\125
-\004\013\023\046\126\151\163\141\040\111\156\164\145\162\156\141
-\164\151\157\156\141\154\040\123\145\162\166\151\143\145\040\101
-\163\163\157\143\151\141\164\151\157\156\061\034\060\032\006\003
-\125\004\003\023\023\126\151\163\141\040\145\103\157\155\155\145
-\162\143\145\040\122\157\157\164\060\202\001\042\060\015\006\011
-\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000
-\060\202\001\012\002\202\001\001\000\257\127\336\126\036\156\241
-\332\140\261\224\047\313\027\333\007\077\200\205\117\310\234\266
-\320\364\157\117\317\231\330\341\333\302\110\134\072\254\071\063
-\307\037\152\213\046\075\053\065\365\110\261\221\301\002\116\004
-\226\221\173\260\063\360\261\024\116\021\157\265\100\257\033\105
-\245\112\357\176\266\254\362\240\037\130\077\022\106\140\074\215
-\241\340\175\317\127\076\063\036\373\107\361\252\025\227\007\125
-\146\245\265\055\056\330\200\131\262\247\015\267\106\354\041\143
-\377\065\253\245\002\317\052\364\114\376\173\365\224\135\204\115
-\250\362\140\217\333\016\045\074\237\163\161\317\224\337\112\352
-\333\337\162\070\214\363\226\275\361\027\274\322\272\073\105\132
-\306\247\366\306\027\213\001\235\374\031\250\052\203\026\270\072
-\110\376\116\076\240\253\006\031\351\123\363\200\023\007\355\055
-\277\077\012\074\125\040\071\054\054\000\151\164\225\112\274\040
-\262\251\171\345\030\211\221\250\334\034\115\357\273\176\067\013
-\135\376\071\245\210\122\214\000\154\354\030\174\101\275\366\213
-\165\167\272\140\235\204\347\376\055\002\003\001\000\001\243\102
-\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003
-\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003
-\002\001\006\060\035\006\003\125\035\016\004\026\004\024\025\070
-\203\017\077\054\077\160\063\036\315\106\376\007\214\040\340\327
-\303\267\060\015\006\011\052\206\110\206\367\015\001\001\005\005
-\000\003\202\001\001\000\137\361\101\175\174\134\010\271\053\340
-\325\222\107\372\147\134\245\023\303\003\041\233\053\114\211\106
-\317\131\115\311\376\245\100\266\143\315\335\161\050\225\147\021
-\314\044\254\323\104\154\161\256\001\040\153\003\242\217\030\267
-\051\072\175\345\026\140\123\170\074\300\257\025\203\367\217\122
-\063\044\275\144\223\227\356\213\367\333\030\250\155\161\263\367
-\054\027\320\164\045\151\367\376\153\074\224\276\115\113\101\214
-\116\342\163\320\343\220\042\163\103\315\363\357\352\163\316\105
-\212\260\246\111\377\114\175\235\161\210\304\166\035\220\133\035
-\356\375\314\367\356\375\140\245\261\172\026\161\321\026\320\174
-\022\074\154\151\227\333\256\137\071\232\160\057\005\074\031\106
-\004\231\040\066\320\140\156\141\006\273\026\102\214\160\367\060
-\373\340\333\146\243\000\001\275\346\054\332\221\137\240\106\213
-\115\152\234\075\075\335\005\106\376\166\277\240\012\074\344\000
-\346\047\267\377\204\055\336\272\042\047\226\020\161\353\042\355
-\337\337\063\234\317\343\255\256\216\324\216\346\117\121\257\026
-\222\340\134\366\007\017
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-
-# Trust for Certificate "Visa eCommerce Root"
-# Issuer: CN=Visa eCommerce Root,OU=Visa International Service Association,O=VISA,C=US
-# Serial Number:13:86:35:4d:1d:3f:06:f2:c1:f9:65:05:d5:90:1c:62
-# Subject: CN=Visa eCommerce Root,OU=Visa International Service Association,O=VISA,C=US
-# Not Valid Before: Wed Jun 26 02:18:36 2002
-# Not Valid After : Fri Jun 24 00:16:12 2022
-# Fingerprint (MD5): FC:11:B8:D8:08:93:30:00:6D:23:F9:7E:EB:52:1E:02
-# Fingerprint (SHA1): 70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Visa eCommerce Root"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\160\027\233\206\214\000\244\372\140\221\122\042\077\237\076\062
-\275\340\005\142
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\374\021\270\330\010\223\060\000\155\043\371\176\353\122\036\002
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\153\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\015\060\013\006\003\125\004\012\023\004\126\111\123\101\061\057
-\060\055\006\003\125\004\013\023\046\126\151\163\141\040\111\156
-\164\145\162\156\141\164\151\157\156\141\154\040\123\145\162\166
-\151\143\145\040\101\163\163\157\143\151\141\164\151\157\156\061
-\034\060\032\006\003\125\004\003\023\023\126\151\163\141\040\145
-\103\157\155\155\145\162\143\145\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\023\206\065\115\035\077\006\362\301\371\145\005\325\220
-\034\142
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-#
 # Certificate "Certum Root CA"
 #
 # Issuer: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
 # Serial Number: 65568 (0x10020)
 # Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
 # Not Valid Before: Tue Jun 11 10:46:39 2002
 # Not Valid After : Fri Jun 11 10:46:39 2027
 # Fingerprint (MD5): 2C:8F:9F:66:1D:18:90:B1:47:26:9D:8E:86:82:8C:A9
--- a/security/nss/lib/ckfw/builtins/nssckbi.h
+++ b/security/nss/lib/ckfw/builtins/nssckbi.h
@@ -41,18 +41,18 @@
  *   made on that branch.
  *
  * NSS_BUILTINS_LIBRARY_VERSION_MINOR is a CK_BYTE.  It's not clear
  * whether we may use its full range (0-255) or only 0-99 because
  * of the comment in the CK_VERSION type definition.
  * It's recommend to switch back to 0 after having reached version 98/99.
  */
 #define NSS_BUILTINS_LIBRARY_VERSION_MAJOR 2
-#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 26
-#define NSS_BUILTINS_LIBRARY_VERSION "2.26"
+#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 28
+#define NSS_BUILTINS_LIBRARY_VERSION "2.28"
 
 /* These version numbers detail the semantic changes to the ckfw engine. */
 #define NSS_BUILTINS_HARDWARE_VERSION_MAJOR 1
 #define NSS_BUILTINS_HARDWARE_VERSION_MINOR 0
 
 /* These version numbers detail the semantic changes to ckbi itself
  * (new PKCS #11 objects), etc. */
 #define NSS_BUILTINS_FIRMWARE_VERSION_MAJOR 1
--- a/security/nss/lib/ssl/tls13con.c
+++ b/security/nss/lib/ssl/tls13con.c
@@ -3444,16 +3444,17 @@ tls13_CopyKeyShareEntry(TLS13KeyShareEnt
     PORT_Assert(o);
     n = PORT_ZNew(TLS13KeyShareEntry);
     if (!n) {
         return NULL;
     }
 
     if (SECSuccess != SECITEM_CopyItem(NULL, &n->key_exchange, &o->key_exchange)) {
         PORT_Free(n);
+        return NULL;
     }
     n->group = o->group;
     return n;
 }
 
 void
 tls13_DestroyKeyShareEntry(TLS13KeyShareEntry *offer)
 {
--- a/security/nss/lib/ssl/tls13exthandle.c
+++ b/security/nss/lib/ssl/tls13exthandle.c
@@ -244,16 +244,17 @@ tls13_ClientHandleKeyShareXtn(const sslS
     rv = tls13_DecodeKeyShareEntry(&rdr, &ks);
     if ((rv != SECSuccess) || !ks) {
         ssl3_ExtSendAlert(ss, alert_fatal, illegal_parameter);
         PORT_SetError(SSL_ERROR_RX_MALFORMED_KEY_SHARE);
         return SECFailure;
     }
 
     if (SSL_READER_REMAINING(&rdr)) {
+        tls13_DestroyKeyShareEntry(ks);
         PORT_SetError(SSL_ERROR_RX_MALFORMED_KEY_SHARE);
         return SECFailure;
     }
     PR_APPEND_LINK(&ks->link, &xtnData->remoteKeyShares);
 
     return SECSuccess;
 }
 
@@ -1305,16 +1306,19 @@ tls13_ServerHandleEsniXtn(const sslSocke
     sniItem.len = buf.len + 2;
 
     /* Check the padding. Note we don't need to do this in constant time
      * because it's inside the AEAD boundary. */
     /* TODO(ekr@rtfm.com): check that the padding is the right length. */
     PRUint64 tmp;
     while (SSL_READER_REMAINING(&sniRdr)) {
         rv = sslRead_ReadNumber(&sniRdr, 1, &tmp);
+        if (rv != SECSuccess) {
+            goto loser;
+        }
         if (tmp != 0) {
             goto loser;
         }
     }
 
     rv = ssl3_HandleServerNameXtn(ss, xtnData, &sniItem);
     if (rv != SECSuccess) {
         goto loser;
--- a/taskcluster/ci/source-test/wpt-manifest.yml
+++ b/taskcluster/ci/source-test/wpt-manifest.yml
@@ -15,17 +15,17 @@ upload:
     index:
         product: source
         job-name: manifest-upload
         rank: build_date
     run:
         using: run-task
         command: >
             cd /builds/worker/checkouts/gecko
-            && ./mach wpt-manifest-update
+            && ./mach wpt-manifest-update --config testing/web-platform/wptrunner.ini
             && tar -cvzf manifests.tar.gz -C testing/web-platform/ meta/MANIFEST.json mozilla/meta/MANIFEST.json
     worker:
         artifacts:
             - type: file
               path: /builds/worker/checkouts/gecko/manifests.tar.gz
               name: public/manifests.tar.gz
 
         max-run-time: 3600
--- a/testing/mochitest/runtests.py
+++ b/testing/mochitest/runtests.py
@@ -2830,22 +2830,23 @@ toolbar#nav-bar {
 
         # Stop leak detection if m-bc code coverage is enabled
         # by maxing out the leak threshold for all processes.
         if options.jscov_dir_prefix:
             for processType in leakThresholds:
                 ignoreMissingLeaks.append(processType)
                 leakThresholds[processType] = sys.maxsize
 
+        utilityPath = options.utilityPath or options.xrePath
         mozleak.process_leak_log(
             self.leak_report_file,
             leak_thresholds=leakThresholds,
             ignore_missing_leaks=ignoreMissingLeaks,
             log=self.log,
-            stack_fixer=get_stack_fixer_function(options.utilityPath,
+            stack_fixer=get_stack_fixer_function(utilityPath,
                                                  options.symbolsPath),
         )
 
         self.log.info("runtests.py | Running tests: end.")
 
         if self.manifest is not None:
             self.cleanup(options, False)
 
--- a/testing/mozbase/moztest/moztest/resolve.py
+++ b/testing/mozbase/moztest/moztest/resolve.py
@@ -445,34 +445,24 @@ class TestMetadata(object):
             return True
         return False
 
     def add_wpt_manifest_data(self):
         if self._wpt_loaded:
             return
 
         wpt_path = os.path.join(self._srcdir, "testing", "web-platform")
-        wptrunner_path = os.path.join(wpt_path, "tests", "tools", "wptrunner")
-        manifest_path = os.path.join(self._objdir, "_tests", "web-platform")
-
-        sys.path = [wpt_path, wptrunner_path] + sys.path
-
-        import manifestdownload
-        import wptrunner
-        from wptrunner.wptrunner import testloader
+        sys.path = [wpt_path] + sys.path
 
-        manifestdownload.run(manifest_path, self._srcdir)
-
-        kwargs = {"config": os.path.join(self._objdir, "_tests", "web-platform",
-                                         "wptrunner.local.ini"),
-                  "tests_root": None,
-                  "metadata_root": None}
-
-        wptrunner.wptcommandline.set_from_config(kwargs)
-        manifests = testloader.ManifestLoader(kwargs["test_paths"]).load()
+        import manifestupdate
+        manifests = manifestupdate.run(self._srcdir, self._objdir, rebuild=False, download=True,
+                                       config_path=None, rewrite_config=True, update=True)
+        if not manifests:
+            print("Loading wpt manifest failed")
+            return
 
         for manifest, data in manifests.iteritems():
             tests_root = data["tests_path"]
             for test_type, path, tests in manifest:
                 full_path = os.path.join(tests_root, path)
                 src_path = os.path.relpath(full_path, self._srcdir)
                 if test_type not in ["testharness", "reftest", "wdspec"]:
                     continue
--- a/testing/web-platform/mach_commands.py
+++ b/testing/web-platform/mach_commands.py
@@ -268,39 +268,16 @@ testing/web-platform/tests for tests tha
             if ref_path:
                 path = "%s %s" % (path, ref_path)
             proc = subprocess.Popen("%s %s" % (editor, path), shell=True)
 
         if proc:
             proc.wait()
 
 
-class WPTManifestUpdater(MozbuildObject):
-    def setup_logging(self, **kwargs):
-        from wptrunner import wptlogging
-        logger = wptlogging.setup(kwargs, {"mach": sys.stdout})
-
-    def run_update(self, logger, rebuild=False, **kwargs):
-        import manifestupdate
-        wpt_dir = os.path.abspath(os.path.join(self.topsrcdir, 'testing', 'web-platform'))
-        config_dir = os.path.abspath(os.path.join(self.topobjdir, '_tests', 'web-platform'))
-        manifestupdate.update(logger, wpt_dir, rebuild, config_dir)
-
-
-class WPTManifestDownloader(MozbuildObject):
-    def setup_logging(self, **kwargs):
-        from wptrunner import wptlogging
-        logger = wptlogging.setup(kwargs, {"mach": sys.stdout})
-
-    def run_download(self, logger, manifest_update=True, force=False, **kwargs):
-        import manifestdownload
-        wpt_dir = os.path.abspath(os.path.join(self.topobjdir, '_tests', 'web-platform'))
-        manifestdownload.run(wpt_dir, self.topsrcdir, logger, force, manifest_update)
-
-
 def create_parser_update():
     from update import updatecommandline
     return updatecommandline.create_parser()
 
 
 def create_parser_create():
     import argparse
     p = argparse.ArgumentParser()
@@ -321,20 +298,16 @@ def create_parser_create():
     p.add_argument("path", action="store", help="Path to the test file")
     return p
 
 
 def create_parser_manifest_update():
     import manifestupdate
     return manifestupdate.create_parser()
 
-def create_parser_manifest_download():
-    import manifestdownload
-    return manifestdownload.create_parser()
-
 
 @CommandProvider
 class MachCommands(MachCommandBase):
     def setup(self):
         self._activate_virtualenv()
 
     @Command("web-platform-tests",
              category="testing",
@@ -352,18 +325,16 @@ class MachCommands(MachCommandBase):
                 params["include"].append(item["name"])
             del params["test_objects"]
 
         wpt_setup = self._spawn(WebPlatformTestsRunnerSetup)
         wpt_runner = WebPlatformTestsRunner(wpt_setup)
 
         logger = wpt_runner.setup_logging(**params)
 
-        self.wpt_manifest_download(logger, **params)
-        params["manifest_update"] = False
         return wpt_runner.run(logger, **params)
 
     @Command("wpt",
              category="testing",
              conditions=[conditions.is_firefox_or_android],
              parser=create_parser_wpt)
     def run_wpt(self, **params):
         return self.run_web_platform_tests(**params)
@@ -401,24 +372,12 @@ class MachCommands(MachCommandBase):
     def create_wpt(self, **params):
         return self.create_web_platform_test(**params)
 
     @Command("wpt-manifest-update",
              category="testing",
              parser=create_parser_manifest_update)
     def wpt_manifest_update(self, **params):
         self.setup()
-        self.wpt_manifest_download(**params)
-        wpt_manifest_updater = self._spawn(WPTManifestUpdater)
-        logger = wpt_manifest_updater.setup_logging(**params)
-        self.wpt_manifest_download(logger, **params)
-        return wpt_manifest_updater.run_update(logger, **params)
-
-    @Command("wpt-manifest-download",
-             category="testing",
-             parser=create_parser_manifest_download)
-    def wpt_manifest_download(self, logger=None, **params):
-        self.setup()
-        if logger is None:
-            from wptrunner import wptlogging
-            logger = wptlogging.setup(params, {"mach": sys.stdout})
-        wpt_manifest_downloader = self._spawn(WPTManifestDownloader)
-        return wpt_manifest_downloader.run_download(logger, **params)
+        wpt_setup = self._spawn(WebPlatformTestsRunnerSetup)
+        wpt_runner = WebPlatformTestsRunner(wpt_setup)
+        logger = wpt_runner.setup_logging(**params)
+        return 0 if wpt_runner.update_manifest(logger, **params) else 1
--- a/testing/web-platform/mach_commands_base.py
+++ b/testing/web-platform/mach_commands_base.py
@@ -17,19 +17,31 @@ class WebPlatformTestsRunner(object):
         self.setup = setup
 
     def setup_logging(self, **kwargs):
         from wptrunner import wptrunner
         return wptrunner.setup_logging(kwargs, {self.setup.default_log_type: sys.stdout})
 
     def run(self, logger, **kwargs):
         from wptrunner import wptrunner
+
+        if kwargs["manifest_update"] is not False:
+            self.update_manifest(logger)
+        kwargs["manifest_update"] = False
+
         if kwargs["product"] in ["firefox", None]:
             kwargs = self.setup.kwargs_firefox(kwargs)
         elif kwargs["product"] == "fennec":
             from wptrunner import wptcommandline
             kwargs = wptcommandline.check_args(self.setup.kwargs_common(kwargs))
         elif kwargs["product"] in ("chrome", "edge", "servo"):
             kwargs = self.setup.kwargs_wptrun(kwargs)
         else:
             raise ValueError("Unknown product %s" % kwargs["product"])
         result = wptrunner.start(**kwargs)
         return int(not result)
+
+    def update_manifest(self, logger, **kwargs):
+        import manifestupdate
+        return manifestupdate.run(logger=logger,
+                                  src_root=self.setup.topsrcdir,
+                                  obj_root=self.setup.topobjdir,
+                                  **kwargs)
--- a/testing/web-platform/manifestdownload.py
+++ b/testing/web-platform/manifestdownload.py
@@ -50,16 +50,18 @@ def should_download(logger, manifest_pat
         if mtime < datetime.now() - rebuild_time:
             return True
 
     logger.info("Skipping manifest download because existing file is recent")
     return False
 
 
 def taskcluster_url(logger, commits):
+    artifact_path = '/artifacts/public/manifests.tar.gz'
+
     cset_url = ('https://hg.mozilla.org/mozilla-central/json-pushes?'
                 'changeset={changeset}&version=2&tipsonly=1')
 
     tc_url = ('https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central.'
               'revision.{changeset}.source.manifest-upload')
 
     for revision in commits:
         req = None
@@ -88,151 +90,74 @@ def taskcluster_url(logger, commits):
 
         try:
             req = requests.get(tc_url.format(changeset=cset),
                                headers=HEADERS)
         except requests.exceptions.RequestException:
             return False
 
         if req.status_code == 200:
-            return tc_url.format(changeset=cset)
+            return tc_url.format(changeset=cset) + artifact_path
 
     logger.info("Can't find a commit-specific manifest so just using the most"
                 "recent one")
 
     return ("https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central."
-            "latest.source.manifest-upload")
+            "latest.source.manifest-upload" +
+            artifact_path)
 
 
-def download_manifest(logger, wpt_dir, commits_func, url_func, force=False):
-    manifest_path = os.path.join(wpt_dir, "meta", "MANIFEST.json")
-    mozilla_manifest_path = os.path.join(wpt_dir, "mozilla", "meta", "MANIFEST.json")
+def download_manifest(logger, test_paths, commits_func, url_func, force=False):
+    manifest_paths = [item["manifest_path"] for item in test_paths.itervalues()]
 
-    if not force and not should_download(logger, [manifest_path, mozilla_manifest_path]):
+    if not force and not should_download(logger, manifest_paths):
         return True
 
     commits = commits_func()
     if not commits:
         return False
 
     url = url_func(logger, commits)
     if not url:
         logger.warning("No generated manifest found")
         return False
-    url+= "/artifacts/public/manifests.tar.gz"
 
     logger.info("Downloading manifest from %s" % url)
     try:
         req = requests.get(url, headers=HEADERS)
     except Exception:
         logger.warning("Downloading pregenerated manifest failed")
         return False
 
     if req.status_code != 200:
         logger.warning("Downloading pregenerated manifest failed; got"
                         "HTTP status %d" % req.status_code)
         return False
 
     tar = tarfile.open(mode="r:gz", fileobj=StringIO(req.content))
-    try:
-        tar.extractall(path=wpt_dir)
-    except IOError:
-        logger.warning("Failed to decompress downloaded file")
-        return False
-
-    os.utime(manifest_path, None)
-    os.utime(mozilla_manifest_path, None)
-
-    logger.info("Manifest downloaded")
-    return True
-
-
-def create_parser():
-    parser = argparse.ArgumentParser()
-    parser.add_argument(
-        "-p", "--path", type=abs_path, help="Path to manifest file.")
-    parser.add_argument(
-        "--force", action="store_true",
-        help="Always download, even if the existing manifest is recent")
-    parser.add_argument(
-        "--no-manifest-update", action="store_false", dest="manifest_update",
-        default=True, help="Don't update the downloaded manifest")
-    return parser
-
-
-def download_from_taskcluster(logger, wpt_dir, repo_root, force=False):
-    return download_manifest(logger, wpt_dir, lambda: get_commits(logger, repo_root),
-                             taskcluster_url, force)
-
+    for paths in test_paths.itervalues():
+        try:
+            member = tar.getmember(paths["manifest_rel_path"].replace(os.path.sep, "/"))
+        except KeyError:
+            logger.warning("Failed to find downloaded manifest %s" % paths["manifest_rel_path"])
+        else:
+            try:
+                logger.debug("Unpacking %s to %s" % (member.name, paths["manifest_path"]))
+                src = tar.extractfile(member)
+                with open(paths["manifest_path"], "w") as dest:
+                    dest.write(src.read())
+                src.close()
+            except IOError:
+                import traceback
+                logger.warning("Failed to decompress %s:\n%s" % (paths["manifest_rel_path"], traceback.format_exc()))
+                return False
 
-def generate_config(obj_base_path):
-    """Generate the local wptrunner.ini file to use locally"""
-    import ConfigParser
-    here = os.path.split(os.path.abspath(__file__))[0]
-    config_path = os.path.join(here, 'wptrunner.ini')
-
-    if not os.path.exists(obj_base_path):
-        os.makedirs(obj_base_path)
-
-    path = os.path.join(obj_base_path, 'wptrunner.local.ini')
-
-    if os.path.exists(path):
-        return True
-
-    parser = ConfigParser.SafeConfigParser()
-    success = parser.read(config_path)
-    assert config_path in success, success
-
-    for name, path_prefix in [("upstream", ""),
-                              ("mozilla", "mozilla")]:
-        obj_path = os.path.join(obj_base_path, path_prefix)
-        src_path = os.path.join(here, path_prefix)
-        parser.set('manifest:%s' % name, 'manifest',
-                   os.path.join(obj_path, 'meta', 'MANIFEST.json'))
-
-        for key, dir_path in [("tests", "tests"), ("metadata", "meta")]:
-            parser.set("manifest:%s" % name, key, os.path.join(src_path, dir_path))
-
-    parser.set('paths', 'prefs', os.path.abspath(os.path.join(here, "..", 'profiles')))
-
-    with open(path, 'wb') as config_file:
-        parser.write(config_file)
+        os.utime(paths["manifest_path"], None)
 
     return True
 
 
-def update_manifest(logger, config_dir, manifest_update=True):
-    if manifest_update:
-        logger.info("Updating manifests")
-        import manifestupdate
-        here = os.path.split(os.path.abspath(__file__))[0]
-        return manifestupdate.update(logger, here, config_dir=config_dir) is 0
-    else:
-        logger.info("Skipping manifest update")
-        return True
-
-def check_dirs(logger, success, wpt_dir):
-    if success:
-        return
-    else:
-        logger.info("Could not download manifests.")
-        logger.info("Generating from scratch instead.")
-        try:
-            os.mkdir(os.path.join(wpt_dir, "meta"))
-        except OSError:
-            pass
-        try:
-            os.makedirs(os.path.join(wpt_dir, "mozilla", "meta"))
-        except OSError:
-            pass
-
-
-def run(wpt_dir, repo_root, logger=None, force=False, manifest_update=True):
-    if not logger:
-        logger = logging.getLogger(__name__)
-        handler = logging.FileHandler(os.devnull)
-        logger.addHandler(handler)
-
-    success = download_from_taskcluster(logger, wpt_dir, repo_root, force)
-    check_dirs(logger, success, wpt_dir)
-    generate_config(wpt_dir)
-    success |= update_manifest(logger, wpt_dir, manifest_update)
-    return 0 if success else 1
+def download_from_taskcluster(logger, repo_root, test_paths, force=False):
+    return download_manifest(logger,
+                             test_paths,
+                             lambda: get_commits(logger, repo_root),
+                             taskcluster_url,
+                             force)
--- a/testing/web-platform/manifestupdate.py
+++ b/testing/web-platform/manifestupdate.py
@@ -1,76 +1,207 @@
+import ConfigParser
 import argparse
 import imp
 import os
 import sys
-from collections import defaultdict
 
 from mozlog.structured import commandline
-from wptrunner.wptcommandline import get_test_paths, set_from_config
+from wptrunner.wptcommandline import set_from_config
+
+import manifestdownload
+from wptrunner import wptcommandline
 
 manifest = None
 
 
 def do_delayed_imports(wpt_dir):
     global manifest
+    imp.load_source("localpaths",
+                    os.path.join(wpt_dir, "tests", "tools", "localpaths.py"))
     sys.path.insert(0, os.path.join(wpt_dir, "tools", "manifest"))
     import manifest
 
 
-
 def create_parser():
     p = argparse.ArgumentParser()
     p.add_argument("--rebuild", action="store_true",
-                   help="Rebuild the manifest from scratch")
+                   help="Rebuild manifest from scratch")
+    download_group = p.add_mutually_exclusive_group()
+    download_group.add_argument(
+        "--download", dest="download", action="store_true", default=None,
+        help="Always download even if the local manifest is recent")
+    download_group.add_argument(
+        "--no-download", dest="download", action="store_false",
+        help="Don't try to download the manifest")
+    p.add_argument(
+        "--no-update", action="store_false", dest="update",
+        default=True, help="Just download the manifest, don't update")
+    p.add_argument(
+        "--config", action="store", dest="config_path", default=None,
+        help="Path to wptrunner config file")
+    p.add_argument(
+        "--rewrite-config", action="store_true", default=False,
+        help="Force the local configuration to be regenerated")
     commandline.add_logging_group(p)
 
     return p
 
 
-def update(logger, wpt_dir, rebuild=False, config_dir=None):
-    localpaths = imp.load_source("localpaths",
-                                 os.path.join(wpt_dir, "tests", "tools", "localpaths.py"))
-
-    if not config_dir:
-        config_dir = wpt_dir
-        config_name = "wptrunner.ini"
-    else:
-        if not os.path.exists(os.path.join(config_dir, 'wptrunner.local.ini')):
-            from manifestdownload import generate_config
-            generate_config(config_dir)
-        config_name = "wptrunner.local.ini"
-
-    kwargs = {"config": os.path.join(config_dir, config_name),
-              "tests_root": None,
-              "metadata_root": None}
-
-    set_from_config(kwargs)
-    do_delayed_imports(wpt_dir)
-
-    return _update(logger, kwargs["test_paths"], rebuild)
+def ensure_kwargs(kwargs):
+    _kwargs = vars(create_parser().parse_args([]))
+    _kwargs.update(kwargs)
+    return _kwargs
 
 
-def _update(logger, test_paths, rebuild):
+def run(src_root, obj_root, logger=None, **kwargs):
+    kwargs = ensure_kwargs(kwargs)
+
+    if logger is None:
+        from wptrunner import wptlogging
+        logger = wptlogging.setup(kwargs, {"mach": sys.stdout})
+
+    src_wpt_dir = os.path.join(src_root, "testing", "web-platform")
+
+    do_delayed_imports(src_wpt_dir)
+
+    if not kwargs["config_path"]:
+        config_path = generate_config(logger,
+                                      src_root,
+                                      src_wpt_dir,
+                                      os.path.join(obj_root, "_tests", "web-platform"),
+                                      kwargs["rewrite_config"])
+    else:
+        config_path = kwargs["config_path"]
+
+    if not os.path.exists(config_path):
+        logger.critical("Config file %s does not exist" % config_path)
+        return None
+
+    logger.debug("Using config path %s" % config_path)
+
+    test_paths = wptcommandline.get_test_paths(
+        wptcommandline.config.read(config_path))
+
+    for paths in test_paths.itervalues():
+        if "manifest_path" not in paths:
+            paths["manifest_path"] = os.path.join(paths["metadata_path"],
+                                                  "MANIFEST.json")
+
+    ensure_manifest_directories(logger, test_paths)
+
+    local_config = read_local_config(src_wpt_dir)
+    for section in ["manifest:upstream", "manifest:mozilla"]:
+        url_base = local_config.get(section, "url_base")
+        manifest_rel_path = os.path.join(local_config.get(section, "metadata"),
+                                         "MANIFEST.json")
+        test_paths[url_base]["manifest_rel_path"] = manifest_rel_path
+
+    if not kwargs["rebuild"] and kwargs["download"] is not False:
+        force_download = False if kwargs["download"] is None else True
+        manifestdownload.download_from_taskcluster(logger,
+                                                   src_root,
+                                                   test_paths,
+                                                   force=force_download)
+    else:
+        logger.debug("Skipping manifest download")
+
+    if kwargs["update"] or kwargs["rebuild"]:
+        manifests = update(logger, src_wpt_dir, test_paths, rebuild=kwargs["rebuild"])
+    else:
+        logger.debug("Skipping manifest update")
+        manifests = load_manifests(test_paths)
+
+    return manifests
+
+
+def ensure_manifest_directories(logger, test_paths):
+    for paths in test_paths.itervalues():
+        manifest_dir = os.path.dirname(paths["manifest_path"])
+        if not os.path.exists(manifest_dir):
+            logger.info("Creating directory %s" % manifest_dir)
+            os.makedirs(manifest_dir)
+        elif not os.path.isdir(manifest_dir):
+            raise IOError("Manifest directory is a file")
+
+
+def read_local_config(wpt_dir):
+    src_config_path = os.path.join(wpt_dir, "wptrunner.ini")
+
+    parser = ConfigParser.SafeConfigParser()
+    success = parser.read(src_config_path)
+    assert src_config_path in success
+    return parser
+
+
+def generate_config(logger, repo_root, wpt_dir, dest_path, force_rewrite=False):
+    """Generate the local wptrunner.ini file to use locally"""
+    if not os.path.exists(dest_path):
+        os.makedirs(dest_path)
+
+    dest_config_path = os.path.join(dest_path, 'wptrunner.local.ini')
+
+    if not force_rewrite and os.path.exists(dest_config_path):
+        logger.debug("Config is up to date, not regenerating")
+        return dest_config_path
+
+    logger.info("Creating config file %s" % dest_config_path)
+
+    parser = read_local_config(wpt_dir)
+
+    for section in ["manifest:upstream", "manifest:mozilla"]:
+        meta_rel_path = parser.get(section, "metadata")
+        tests_rel_path = parser.get(section, "tests")
+
+        parser.set(section, "manifest",
+                   os.path.join(dest_path, meta_rel_path, 'MANIFEST.json'))
+        parser.set(section, "metadata", os.path.join(wpt_dir, meta_rel_path))
+        parser.set(section, "tests", os.path.join(wpt_dir, tests_rel_path))
+
+    parser.set('paths', 'prefs', os.path.abspath(os.path.join(wpt_dir, parser.get("paths", "prefs"))))
+
+    with open(dest_config_path, 'wb') as config_file:
+        parser.write(config_file)
+
+    return dest_config_path
+
+
+def update(logger, wpt_dir, test_paths, rebuild=False, config_dir=None):
+    rv = {}
+
     for url_base, paths in test_paths.iteritems():
-        if "manifest_path" in paths:
-            manifest_path = paths["manifest_path"]
-        else:
-            manifest_path = os.path.join(paths["metadata_path"], "MANIFEST.json")
         m = None
+        manifest_path = paths["manifest_path"]
         if not rebuild and os.path.exists(manifest_path):
+            logger.info("Updating manifest %s" % manifest_path)
             try:
                 m = manifest.manifest.load(paths["tests_path"], manifest_path)
             except manifest.manifest.ManifestVersionMismatch:
                 logger.info("Manifest format changed, rebuilding")
         if m is None:
+            logger.info("Recreating manifest %s" % manifest_path)
             m = manifest.manifest.Manifest(url_base)
         manifest.update.update(paths["tests_path"], m, working_copy=True)
         manifest.manifest.write(m, manifest_path)
-    return 0
+
+        path_data = {"url_base": url_base}
+        path_data.update(paths)
+        rv[m] = path_data
+
+    return rv
+
+
+def load_manifests(test_paths):
+    rv = {}
+    for url_base, paths in test_paths.iteritems():
+        m = manifest.manifest.load(paths["tests_path"], manifest_path)
+        path_data = {"url_base": url_base}
+        path_data.update(paths)
+        rv[m] = path_data
+    return rv
 
 
 def log_error(logger, manifest_path, msg):
     logger.lint_error(path=manifest_path,
                       message=msg,
                       lineno=0,
                       source="",
                       linter="wpt-manifest")
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-tables/caption-writing-mode-001.html.ini
@@ -0,0 +1,7 @@
+[caption-writing-mode-001.html]
+  [Caption percent margins are resolved against table's height for vertical-lr tables]
+    expected: FAIL
+
+  [Caption with auto top/bottom margins is centered vertically for vertical-lr tables]
+    expected: FAIL
+
--- a/testing/web-platform/meta/html/semantics/forms/the-form-element/form-autocomplete.html.ini
+++ b/testing/web-platform/meta/html/semantics/forms/the-form-element/form-autocomplete.html.ini
@@ -1,23 +1,11 @@
 [form-autocomplete.html]
   prefs: [dom.forms.autocomplete.formautofill:true]
   max-asserts: 3
-  [form autocomplete attribute missing]
-    expected: FAIL
-
-  [form autocomplete attribute on]
-    expected: FAIL
-
-  [form autocomplete attribute off]