merge mozilla-inbound to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Thu, 10 Nov 2016 16:59:38 +0100
changeset 321971 d38d06f85ef59c5dbb5d4a1a8d895957a78714de
parent 321881 4ee98684375e8c3c3dabccf8285268fa57f0f8a5 (current diff)
parent 321970 6c0d7c338607bf58a09d9a9c9bbece1e8bd5321a (diff)
child 321972 17435b7791134833f8b275163793fba0bf59fc01
child 321981 7ef0d8dca3a6df1f5130970832237457eed2a9f1
child 322052 aa765b477532542fb4db29d48819f55f7376a250
push id30937
push usercbook@mozilla.com
push dateThu, 10 Nov 2016 16:00:02 +0000
treeherdermozilla-central@d38d06f85ef5 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone52.0a1
first release with
nightly linux32
d38d06f85ef5 / 52.0a1 / 20161111030203 / files
nightly linux64
d38d06f85ef5 / 52.0a1 / 20161111030203 / files
nightly mac
d38d06f85ef5 / 52.0a1 / 20161111030203 / files
nightly win32
d38d06f85ef5 / 52.0a1 / 20161111030203 / files
nightly win64
d38d06f85ef5 / 52.0a1 / 20161111030203 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central a=merge
docshell/base/nsDocShell.cpp
gfx/layers/client/TextureClient.cpp
modules/libpref/init/all.js
toolkit/content/browser-content.js
toolkit/mozapps/downloads/content/helperApps.js
widget/nsIPrintOptions.idl
xpcom/tests/TestDeadlockDetector.cpp
xpcom/tests/TestDeadlockDetectorScalability.cpp
xpcom/tests/TestJemalloc.cpp
xpcom/tests/TestTimers.cpp
xpcom/tests/nsIFileEnumerator.cpp
--- a/addon-sdk/test/browser.ini
+++ b/addon-sdk/test/browser.ini
@@ -2,14 +2,13 @@
 support-files =
   head.js
   Math.jsm
   math.js
   data.json
   invalid.json
 [browser_sdk_loader_sdk_modules.js]
 [browser_sdk_loader_sdk_gui_modules.js]
-skip-if = e10s # Bug 1315042
 [browser_sdk_loader_jsm_modules.js]
 [browser_sdk_loader_js_modules.js]
 [browser_sdk_loader_json.js]
 [browser_sdk_loader_chrome.js]
 [browser_sdk_loader_chrome_in_sdk.js]
--- a/browser/base/content/test/plugins/browser.ini
+++ b/browser/base/content/test/plugins/browser.ini
@@ -51,17 +51,16 @@ skip-if = toolkit == "gtk2" || toolkit =
 [browser_CTP_crashreporting.js]
 skip-if = !crashreporter
 [browser_CTP_data_urls.js]
 [browser_CTP_drag_drop.js]
 [browser_CTP_hide_overlay.js]
 [browser_CTP_iframe.js]
 [browser_CTP_multi_allow.js]
 [browser_CTP_nonplugins.js]
-skip-if = e10s # Bug 1315042
 [browser_CTP_notificationBar.js]
 [browser_CTP_outsideScrollArea.js]
 [browser_CTP_remove_navigate.js]
 [browser_CTP_resize.js]
 [browser_CTP_zoom.js]
 [browser_blocking.js]
 [browser_plugins_added_dynamically.js]
 [browser_pluginnotification.js]
--- a/browser/base/content/test/referrer/browser.ini
+++ b/browser/base/content/test/referrer/browser.ini
@@ -1,17 +1,16 @@
 [DEFAULT]
 support-files =
   file_referrer_policyserver.sjs
   file_referrer_policyserver_attr.sjs
   file_referrer_testserver.sjs
   head.js
 
 [browser_referrer_middle_click.js]
-skip-if = e10s # Bug 1315042
 [browser_referrer_middle_click_in_container.js]
 [browser_referrer_open_link_in_private.js]
 skip-if = os == 'linux' # Bug 1145199
 [browser_referrer_open_link_in_tab.js]
 skip-if = os == 'linux' # Bug 1144816
 [browser_referrer_open_link_in_window.js]
 skip-if = os == 'linux' # Bug 1145199
 [browser_referrer_open_link_in_window_in_container.js]
--- a/browser/base/content/test/webrtc/browser.ini
+++ b/browser/base/content/test/webrtc/browser.ini
@@ -4,9 +4,8 @@ support-files =
   get_user_media_content_script.js
   head.js
 
 [browser_devices_get_user_media.js]
 skip-if = (os == "linux" && debug) # linux: bug 976544
 [browser_devices_get_user_media_anim.js]
 [browser_devices_get_user_media_in_frame.js]
 [browser_devices_get_user_media_tear_off_tab.js]
-skip-if = e10s # Bug 1315042
--- a/browser/base/content/test/webrtc/browser_devices_get_user_media.js
+++ b/browser/base/content/test/webrtc/browser_devices_get_user_media.js
@@ -19,18 +19,19 @@ var gTests = [
     let promise = promisePopupNotificationShown("webRTC-shareDevices");
     yield promiseRequestDevice(true, true);
     yield promise;
     yield expectObserverCalled("getUserMedia:request");
 
     is(PopupNotifications.getNotification("webRTC-shareDevices").anchorID,
        "webRTC-shareDevices-notification-icon", "anchored to device icon");
     checkDeviceSelectors(true, true);
-    is(PopupNotifications.panel.firstChild.getAttribute("popupid"),
-       "webRTC-shareDevices", "panel using devices icon");
+    let iconclass =
+      PopupNotifications.panel.firstChild.getAttribute("iconclass");
+    ok(iconclass.includes("camera-icon"), "panel using devices icon");
 
     let indicator = promiseIndicatorWindow();
     yield promiseMessage("ok", () => {
       PopupNotifications.panel.firstChild.button.click();
     });
     yield expectObserverCalled("getUserMedia:response:allow");
     yield expectObserverCalled("recording-device-events");
     is((yield getMediaCaptureState()), "CameraAndMicrophone",
@@ -48,18 +49,19 @@ var gTests = [
     let promise = promisePopupNotificationShown("webRTC-shareDevices");
     yield promiseRequestDevice(true);
     yield promise;
     yield expectObserverCalled("getUserMedia:request");
 
     is(PopupNotifications.getNotification("webRTC-shareDevices").anchorID,
        "webRTC-shareMicrophone-notification-icon", "anchored to mic icon");
     checkDeviceSelectors(true);
-    is(PopupNotifications.panel.firstChild.getAttribute("popupid"),
-       "webRTC-shareMicrophone", "panel using microphone icon");
+    let iconclass =
+      PopupNotifications.panel.firstChild.getAttribute("iconclass");
+    ok(iconclass.includes("microphone-icon"), "panel using microphone icon");
 
     let indicator = promiseIndicatorWindow();
     yield promiseMessage("ok", () => {
       PopupNotifications.panel.firstChild.button.click();
     });
     yield expectObserverCalled("getUserMedia:response:allow");
     yield expectObserverCalled("recording-device-events");
     is((yield getMediaCaptureState()), "Microphone",
@@ -77,18 +79,19 @@ var gTests = [
     let promise = promisePopupNotificationShown("webRTC-shareDevices");
     yield promiseRequestDevice(false, true);
     yield promise;
     yield expectObserverCalled("getUserMedia:request");
 
     is(PopupNotifications.getNotification("webRTC-shareDevices").anchorID,
        "webRTC-shareDevices-notification-icon", "anchored to device icon");
     checkDeviceSelectors(false, true);
-    is(PopupNotifications.panel.firstChild.getAttribute("popupid"),
-       "webRTC-shareDevices", "panel using devices icon");
+    let iconclass =
+      PopupNotifications.panel.firstChild.getAttribute("iconclass");
+    ok(iconclass.includes("camera-icon"), "panel using devices icon");
 
     let indicator = promiseIndicatorWindow();
     yield promiseMessage("ok", () => {
       PopupNotifications.panel.firstChild.button.click();
     });
     yield expectObserverCalled("getUserMedia:response:allow");
     yield expectObserverCalled("recording-device-events");
     is((yield getMediaCaptureState()), "Camera", "expected camera to be shared");
new file mode 100644
--- /dev/null
+++ b/browser/docs/BrowserUsageTelemetry.rst
@@ -0,0 +1,28 @@
+.. _browserusagetelemetry:
+
+=======================
+Browser Usage Telemetry
+=======================
+
+The `BrowserUsageTelemetry.jsm <https://dxr.mozilla.org/mozilla-central/source/browser/modules/BrowserUsageTelemetry.jsm>`_ module is the main module for measurements regarding the browser usage (e.g. tab and window counts, search counts, ...).
+
+The measurements recording begins right after the ``SessionStore`` has finished restoring the session (i.e. restoring tabs/windows after Firefox starts).
+
+Search telemetry
+================
+This module exposes the ``recordSearch`` method, which serves as the main entry point for recording search related Telemetry. It records only the search *counts* per engine and the origin of the search, but nothing pertaining the search contents themselves.
+
+As the transition to the ``BrowserUsageTelemetry`` happens, the ``recordSearch`` calls are dispatched through `BrowserSearch.recordSearchInTelemetry <https://dxr.mozilla.org/mozilla-central/rev/3e73fd638e687a4d7f46613586e5156b8e2af846/browser/base/content/browser.js#3752>`_, that is called by all the search related UI components (urlbar, searchbar, context menu and about\:\* pages).
+
+A list of the components recording search Telemetry can be found using the following `DXR search <https://dxr.mozilla.org/mozilla-central/search?q=recordSearchInTelemetry>`_.
+
+Measured interactions
+=====================
+The usage telemetry module currently measures these interactions with the browser:
+
+- *tab and window engagement*: counts the number of non-private tabs and windows opened in a subsession, after the session is restored (see e.g. ``browser.engagement.max_concurrent_tab_count``);
+- *URI loads*: counts the number of page loads (doesn't track and send the addresses, just the counts) directly triggered by the users (see ``browser.engagement.total_uri_count``);
+- *navigation events*: at this time, this only counts the number of time a page load is triggered by a particular UI interaction (e.g. by searching through the URL bar, see ``browser.engagement.navigation.urlbar``).
+
+
+Please see `Scalars.yaml <https://dxr.mozilla.org/mozilla-central/source/toolkit/components/telemetry/Scalars.yaml>`_ for the full list of tracked interactions.
--- a/browser/docs/index.rst
+++ b/browser/docs/index.rst
@@ -4,8 +4,9 @@ Firefox
 
 This is the nascent documentation of the Firefox front-end code.
 
 .. toctree::
    :maxdepth: 1
 
    DirectoryLinksProvider
    UITelemetry
+   BrowserUsageTelemetry
--- a/browser/modules/webrtcUI.jsm
+++ b/browser/modules/webrtcUI.jsm
@@ -358,27 +358,16 @@ function prompt(aBrowser, aRequest) {
 
   let options = {
     eventCallback: function(aTopic, aNewBrowser) {
       if (aTopic == "swapping")
         return true;
 
       let chromeDoc = this.browser.ownerDocument;
 
-      if (aTopic == "shown") {
-        let popupId = "Devices";
-        if (requestTypes.length == 1 && (requestTypes[0] == "Microphone" ||
-                                         requestTypes[0] == "AudioCapture"))
-          popupId = "Microphone";
-        if (requestTypes.includes("Screen"))
-          popupId = "Screen";
-        chromeDoc.getElementById("webRTC-shareDevices-notification")
-                 .setAttribute("popupid", "webRTC-share" + popupId);
-      }
-
       // Clean-up video streams of screensharing previews.
       if ((aTopic == "dismissed" || aTopic == "removed") &&
           requestTypes.includes("Screen")) {
         let video = chromeDoc.getElementById("webRTC-previewVideo");
         video.deviceId = undefined;
         if (video.stream) {
           video.stream.getTracks().forEach(t => t.stop());
           video.stream = null;
@@ -666,21 +655,29 @@ function prompt(aBrowser, aRequest) {
         mm.sendAsyncMessage("webrtc:Allow", {callID: aRequest.callID,
                                              windowID: aRequest.windowID,
                                              devices: allowedDevices});
       };
       return false;
     }
   };
 
-  let anchorId = "webRTC-shareDevices-notification-icon";
-  if (requestTypes.length == 1 && requestTypes[0] == "Microphone")
-    anchorId = "webRTC-shareMicrophone-notification-icon";
+  let iconType = "Devices";
+  if (requestTypes.length == 1 && (requestTypes[0] == "Microphone" ||
+                                   requestTypes[0] == "AudioCapture"))
+    iconType = "Microphone";
   if (requestTypes.includes("Screen"))
-    anchorId = "webRTC-shareScreen-notification-icon";
+    iconType = "Screen";
+  let anchorId = "webRTC-share" + iconType + "-notification-icon";
+
+  let iconClass = iconType.toLowerCase();
+  if (iconClass == "devices")
+    iconClass = "camera";
+  options.popupIconClass = iconClass + "-icon";
+
   notification =
     chromeWin.PopupNotifications.show(aBrowser, "webRTC-shareDevices", message,
                                       anchorId, mainAction, secondaryActions,
                                       options);
   notification.callID = aRequest.callID;
 }
 
 function removePrompt(aBrowser, aCallId) {
--- a/browser/themes/shared/notification-icons.inc.css
+++ b/browser/themes/shared/notification-icons.inc.css
@@ -108,18 +108,17 @@
 .login-icon {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#login);
 }
 
 .popup-notification-icon[popupid="password"] {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#login-detailed);
 }
 
-.camera-icon,
-.popup-notification-icon[popupid="webRTC-shareDevices"] {
+.camera-icon {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#camera);
 }
 
 .camera-icon.in-use {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#camera-sharing);
 }
 
 .camera-icon.blocked-permission-icon {
@@ -133,21 +132,20 @@
 .microphone-icon.in-use {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#microphone-sharing);
 }
 
 .microphone-icon.blocked-permission-icon {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#microphone-blocked);
 }
 
-.popup-notification-icon[popupid="webRTC-shareMicrophone"] {
+.popup-notification-icon.microphone-icon {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#microphone-detailed);
 }
 
-.popup-notification-icon[popupid="webRTC-shareScreen"],
 .screen-icon {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#screen);
 }
 
 .screen-icon.in-use {
   list-style-image: url(chrome://browser/skin/notification-icons.svg#screen-sharing);
 }
 
--- a/build/valgrind/mach_commands.py
+++ b/build/valgrind/mach_commands.py
@@ -108,16 +108,19 @@ class MachCommands(MachCommandBase):
                 '--vex-iropt-register-updates=allregs-at-mem-access',
                 '--gen-suppressions=all',
                 '--num-callers=36',
                 '--leak-check=full',
                 '--show-possibly-lost=no',
                 '--track-origins=yes',
                 '--trace-children=yes',
                 '-v',  # Enable verbosity to get the list of used suppressions
+                # Avoid excessive delays in the presence of spinlocks.
+                # See bug 1309851.
+                '--fair-sched=yes',
             ]
 
             for s in suppressions:
                 valgrind_args.append('--suppressions=' + s)
 
             supps_dir = os.path.join(build_dir, 'valgrind')
             supps_file1 = os.path.join(supps_dir, 'cross-architecture.sup')
             valgrind_args.append('--suppressions=' + supps_file1)
--- a/caps/BasePrincipal.cpp
+++ b/caps/BasePrincipal.cpp
@@ -319,16 +319,17 @@ OriginAttributes::SetFromGenericAttribut
   mAppId = aAttrs.mAppId;
   mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser;
   mAddonId = aAttrs.mAddonId;
   mUserContextId = aAttrs.mUserContextId;
   mPrivateBrowsingId = aAttrs.mPrivateBrowsingId;
   mFirstPartyDomain = aAttrs.mFirstPartyDomain;
 }
 
+/* static */
 bool
 OriginAttributes::IsFirstPartyEnabled()
 {
   // Cache the privacy.firstparty.isolate pref.
   static bool sFirstPartyIsolation = false;
   static bool sCachedFirstPartyPref = false;
   if (!sCachedFirstPartyPref) {
     sCachedFirstPartyPref = true;
--- a/caps/BasePrincipal.h
+++ b/caps/BasePrincipal.h
@@ -56,23 +56,23 @@ public:
                           nsACString& aOriginNoSuffix);
 
   // Helper function to match mIsPrivateBrowsing to existing private browsing
   // flags. Once all other flags are removed, this can be removed too.
   void SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing);
 
   void SetFromGenericAttributes(const GenericOriginAttributes& aAttrs);
 
+  // check if "privacy.firstparty.isolate" is enabled.
+  static bool IsFirstPartyEnabled();
+
 protected:
   OriginAttributes() {}
   explicit OriginAttributes(const OriginAttributesDictionary& aOther)
     : OriginAttributesDictionary(aOther) {}
-
-  // check if "privacy.firstparty.isolate" is enabled.
-  bool IsFirstPartyEnabled();
 };
 
 class PrincipalOriginAttributes;
 class DocShellOriginAttributes;
 class NeckoOriginAttributes;
 
 // Various classes in Gecko contain OriginAttributes members, and those
 // OriginAttributes get propagated to other classes according to certain rules.
--- a/devtools/client/aboutdebugging/components/aboutdebugging.js
+++ b/devtools/client/aboutdebugging/components/aboutdebugging.js
@@ -1,29 +1,34 @@
 /* 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/. */
 
 /* eslint-env browser */
 
 "use strict";
 
-const { createFactory, createClass, DOM: dom } =
+const { createFactory, createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const Services = require("Services");
 
 const PanelMenu = createFactory(require("./panel-menu"));
 
 loader.lazyGetter(this, "AddonsPanel",
   () => createFactory(require("./addons/panel")));
 loader.lazyGetter(this, "TabsPanel",
   () => createFactory(require("./tabs/panel")));
 loader.lazyGetter(this, "WorkersPanel",
   () => createFactory(require("./workers/panel")));
 
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+loader.lazyRequireGetter(this, "Telemetry",
+  "devtools/client/shared/telemetry");
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 const panels = [{
   id: "addons",
   name: Strings.GetStringFromName("addons"),
   icon: "chrome://devtools/skin/images/debugging-addons.svg",
   component: AddonsPanel
@@ -39,16 +44,21 @@ const panels = [{
   component: WorkersPanel
 }];
 
 const defaultPanelId = "addons";
 
 module.exports = createClass({
   displayName: "AboutDebuggingApp",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    telemetry: PropTypes.instanceOf(Telemetry).isRequired
+  },
+
   getInitialState() {
     return {
       selectedPanelId: defaultPanelId
     };
   },
 
   componentDidMount() {
     window.addEventListener("hashchange", this.onHashChange);
--- a/devtools/client/aboutdebugging/components/addons/controls.js
+++ b/devtools/client/aboutdebugging/components/addons/controls.js
@@ -6,30 +6,34 @@
 /* globals AddonManager */
 
 "use strict";
 
 loader.lazyImporter(this, "AddonManager",
   "resource://gre/modules/AddonManager.jsm");
 
 const { Cc, Ci } = require("chrome");
-const { createFactory, createClass, DOM: dom } =
+const { createFactory, createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const Services = require("Services");
 const AddonsInstallError = createFactory(require("./install-error"));
 
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 const MORE_INFO_URL = "https://developer.mozilla.org/docs/Tools" +
                       "/about:debugging#Enabling_add-on_debugging";
 
 module.exports = createClass({
   displayName: "AddonsControls",
 
+  propTypes: {
+    debugDisabled: PropTypes.bool
+  },
+
   getInitialState() {
     return {
       installError: null,
     };
   },
 
   onEnableAddonDebuggingChange(event) {
     let enabled = event.target.checked;
--- a/devtools/client/aboutdebugging/components/addons/install-error.js
+++ b/devtools/client/aboutdebugging/components/addons/install-error.js
@@ -1,20 +1,24 @@
 /* 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/. */
 
 /* eslint-env browser */
 "use strict";
 
-const { createClass, DOM: dom } = require("devtools/client/shared/vendor/react");
+const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react");
 
 module.exports = createClass({
   displayName: "AddonsInstallError",
 
+  propTypes: {
+    error: PropTypes.string
+  },
+
   render() {
     if (!this.props.error) {
       return null;
     }
     let text = `There was an error during installation: ${this.props.error}`;
     return dom.div({ className: "addons-install-error" },
                    dom.div({ className: "warning" }),
                    dom.span({}, text));
--- a/devtools/client/aboutdebugging/components/addons/panel.js
+++ b/devtools/client/aboutdebugging/components/addons/panel.js
@@ -1,34 +1,42 @@
 /* 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 { AddonManager } = require("resource://gre/modules/AddonManager.jsm");
-const { createFactory, createClass, DOM: dom } =
+const { createFactory, createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const Services = require("Services");
 
 const AddonsControls = createFactory(require("./controls"));
 const AddonTarget = createFactory(require("./target"));
 const PanelHeader = createFactory(require("../panel-header"));
 const TargetList = createFactory(require("../target-list"));
 
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 const ExtensionIcon = "chrome://mozapps/skin/extensions/extensionGeneric.svg";
 const CHROME_ENABLED_PREF = "devtools.chrome.enabled";
 const REMOTE_ENABLED_PREF = "devtools.debugger.remote-enabled";
 
 module.exports = createClass({
   displayName: "AddonsPanel",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    id: PropTypes.string.isRequired
+  },
+
   getInitialState() {
     return {
       extensions: [],
       debugDisabled: false,
     };
   },
 
   componentDidMount() {
@@ -120,16 +128,17 @@ module.exports = createClass({
     },
     PanelHeader({
       id: id + "-header",
       name: Strings.GetStringFromName("addons")
     }),
     AddonsControls({ debugDisabled }),
     dom.div({ id: "addons" },
       TargetList({
+        id: "extensions",
         name,
         targets,
         client,
         debugDisabled,
         targetClass,
         sort: true
       })
     ));
--- a/devtools/client/aboutdebugging/components/addons/target.js
+++ b/devtools/client/aboutdebugging/components/addons/target.js
@@ -1,27 +1,45 @@
 /* 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/. */
 
 /* eslint-env browser */
 
 "use strict";
 
-const { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const { debugAddon } = require("../../modules/addon");
 const Services = require("Services");
 
+loader.lazyImporter(this, "BrowserToolboxProcess",
+  "resource://devtools/client/framework/ToolboxProcess.jsm");
+
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 module.exports = createClass({
   displayName: "AddonTarget",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    debugDisabled: PropTypes.bool,
+    target: PropTypes.shape({
+      addonActor: PropTypes.string.isRequired,
+      addonID: PropTypes.string.isRequired,
+      icon: PropTypes.string,
+      name: PropTypes.string.isRequired,
+      temporarilyInstalled: PropTypes.bool
+    }).isRequired
+  },
+
   debug() {
     let { target } = this.props;
     debugAddon(target.addonID);
   },
 
   reload() {
     let { client, target } = this.props;
     // This function sometimes returns a partial promise that only
--- a/devtools/client/aboutdebugging/components/panel-header.js
+++ b/devtools/client/aboutdebugging/components/panel-header.js
@@ -1,19 +1,24 @@
 /* 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 { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 
 module.exports = createClass({
   displayName: "PanelHeader",
 
+  propTypes: {
+    id: PropTypes.string.isRequired,
+    name: PropTypes.string.isRequired
+  },
+
   render() {
     let { name, id } = this.props;
 
     return dom.div({ className: "header" },
       dom.h1({ id, className: "header-name" }, name));
   },
 });
--- a/devtools/client/aboutdebugging/components/panel-menu-entry.js
+++ b/devtools/client/aboutdebugging/components/panel-menu-entry.js
@@ -1,20 +1,28 @@
 /* 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 { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 
 module.exports = createClass({
   displayName: "PanelMenuEntry",
 
+  propTypes: {
+    icon: PropTypes.string.isRequired,
+    id: PropTypes.string.isRequired,
+    name: PropTypes.string.isRequired,
+    selected: PropTypes.bool,
+    selectPanel: PropTypes.func.isRequired
+  },
+
   onClick() {
     this.props.selectPanel(this.props.id);
   },
 
   onKeyDown(event) {
     if ([" ", "Enter"].includes(event.key)) {
       this.props.selectPanel(this.props.id);
     }
--- a/devtools/client/aboutdebugging/components/panel-menu.js
+++ b/devtools/client/aboutdebugging/components/panel-menu.js
@@ -1,21 +1,32 @@
 /* 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 { createClass, createFactory, DOM: dom } =
+const { createClass, createFactory, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const PanelMenuEntry = createFactory(require("./panel-menu-entry"));
 
 module.exports = createClass({
   displayName: "PanelMenu",
 
+  propTypes: {
+    panels: PropTypes.arrayOf(PropTypes.shape({
+      id: PropTypes.string.isRequired,
+      name: PropTypes.string.isRequired,
+      icon: PropTypes.string.isRequired,
+      component: PropTypes.func.isRequired
+    })).isRequired,
+    selectPanel: PropTypes.func.isRequired,
+    selectedPanelId: PropTypes.string
+  },
+
   render() {
     let { panels, selectedPanelId, selectPanel } = this.props;
     let panelLinks = panels.map(({ id, name, icon }) => {
       let selected = id == selectedPanelId;
       return PanelMenuEntry({
         id,
         name,
         icon,
--- a/devtools/client/aboutdebugging/components/tabs/panel.js
+++ b/devtools/client/aboutdebugging/components/tabs/panel.js
@@ -1,30 +1,38 @@
 /* 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/. */
 
 /* eslint-env browser */
 
 "use strict";
 
-const { createClass, createFactory, DOM: dom } =
+const { createClass, createFactory, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const Services = require("Services");
 
 const PanelHeader = createFactory(require("../panel-header"));
 const TargetList = createFactory(require("../target-list"));
 const TabTarget = createFactory(require("./target"));
 
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 module.exports = createClass({
   displayName: "TabsPanel",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    id: PropTypes.string.isRequired
+  },
+
   getInitialState() {
     return {
       tabs: []
     };
   },
 
   componentDidMount() {
     let { client } = this.props;
--- a/devtools/client/aboutdebugging/components/tabs/target.js
+++ b/devtools/client/aboutdebugging/components/tabs/target.js
@@ -1,26 +1,35 @@
 /* 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/. */
 
 /* eslint-env browser */
 
 "use strict";
 
-const { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const Services = require("Services");
 
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 module.exports = createClass({
   displayName: "TabTarget",
 
+  propTypes: {
+    target: PropTypes.shape({
+      icon: PropTypes.string,
+      outerWindowID: PropTypes.number.isRequired,
+      title: PropTypes.string,
+      url: PropTypes.string.isRequired
+    }).isRequired
+  },
+
   debug() {
     let { target } = this.props;
     window.open("about:devtools-toolbox?type=tab&id=" + target.outerWindowID);
   },
 
   render() {
     let { target } = this.props;
 
--- a/devtools/client/aboutdebugging/components/target-list.js
+++ b/devtools/client/aboutdebugging/components/target-list.js
@@ -1,28 +1,42 @@
 /* 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 { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const Services = require("Services");
 
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 const LocaleCompare = (a, b) => {
   return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
 };
 
 module.exports = createClass({
   displayName: "TargetList",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    debugDisabled: PropTypes.bool,
+    error: PropTypes.node,
+    id: PropTypes.string.isRequired,
+    name: PropTypes.string,
+    sort: PropTypes.bool,
+    targetClass: PropTypes.func.isRequired,
+    targets: PropTypes.arrayOf(PropTypes.object).isRequired
+  },
+
   render() {
     let { client, debugDisabled, error, targetClass, targets, sort } = this.props;
     if (sort) {
       targets = targets.sort(LocaleCompare);
     }
     targets = targets.map(target => {
       return targetClass({ client, target, debugDisabled });
     });
--- a/devtools/client/aboutdebugging/components/workers/panel.js
+++ b/devtools/client/aboutdebugging/components/workers/panel.js
@@ -3,35 +3,46 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 /* globals window */
 "use strict";
 
 loader.lazyImporter(this, "PrivateBrowsingUtils",
   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 
 const { Ci } = require("chrome");
-const { createClass, createFactory, DOM: dom } =
+const { createClass, createFactory, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const { getWorkerForms } = require("../../modules/worker");
 const Services = require("Services");
 
 const PanelHeader = createFactory(require("../panel-header"));
 const TargetList = createFactory(require("../target-list"));
 const WorkerTarget = createFactory(require("./target"));
 const ServiceWorkerTarget = createFactory(require("./service-worker-target"));
 
+loader.lazyImporter(this, "PrivateBrowsingUtils",
+  "resource://gre/modules/PrivateBrowsingUtils.jsm");
+
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 const WorkerIcon = "chrome://devtools/skin/images/debugging-workers.svg";
 const MORE_INFO_URL = "https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging";
 
 module.exports = createClass({
   displayName: "WorkersPanel",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    id: PropTypes.string.isRequired
+  },
+
   getInitialState() {
     return {
       workers: {
         service: [],
         shared: [],
         other: []
       }
     };
--- a/devtools/client/aboutdebugging/components/workers/service-worker-target.js
+++ b/devtools/client/aboutdebugging/components/workers/service-worker-target.js
@@ -1,27 +1,45 @@
 /* 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/. */
 
 /* eslint-env browser */
 
 "use strict";
 
-const { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const { debugWorker } = require("../../modules/worker");
 const Services = require("Services");
 
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 module.exports = createClass({
   displayName: "ServiceWorkerTarget",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    debugDisabled: PropTypes.bool,
+    target: PropTypes.shape({
+      active: PropTypes.bool,
+      icon: PropTypes.string,
+      name: PropTypes.string.isRequired,
+      url: PropTypes.string,
+      scope: PropTypes.string.isRequired,
+      // registrationActor can be missing in e10s.
+      registrationActor: PropTypes.string,
+      workerActor: PropTypes.string
+    }).isRequired
+  },
+
   getInitialState() {
     return {
       pushSubscription: null
     };
   },
 
   componentDidMount() {
     let { client } = this.props;
--- a/devtools/client/aboutdebugging/components/workers/target.js
+++ b/devtools/client/aboutdebugging/components/workers/target.js
@@ -1,27 +1,40 @@
 /* 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/. */
 
 /* eslint-env browser */
 
 "use strict";
 
-const { createClass, DOM: dom } =
+const { createClass, DOM: dom, PropTypes } =
   require("devtools/client/shared/vendor/react");
 const { debugWorker } = require("../../modules/worker");
 const Services = require("Services");
 
+loader.lazyRequireGetter(this, "DebuggerClient",
+  "devtools/shared/client/main", true);
+
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 module.exports = createClass({
   displayName: "WorkerTarget",
 
+  propTypes: {
+    client: PropTypes.instanceOf(DebuggerClient).isRequired,
+    debugDisabled: PropTypes.bool,
+    target: PropTypes.shape({
+      icon: PropTypes.string,
+      name: PropTypes.string.isRequired,
+      workerActor: PropTypes.string
+    }).isRequired
+  },
+
   debug() {
     let { client, target } = this.props;
     debugWorker(client, target.workerActor);
   },
 
   render() {
     let { target, debugDisabled } = this.props;
 
--- a/devtools/client/responsive.html/test/browser/browser.ini
+++ b/devtools/client/responsive.html/test/browser/browser.ini
@@ -33,12 +33,11 @@ support-files =
 [browser_permission_doorhanger.js]
 [browser_resize_cmd.js]
 [browser_screenshot_button.js]
 [browser_tab_close.js]
 [browser_tab_remoteness_change.js]
 [browser_toolbox_computed_view.js]
 [browser_toolbox_rule_view.js]
 [browser_toolbox_swap_browsers.js]
-skip-if = true # Bug 1315042
 [browser_touch_simulation.js]
 [browser_viewport_basics.js]
 [browser_window_close.js]
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -3568,31 +3568,73 @@ nsDocShell::CanAccessItem(nsIDocShellTre
   }
 
   if (targetDS->GetIsInIsolatedMozBrowserElement() !=
         accessingDS->GetIsInIsolatedMozBrowserElement() ||
       targetDS->GetAppId() != accessingDS->GetAppId()) {
     return false;
   }
 
-  if (static_cast<nsDocShell*>(targetDS.get())->GetOriginAttributes() !=
-      static_cast<nsDocShell*>(accessingDS.get())->GetOriginAttributes()) {
+  nsCOMPtr<nsIDocShellTreeItem> accessingRoot;
+  aAccessingItem->GetSameTypeRootTreeItem(getter_AddRefs(accessingRoot));
+  nsCOMPtr<nsIDocShell> accessingRootDS = do_QueryInterface(accessingRoot);
+
+  nsCOMPtr<nsIDocShellTreeItem> targetRoot;
+  aTargetItem->GetSameTypeRootTreeItem(getter_AddRefs(targetRoot));
+  nsCOMPtr<nsIDocShell> targetRootDS = do_QueryInterface(targetRoot);
+
+  DocShellOriginAttributes targetOA =
+    static_cast<nsDocShell*>(targetDS.get())->GetOriginAttributes();
+  DocShellOriginAttributes accessingOA =
+    static_cast<nsDocShell*>(accessingDS.get())->GetOriginAttributes();
+
+  // When the first party isolation is on, the top-level docShell may not have
+  // the firstPartyDomain in its originAttributes, but its document will have
+  // it. So we get the firstPartyDomain from the nodePrincipal of the document
+  // before we compare the originAttributes.
+  if (OriginAttributes::IsFirstPartyEnabled()) {
+    if (accessingDS == accessingRootDS &&
+        aAccessingItem->ItemType() == nsIDocShellTreeItem::typeContent &&
+        !accessingDS->GetIsMozBrowserOrApp()) {
+
+      nsCOMPtr<nsIDocument> accessingDoc = aAccessingItem->GetDocument();
+
+      if (accessingDoc) {
+        nsCOMPtr<nsIPrincipal> accessingPrincipal = accessingDoc->NodePrincipal();
+
+        accessingOA.mFirstPartyDomain =
+          BasePrincipal::Cast(accessingPrincipal)->OriginAttributesRef().mFirstPartyDomain;
+      }
+    }
+
+    if (targetDS == targetRootDS &&
+        aTargetItem->ItemType() == nsIDocShellTreeItem::typeContent &&
+        !targetDS->GetIsMozBrowserOrApp()) {
+
+      nsCOMPtr<nsIDocument> targetDoc = aAccessingItem->GetDocument();
+
+      if (targetDoc) {
+        nsCOMPtr<nsIPrincipal> targetPrincipal = targetDoc->NodePrincipal();
+
+        targetOA.mFirstPartyDomain =
+          BasePrincipal::Cast(targetPrincipal)->OriginAttributesRef().mFirstPartyDomain;
+      }
+    }
+  }
+
+  if (targetOA != accessingOA) {
     return false;
   }
 
   // A private document can't access a non-private one, and vice versa.
   if (static_cast<nsDocShell*>(targetDS.get())->UsePrivateBrowsing() !=
       static_cast<nsDocShell*>(accessingDS.get())->UsePrivateBrowsing()) {
     return false;
   }
 
-
-  nsCOMPtr<nsIDocShellTreeItem> accessingRoot;
-  aAccessingItem->GetSameTypeRootTreeItem(getter_AddRefs(accessingRoot));
-
   if (aTargetItem == accessingRoot) {
     // A frame can navigate its root.
     return true;
   }
 
   // Check if aAccessingItem can navigate one of aTargetItem's ancestors.
   nsCOMPtr<nsIDocShellTreeItem> target = aTargetItem;
   do {
@@ -3600,19 +3642,16 @@ nsDocShell::CanAccessItem(nsIDocShellTre
       return true;
     }
 
     nsCOMPtr<nsIDocShellTreeItem> parent;
     target->GetSameTypeParent(getter_AddRefs(parent));
     parent.swap(target);
   } while (target);
 
-  nsCOMPtr<nsIDocShellTreeItem> targetRoot;
-  aTargetItem->GetSameTypeRootTreeItem(getter_AddRefs(targetRoot));
-
   if (aTargetItem != targetRoot) {
     // target is a subframe, not in accessor's frame hierarchy, and all its
     // ancestors have origins different from that of the accessor. Don't
     // allow access.
     return false;
   }
 
   if (!aConsiderOpener) {
--- a/dom/base/test/browser.ini
+++ b/dom/base/test/browser.ini
@@ -15,17 +15,16 @@ support-files =
   file_use_counter_svg_fill_pattern_data.svg
 
 [browser_bug593387.js]
 [browser_bug902350.js]
 tags = mcb
 [browser_bug1011748.js]
 [browser_bug1058164.js]
 [browser_messagemanager_loadprocessscript.js]
-skip-if = e10s # Bug 1315042
 [browser_messagemanager_targetframeloader.js]
 [browser_messagemanager_unload.js]
 [browser_pagehide_on_tab_close.js]
 skip-if = e10s # this tests non-e10s behavior. it's not expected to work in e10s.
 [browser_state_notifications.js]
 skip-if = true # Bug 1271028
 [browser_use_counters.js]
 [browser_bug1307747.js]
--- a/dom/browser-element/mochitest/mochitest-oop.ini
+++ b/dom/browser-element/mochitest/mochitest-oop.ini
@@ -66,17 +66,16 @@ disabled = disabled for bug 1266035
 [test_browserElement_oop_OpenWindow.html]
 [test_browserElement_oop_OpenWindowDifferentOrigin.html]
 [test_browserElement_oop_OpenWindowInFrame.html]
 [test_browserElement_oop_OpenWindowRejected.html]
 [test_browserElement_oop_Opensearch.html]
 [test_browserElement_oop_OpenTab.html]
 disabled = Disabling some OOP tests for WebIDL scope changes
 [test_browserElement_oop_PrivateBrowsing.html]
-skip-if = e10s # Bug 1315042
 [test_browserElement_oop_PromptCheck.html]
 [test_browserElement_oop_PromptConfirm.html]
 [test_browserElement_oop_Proxy.html]
 [test_browserElement_oop_PurgeHistory.html]
 disabled = Disabling some OOP tests for WebIDL scope changes
 [test_browserElement_oop_Reload.html]
 disabled = Disabling some OOP tests for WebIDL scope changes
 [test_browserElement_oop_ReloadPostRequest.html]
--- a/dom/canvas/WebGLFormats.cpp
+++ b/dom/canvas/WebGLFormats.cpp
@@ -163,17 +163,17 @@ AddFormatInfo(EffectiveFormat format, co
     case UnsizedFormat::D:
         MOZ_ASSERT(!r && !g && !b && !a && d && !s);
         break;
 
     case UnsizedFormat::S:
         MOZ_ASSERT(!r && !g && !b && !a && !d && s);
         break;
 
-    case UnsizedFormat::DS:
+    case UnsizedFormat::DEPTH_STENCIL:
         MOZ_ASSERT(!r && !g && !b && !a && d && s);
         break;
     }
 
     const CompressedFormatInfo* compressedFormatInfo = GetCompressedFormatInfo(format);
     MOZ_ASSERT(!bytesPerPixel == bool(compressedFormatInfo));
 
 #ifdef DEBUG
@@ -257,18 +257,18 @@ InitFormatInfo()
     AddFormatInfo(FOO(RGBA16UI      ),  8, 16,16,16,16,  0,0, UnsizedFormat::RGBA, false, ComponentType::UInt    );
     AddFormatInfo(FOO(RGBA32I       ), 16, 32,32,32,32,  0,0, UnsizedFormat::RGBA, false, ComponentType::Int     );
     AddFormatInfo(FOO(RGBA32UI      ), 16, 32,32,32,32,  0,0, UnsizedFormat::RGBA, false, ComponentType::UInt    );
 
     // GLES 3.0.4, p133, table 3.14
     AddFormatInfo(FOO(DEPTH_COMPONENT16 ), 2, 0,0,0,0, 16,0, UnsizedFormat::D , false, ComponentType::NormUInt);
     AddFormatInfo(FOO(DEPTH_COMPONENT24 ), 3, 0,0,0,0, 24,0, UnsizedFormat::D , false, ComponentType::NormUInt);
     AddFormatInfo(FOO(DEPTH_COMPONENT32F), 4, 0,0,0,0, 32,0, UnsizedFormat::D , false, ComponentType::Float);
-    AddFormatInfo(FOO(DEPTH24_STENCIL8  ), 4, 0,0,0,0, 24,8, UnsizedFormat::DS, false, ComponentType::Special);
-    AddFormatInfo(FOO(DEPTH32F_STENCIL8 ), 5, 0,0,0,0, 32,8, UnsizedFormat::DS, false, ComponentType::Special);
+    AddFormatInfo(FOO(DEPTH24_STENCIL8  ), 4, 0,0,0,0, 24,8, UnsizedFormat::DEPTH_STENCIL, false, ComponentType::Special);
+    AddFormatInfo(FOO(DEPTH32F_STENCIL8 ), 5, 0,0,0,0, 32,8, UnsizedFormat::DEPTH_STENCIL, false, ComponentType::Special);
 
     // GLES 3.0.4, p205-206, "Required Renderbuffer Formats"
     AddFormatInfo(FOO(STENCIL_INDEX8), 1, 0,0,0,0, 0,8, UnsizedFormat::S, false, ComponentType::UInt);
 
     // GLES 3.0.4, p147, table 3.19
     // GLES 3.0.4  p286+  $C.1 "ETC Compressed Texture Image Formats"
     AddFormatInfo(FOO(COMPRESSED_RGB8_ETC2                     ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , false, ComponentType::NormUInt);
     AddFormatInfo(FOO(COMPRESSED_SRGB8_ETC2                    ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , true , ComponentType::NormUInt);
--- a/dom/canvas/WebGLFormats.h
+++ b/dom/canvas/WebGLFormats.h
@@ -153,17 +153,17 @@ enum class UnsizedFormat : uint8_t {
     RG,
     RGB,
     RGBA,
     LA,
     L,
     A,
     D,
     S,
-    DS,
+    DEPTH_STENCIL, // `DS` is a macro on Solaris. (regset.h)
 };
 
 // GLES 3.0.4 p114 Table 3.4, p240
 enum class ComponentType : uint8_t {
     None,
     Int,          // RGBA32I
     UInt,         // RGBA32UI, STENCIL_INDEX8
     NormInt,      // RGBA8_SNORM
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -532,17 +532,17 @@ WebGLFBAttachPoint::GetParameter(const c
                               : LOCAL_GL_LINEAR);
         break;
 
     case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
         MOZ_ASSERT(attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT);
 
         if (format->componentType == webgl::ComponentType::Special) {
             // Special format is used for DS mixed format(e.g. D24S8 and D32FS8).
-            MOZ_ASSERT(format->unsizedFormat == webgl::UnsizedFormat::DS);
+            MOZ_ASSERT(format->unsizedFormat == webgl::UnsizedFormat::DEPTH_STENCIL);
             MOZ_ASSERT(attachment == LOCAL_GL_DEPTH_ATTACHMENT ||
                        attachment == LOCAL_GL_STENCIL_ATTACHMENT);
 
             if (attachment == LOCAL_GL_DEPTH_ATTACHMENT) {
                 switch (format->effectiveFormat) {
                 case webgl::EffectiveFormat::DEPTH24_STENCIL8:
                     format = webgl::GetFormat(webgl::EffectiveFormat::DEPTH_COMPONENT24);
                     break;
--- a/dom/ipc/Blob.cpp
+++ b/dom/ipc/Blob.cpp
@@ -204,17 +204,21 @@ ActorManagerIsSameProcess(PBackgroundPar
 bool
 EventTargetIsOnCurrentThread(nsIEventTarget* aEventTarget)
 {
   if (!aEventTarget) {
     return NS_IsMainThread();
   }
 
   bool current;
-  MOZ_ALWAYS_SUCCEEDS(aEventTarget->IsOnCurrentThread(&current));
+
+  // If this fails, we are probably shutting down.
+  if (NS_WARN_IF(NS_FAILED(aEventTarget->IsOnCurrentThread(&current)))) {
+    return true;
+  }
 
   return current;
 }
 
 class CancelableRunnableWrapper final
   : public CancelableRunnable
 {
   nsCOMPtr<nsIRunnable> mRunnable;
--- a/dom/media/platforms/omx/moz.build
+++ b/dom/media/platforms/omx/moz.build
@@ -43,8 +43,15 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk
     EXTRA_DSO_LDOPTS += [
         '-libbinder',
     ]
 
 FINAL_LIBRARY = 'xul'
 
 if CONFIG['GNU_CXX']:
     CXXFLAGS += ['-Wno-error=shadow']
+
+if CONFIG['_MSC_VER']:
+    # Avoid warnings from third-party code that we can not modify.
+    if CONFIG['CLANG_CL']:
+        CXXFLAGS += ['-Wno-invalid-source-encoding']
+    else:
+        CXXFLAGS += ['-validate-charset-']
--- a/embedding/components/printingui/ipc/PrintDataUtils.cpp
+++ b/embedding/components/printingui/ipc/PrintDataUtils.cpp
@@ -1,16 +1,15 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /* vim: set sw=4 ts=8 et tw=80 : */
 /* 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/. */
 
 #include "PrintDataUtils.h"
-#include "nsIPrintOptions.h"
 #include "nsIPrintSettings.h"
 #include "nsIServiceManager.h"
 #include "nsIWebBrowserPrint.h"
 #include "nsXPIDLString.h"
 
 namespace mozilla {
 namespace embedding {
 
--- a/embedding/components/printingui/win/nsPrintDialogUtil.cpp
+++ b/embedding/components/printingui/win/nsPrintDialogUtil.cpp
@@ -28,17 +28,17 @@ WIN_LIBS=                               
 #include <commdlg.h>
 
 #include "nsIWebBrowserPrint.h"
 #include "nsString.h"
 #include "nsIServiceManager.h"
 #include "nsReadableUtils.h"
 #include "nsIPrintSettings.h"
 #include "nsIPrintSettingsWin.h"
-#include "nsIPrintOptions.h"
+#include "nsIPrinterEnumerator.h"
 
 #include "nsRect.h"
 
 #include "nsIPrefService.h"
 #include "nsIPrefBranch.h"
 
 #include "nsCRT.h"
 #include "prenv.h" /* for PR_GetEnv */
--- a/extensions/spellcheck/hunspell/glue/mozHunspell.cpp
+++ b/extensions/spellcheck/hunspell/glue/mozHunspell.cpp
@@ -7,24 +7,24 @@
  * http://www.mozilla.org/MPL/
  *
  * Software distributed under the License is distributed on an "AS IS" basis,
  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  * for the specific language governing rights and limitations under the
  * License.
  *
  * The Initial Developers of the Original Code are Kevin Hendricks (MySpell)
- * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers
+ * and László Németh (Hunspell). Portions created by the Initial Developers
  * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved.
  *
  * Contributor(s): Kevin Hendricks (kevin.hendricks@sympatico.ca)
  *                 David Einstein (deinst@world.std.com)
  *                 Michiel van Leeuwen (mvl@exedo.nl)
  *                 Caolan McNamara (cmc@openoffice.org)
- *                 Lszl Nmeth (nemethl@gyorsposta.hu)
+ *                 László Németh (nemethl@gyorsposta.hu)
  *                 Davide Prina
  *                 Giuseppe Modugno
  *                 Gianluca Turconi
  *                 Simon Brouwer
  *                 Noll Janos
  *                 Biro Arpad
  *                 Goldman Eleonora
  *                 Sarlos Tamas
--- a/extensions/spellcheck/hunspell/glue/mozHunspell.h
+++ b/extensions/spellcheck/hunspell/glue/mozHunspell.h
@@ -7,24 +7,24 @@
  * http://www.mozilla.org/MPL/
  * 
  * Software distributed under the License is distributed on an "AS IS" basis,
  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  * for the specific language governing rights and limitations under the
  * License.
  * 
  * The Initial Developers of the Original Code are Kevin Hendricks (MySpell)
- * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers
+ * and László Németh (Hunspell). Portions created by the Initial Developers
  * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved.
  * 
  * Contributor(s): Kevin Hendricks (kevin.hendricks@sympatico.ca)
  *                 David Einstein (deinst@world.std.com)
  *                 Michiel van Leeuwen (mvl@exedo.nl)
  *                 Caolan McNamara (cmc@openoffice.org)
- *                 Lszl Nmeth (nemethl@gyorsposta.hu)
+ *                 László Németh (nemethl@gyorsposta.hu)
  *                 Davide Prina
  *                 Giuseppe Modugno
  *                 Gianluca Turconi
  *                 Simon Brouwer
  *                 Noll Janos
  *                 Biro Arpad
  *                 Goldman Eleonora
  *                 Sarlos Tamas
--- a/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.cpp
+++ b/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.cpp
@@ -7,21 +7,21 @@
  * http://www.mozilla.org/MPL/
  * 
  * Software distributed under the License is distributed on an "AS IS" basis,
  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  * for the specific language governing rights and limitations under the
  * License.
  * 
  * The Initial Developers of the Original Code are Kevin Hendricks (MySpell)
- * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers
+ * and László Németh (Hunspell). Portions created by the Initial Developers
  * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved.
  * 
  * Contributor(s): Benjamin Smedberg (benjamin@smedbergs.us) (Original Code)
- *                 Lszl Nmeth (nemethl@gyorsposta.hu)
+ *                 László Németh (nemethl@gyorsposta.hu)
  *                 Ryan VanderMeulen (ryanvm@gmail.com)
  * 
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
--- a/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.h
+++ b/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.h
@@ -7,21 +7,21 @@
  * http://www.mozilla.org/MPL/
  * 
  * Software distributed under the License is distributed on an "AS IS" basis,
  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  * for the specific language governing rights and limitations under the
  * License.
  * 
  * The Initial Developers of the Original Code are Kevin Hendricks (MySpell)
- * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers
+ * and László Németh (Hunspell). Portions created by the Initial Developers
  * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved.
  * 
  * Contributor(s): Benjamin Smedberg (benjamin@smedbergs.us) (Original Code)
- *                 Lszl Nmeth (nemethl@gyorsposta.hu)
+ *                 László Németh (nemethl@gyorsposta.hu)
  *                 Ryan VanderMeulen (ryanvm@gmail.com)
  * 
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
--- a/gfx/2d/DrawTargetSkia.cpp
+++ b/gfx/2d/DrawTargetSkia.cpp
@@ -1562,20 +1562,27 @@ DrawTargetSkia::CreateSimilarDrawTarget(
     // Try to create a GPU draw target first if we're currently using the GPU.
     // Mark the DT as cached so that shadow DTs, extracted subrects, and similar can be reused.
     if (target->InitWithGrContext(mGrContext.get(), aSize, aFormat, true)) {
       return target.forget();
     }
     // Otherwise, just fall back to a software draw target.
   }
 #endif
+
+#ifdef DEBUG
   // Check that our SkCanvas isn't backed by vector storage such as PDF.  If it
-  // is then we want similar storage to avoid losing fidelity.
-  MOZ_ASSERT(mCanvas->imageInfo().colorType() != kUnknown_SkColorType,
-             "Not backed by pixels - we need to handle PDF backed SkCanvas");
+  // is then we want similar storage to avoid losing fidelity (if and when this
+  // DrawTarget is Snapshot()'ed, drawning a raster back into this DrawTarget
+  // will lose fidelity).
+  if (mCanvas->imageInfo().colorType() != kUnknown_SkColorType) {
+    NS_WARNING("Not backed by pixels - we need to handle PDF backed SkCanvas");
+  }
+#endif
+
   if (!target->Init(aSize, aFormat)) {
     return nullptr;
   }
   return target.forget();
 }
 
 bool
 DrawTargetSkia::UsingSkiaGPU() const
--- a/gfx/2d/Factory.cpp
+++ b/gfx/2d/Factory.cpp
@@ -506,16 +506,19 @@ Factory::CreateNativeFontResource(uint8_
 #ifdef WIN32
   case FontType::DWRITE:
     {
       return NativeFontResourceDWrite::Create(aData, aSize,
                                               /* aNeedsCairo = */ false);
     }
 #endif
   case FontType::CAIRO:
+#ifdef USE_SKIA
+  case FontType::SKIA:
+#endif
     {
 #ifdef WIN32
       if (GetDirect3D11Device()) {
         return NativeFontResourceDWrite::Create(aData, aSize,
                                                 /* aNeedsCairo = */ true);
       } else {
         return NativeFontResourceGDI::Create(aData, aSize,
                                              /* aNeedsCairo = */ true);
--- a/gfx/cairo/cairo/src/cairo-platform.h
+++ b/gfx/cairo/cairo/src/cairo-platform.h
@@ -1,11 +1,11 @@
 /* cairo - a vector graphics library with display and print output
  *
- * Copyright  2005 Mozilla Foundation
+ * Copyright © 2005 Mozilla Foundation
  *
  * This library is free software; you can redistribute it and/or
  * modify it either under the terms of the GNU Lesser General Public
  * License version 2.1 as published by the Free Software Foundation
  * (the "LGPL") or, at your option, under the terms of the Mozilla
  * Public License Version 1.1 (the "MPL"). If you do not alter this
  * notice, a recipient may use your version of this file under either
  * the MPL or the LGPL.
--- a/gfx/layers/client/TextureClient.cpp
+++ b/gfx/layers/client/TextureClient.cpp
@@ -89,17 +89,17 @@ void DeallocateTextureClient(TextureDeal
  * deallocte or recycle the it.
  */
 class TextureChild final : PTextureChild
 {
   ~TextureChild()
   {
     // We should have deallocated mTextureData in ActorDestroy
     MOZ_ASSERT(!mTextureData);
-    MOZ_ASSERT(mOwnerCalledDestroy);
+    MOZ_ASSERT_IF(!mOwnerCalledDestroy, !mTextureClient);
   }
 public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TextureChild)
 
   TextureChild()
   : mCompositableForwarder(nullptr)
   , mTextureForwarder(nullptr)
   , mTextureClient(nullptr)
@@ -930,21 +930,30 @@ TextureClient::InitIPDLActor(KnowsCompos
   }
   MOZ_ASSERT(!mActor || mActor->mDestroyed, "Cannot use a texture on several IPC channels.");
 
   SurfaceDescriptor desc;
   if (!ToSurfaceDescriptor(desc)) {
     return false;
   }
 
-  mActor = static_cast<TextureChild*>(fwd->CreateTexture(desc,
-                                      aForwarder->GetCompositorBackendType(),
-                                      GetFlags(),
-                                      mSerial));
-  MOZ_ASSERT(mActor);
+  PTextureChild* actor = fwd->CreateTexture(
+    desc,
+    aForwarder->GetCompositorBackendType(),
+    GetFlags(),
+    mSerial);
+  if (!actor) {
+    gfxCriticalNote << static_cast<int32_t>(desc.type()) << ", "
+                    << static_cast<int32_t>(aForwarder->GetCompositorBackendType()) << ", "
+                    << static_cast<uint32_t>(GetFlags())
+                    << ", " << mSerial;
+    return false;
+  }
+
+  mActor = static_cast<TextureChild*>(actor);
   mActor->mTextureForwarder = fwd;
   mActor->mTextureClient = this;
   mActor->mMainThreadOnly = !!(mFlags & TextureFlags::DEALLOCATE_MAIN_THREAD);
 
   // If the TextureClient is already locked, we have to lock TextureChild's mutex
   // since it will be unlocked in TextureClient::Unlock.
   if (mIsLocked) {
     LockActor();
--- a/gfx/layers/ipc/ShadowLayers.cpp
+++ b/gfx/layers/ipc/ShadowLayers.cpp
@@ -368,42 +368,52 @@ ShadowLayerForwarder::CheckSurfaceDescri
   }
 }
 #endif
 
 void
 ShadowLayerForwarder::UseTiledLayerBuffer(CompositableClient* aCompositable,
                                           const SurfaceDescriptorTiles& aTileLayerDescriptor)
 {
-  MOZ_ASSERT(aCompositable && aCompositable->IsConnected());
+  MOZ_ASSERT(aCompositable);
+
+  if (!aCompositable->IsConnected()) {
+    return;
+  }
 
   mTxn->AddNoSwapPaint(CompositableOperation(nullptr, aCompositable->GetIPDLActor(),
                                              OpUseTiledLayerBuffer(aTileLayerDescriptor)));
 }
 
 void
 ShadowLayerForwarder::UpdateTextureRegion(CompositableClient* aCompositable,
                                           const ThebesBufferData& aThebesBufferData,
                                           const nsIntRegion& aUpdatedRegion)
 {
   MOZ_ASSERT(aCompositable);
-  MOZ_ASSERT(aCompositable);
-  MOZ_ASSERT(aCompositable->IsConnected());
+
+  if (!aCompositable->IsConnected()) {
+    return;
+  }
 
   mTxn->AddPaint(
     CompositableOperation(
       nullptr, aCompositable->GetIPDLActor(),
       OpPaintTextureRegion(aThebesBufferData, aUpdatedRegion)));
 }
 
 void
 ShadowLayerForwarder::UseTextures(CompositableClient* aCompositable,
                                   const nsTArray<TimedTextureClient>& aTextures)
 {
-  MOZ_ASSERT(aCompositable && aCompositable->IsConnected());
+  MOZ_ASSERT(aCompositable);
+
+  if (!aCompositable->IsConnected()) {
+    return;
+  }
 
   AutoTArray<TimedTexture,4> textures;
 
   for (auto& t : aTextures) {
     MOZ_ASSERT(t.mTextureClient);
     MOZ_ASSERT(t.mTextureClient->GetIPDLActor());
     MOZ_RELEASE_ASSERT(t.mTextureClient->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel());
     ReadLockDescriptor readLock;
@@ -427,17 +437,21 @@ ShadowLayerForwarder::UseTextures(Compos
 }
 
 void
 ShadowLayerForwarder::UseComponentAlphaTextures(CompositableClient* aCompositable,
                                                 TextureClient* aTextureOnBlack,
                                                 TextureClient* aTextureOnWhite)
 {
   MOZ_ASSERT(aCompositable);
-  MOZ_ASSERT(aCompositable->IsConnected());
+
+  if (!aCompositable->IsConnected()) {
+    return;
+  }
+
   MOZ_ASSERT(aTextureOnWhite);
   MOZ_ASSERT(aTextureOnBlack);
   MOZ_ASSERT(aCompositable->GetIPDLActor());
   MOZ_ASSERT(aTextureOnBlack->GetIPDLActor());
   MOZ_ASSERT(aTextureOnWhite->GetIPDLActor());
   MOZ_ASSERT(aTextureOnBlack->GetSize() == aTextureOnWhite->GetSize());
   MOZ_RELEASE_ASSERT(aTextureOnWhite->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel());
   MOZ_RELEASE_ASSERT(aTextureOnBlack->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel());
@@ -489,17 +503,16 @@ ShadowLayerForwarder::DestroyInTransacti
 }
 
 void
 ShadowLayerForwarder::RemoveTextureFromCompositable(CompositableClient* aCompositable,
                                                     TextureClient* aTexture)
 {
   MOZ_ASSERT(aCompositable);
   MOZ_ASSERT(aTexture);
-  MOZ_ASSERT(aCompositable->IsConnected());
   MOZ_ASSERT(aTexture->GetIPDLActor());
   MOZ_RELEASE_ASSERT(aTexture->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel());
   if (!aCompositable->IsConnected() || !aTexture->GetIPDLActor()) {
     // We don't have an actor anymore, don't try to use it!
     return;
   }
 
   mTxn->AddEdit(
--- a/gfx/thebes/PrintTargetThebes.cpp
+++ b/gfx/thebes/PrintTargetThebes.cpp
@@ -81,28 +81,37 @@ nsresult
 PrintTargetThebes::EndPrinting()
 {
   return mGfxSurface->EndPrinting();
 }
 
 nsresult
 PrintTargetThebes::AbortPrinting()
 {
+#ifdef DEBUG
+  mHasActivePage = false;
+#endif
   return mGfxSurface->AbortPrinting();
 }
 
 nsresult
 PrintTargetThebes::BeginPage()
 {
+#ifdef DEBUG
+  mHasActivePage = true;
+#endif
   return mGfxSurface->BeginPage();
 }
 
 nsresult
 PrintTargetThebes::EndPage()
 {
+#ifdef DEBUG
+  mHasActivePage = false;
+#endif
   return mGfxSurface->EndPage();
 }
 
 void
 PrintTargetThebes::Finish()
 {
   return mGfxSurface->Finish();
 }
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -972,17 +972,17 @@ gfxPlatform::~gfxPlatform()
 #endif
 
 #if MOZ_TREE_CAIRO
     cairo_debug_reset_static_data();
 #endif
 #endif
 }
 
-already_AddRefed<DrawTarget>
+/* static */ already_AddRefed<DrawTarget>
 gfxPlatform::CreateDrawTargetForSurface(gfxASurface *aSurface, const IntSize& aSize)
 {
   SurfaceFormat format = aSurface->GetSurfaceFormat();
   RefPtr<DrawTarget> drawTarget = Factory::CreateDrawTargetForCairoSurface(aSurface->CairoSurface(), aSize, &format);
   if (!drawTarget) {
     gfxWarning() << "gfxPlatform::CreateDrawTargetForSurface failed in CreateDrawTargetForCairoSurface";
     return nullptr;
   }
--- a/gfx/thebes/gfxPlatform.h
+++ b/gfx/thebes/gfxPlatform.h
@@ -191,17 +191,17 @@ public:
     /**
      * Beware that this method may return DrawTargets which are not fully supported
      * on the current platform and might fail silently in subtle ways. This is a massive
      * potential footgun. You should only use these methods for canvas drawing really.
      * Use extreme caution if you use them for content where you are not 100% sure we
      * support the DrawTarget we get back.
      * See SupportsAzureContentForDrawTarget.
      */
-    virtual already_AddRefed<DrawTarget>
+    static already_AddRefed<DrawTarget>
       CreateDrawTargetForSurface(gfxASurface *aSurface, const mozilla::gfx::IntSize& aSize);
 
     /*
      * Creates a SourceSurface for a gfxASurface. This function does no caching,
      * so the caller should cache the gfxASurface if it will be used frequently.
      * The returned surface keeps a reference to aTarget, so it is OK to keep the
      * surface, even if aTarget changes.
      * aTarget should not keep a reference to the returned surface because that
--- a/intl/lwbrk/nsJISx4051LineBreaker.cpp
+++ b/intl/lwbrk/nsJISx4051LineBreaker.cpp
@@ -542,20 +542,30 @@ GetClass(uint32_t u)
     /* H2 = 31,                           [H2] */ CLASS_BREAKABLE,
     /* H3 = 32,                           [H3] */ CLASS_BREAKABLE,
     /* JL = 33,                           [JL] */ CLASS_CHARACTER,
     /* JT = 34,                           [JT] */ CLASS_CHARACTER,
     /* JV = 35,                           [JV] */ CLASS_CHARACTER,
     /* CLOSE_PARENTHESIS = 36,            [CP] */ CLASS_CLOSE_LIKE_CHARACTER,
     /* CONDITIONAL_JAPANESE_STARTER = 37, [CJ] */ CLASS_CLOSE,
     /* HEBREW_LETTER = 38,                [HL] */ CLASS_CHARACTER,
-    /* REGIONAL_INDICATOR = 39,           [RI] */ CLASS_CHARACTER
+    /* REGIONAL_INDICATOR = 39,           [RI] */ CLASS_CHARACTER,
+    /* E_BASE = 40,                       [EB] */ CLASS_BREAKABLE,
+    /* E_MODIFIER = 41,                   [EM] */ CLASS_CHARACTER,
+    /* ZWJ = 42,                          [ZWJ]*/ CLASS_CHARACTER
   };
 
-  return sUnicodeLineBreakToClass[mozilla::unicode::GetLineBreakClass(u)];
+#if ENABLE_INTL_API
+  static_assert(U_LB_COUNT == mozilla::ArrayLength(sUnicodeLineBreakToClass),
+                "Gecko vs ICU LineBreak class mismatch");
+#endif
+
+  auto cls = mozilla::unicode::GetLineBreakClass(u);
+  MOZ_ASSERT(cls < mozilla::ArrayLength(sUnicodeLineBreakToClass));
+  return sUnicodeLineBreakToClass[cls];
 }
 
 static bool
 GetPair(int8_t c1, int8_t c2)
 {
   NS_ASSERTION(c1 < MAX_CLASSES ,"illegal classes 1");
   NS_ASSERTION(c2 < MAX_CLASSES ,"illegal classes 2");
 
--- a/js/src/doc/Debugger/Debugger.Object.md
+++ b/js/src/doc/Debugger/Debugger.Object.md
@@ -152,16 +152,24 @@ from its prototype:
     [`Debugger.Environment`][environment] instance representing the lexical
     environment enclosing the function when it was created. If the referent
     is a function proxy or not debuggee code, this is `undefined`.
 
 `errorMessageName`
 :  If the referent is an error created with an engine internal message template
    this is a string which is the name of the template; `undefined` otherwise.
 
+`errorLineNumber`
+:  If the referent is an Error object, this is the line number at which the
+   referent was created; `undefined`  otherwise.
+
+`errorColumnNumber`
+:  If the referent is an Error object, this is the column number at which the
+   referent was created; `undefined`  otherwise.
+
 `isBoundFunction`
 :   If the referent is a debuggee function, returns `true` if the referent is a
     bound function; `false` otherwise. If the referent is not a debuggee
     function, or not a function at all, returns `undefined` instead.
 
 `isArrowFunction`
 :   If the referent is a debuggee function, returns `true` if the referent is an
     arrow function; `false` otherwise. If the referent is not a debuggee
--- a/js/src/gc/Verifier.cpp
+++ b/js/src/gc/Verifier.cpp
@@ -549,13 +549,13 @@ CheckHeapTracer::check(AutoLockForExclus
     MOZ_RELEASE_ASSERT(failures == 0);
 }
 
 void
 js::gc::CheckHeapAfterGC(JSRuntime* rt)
 {
     AutoTraceSession session(rt, JS::HeapState::Tracing);
     CheckHeapTracer tracer(rt);
-    if (!tracer.init())
+    if (tracer.init())
         tracer.check(session.lock);
 }
 
 #endif /* JSGC_HASH_TABLE_CHECKS */
--- a/js/src/jit-test/tests/asm.js/bug1201124-simd-proxy.js
+++ b/js/src/jit-test/tests/asm.js/bug1201124-simd-proxy.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 if (typeof newGlobal !== 'function' ||
     !isSimdAvailable() ||
     typeof SIMD === 'undefined')
 {
     quit();
--- a/js/src/jit-test/tests/asm.js/bug1268955-usestrict-semantics.js
+++ b/js/src/jit-test/tests/asm.js/bug1268955-usestrict-semantics.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 
 var scope = {};
 scope.mod = eval(`"use strict"; (function() { "use asm"; function f() {} return f; });`);
 
 scope.fun = scope.mod();
 
 var caught = false;
 for (let callee of ['mod', 'fun']) {
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/asm.js/directives.txt
@@ -0,0 +1,1 @@
+|jit-test| test-also-noasmjs; test-also-wasm-baseline
--- a/js/src/jit-test/tests/asm.js/neuter-during-arguments-coercion.js
+++ b/js/src/jit-test/tests/asm.js/neuter-during-arguments-coercion.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 function f(stdlib, foreign, buffer)
 {
   "use asm";
   var i32 = new stdlib.Int32Array(buffer);
   function set(v)
   {
--- a/js/src/jit-test/tests/asm.js/simd-fbirds.js
+++ b/js/src/jit-test/tests/asm.js/simd-fbirds.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 /* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 ; js-indent-level : 2 ; js-curly-indent-offset: 0 -*- */
 /* vim: set ts=4 et sw=4 tw=80: */
 
 // Author: Peter Jensen
 
 load(libdir + "asm.js");
 if (!isSimdAvailable() || typeof SIMD === 'undefined') {
     print("won't run tests as simd extensions aren't activated yet");
--- a/js/src/jit-test/tests/asm.js/simd-mandelbrot.js
+++ b/js/src/jit-test/tests/asm.js/simd-mandelbrot.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 /* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 ; js-indent-level : 2 ; js-curly-indent-offset: 0 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 
 // Mandelbrot using SIMD
 // Author: Peter Jensen, Intel Corporation
 
 load(libdir + "asm.js");
 if (!isSimdAvailable() || typeof SIMD === 'undefined') {
--- a/js/src/jit-test/tests/asm.js/testAddressErrors.js
+++ b/js/src/jit-test/tests/asm.js/testAddressErrors.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 setIonCheckGraphCoherency(false);
 setCachingEnabled(false);
 
 // constants
 var buf = new ArrayBuffer(BUF_MIN);
 
--- a/js/src/jit-test/tests/asm.js/testAtomic-effect.js
+++ b/js/src/jit-test/tests/asm.js/testAtomic-effect.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 if (!this.Atomics)
     quit();
 
 load(libdir + "asm.js");
 setJitCompilerOption('asmjs.atomics.enable', 1);
 
 var code = `
     "use asm";
--- a/js/src/jit-test/tests/asm.js/testBasic.js
+++ b/js/src/jit-test/tests/asm.js/testBasic.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 assertAsmTypeFail(USE_ASM);
 assertAsmTypeFail(USE_ASM + 'return');
 assertAsmTypeFail(USE_ASM + 'function f() 0');
 assertAsmTypeFail(USE_ASM + 'function f(){}');
 assertAsmTypeFail(USE_ASM + 'function f(){} return 0');
--- a/js/src/jit-test/tests/asm.js/testBullet.js
+++ b/js/src/jit-test/tests/asm.js/testBullet.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 // Test a big fat asm.js module. First load/compile/cache bullet.js in a
 // separate process and then load it again in this process, which should be a
 // cache hit.
 
 setCachingEnabled(true);
 if (!isAsmJSCompilationAvailable())
     quit();
 
--- a/js/src/jit-test/tests/asm.js/testCaching.js
+++ b/js/src/jit-test/tests/asm.js/testCaching.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 setCachingEnabled(true);
 if (!isAsmJSCompilationAvailable() || !isCachingEnabled())
     quit();
 
 var body1 = "'use asm'; function f() { return 42 } function ff() { return 43 } return f";
 var m = new Function(body1);
--- a/js/src/jit-test/tests/asm.js/testCall.js
+++ b/js/src/jit-test/tests/asm.js/testCall.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 assertAsmTypeFail(USE_ASM+"function f(){i=i|0} function g() { f(0) } return g");
 assertAsmTypeFail(USE_ASM+"function f(i){i=i|0} function g() { f() } return g");
 assertAsmTypeFail(USE_ASM+"function f(){} function g() { f()|0 } return g");
 assertAsmTypeFail(USE_ASM+"function f(){} function g() { +f() } return g");
 assertAsmTypeFail(USE_ASM+"function f(){} function g() { return f() } return g");
--- a/js/src/jit-test/tests/asm.js/testCloning.js
+++ b/js/src/jit-test/tests/asm.js/testCloning.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 setCachingEnabled(true);
 
 var code = asmCompile(USE_ASM + "function g() { return 42 } return g");
 assertEq(asmLink(code)(), 42);
 assertEq(asmLink(code)(), 42);
 
--- a/js/src/jit-test/tests/asm.js/testCompoundPlusMinus.js
+++ b/js/src/jit-test/tests/asm.js/testCompoundPlusMinus.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertAsmTypeFail(USE_ASM + "function f(i,j,k) { i=i|0;j=+j;k=+k; return (i+(j+k))|0 } return f");
 assertAsmTypeFail(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=+k; return +((i+j)+k) } return f");
 assertAsmTypeFail('imp', USE_ASM + "var ffi=imp.ffi; function f(i) { i=i|0; return (i+ffi())|0 } return f");
 
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=k|0; return (i+j+k)|0 } return f"))(1,2,3), 6);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=k|0; return (i+j-k)|0 } return f"))(1,2,3), 0);
--- a/js/src/jit-test/tests/asm.js/testControlFlow.js
+++ b/js/src/jit-test/tests/asm.js/testControlFlow.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=+j; if (i) return j; return j+1.0 } return f"))(0, 1.2), 1.2+1.0);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=+j; if (i) return j; return +~~i } return f"))(1,1.4), 1.4);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; if (i) return j^0; return i^1 } return f"))(1, 1), 1);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; if (i) return j^0; return i|0 } return f"))(1,8), 8);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; if ((i|0) == 0) return 10; else if ((i|0) == 1) return 12; else if ((i|0) == 2) return 14; return 0} return f"))(2), 14);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; if ((i|0) == 0) return 10; else if ((i|0) == 1) return 12; else if ((i|0) == 2) return 14; else return 16; return 0} return f"))(3), 16);
--- a/js/src/jit-test/tests/asm.js/testExpressions.js
+++ b/js/src/jit-test/tests/asm.js/testExpressions.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i+j)|0 } return f");
 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i+j)|0 } return f");
 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i-j)|0 } return f");
 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i-j)|0 } return f");
 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i*j)|0 } return f");
 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i*j)|0 } return f");
--- a/js/src/jit-test/tests/asm.js/testFFI.js
+++ b/js/src/jit-test/tests/asm.js/testFFI.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 function ffi(a,b,c,d) {
     return a+b+c+d;
 }
 
 var f = asmLink(asmCompile('global','imp', USE_ASM + 'var ffi=imp.ffi; function g() { return 1 } function f() { var i=0; i=g()|0; return ((ffi(4,5,6,7)|0)+i)|0 } return f'), null, {ffi:ffi});
--- a/js/src/jit-test/tests/asm.js/testFastHeapAccess.js
+++ b/js/src/jit-test/tests/asm.js/testFastHeapAccess.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 var code = asmCompile('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f(i,j) {i=i|0;j=j|0; u32[((i<<2)+32 & 0xffff)>>2] = j } return f');
 var f = asmLink(code, this, null, BUF_64KB);
 for (var i = 0; i < 100; i++)
     f(i, i);
 var u32 = new Uint32Array(BUF_64KB);
 for (var i = 0; i < 100; i++)
--- a/js/src/jit-test/tests/asm.js/testFloat32.js
+++ b/js/src/jit-test/tests/asm.js/testFloat32.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 const TO_FLOAT32 = "var toF = glob.Math.fround;";
 const HEAP32 = "var f32 = new glob.Float32Array(heap);";
 const HEAP64 = "var f64 = new glob.Float64Array(heap);"
 var heap = new ArrayBuffer(BUF_MIN);
 
 // Module linking
 assertAsmLinkAlwaysFail(asmCompile('glob', USE_ASM + TO_FLOAT32 + "function f() {} return f"), null);
--- a/js/src/jit-test/tests/asm.js/testFloatingPoint.js
+++ b/js/src/jit-test/tests/asm.js/testFloatingPoint.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return 1.1 } return f"))(), 1.1);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return +(+(i|0) + .1) } return f"))(1), 1.1);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(d) { d=+d; return +d } return f"))(1.1), 1.1);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d+e) } return f"))(1.0, .1), 1.1);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,e) { i=i|0;e=+e; return +(+~~i+e) } return f"))(1, .1), 1.1);
 assertEq(asmLink(asmCompile(USE_ASM + "function f(d,i) { d=+d;i=i|0; return +(d + +(i|0)) } return f"))(.1, 1), 1.1);
--- a/js/src/jit-test/tests/asm.js/testFunctionPtr.js
+++ b/js/src/jit-test/tests/asm.js/testFunctionPtr.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertAsmTypeFail('imp', USE_ASM + "function f() {} var imp=[f]; return f");
 assertAsmTypeFail(USE_ASM + "function f() {} var eval=[f]; return f");
 assertAsmTypeFail(USE_ASM + "var tbl=0; function f() {} var tbl=[f]; return f");
 assertAsmTypeFail(USE_ASM + "function f() {} var tbl; return f");
 assertAsmTypeFail(USE_ASM + "function f() {} var tbl=[]; return f");
 assertAsmTypeFail(USE_ASM + "function f() {} var tbl=[f,f,f]; return f");
--- a/js/src/jit-test/tests/asm.js/testGlobals.js
+++ b/js/src/jit-test/tests/asm.js/testGlobals.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 assertAsmTypeFail(USE_ASM + "var i; function f(){} return f");
 assertEq(asmLink(asmCompile(USE_ASM + "var i=0; function f(){} return f"))(), undefined);
 assertEq(asmLink(asmCompile(USE_ASM + "const i=0; function f(){} return f"))(), undefined);
 assertEq(asmLink(asmCompile(USE_ASM + "var i=42; function f(){ return i|0 } return f"))(), 42);
 assertEq(asmLink(asmCompile(USE_ASM + "const i=42; function f(){ return i|0 } return f"))(), 42);
--- a/js/src/jit-test/tests/asm.js/testHeapAccess.js
+++ b/js/src/jit-test/tests/asm.js/testHeapAccess.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { i32[0>>2] = 4.0; return i32[0>>2]|0; } return f');
 assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { f32[0>>2] = 4; return +f32[0>>2]; } return f');
 
 assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { var x=0,y=0; return i8[x+y]|0 } return f');
 assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { var x=0,y=0; return u8[x+y]|0 } return f');
 
--- a/js/src/jit-test/tests/asm.js/testLinkErrorAssert.js
+++ b/js/src/jit-test/tests/asm.js/testLinkErrorAssert.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 // This test should not assert.
 
 function asmModule(g, foreign, heap) {
     "use asm";
     let HEAP8 = new g.Int8Array(heap);
 
     function f() { return 99; } 
     return {f: f};
--- a/js/src/jit-test/tests/asm.js/testLiterals.js
+++ b/js/src/jit-test/tests/asm.js/testLiterals.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + 'asm.js');
 
 assertAsmTypeFail(USE_ASM + 'function f(d) { d=+d; var e=0; e=d; return +e } return f');
 assertAsmTypeFail(USE_ASM + 'function f(d) { d=+d; var e=1e1; e=d; return +e } return f');
 assertAsmTypeFail(USE_ASM + 'function f(d) { d=+d; var e=+0; e=d; return +e } return f');
 assertEq(asmLink(asmCompile(USE_ASM + 'function f() { var e=-0; return +e } return f'))(-0), -0);
 assertEq(asmLink(asmCompile(USE_ASM + 'function f() { var e=-0.0; return +e } return f'))(-0), -0);
 assertEq(asmLink(asmCompile(USE_ASM + 'function f(d) { d=+d; var e=0.0; e=d; return +e } return f'))(0.1), 0.1);
--- a/js/src/jit-test/tests/asm.js/testMathLib.js
+++ b/js/src/jit-test/tests/asm.js/testMathLib.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 function testUnary(f, g) {
     var numbers = [NaN, Infinity, -Infinity, -10000, -3.4, -0, 0, 3.4, 10000];
     for (n of numbers)
         assertEq(f(n), g(n));
 }
 
--- a/js/src/jit-test/tests/asm.js/testModuleFunctions.js
+++ b/js/src/jit-test/tests/asm.js/testModuleFunctions.js
@@ -1,9 +1,9 @@
-// |jit-test| test-also-noasmjs
+
 function testUniqueness(asmJSModule) {
     var f = asmJSModule();
     var g = asmJSModule();
     assertEq(f === g, false);
     f.x = 4;
     assertEq(f.x, 4);
     assertEq(g.x, undefined);
 }
--- a/js/src/jit-test/tests/asm.js/testNeuter.js
+++ b/js/src/jit-test/tests/asm.js/testNeuter.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 if (!isAsmJSCompilationAvailable())
     quit();
 
 var m = asmCompile('stdlib', 'foreign', 'buffer',
                   `"use asm";
--- a/js/src/jit-test/tests/asm.js/testParallelCompile.js
+++ b/js/src/jit-test/tests/asm.js/testParallelCompile.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 if (!isAsmJSCompilationAvailable())
     quit();
 
 var module = "'use asm';\n";
 for (var i = 0; i < 100; i++) {
     module += "function f" + i + "(i) {\n";
--- a/js/src/jit-test/tests/asm.js/testProfiling.js
+++ b/js/src/jit-test/tests/asm.js/testProfiling.js
@@ -1,11 +1,15 @@
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
+// Run test only for asm.js
+if (!isAsmJSCompilationAvailable())
+    quit();
+
 // Single-step profiling currently only works in the ARM simulator
 if (!getBuildConfiguration()["arm-simulator"])
     quit();
 
 function checkSubSequence(got, expect)
 {
     var got_i = 0;
     EXP: for (var exp_i = 0; exp_i < expect.length; exp_i++) {
--- a/js/src/jit-test/tests/asm.js/testRangeAnalysis.js
+++ b/js/src/jit-test/tests/asm.js/testRangeAnalysis.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 // Bug 894781
 function m(stdlib)
 {
   "use asm";
   var abs = stdlib.Math.abs;
   function f(d)
   {
     d = +d;
--- a/js/src/jit-test/tests/asm.js/testSource.js
+++ b/js/src/jit-test/tests/asm.js/testSource.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 setCachingEnabled(true);
 
 (function() {
 /*
  * NO ARGUMENT
  */
 
 function f0() {
--- a/js/src/jit-test/tests/asm.js/testStackWalking.js
+++ b/js/src/jit-test/tests/asm.js/testStackWalking.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 load(libdir + "asserts.js");
 
 function matchStack(stackString, stackArray)
 {
     var match = 0;
     for (name of stackArray) {
         match = stackString.indexOf(name, match);
--- a/js/src/jit-test/tests/asm.js/testUseAsmWarnings.js
+++ b/js/src/jit-test/tests/asm.js/testUseAsmWarnings.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 assertAsmDirectiveFail("'use asm'");
 assertAsmDirectiveFail("eval('\"use asm\";');");
 assertAsmDirectiveFail("{ eval('\"use asm\";'); }");
 assertAsmDirectiveFail("if (Math) { 'use asm'; }");
 assertAsmDirectiveFail("function f(){ { 'use asm'; } }");
 assertAsmDirectiveFail("function f(){ ; 'use asm'; } }");
--- a/js/src/jit-test/tests/asm.js/testX86ByteStore.js
+++ b/js/src/jit-test/tests/asm.js/testX86ByteStore.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-noasmjs
 load(libdir + "asm.js");
 
 var body =
 '   "use asm";\
     var i8=new global.Int8Array(buffer);\
     function g(i,j,k) {\
         i=i|0;\
         j=j|0;\
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Object-errorLineNumber-errorColumnNumber.js
@@ -0,0 +1,55 @@
+// Debugger.Object.prototype.{errorLineNumber,errorColumnNumber} return the
+// line number and column number associated with some error object.
+
+var g = newGlobal();
+var dbg = new Debugger();
+var gw = dbg.addDebuggee(g);
+
+var syntaxError = gw.executeInGlobal("\nlet a, a;").throw;
+assertEq(syntaxError.errorLineNumber, 2);
+assertEq(syntaxError.errorColumnNumber, 7);
+
+var typeError = gw.executeInGlobal("\n1 + f();").throw;
+assertEq(typeError.errorLineNumber, 2);
+assertEq(typeError.errorColumnNumber, 1);
+
+// Custom errors have no line/column numbers .
+var customError = gw.executeInGlobal("\nthrow 1;").throw;
+assertEq(customError.errorLineNumber, undefined);
+assertEq(customError.errorColumnNumber, undefined);
+
+customError = gw.executeInGlobal("\nthrow { errorLineNumber: 10, errorColumnNumber: 20 };").throw;
+assertEq(customError.errorLineNumber, undefined);
+assertEq(customError.errorColumnNumber, undefined);
+
+customError = gw.executeInGlobal("\nthrow { lineNumber: 10, columnNumber: 20 };").throw;
+assertEq(customError.errorLineNumber, undefined);
+assertEq(customError.errorColumnNumber, undefined);
+
+// Ensure that the method works across globals.
+g.eval(`var g = newGlobal();
+        g.eval('var err; \\n' +
+               'try {\\n' +
+               '  f();\\n' +
+               '} catch (e) {\\n' +
+               '  err = e;\\n' +
+               '}');
+        var err2 = g.err;`);
+var otherGlobalError = gw.executeInGlobal("throw err2").throw;
+assertEq(otherGlobalError.errorLineNumber, 3);
+assertEq(otherGlobalError.errorColumnNumber, 3);
+
+// Ensure that non-error objects return undefined.
+const Args = [
+    "1",
+    "'blah'",
+    "({})",
+    "[]",
+    "() => 1"
+]
+
+for (let arg of Args) {
+    let nonError = gw.executeInGlobal(`${arg}`).return;
+    assertEq(nonError.errorLineNumber, undefined);
+    assertEq(nonError.errorColumnNumber, undefined);
+}
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/gc/bug-1315946.js
@@ -0,0 +1,14 @@
+if (!('oomTest' in this))
+    quit();
+
+// Don't run a full oomTest because it takes ages - a few iterations are
+// sufficient to trigger the bug.
+let i = 0;
+
+oomTest(Function(`
+    if (i < 10) {
+        i++;
+        gczeal(15,1);
+        foo;
+    }
+`));
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/bug1314438.js
@@ -0,0 +1,6 @@
+
+function g(x) {
+    return (-1 % x && Math.cos(8) >>> 0);
+}
+g(2);
+assertEq(uneval(g(-1)), "-0");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/bug1314545.js
@@ -0,0 +1,31 @@
+function f() {
+    Object.prototype[0] = 10;
+
+    var arr = [];
+    for (var i=3; i<20; i++) {
+        arr[0] = i;
+        Object.freeze(arr);
+        while (!inIon()) {}
+    }
+    assertEq(arr[0], 3);
+}
+f();
+
+function g() {
+    var c = 0;
+    Object.defineProperty(Object.prototype, 18, {set: function() { c++; }});
+
+    var arrays = [];
+    for (var i=0; i<2; i++)
+        arrays.push([1, 2]);
+
+    for (var i=0; i<20; i++) {
+        arrays[0][i] = 1;
+        arrays[1][i] = 2;
+        if (i === 0)
+            Object.freeze(arrays[0]);
+        while (!inIon()) {}
+    }
+    assertEq(c, 2);
+}
+g();
--- a/js/src/jit-test/tests/wasm/backtrace.js
+++ b/js/src/jit-test/tests/wasm/backtrace.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 var code = `(module
   (import $i "env" "test")
   (func $t (call $i))
   (export "test" $t)
 )`;
 var mod = wasmEvalText(code, {
--- a/js/src/jit-test/tests/wasm/basic.js
+++ b/js/src/jit-test/tests/wasm/basic.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // ----------------------------------------------------------------------------
 // exports
 
 var o = wasmEvalText('(module)').exports;
 assertEq(Object.getOwnPropertyNames(o).length, 0);
 
--- a/js/src/jit-test/tests/wasm/bce.js
+++ b/js/src/jit-test/tests/wasm/bce.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 mem='\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'+
     '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'+
     '\x00'.repeat(65488) +
     '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
 
 print (mem.lengt)
--- a/js/src/jit-test/tests/wasm/binary.js
+++ b/js/src/jit-test/tests/wasm/binary.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 load(libdir + "wasm-binary.js");
 
 const CompileError = WebAssembly.CompileError;
 
 const magicError = /failed to match magic number/;
 const unknownSection = /expected user-defined section/;
 
--- a/js/src/jit-test/tests/wasm/comments.js
+++ b/js/src/jit-test/tests/wasm/comments.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // sanity check
 assertErrorMessage(() => wasmEvalText(''), SyntaxError, /parsing wasm text/);
 
 // single line comment
 var o = wasmEvalText('(module (func)) ;; end');
 var o = wasmEvalText('(module (func)) ;; end\n');
--- a/js/src/jit-test/tests/wasm/compiler-frame-depth.js
+++ b/js/src/jit-test/tests/wasm/compiler-frame-depth.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Ensures that the postorder allows us to have very deep expression trees.
 
 var expr = '(get_local 0)';
 
 for (var i = 1000; i --> 0; ) {
     expr = `(f32.neg ${expr})`;
--- a/js/src/jit-test/tests/wasm/const.js
+++ b/js/src/jit-test/tests/wasm/const.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 function testConst(type, str, expect) {
     if (type === 'i64')
         wasmFullPassI64(`(module (func (result i64) (i64.const ${str})) (export "run" 0))`, expect);
     else
         wasmFullPass(`(module (func (result ${type}) (${type}.const ${str})) (export "run" 0))`, expect);
 }
--- a/js/src/jit-test/tests/wasm/control-flow.js
+++ b/js/src/jit-test/tests/wasm/control-flow.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 const RuntimeError = WebAssembly.RuntimeError;
 
 // ----------------------------------------------------------------------------
 // if
 
 // Condition is an int32
--- a/js/src/jit-test/tests/wasm/conversion.js
+++ b/js/src/jit-test/tests/wasm/conversion.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 function testConversion(resultType, opcode, paramType, op, expect) {
   if (paramType === 'i64') {
     // i64 cannot be imported, so we use a wrapper function.
     wasmFullPass(`(module
                     (func (param i64) (result ${resultType}) (${resultType}.${opcode}/i64 (get_local 0)))
                     (export "run" 0))`, expect, {}, createI64(op));
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/directives.txt
@@ -0,0 +1,1 @@
+|jit-test| test-also-wasm-baseline
--- a/js/src/jit-test/tests/wasm/errors.js
+++ b/js/src/jit-test/tests/wasm/errors.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 load(libdir + "wasm-binary.js");
 
 const Module = WebAssembly.Module;
 const Instance = WebAssembly.Instance;
 const RuntimeError = WebAssembly.RuntimeError;
 
 function isWasmFunction(name) {
--- a/js/src/jit-test/tests/wasm/extract-code.js
+++ b/js/src/jit-test/tests/wasm/extract-code.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 var module = new WebAssembly.Module(wasmTextToBinary(`(module (func (nop)))`));
 var exp = wasmExtractCode(module);
 assertEq(exp.code instanceof Uint8Array, true);
 assertEq(Array.isArray(exp.segments), true);
 var funcs = exp.segments.filter(s => s.kind === 0);
 assertEq(funcs.length, 1);
--- a/js/src/jit-test/tests/wasm/fac.js
+++ b/js/src/jit-test/tests/wasm/fac.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // This is fac-opt from fac.wast in the official testsuite, changed to use
 // i32 instead of i64.
 assertEq(wasmEvalText(`(module
   (func $fac-opt (param i32) (result i32)
     (local i32)
     (set_local 1 (i32.const 1))
--- a/js/src/jit-test/tests/wasm/float.js
+++ b/js/src/jit-test/tests/wasm/float.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 wasmFullPass('(module (func (result f32) (f32.const -1)) (export "run" 0))', -1);
 wasmFullPass('(module (func (result f32) (f32.const 1)) (export "run" 0))', 1);
 wasmFullPass('(module (func (result f64) (f64.const -2)) (export "run" 0))', -2);
 wasmFullPass('(module (func (result f64) (f64.const 2)) (export "run" 0))', 2);
 wasmFullPass('(module (func (result f64) (f64.const 4294967296)) (export "run" 0))', 4294967296);
 wasmFullPass('(module (func (result f32) (f32.const 1.5)) (export "run" 0))', 1.5);
--- a/js/src/jit-test/tests/wasm/full-cycle.js
+++ b/js/src/jit-test/tests/wasm/full-cycle.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 wasmFullPass(`(module
     (func $test (result i32) (param i32) (param i32) (i32.add (get_local 0) (get_local 1)))
     (func $run (result i32) (call $test (i32.const 1) (i32.const ${Math.pow(2, 31) - 1})))
     (export "run" $run)
 )`, -Math.pow(2, 31));
 
--- a/js/src/jit-test/tests/wasm/globals.js
+++ b/js/src/jit-test/tests/wasm/globals.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 const { Instance, Module } = WebAssembly;
 
 // Locally-defined globals
 assertErrorMessage(() => wasmEvalText(`(module (global))`), SyntaxError, /parsing/);
 assertErrorMessage(() => wasmEvalText(`(module (global i32))`), SyntaxError, /parsing/);
 assertErrorMessage(() => wasmEvalText(`(module (global (mut i32)))`), SyntaxError, /parsing/);
--- a/js/src/jit-test/tests/wasm/grow-memory.js
+++ b/js/src/jit-test/tests/wasm/grow-memory.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 function linearModule(min, max, ops) {
   var opsText = ops.map(function (op) {
     if (op[0] == "CM") {
       res = `(if i32 (i32.ne (current_memory) (i32.const ${op[1]}))
                   (i32.load offset=10 (i32.const 4294967295))
                   (i32.const 0))`
--- a/js/src/jit-test/tests/wasm/import-export.js
+++ b/js/src/jit-test/tests/wasm/import-export.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + 'wasm.js');
 
 const Module = WebAssembly.Module;
 const Instance = WebAssembly.Instance;
 const Memory = WebAssembly.Memory;
 const Table = WebAssembly.Table;
 
 const mem1Page = new Memory({initial:1});
--- a/js/src/jit-test/tests/wasm/integer.js
+++ b/js/src/jit-test/tests/wasm/integer.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 assertEq(wasmEvalText('(module (func (result i32) (i32.const -1)) (export "" 0))').exports[""](), -1);
 assertEq(wasmEvalText('(module (func (result i32) (i32.const -2147483648)) (export "" 0))').exports[""](), -2147483648);
 assertEq(wasmEvalText('(module (func (result i32) (i32.const 4294967295)) (export "" 0))').exports[""](), -1);
 
 function testUnary(type, opcode, op, expect) {
     var fullPass = wasmFullPass;
--- a/js/src/jit-test/tests/wasm/js-reexport.js
+++ b/js/src/jit-test/tests/wasm/js-reexport.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 const Module = WebAssembly.Module;
 const Instance = WebAssembly.Instance;
 const Memory = WebAssembly.Memory;
 const Table = WebAssembly.Table;
 
 function accum(...args) {
--- a/js/src/jit-test/tests/wasm/memory-aliasing.js
+++ b/js/src/jit-test/tests/wasm/memory-aliasing.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 var i = wasmEvalText(
 `(module
    (memory 1) (data (i32.const 0) "\\01\\02\\03\\04\\05\\06\\07\\08")
    (func $off1 (param $base i32) (result i32)
      (i32.add
        (i32.load8_u (get_local $base))
--- a/js/src/jit-test/tests/wasm/memory.js
+++ b/js/src/jit-test/tests/wasm/memory.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 const RuntimeError = WebAssembly.RuntimeError;
 
 function loadModule(type, ext, offset, align) {
     return wasmEvalText(
     `(module
        (memory 1)
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/baseline-pop-along-edge.js
@@ -0,0 +1,68 @@
+// Bug 1316181
+
+load(libdir + "wasm.js");
+
+// There are locals with different values here to ensure that the
+// get_local at the end picks up the right one even if the stack might
+// have become unbalanced by a failure to adjust SP along the branch
+// edge.  The logic is that we use SP-relative addressing, and if the
+// actual SP is not what the compiler thinks it is we will read
+// something other than the expected value.
+
+var o = wasmEvalText(
+    `(module
+      (func (result i32)
+       (local $v0 i32)
+       (local $v1 i32)
+       (local $v2 i32)
+       (local $v3 i32)
+       (local $v4 i32)
+       (local $v5 i32)
+       (local $v6 i32)
+       (local $v7 i32)
+       (local $res i32)
+       (set_local $v0 (i32.const 0xDEADBEEF))
+       (set_local $v1 (i32.const 0xFDEADBEE))
+       (set_local $v2 (i32.const 0xEFDEADBE))
+       (set_local $v3 (i32.const 0xEEFDEADB))
+       (set_local $v4 (i32.const 0xBEEFDEAD))
+       (set_local $v5 (i32.const 0xDBEEFDEA))
+       (set_local $v6 (i32.const 0xADBEEFDE))
+       (set_local $v7 (i32.const 0xEADBEEFD))
+       (block $b
+	(set_local $res
+	 (i32.add
+	  (i32.add (i32.const 1) (i32.const 2))
+	  (i32.add
+	   (i32.add (i32.const 3) (i32.const 4))
+	   (i32.add
+	    (i32.add (i32.const 5) (i32.const 6))
+	    (i32.add
+	     (i32.add (i32.const 7) (i32.const 8))
+	     (i32.add
+	      (i32.add (i32.const 9) (i32.const 10))
+	      (i32.add
+	       (i32.add (i32.const 11) (i32.const 12))
+	       (i32.add
+		(i32.add (i32.const 13) (i32.const 14))
+		(i32.add
+		 (i32.add (i32.const 15) (i32.const 16))
+		 (i32.add
+		  (i32.add (i32.const 17) (i32.const 18))
+		  (i32.add
+		   (i32.add (i32.const 19) (i32.const 20))
+		   (i32.add
+		    (i32.add (i32.const 21) (i32.const 22))
+		    (i32.add
+		     (i32.add (i32.const 23) (i32.const 24))
+		     (i32.add
+		      (i32.add (i32.const 25) (i32.const 26))
+		      (i32.add
+		       (i32.add (i32.const 27) (i32.const 28))
+		       (i32.add
+			(i32.add (i32.const 29) (i32.const 30))
+			(br_if $b (i32.const 31) (i32.const 1)))))))))))))))))))
+       (return (get_local $v3)))
+      (export "a" 0))`).exports;
+
+assertEq(o["a"](), 0xEEFDEADB|0);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/directives.txt
@@ -0,0 +1,1 @@
+|jit-test| test-also-wasm-baseline
--- a/js/src/jit-test/tests/wasm/regress/misc-control-flow.js
+++ b/js/src/jit-test/tests/wasm/regress/misc-control-flow.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 wasmFailValidateText(`(module
    (func (result i32) (param i32)
      (loop (if (i32.const 0) (br 0)) (get_local 0)))
    (export "" 0)
 )`, /unused values not explicitly dropped by end of block/);
 
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/pass-stack-int64.js
@@ -0,0 +1,17 @@
+load(libdir + "wasm.js");
+
+var params = '';
+var locals = '';
+for (let i = 0; i < 20; i++) {
+    params += '(param i64) ';
+    locals += `(get_local ${i}) `;
+}
+
+wasmEvalText(`
+(module
+    (func
+        ${params}
+        (call 0 ${locals})
+    )
+)
+`);
--- a/js/src/jit-test/tests/wasm/regress/regalloc-muli64.js
+++ b/js/src/jit-test/tests/wasm/regress/regalloc-muli64.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Bug 1298808.
 assertEq(wasmEvalText(`(module
     (func
         (result i32)
         (i32.wrap/i64
             (i64.mul
--- a/js/src/jit-test/tests/wasm/regress/reserve-enough.js
+++ b/js/src/jit-test/tests/wasm/regress/reserve-enough.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Bug 1281131 - be sure to reserve enough stack space
 
 wasmEvalText(
 `(module
   (func $func0
    ${loopy(100)}
--- a/js/src/jit-test/tests/wasm/regress/reserve-joinreg.js
+++ b/js/src/jit-test/tests/wasm/regress/reserve-joinreg.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Bug 1280933, excerpted from binary test case provided there.
 
 wasmEvalText(
 `(module
   (func $func0 (param $arg0 i32) (result i32) (local $var0 i64)
 	(set_local $var0 (i64.extend_u/i32 (get_local $arg0)))
--- a/js/src/jit-test/tests/wasm/regress/select-any.js
+++ b/js/src/jit-test/tests/wasm/regress/select-any.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Bug 1280921
 
 var m1 = wasmEvalText(
 `(module
   (type $type0 (func))
   (func $func0
--- a/js/src/jit-test/tests/wasm/regress/shift-counts.js
+++ b/js/src/jit-test/tests/wasm/regress/shift-counts.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Bug 1280926, extracted from binary
 
 wasmEvalText(
 `(module
   (type $type0 (func (result i32)))
   (export "" $func0)
--- a/js/src/jit-test/tests/wasm/regress/teavm-bugs.js
+++ b/js/src/jit-test/tests/wasm/regress/teavm-bugs.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Register allocation issue with LCompareI64AndBranch.
 let params = '';
 let locals = '';
 let tests = '(i64.const 0)';
 
 for (let i = 15; i --> 0;) {
--- a/js/src/jit-test/tests/wasm/regress/too-large-frame.js
+++ b/js/src/jit-test/tests/wasm/regress/too-large-frame.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Bug 1280934, equivalent test case.
 
 try {
 
 wasmEvalText(
 `(module
--- a/js/src/jit-test/tests/wasm/resizing.js
+++ b/js/src/jit-test/tests/wasm/resizing.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 const Module = WebAssembly.Module;
 const Instance = WebAssembly.Instance;
 const Table = WebAssembly.Table;
 const Memory = WebAssembly.Memory;
 const RuntimeError = WebAssembly.RuntimeError;
 
--- a/js/src/jit-test/tests/wasm/spec.js
+++ b/js/src/jit-test/tests/wasm/spec.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // This is meant to be a small and dumb interpreter for wast files. Either it
 // is imported by another script, which needs to define an array of arguments
 // called importedArgs, or args need to be passed to the command line.
 //
 // Possible arguments include:
 // -d           enable debug verbose mode
@@ -393,31 +392,43 @@ function exec(e) {
 
             i32[0] = res.nan_low;
             i32[1] = res.nan_high;
             assert(Number.isNaN(f64[0]) || Number.isNaN(f32[0]), "assert_return_nan test failed.");
         }
         return;
     }
 
-    if (exprName === "assert_invalid") {
+    if (exprName === "assert_invalid" || exprName === "assert_malformed") {
         let moduleText = e.list[1].toString();
         let errMsg = e.list[2];
         if (errMsg) {
-            assert(errMsg.quoted, "assert_invalid second argument must be a string");
+            assert(errMsg.quoted, "assert_invalid/malformed second argument must be a string");
             errMsg.quoted = false;
         }
+
         // assert_invalid tests both the decoder *and* the parser itself.
+        let text;
         try {
-            assertEq(WebAssembly.validate(wasmTextToBinary(moduleText)), false, "assert_invalid failed");
+            text = wasmTextToBinary(moduleText);
         } catch(e) {
             if (/wasm text error/.test(e.toString()))
                 return;
-            throw e;
         }
+
+        assertEq(WebAssembly.validate(text), false, "assert_invalid failed");
+
+        let caught = false;
+        try {
+            new WebAssembly.Module(text)
+        } catch (e) {
+            caught = true;
+            debug("Caught", e.toString(), ", expected:", errMsg);
+        }
+        assertEq(caught, true);
         return;
     }
 
     if (exprName === "assert_soft_invalid") {
         let moduleText = e.list[1].toString();
         let errMsg = e.list[2];
         if (errMsg) {
             assert(errMsg.quoted, "assert_soft_invalid second argument must be a string");
--- a/js/src/jit-test/tests/wasm/spec/address.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/address.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['address.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/binary.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/binary.wast.js
@@ -1,4 +1,1 @@
-// |jit-test| test-also-wasm-baseline
-// TODO: binary text format.
-quit();
 var importedArgs = ['binary.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/block.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/block.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['block.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/br.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/br.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['br.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/br_if.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/br_if.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['br_if.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/br_table.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/br_table.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['br_table.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/break-drop.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/break-drop.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['break-drop.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/call.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/call.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['call.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/call_indirect.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/call_indirect.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['call_indirect.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/comments.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/comments.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['comments.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/conversions.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/conversions.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['conversions.wast']; load(scriptdir + '../spec.js');
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/spec/directives.txt
@@ -0,0 +1,1 @@
+|jit-test| test-also-wasm-baseline
--- a/js/src/jit-test/tests/wasm/spec/endianness.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/endianness.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['endianness.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/exports.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/exports.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['exports.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f32.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/f32.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['f32.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f32_cmp.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/f32_cmp.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['f32_cmp.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f64.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/f64.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['f64.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f64_cmp.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/f64_cmp.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['f64_cmp.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/fac.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/fac.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['fac.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_exprs.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/float_exprs.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['float_exprs.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_literals.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/float_literals.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['float_literals.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_memory.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/float_memory.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['float_memory.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_misc.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/float_misc.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['float_misc.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/forward.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/forward.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['forward.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/func.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/func.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['func.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/func_ptrs.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/func_ptrs.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['func_ptrs.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/get_local.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/get_local.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['get_local.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/globals.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/globals.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['globals.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/i32.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/i32.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['i32.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/i64.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/i64.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['i64.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/import_tests.sh
+++ b/js/src/jit-test/tests/wasm/spec/import_tests.sh
@@ -6,11 +6,10 @@ git clone https://github.com/WebAssembly
 mv spec/interpreter/test/*.wast ./
 rm -rf spec/
 
 # TODO not handled yet
 rm -f *.fail.wast
 
 for i in $(ls *.wast);
 do
-    echo "// |jit-test| test-also-wasm-baseline" > $i.js
-    echo "var importedArgs = ['$i']; load(scriptdir + '../spec.js');" >> $i.js
+    echo "var importedArgs = ['$i']; load(scriptdir + '../spec.js');" > $i.js
 done;
--- a/js/src/jit-test/tests/wasm/spec/imports.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/imports.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['imports.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/int_exprs.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/int_exprs.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['int_exprs.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/int_literals.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/int_literals.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['int_literals.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/labels.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/labels.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['labels.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/left-to-right.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/left-to-right.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['left-to-right.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/linking.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/linking.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['linking.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/loop.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/loop.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['loop.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/memory.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/memory.wast.js
@@ -1,4 +1,3 @@
-// |jit-test| test-also-wasm-baseline
 // TODO initializer expression can reference global module-defined variables?
 quit();
 var importedArgs = ['memory.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/memory_redundancy.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/memory_redundancy.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['memory_redundancy.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/memory_trap.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/memory_trap.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['memory_trap.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/names.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/names.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['names.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/nop.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/nop.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['nop.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/resizing.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/resizing.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['resizing.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/return.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/return.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['return.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/select.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/select.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['select.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/set_local.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/set_local.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['set_local.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/skip-stack-guard-page.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/skip-stack-guard-page.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['skip-stack-guard-page.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/soft-fail.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/soft-fail.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['soft-fail.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/stack.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/stack.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['stack.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/start.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/start.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['start.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/store_retval.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/store_retval.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['store_retval.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/switch.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/switch.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['switch.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/tee_local.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/tee_local.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['tee_local.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/traps.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/traps.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['traps.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/typecheck.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/typecheck.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['typecheck.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/unreachable.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/unreachable.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['unreachable.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/unwind.wast.js
+++ b/js/src/jit-test/tests/wasm/spec/unwind.wast.js
@@ -1,2 +1,1 @@
-// |jit-test| test-also-wasm-baseline
 var importedArgs = ['unwind.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/stack.js
+++ b/js/src/jit-test/tests/wasm/stack.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // Test instructions with no return value interposed between pushes and pops.
 wasmFullPass(` (module
    (memory 1)
 
    (func (result i32)
      (local $local f64)
--- a/js/src/jit-test/tests/wasm/start.js
+++ b/js/src/jit-test/tests/wasm/start.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 assertErrorMessage(() => wasmEvalText('(module (func) (start 0) (start 0))'), SyntaxError, /wasm text error/);
 assertErrorMessage(() => wasmEvalText('(module (func) (start $unknown))'), SyntaxError, /label.*not found/);
 
 wasmFailValidateText('(module (func) (start 1))', /unknown start function/);
 wasmFailValidateText('(module (func (param i32)) (start 0))', /must be nullary/);
 wasmFailValidateText('(module (func (param i32) (param f32)) (start 0))', /must be nullary/);
--- a/js/src/jit-test/tests/wasm/tables.js
+++ b/js/src/jit-test/tests/wasm/tables.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + 'wasm.js');
 
 const Module = WebAssembly.Module;
 const Instance = WebAssembly.Instance;
 const Table = WebAssembly.Table;
 const Memory = WebAssembly.Memory;
 const RuntimeError = WebAssembly.RuntimeError;
 
--- a/js/src/jit-test/tests/wasm/text.js
+++ b/js/src/jit-test/tests/wasm/text.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 var parsingError = /parsing wasm text at/;
 
 assertErrorMessage(() => wasmEvalText(''), SyntaxError, parsingError);
 assertErrorMessage(() => wasmEvalText('('), SyntaxError, parsingError);
 assertErrorMessage(() => wasmEvalText('(m'), SyntaxError, parsingError);
 assertErrorMessage(() => wasmEvalText('(module'), SyntaxError, parsingError);
--- a/js/src/jit-test/tests/wasm/to-text-experimental.js
+++ b/js/src/jit-test/tests/wasm/to-text-experimental.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 assertErrorMessage(() => wasmBinaryToText(wasmTextToBinary(`(module (func (result i32) (f32.const 13.37)))`), 'experimental'), WebAssembly.CompileError, /type mismatch/);
 
 function runTest(code, expected) {
   var binary = wasmTextToBinary(code);
   var s = wasmBinaryToText(binary, "experimental");
   s = s.replace(/\s+/g, ' ');
--- a/js/src/jit-test/tests/wasm/to-text.js
+++ b/js/src/jit-test/tests/wasm/to-text.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 var caught = false;
 try {
     wasmBinaryToText(new Int8Array(1));
 } catch (e) {
     caught = true;
 }
--- a/js/src/jit-test/tests/wasm/unreachable.js
+++ b/js/src/jit-test/tests/wasm/unreachable.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 // In unreachable code, the current design is that validation is disabled,
 // meaning we have to have a special mode in the decoder for decoding code
 // that won't actually run.
 
 wasmFullPass(`(module
    (func (result i32)
--- a/js/src/jit-test/tests/wasm/validate.js
+++ b/js/src/jit-test/tests/wasm/validate.js
@@ -1,9 +1,8 @@
-// |jit-test| test-also-wasm-baseline
 load(libdir + "wasm.js");
 
 const { validate } = WebAssembly;
 
 assertErrorMessage(() => validate(), Error, /requires more than 0 arguments/);
 
 const argError = /first argument must be an ArrayBuffer or typed array object/;
 assertErrorMessage(() => validate(null), Error, argError);
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -1899,16 +1899,18 @@ OptimizeMIR(MIRGenerator* mir)
 
     if (mir->compilingWasm()) {
         if (!EliminateBoundsChecks(mir, graph))
             return false;
         gs.spewPass("Redundant Bounds Check Elimination");
         AssertGraphCoherency(graph);
     }
 
+    DumpMIRExpressions(graph);
+
     return true;
 }
 
 LIRGraph*
 GenerateLIR(MIRGenerator* mir)
 {
     MIRGraph& graph = mir->graph();
     GraphSpewer& gs = mir->graphSpewer();
--- a/js/src/jit/IonAnalysis.cpp
+++ b/js/src/jit/IonAnalysis.cpp
@@ -4672,8 +4672,40 @@ jit::CreateMIRRootList(IonBuilder& build
             if (!iter->appendRoots(*roots))
                 return false;
         }
     }
 
     builder.setRootList(*roots);
     return true;
 }
+
+static void
+DumpDefinition(GenericPrinter& out, MDefinition* def, size_t depth)
+{
+    MDefinition::PrintOpcodeName(out, def->op());
+
+    if (depth == 0)
+        return;
+
+    for (size_t i = 0; i < def->numOperands(); i++) {
+        out.printf(" (");
+        DumpDefinition(out, def->getOperand(i), depth - 1);
+        out.printf(")");
+    }
+}
+
+void
+jit::DumpMIRExpressions(MIRGraph& graph)
+{
+    if (!JitSpewEnabled(JitSpew_MIRExpressions))
+        return;
+
+    size_t depth = 2;
+
+    Fprinter& out = JitSpewPrinter();
+    for (ReversePostorderIterator block(graph.rpoBegin()); block != graph.rpoEnd(); block++) {
+        for (MInstructionIterator iter(block->begin()), end(block->end()); iter != end; iter++) {
+            DumpDefinition(out, *iter, depth);
+            out.printf("\n");
+        }
+    }
+}
--- a/js/src/jit/IonAnalysis.h
+++ b/js/src/jit/IonAnalysis.h
@@ -191,12 +191,15 @@ MOZ_MUST_USE bool
 AnalyzeArgumentsUsage(JSContext* cx, JSScript* script);
 
 bool
 DeadIfUnused(const MDefinition* def);
 
 bool
 IsDiscardable(const MDefinition* def);
 
+void
+DumpMIRExpressions(MIRGraph& graph);
+
 } // namespace jit
 } // namespace js
 
 #endif /* jit_IonAnalysis_h */
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -10389,21 +10389,25 @@ IonBuilder::setElemTryDense(bool* emitte
     // Don't generate a fast path if there have been bounds check failures
     // and this access might be on a sparse property.
     if (ElementAccessHasExtraIndexedProperty(this, object) && failedBoundsCheck_) {
         trackOptimizationOutcome(TrackedOutcome::ProtoIndexedProps);
         return true;
     }
 
     // Emit dense setelem variant.
-    if (!jsop_setelem_dense(conversion, object, index, value, unboxedType, writeHole))
-        return false;
+    if (!jsop_setelem_dense(conversion, object, index, value, unboxedType, writeHole, emitted))
+        return false;
+
+    if (!*emitted) {
+        trackOptimizationOutcome(TrackedOutcome::NonWritableProperty);
+        return true;
+    }
 
     trackOptimizationSuccess();
-    *emitted = true;
     return true;
 }
 
 bool
 IonBuilder::setElemTryArguments(bool* emitted, MDefinition* object,
                                 MDefinition* index, MDefinition* value)
 {
     MOZ_ASSERT(*emitted == false);
@@ -10475,29 +10479,40 @@ IonBuilder::setElemTryCache(bool* emitte
     trackOptimizationSuccess();
     *emitted = true;
     return true;
 }
 
 bool
 IonBuilder::jsop_setelem_dense(TemporaryTypeSet::DoubleConversion conversion,
                                MDefinition* obj, MDefinition* id, MDefinition* value,
-                               JSValueType unboxedType, bool writeHole)
-{
+                               JSValueType unboxedType, bool writeHole, bool* emitted)
+{
+    MOZ_ASSERT(*emitted == false);
+
     MIRType elementType = MIRType::None;
     if (unboxedType == JSVAL_TYPE_MAGIC)
         elementType = DenseNativeElementType(constraints(), obj);
     bool packed = ElementAccessIsPacked(constraints(), obj);
 
     // Writes which are on holes in the object do not have to bail out if they
     // cannot hit another indexed property on the object or its prototypes.
     bool hasNoExtraIndexedProperty = !ElementAccessHasExtraIndexedProperty(this, obj);
 
     bool mayBeFrozen = ElementAccessMightBeFrozen(constraints(), obj);
 
+    if (mayBeFrozen && !hasNoExtraIndexedProperty) {
+        // FallibleStoreElement does not know how to deal with extra indexed
+        // properties on the prototype. This case should be rare so we fall back
+        // to an IC.
+        return true;
+    }
+
+    *emitted = true;
+
     // Ensure id is an integer.
     MInstruction* idInt32 = MToInt32::New(alloc(), id);
     current->add(idInt32);
     id = idInt32;
 
     if (NeedsPostBarrier(value))
         current->add(MPostWriteElementBarrier::New(alloc(), obj, value, id));
 
@@ -10535,25 +10550,28 @@ IonBuilder::jsop_setelem_dense(Temporary
     }
 
     // Use MStoreElementHole if this SETELEM has written to out-of-bounds
     // indexes in the past. Otherwise, use MStoreElement so that we can hoist
     // the initialized length and bounds check.
     // If an object may have been frozen, no previous expectation hold and we
     // fallback to MFallibleStoreElement.
     MInstruction* store;
-    MStoreElementCommon *common = nullptr;
+    MStoreElementCommon* common = nullptr;
     if (writeHole && hasNoExtraIndexedProperty && !mayBeFrozen) {
         MStoreElementHole* ins = MStoreElementHole::New(alloc(), obj, elements, id, newValue, unboxedType);
         store = ins;
         common = ins;
 
         current->add(ins);
         current->push(value);
-    } else if (hasNoExtraIndexedProperty && mayBeFrozen) {
+    } else if (mayBeFrozen) {
+        MOZ_ASSERT(hasNoExtraIndexedProperty,
+                   "FallibleStoreElement codegen assumes no extra indexed properties");
+
         bool strict = IsStrictSetPC(pc);
         MFallibleStoreElement* ins = MFallibleStoreElement::New(alloc(), obj, elements, id,
                                                                 newValue, unboxedType, strict);
         store = ins;
         common = ins;
 
         current->add(ins);
         current->push(value);
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -732,17 +732,17 @@ class IonBuilder
     MOZ_MUST_USE bool jsop_getelem_dense(MDefinition* obj, MDefinition* index,
                                          JSValueType unboxedType);
     MOZ_MUST_USE bool jsop_getelem_typed(MDefinition* obj, MDefinition* index,
                                          ScalarTypeDescr::Type arrayType);
     MOZ_MUST_USE bool jsop_setelem();
     MOZ_MUST_USE bool jsop_setelem_dense(TemporaryTypeSet::DoubleConversion conversion,
                                          MDefinition* object, MDefinition* index,
                                          MDefinition* value, JSValueType unboxedType,
-                                         bool writeHole);
+                                         bool writeHole, bool* emitted);
     MOZ_MUST_USE bool jsop_setelem_typed(ScalarTypeDescr::Type arrayType,
                                          MDefinition* object, MDefinition* index,
                                          MDefinition* value);
     MOZ_MUST_USE bool jsop_length();
     MOZ_MUST_USE bool jsop_length_fastPath();
     MOZ_MUST_USE bool jsop_arguments();
     MOZ_MUST_USE bool jsop_arguments_getelem();
     MOZ_MUST_USE bool jsop_runonce();
--- a/js/src/jit/JitSpewer.cpp
+++ b/js/src/jit/JitSpewer.cpp
@@ -410,56 +410,57 @@ jit::CheckLogging()
     if (!env)
         return;
     if (strstr(env, "help")) {
         fflush(nullptr);
         printf(
             "\n"
             "usage: IONFLAGS=option,option,option,... where options can be:\n"
             "\n"
-            "  aborts     Compilation abort messages\n"
-            "  scripts    Compiled scripts\n"
-            "  mir        MIR information\n"
-            "  prune      Prune unused branches\n"
-            "  escape     Escape analysis\n"
-            "  alias      Alias analysis\n"
-            "  alias-sum  Alias analysis: shows summaries for every block\n"
-            "  gvn        Global Value Numbering\n"
-            "  licm       Loop invariant code motion\n"
-            "  flac       Fold linear arithmetic constants\n"
-            "  eaa        Effective address analysis\n"
-            "  sincos     Replace sin/cos by sincos\n"
-            "  sink       Sink transformation\n"
-            "  regalloc   Register allocation\n"
-            "  inline     Inlining\n"
-            "  snapshots  Snapshot information\n"
-            "  codegen    Native code generation\n"
-            "  bailouts   Bailouts\n"
-            "  caches     Inline caches\n"
-            "  osi        Invalidation\n"
-            "  safepoints Safepoints\n"
-            "  pools      Literal Pools (ARM only for now)\n"
-            "  cacheflush Instruction Cache flushes (ARM only for now)\n"
-            "  range      Range Analysis\n"
-            "  unroll     Loop unrolling\n"
-            "  logs       C1 and JSON visualization logging\n"
-            "  logs-sync  Same as logs, but flushes between each pass (sync. compiled functions only).\n"
-            "  profiling  Profiling-related information\n"
-            "  trackopts  Optimization tracking information\n"
-            "  all        Everything\n"
+            "  aborts        Compilation abort messages\n"
+            "  scripts       Compiled scripts\n"
+            "  mir           MIR information\n"
+            "  prune         Prune unused branches\n"
+            "  escape        Escape analysis\n"
+            "  alias         Alias analysis\n"
+            "  alias-sum     Alias analysis: shows summaries for every block\n"
+            "  gvn           Global Value Numbering\n"
+            "  licm          Loop invariant code motion\n"
+            "  flac          Fold linear arithmetic constants\n"
+            "  eaa           Effective address analysis\n"
+            "  sincos        Replace sin/cos by sincos\n"
+            "  sink          Sink transformation\n"
+            "  regalloc      Register allocation\n"
+            "  inline        Inlining\n"
+            "  snapshots     Snapshot information\n"
+            "  codegen       Native code generation\n"
+            "  bailouts      Bailouts\n"
+            "  caches        Inline caches\n"
+            "  osi           Invalidation\n"
+            "  safepoints    Safepoints\n"
+            "  pools         Literal Pools (ARM only for now)\n"
+            "  cacheflush    Instruction Cache flushes (ARM only for now)\n"
+            "  range         Range Analysis\n"
+            "  unroll        Loop unrolling\n"
+            "  logs          C1 and JSON visualization logging\n"
+            "  logs-sync     Same as logs, but flushes between each pass (sync. compiled functions only).\n"
+            "  profiling     Profiling-related information\n"
+            "  trackopts     Optimization tracking information\n"
+            "  dump-mir-expr Dump the MIR expressions\n"
+            "  all           Everything\n"
             "\n"
-            "  bl-aborts  Baseline compiler abort messages\n"
-            "  bl-scripts Baseline script-compilation\n"
-            "  bl-op      Baseline compiler detailed op-specific messages\n"
-            "  bl-ic      Baseline inline-cache messages\n"
-            "  bl-ic-fb   Baseline IC fallback stub messages\n"
-            "  bl-osr     Baseline IC OSR messages\n"
-            "  bl-bails   Baseline bailouts\n"
-            "  bl-dbg-osr Baseline debug mode on stack recompile messages\n"
-            "  bl-all     All baseline spew\n"
+            "  bl-aborts     Baseline compiler abort messages\n"
+            "  bl-scripts    Baseline script-compilation\n"
+            "  bl-op         Baseline compiler detailed op-specific messages\n"
+            "  bl-ic         Baseline inline-cache messages\n"
+            "  bl-ic-fb      Baseline IC fallback stub messages\n"
+            "  bl-osr        Baseline IC OSR messages\n"
+            "  bl-bails      Baseline bailouts\n"
+            "  bl-dbg-osr    Baseline debug mode on stack recompile messages\n"
+            "  bl-all        All baseline spew\n"
             "\n"
         );
         exit(0);
         /*NOTREACHED*/
     }
     if (ContainsFlag(env, "aborts"))
         EnableChannel(JitSpew_IonAbort);
     if (ContainsFlag(env, "prune"))
@@ -513,16 +514,18 @@ jit::CheckLogging()
     if (ContainsFlag(env, "logs"))
         EnableIonDebugAsyncLogging();
     if (ContainsFlag(env, "logs-sync"))
         EnableIonDebugSyncLogging();
     if (ContainsFlag(env, "profiling"))
         EnableChannel(JitSpew_Profiling);
     if (ContainsFlag(env, "trackopts"))
         EnableChannel(JitSpew_OptimizationTracking);
+    if (ContainsFlag(env, "dump-mir-expr"))
+        EnableChannel(JitSpew_MIRExpressions);
     if (ContainsFlag(env, "all"))
         LoggingBits = uint64_t(-1);
 
     if (ContainsFlag(env, "bl-aborts"))
         EnableChannel(JitSpew_BaselineAbort);
     if (ContainsFlag(env, "bl-scripts"))
         EnableChannel(JitSpew_BaselineScripts);
     if (ContainsFlag(env, "bl-op"))
--- a/js/src/jit/JitSpewer.h
+++ b/js/src/jit/JitSpewer.h
@@ -59,16 +59,18 @@ namespace jit {
     /* Debug info about Pools*/             \
     _(Pools)                                \
     /* Profiling-related information */     \
     _(Profiling)                            \
     /* Information of tracked opt strats */ \
     _(OptimizationTracking)                 \
     /* Debug info about the I$ */           \
     _(CacheFlush)                           \
+    /* Output a list of MIR expressions */  \
+    _(MIRExpressions)                       \
                                             \
     /* BASELINE COMPILER SPEW */            \
                                             \
     /* Aborting Script Compilation. */      \
     _(BaselineAbort)                        \
     /* Script Compilation. */               \
     _(BaselineScripts)                      \
     /* Detailed op-specific spew. */        \
--- a/js/src/jit/LIR.cpp
+++ b/js/src/jit/LIR.cpp
@@ -343,46 +343,49 @@ LNode::printName(GenericPrinter& out)
 bool
 LAllocation::aliases(const LAllocation& other) const
 {
     if (isFloatReg() && other.isFloatReg())
         return toFloatReg()->reg().aliases(other.toFloatReg()->reg());
     return *this == other;
 }
 
-static const char * const TypeChars[] =
+static const char*
+typeName(LDefinition::Type type)
 {
-    "g",            // GENERAL
-    "i",            // INT32
-    "i64",          // INT64
-    "o",            // OBJECT
-    "s",            // SLOTS
-    "f",            // FLOAT32
-    "d",            // DOUBLE
-    "simd128int",   // SIMD128INT
-    "simd128float", // SIMD128FLOAT
-    "sincos",       // SINCOS
+    switch (type) {
+      case LDefinition::GENERAL: return "g";
+      case LDefinition::INT32: return "i";
+      case LDefinition::OBJECT: return "o";
+      case LDefinition::SLOTS: return "s";
+      case LDefinition::FLOAT32: return "f";
+      case LDefinition::DOUBLE: return "d";
+      case LDefinition::SIMD128INT: return "simd128int";
+      case LDefinition::SIMD128FLOAT: return "simd128float";
+      case LDefinition::SINCOS: return "sincos";
 #ifdef JS_NUNBOX32
-    "t",            // TYPE
-    "p"             // PAYLOAD
-#elif JS_PUNBOX64
-    "x"             // BOX
+      case LDefinition::TYPE: return "t";
+      case LDefinition::PAYLOAD: return "p";
+#else
+      case LDefinition::BOX: return "x";
 #endif
-};
+    }
+    MOZ_CRASH("Invalid type");
+}
 
 UniqueChars
 LDefinition::toString() const
 {
     AutoEnterOOMUnsafeRegion oomUnsafe;
 
     char* buf;
     if (isBogusTemp()) {
         buf = JS_smprintf("bogus");
     } else {
-        buf = JS_smprintf("v%u<%s>", virtualRegister(), TypeChars[type()]);
+        buf = JS_smprintf("v%u<%s>", virtualRegister(), typeName(type()));
         if (buf) {
             if (policy() == LDefinition::FIXED)
                 buf = JS_sprintf_append(buf, ":%s", output()->toString().get());
             else if (policy() == LDefinition::MUST_REUSE_INPUT)
                 buf = JS_sprintf_append(buf, ":tied(%u)", getReusedInput());
         }
     }
 
@@ -604,15 +607,15 @@ LMoveGroup::addAfter(LAllocation from, L
 
 void
 LMoveGroup::printOperands(GenericPrinter& out)
 {
     for (size_t i = 0; i < numMoves(); i++) {
         const LMove& move = getMove(i);
         out.printf(" [%s -> %s", move.from().toString().get(), move.to().toString().get());
 #ifdef DEBUG
-        out.printf(", %s", TypeChars[move.type()]);
+        out.printf(", %s", typeName(move.type()));
 #endif
         out.printf("]");
         if (i != numMoves() - 1)
             out.printf(",");
     }
 }
--- a/js/src/jit/LIR.h
+++ b/js/src/jit/LIR.h
@@ -185,17 +185,16 @@ class LAllocation : public TempObject
 
     HashNumber hash() const {
         return bits_;
     }
 
     UniqueChars toString() const;
     bool aliases(const LAllocation& other) const;
     void dump() const;
-
 };
 
 class LUse : public LAllocation
 {
     static const uint32_t POLICY_BITS = 3;
     static const uint32_t POLICY_SHIFT = 0;
     static const uint32_t POLICY_MASK = (1 << POLICY_BITS) - 1;
     static const uint32_t REG_BITS = 6;
--- a/js/src/jit/Lowering.cpp
+++ b/js/src/jit/Lowering.cpp
@@ -4277,17 +4277,17 @@ LIRGenerator::visitWasmReturnVoid(MWasmR
 
     add(lir);
 }
 
 void
 LIRGenerator::visitWasmStackArg(MWasmStackArg* ins)
 {
     if (ins->arg()->type() == MIRType::Int64) {
-        add(new(alloc()) LWasmStackArgI64(useInt64OrConstantAtStart(ins->arg())), ins);
+        add(new(alloc()) LWasmStackArgI64(useInt64RegisterOrConstantAtStart(ins->arg())), ins);
     } else if (IsFloatingPointType(ins->arg()->type()) || IsSimdType(ins->arg()->type())) {
         MOZ_ASSERT(!ins->arg()->isEmittedAtUses());
         add(new(alloc()) LWasmStackArg(useRegisterAtStart(ins->arg())), ins);
     } else {
         add(new(alloc()) LWasmStackArg(useRegisterOrConstantAtStart(ins->arg())), ins);
     }
 }
 
--- a/js/src/jit/MIR.cpp
+++ b/js/src/jit/MIR.cpp
@@ -2385,16 +2385,18 @@ MPhi::foldsTernary(TempAllocator& alloc)
     {
         return nullptr;
     }
 
     // If testArg is an int32 type we can:
     // - fold testArg ? testArg : 0 to testArg
     // - fold testArg ? 0 : testArg to 0
     if (testArg->type() == MIRType::Int32 && c->numberToDouble() == 0) {
+        testArg->setGuardRangeBailoutsUnchecked();
+
         // When folding to the constant we need to hoist it.
         if (trueDef == c && !c->block()->dominates(block()))
             c->block()->moveBefore(pred->lastIns(), c);
         return trueDef;
     }
 
     // If testArg is an double type we can:
     // - fold testArg ? testArg : 0.0 to MNaNToZero(testArg)
@@ -2916,16 +2918,19 @@ CanProduceNegativeZero(MDefinition* def)
         default:
             return true;
     }
 }
 
 static inline bool
 NeedNegativeZeroCheck(MDefinition* def)
 {
+    if (def->isGuardRangeBailouts())
+        return true;
+
     // Test if all uses have the same semantics for -0 and 0
     for (MUseIterator use = def->usesBegin(); use != def->usesEnd(); use++) {
         if (use->consumer()->isResumePoint())
             continue;
 
         MDefinition* use_def = use->consumer()->toDefinition();
         switch (use_def->op()) {
           case MDefinition::Op_Add: {
@@ -4382,18 +4387,17 @@ MCompare::tryFoldEqualOperands(bool* res
                compareType_ == Compare_String || compareType_ == Compare_StrictString ||
                compareType_ == Compare_Object || compareType_ == Compare_Bitwise);
 
     if (isDoubleComparison() || isFloat32Comparison()) {
         if (!operandsAreNeverNaN())
             return false;
     }
 
-    if (DeadIfUnused(lhs()))
-        lhs()->setGuardRangeBailouts();
+    lhs()->setGuardRangeBailoutsUnchecked();
 
     *result = (jsop() == JSOP_STRICTEQ);
     return true;
 }
 
 bool
 MCompare::tryFoldTypeOf(bool* result)
 {
--- a/js/src/jit/RangeAnalysis.cpp
+++ b/js/src/jit/RangeAnalysis.cpp
@@ -3535,18 +3535,17 @@ RangeAnalysis::prepareForUCE(bool* shoul
         // If the false-branch is unreachable, then the test condition must be true.
         // If the true-branch is unreachable, then the test condition must be false.
         MOZ_ASSERT(block == test->ifTrue() || block == test->ifFalse());
         bool value = block == test->ifFalse();
         MConstant* constant = MConstant::New(alloc().fallible(), BooleanValue(value));
         if (!constant)
             return false;
 
-        if (DeadIfUnused(condition))
-            condition->setGuardRangeBailoutsUnchecked();
+        condition->setGuardRangeBailoutsUnchecked();
 
         test->block()->insertBefore(test, constant);
 
         test->replaceOperand(0, constant);
         JitSpew(JitSpew_Range, "Update condition of %d to reflect unreachable branches.",
                 test->id());
 
         *shouldRemoveDeadCode = true;
@@ -3572,23 +3571,24 @@ bool RangeAnalysis::tryRemovingGuards()
 
     // Flag all fallible instructions which were indirectly used in the
     // computation of the condition, such that we do not ignore
     // bailout-paths which are used to shrink the input range of the
     // operands of the condition.
     for (size_t i = 0; i < guards.length(); i++) {
         MDefinition* guard = guards[i];
 
-#ifdef DEBUG
-        // There is no need to mark an instructions if there is
-        // already a more restrictive flag on it.
+        // If this ins is a guard even without guardRangeBailouts,
+        // there is no reason in trying to hoist the guardRangeBailouts check.
         guard->setNotGuardRangeBailouts();
-        MOZ_ASSERT(DeadIfUnused(guard));
+        if (!DeadIfUnused(guard)) {
+            guard->setGuardRangeBailouts();
+            continue;
+        }
         guard->setGuardRangeBailouts();
-#endif
 
         if (!guard->isPhi()) {
             if (!guard->range())
                 continue;
 
             // Filter the range of the instruction based on its MIRType.
             Range typeFilteredRange(guard);
 
@@ -3609,21 +3609,16 @@ bool RangeAnalysis::tryRemovingGuards()
             MDefinition* operand = guard->getOperand(op);
 
             // Already marked.
             if (operand->isInWorklist())
                 continue;
 
             MOZ_ASSERT(!operand->isGuardRangeBailouts());
 
-            // No need to mark as a guard, since it is has already an even more
-            // restrictive flag set.
-            if (!DeadIfUnused(operand))
-                continue;
-
             operand->setInWorklist();
             operand->setGuardRangeBailouts();
             if (!guards.append(operand))
                 return false;
         }
     }
 
     for (size_t i = 0; i < guards.length(); i++) {
--- a/js/src/jit/ValueNumbering.cpp
+++ b/js/src/jit/ValueNumbering.cpp
@@ -792,16 +792,19 @@ ValueNumberer::visitDefinition(MDefiniti
         MOZ_ASSERT(!sim->isDiscarded());
         ReplaceAllUsesWith(def, sim);
 
         // The node's foldsTo said |def| can be replaced by |rep|. If |def| is a
         // guard, then either |rep| is also a guard, or a guard isn't actually
         // needed, so we can clear |def|'s guard flag and let it be discarded.
         def->setNotGuardUnchecked();
 
+        if (def->isGuardRangeBailouts())
+            sim->setGuardRangeBailoutsUnchecked();
+
         if (DeadIfUnused(def)) {
             if (!discardDefsRecursively(def))
                 return false;
 
             // If that ended up discarding |sim|, then we're done here.
             if (sim->isDiscarded())
                 return true;
         }
--- a/js/src/jit/arm/Assembler-arm.cpp
+++ b/js/src/jit/arm/Assembler-arm.cpp
@@ -585,42 +585,32 @@ InstMOV::IsTHIS(const Instruction& i)
     return InstALU::IsTHIS(i) && InstALU::AsTHIS(i)->checkOp1(r0) && InstALU::AsTHIS(i)->checkOp(OpMov);
 }
 
 Op2Reg
 Operand2::toOp2Reg() const {
     return *(Op2Reg*)this;
 }
 
-O2RegImmShift
-Op2Reg::toO2RegImmShift() const {
-    return *(O2RegImmShift*)this;
-}
-
-O2RegRegShift
-Op2Reg::toO2RegRegShift() const {
-    return *(O2RegRegShift*)this;
-}
-
 Imm16::Imm16(Instruction& inst)
-  : lower(inst.encode() & 0xfff),
-    upper(inst.encode() >> 16),
-    invalid(0xfff)
+  : lower_(inst.encode() & 0xfff),
+    upper_(inst.encode() >> 16),
+    invalid_(0xfff)
 { }
 
 Imm16::Imm16(uint32_t imm)
-  : lower(imm & 0xfff), pad(0),
-    upper((imm >> 12) & 0xf),
-    invalid(0)
+  : lower_(imm & 0xfff), pad_(0),
+    upper_((imm >> 12) & 0xf),
+    invalid_(0)
 {
     MOZ_ASSERT(decode() == imm);
 }
 
 Imm16::Imm16()
-  : invalid(0xfff)
+  : invalid_(0xfff)
 { }
 
 void
 jit::PatchJump(CodeLocationJump& jump_, CodeLocationLabel label, ReprotectCode reprotect)
 {
     // We need to determine if this jump can fit into the standard 24+2 bit
     // address or if we need a larger branch (or just need to use our pool
     // entry).
@@ -930,20 +920,20 @@ Assembler::copyPreBarrierTable(uint8_t* 
         memcpy(dest, preBarriers_.buffer(), preBarriers_.length());
 }
 
 void
 Assembler::trace(JSTracer* trc)
 {
     for (size_t i = 0; i < jumps_.length(); i++) {
         RelativePatch& rp = jumps_[i];
-        if (rp.kind == Relocation::JITCODE) {
-            JitCode* code = JitCode::FromExecutable((uint8_t*)rp.target);
+        if (rp.kind() == Relocation::JITCODE) {
+            JitCode* code = JitCode::FromExecutable((uint8_t*)rp.target());
             TraceManuallyBarrieredEdge(trc, &code, "masmrel32");
-            MOZ_ASSERT(code == JitCode::FromExecutable((uint8_t*)rp.target));
+            MOZ_ASSERT(code == JitCode::FromExecutable((uint8_t*)rp.target()));
         }
     }
 
     if (dataRelocations_.length()) {
         CompactBufferReader reader(dataRelocations_);
         ::TraceDataRelocations(trc, &m_buffer, reader);
     }
 }
@@ -1288,34 +1278,34 @@ jit::asr(Register r, Register amt)
 }
 
 static js::jit::DoubleEncoder doubleEncoder;
 
 /* static */ const js::jit::VFPImm js::jit::VFPImm::One(0x3FF00000);
 
 js::jit::VFPImm::VFPImm(uint32_t top)
 {
-    data = -1;
+    data_ = -1;
     datastore::Imm8VFPImmData tmp;
     if (doubleEncoder.lookup(top, &tmp))
-        data = tmp.encode();
+        data_ = tmp.encode();
 }
 
-BOffImm::BOffImm(Instruction& inst)
-  : data(inst.encode() & 0x00ffffff)
+BOffImm::BOffImm(const Instruction& inst)
+  : data_(inst.encode() & 0x00ffffff)
 {
 }
 
 Instruction*
 BOffImm::getDest(Instruction* src) const
 {
     // TODO: It is probably worthwhile to verify that src is actually a branch.
     // NOTE: This does not explicitly shift the offset of the destination left by 2,
     // since it is indexing into an array of instruction sized objects.
-    return &src[(((int32_t)data << 8) >> 8) + 2];
+    return &src[((int32_t(data_) << 8) >> 8) + 2];
 }
 
 const js::jit::DoubleEncoder::DoubleEntry js::jit::DoubleEncoder::table[256] = {
 #include "jit/arm/DoubleEntryTable.tbl"
 };
 
 // VFPRegister implementation
 VFPRegister
--- a/js/src/jit/arm/Assembler-arm.h
+++ b/js/src/jit/arm/Assembler-arm.h
@@ -267,24 +267,24 @@ uint32_t VN(VFPRegister vr);
 uint32_t VM(VFPRegister vr);
 
 // For being passed into the generic vfp instruction generator when there is an
 // instruction that only takes two registers.
 static constexpr VFPRegister NoVFPRegister(VFPRegister::Double, 0, false, true);
 
 struct ImmTag : public Imm32
 {
-    ImmTag(JSValueTag mask)
+    explicit ImmTag(JSValueTag mask)
       : Imm32(int32_t(mask))
     { }
 };
 
 struct ImmType : public ImmTag
 {
-    ImmType(JSValueType type)
+    explicit ImmType(JSValueType type)
       : ImmTag(JSVAL_TYPE_TO_TAG(type))
     { }
 };
 
 enum Index {
     Offset = 0 << 21 | 1<<24,
     PreIndex = 1 << 21 | 1 << 24,
     PostIndex = 0 << 21 | 0 << 24
@@ -309,26 +309,16 @@ enum IsImmEDTR_ {
 enum ShiftType {
     LSL = 0, // << 5
     LSR = 1, // << 5
     ASR = 2, // << 5
     ROR = 3, // << 5
     RRX = ROR // RRX is encoded as ROR with a 0 offset.
 };
 
-// The actual codes that get set by instructions and the codes that are checked
-// by the conditions below.
-struct ConditionCodes
-{
-    bool Zero : 1;
-    bool Overflow : 1;
-    bool Carry : 1;
-    bool Minus : 1;
-};
-
 // Modes for STM/LDM. Names are the suffixes applied to the instruction.
 enum DTMMode {
     A = 0 << 24, // empty / after
     B = 1 << 24, // full / before
     D = 0 << 23, // decrement
     I = 1 << 23, // increment
     DA = D | A,
     DB = D | B,
@@ -444,112 +434,111 @@ static const ValueOperand softfpReturnOp
 // storage. We also wanted to avoid passing around raw integers at all since
 // they are error prone.
 class Op2Reg;
 class O2RegImmShift;
 class O2RegRegShift;
 
 namespace datastore {
 
-struct Reg
+class Reg
 {
     // The "second register".
-    uint32_t RM : 4;
+    uint32_t rm_ : 4;
     // Do we get another register for shifting.
-    uint32_t RRS : 1;
-    ShiftType Type : 2;
+    bool rrs_ : 1;
+    ShiftType type_ : 2;
     // We'd like this to be a more sensible encoding, but that would need to be
     // a struct and that would not pack :(
-    uint32_t ShiftAmount : 5;
-    uint32_t pad : 20;
+    uint32_t shiftAmount_ : 5;
+    uint32_t pad_ : 20;
 
-    Reg(uint32_t rm, ShiftType type, uint32_t rsr, uint32_t shiftamount)
-      : RM(rm), RRS(rsr), Type(type), ShiftAmount(shiftamount), pad(0)
+  public:
+    Reg(uint32_t rm, ShiftType type, uint32_t rsr, uint32_t shiftAmount)
+      : rm_(rm), rrs_(rsr), type_(type), shiftAmount_(shiftAmount), pad_(0)
     { }
-
     explicit Reg(const Op2Reg& op) {
         memcpy(this, &op, sizeof(*this));
     }
 
+    uint32_t shiftAmount() const {
+        return shiftAmount_;
+    }
+
     uint32_t encode() const {
-        return RM | RRS << 4 | Type << 5 | ShiftAmount << 7;
+        return rm_ | (rrs_ << 4) | (type_ << 5) | (shiftAmount_ << 7);
     }
 };
 
 // Op2 has a mode labelled "<imm8m>", which is arm's magical immediate encoding.
 // Some instructions actually get 8 bits of data, which is called Imm8Data
 // below. These should have edit distance > 1, but this is how it is for now.
-struct Imm8mData
+class Imm8mData
 {
-  private:
-    uint32_t data : 8;
-    uint32_t rot : 4;
+    uint32_t data_ : 8;
+    uint32_t rot_ : 4;
+    uint32_t buff_ : 19;
+
     // Throw in an extra bit that will be 1 if we can't encode this properly.
     // if we can encode it properly, a simple "|" will still suffice to meld it
     // into the instruction.
-    uint32_t buff : 19;
-
-  public:
-    uint32_t invalid : 1;
+    bool invalid_ : 1;
 
   public:
-    uint32_t encode() const {
-        MOZ_ASSERT(!invalid);
-        return data | rot << 8;
-    };
-
     // Default constructor makes an invalid immediate.
     Imm8mData()
-      : data(0xff), rot(0xf), buff(0), invalid(1)
+      : data_(0xff), rot_(0xf), buff_(0), invalid_(true)
     { }
 
-    Imm8mData(uint32_t data_, uint32_t rot_)
-      : data(data_), rot(rot_), buff(0), invalid(0)
+    Imm8mData(uint32_t data, uint32_t rot)
+      : data_(data), rot_(rot), buff_(0), invalid_(false)
     {
         MOZ_ASSERT(data == data_);
         MOZ_ASSERT(rot == rot_);
     }
+
+    bool invalid() const { return invalid_; }
+
+    uint32_t encode() const {
+        MOZ_ASSERT(!invalid_);
+        return data_ | (rot_ << 8);
+    };
 };
 
-struct Imm8Data
+class Imm8Data
 {
-  private:
-    uint32_t imm4L : 4;
-    uint32_t pad : 4;
-    uint32_t imm4H : 4;
+    uint32_t imm4L_ : 4;
+    uint32_t pad_ : 4;
+    uint32_t imm4H_ : 4;
 
   public:
-    Imm8Data(uint32_t imm)
-      : imm4L(imm & 0xf), imm4H(imm >> 4)
+    explicit Imm8Data(uint32_t imm)
+      : imm4L_(imm & 0xf), imm4H_(imm >> 4)
     {
         MOZ_ASSERT(imm <= 0xff);
     }
 
-  public:
     uint32_t encode() const {
-        return imm4L | (imm4H << 8);
+        return imm4L_ | (imm4H_ << 8);
     };
 };
 
 // VLDR/VSTR take an 8 bit offset, which is implicitly left shifted by 2.
-struct Imm8VFPOffData
+class Imm8VFPOffData
 {
-  private:
-    uint32_t data;
+    uint32_t data_;
 
   public:
-    Imm8VFPOffData(uint32_t imm)
-      : data (imm)
+    explicit Imm8VFPOffData(uint32_t imm)
+      : data_(imm)
     {
         MOZ_ASSERT((imm & ~(0xff)) == 0);
     }
-
-  public:
     uint32_t encode() const {
-        return data;
+        return data_;
     };
 };
 
 // ARM can magically encode 256 very special immediates to be moved into a
 // register.
 struct Imm8VFPImmData
 {
     // This structure's members are public and it has no constructor to
@@ -568,204 +557,182 @@ struct Imm8VFPImmData
     uint32_t encode() const {
         // This assert is an attempting at ensuring that we don't create random
         // instances of this structure and then asking to encode() it.
         MOZ_ASSERT(isInvalid == 0);
         return imm4L | (imm4H << 16);
     };
 };
 
-struct Imm12Data
+class Imm12Data
 {
-    uint32_t data : 12;
+    uint32_t data_ : 12;
 
-    Imm12Data(uint32_t imm)
-      : data(imm)
+  public:
+    explicit Imm12Data(uint32_t imm)
+      : data_(imm)
     {
-        MOZ_ASSERT(data == imm);
+        MOZ_ASSERT(data_ == imm);
     }
 
     uint32_t encode() const {
-        return data;
+        return data_;
     }
 };
 
-struct RIS
+class RIS
 {
-    uint32_t ShiftAmount : 5;
+    uint32_t shiftAmount_ : 5;
 
-    RIS(uint32_t imm)
-      : ShiftAmount(imm)
+  public:
+    explicit RIS(uint32_t imm)
+      : shiftAmount_(imm)
     {
-        MOZ_ASSERT(ShiftAmount == imm);
+        MOZ_ASSERT(shiftAmount_ == imm);
     }
 
     explicit RIS(Reg r)
-      : ShiftAmount(r.ShiftAmount)
+      : shiftAmount_(r.shiftAmount())
     { }
 
     uint32_t encode() const {
-        return ShiftAmount;
+        return shiftAmount_;
     }
 };
 
-struct RRS
+class RRS
 {
-    uint32_t MustZero : 1;
+    bool mustZero_ : 1;
     // The register that holds the shift amount.
-    uint32_t RS : 4;
+    uint32_t rs_ : 4;
 
-    RRS(uint32_t rs)
-      : RS(rs)
+  public:
+    explicit RRS(uint32_t rs)
+      : rs_(rs)
     {
-        MOZ_ASSERT(rs == RS);
+        MOZ_ASSERT(rs_ == rs);
     }
 
     uint32_t encode() const {
-        return RS << 1;
+        return rs_ << 1;
     }
 };
 
 } // namespace datastore
 
 class MacroAssemblerARM;
 class Operand;
+
 class Operand2
 {
     friend class Operand;
     friend class MacroAssemblerARM;
     friend class InstALU;
 
-  public:
-    uint32_t oper : 31;
-    uint32_t invalid : 1;
+    uint32_t oper_ : 31;
+    bool invalid_ : 1;
 
   protected:
     explicit Operand2(datastore::Imm8mData base)
-      : oper(base.invalid ? -1 : (base.encode() | (uint32_t)IsImmOp2)),
-        invalid(base.invalid)
+      : oper_(base.invalid() ? -1 : (base.encode() | uint32_t(IsImmOp2))),
+        invalid_(base.invalid())
     { }
 
     explicit Operand2(datastore::Reg base)
-      : oper(base.encode() | (uint32_t)IsNotImmOp2)
+      : oper_(base.encode() | uint32_t(IsNotImmOp2)),
+        invalid_(false)
     { }
 
   private:
-    explicit Operand2(int blob)
-      : oper(blob)
+    explicit Operand2(uint32_t blob)
+      : oper_(blob),
+        invalid_(false)
     { }
 
   public:
     bool isO2Reg() const {
-        return !(oper & IsImmOp2);
+        return !(oper_ & IsImmOp2);
     }
 
     Op2Reg toOp2Reg() const;
 
     bool isImm8() const {
-        return oper & IsImmOp2;
+        return oper_ & IsImmOp2;
+    }
+
+    bool invalid() const {
+        return invalid_;
     }
 
     uint32_t encode() const {
-        return oper;
+        return oper_;
     }
 };
 
 class Imm8 : public Operand2
 {
   public:
     explicit Imm8(uint32_t imm)
       : Operand2(EncodeImm(imm))
     { }
 
-  public:
     static datastore::Imm8mData EncodeImm(uint32_t imm) {
         // RotateLeft below may not be called with a shift of zero.
         if (imm <= 0xFF)
             return datastore::Imm8mData(imm, 0);
 
         // An encodable integer has a maximum of 8 contiguous set bits,
         // with an optional wrapped left rotation to even bit positions.
         for (int rot = 1; rot < 16; rot++) {
-            uint32_t rotimm = mozilla::RotateLeft(imm, rot*2);
+            uint32_t rotimm = mozilla::RotateLeft(imm, rot * 2);
             if (rotimm <= 0xFF)
                 return datastore::Imm8mData(rotimm, rot);
         }
         return datastore::Imm8mData();
     }
 
     // Pair template?
     struct TwoImm8mData
     {
-        datastore::Imm8mData fst, snd;
+        datastore::Imm8mData fst_, snd_;
 
-        TwoImm8mData()
-          : fst(), snd()
+        TwoImm8mData() = default;
+
+        TwoImm8mData(datastore::Imm8mData fst, datastore::Imm8mData snd)
+          : fst_(fst), snd_(snd)
         { }
 
-        TwoImm8mData(datastore::Imm8mData _fst, datastore::Imm8mData _snd)
-          : fst(_fst), snd(_snd)
-        { }
+        datastore::Imm8mData fst() const { return fst_; }
+        datastore::Imm8mData snd() const { return snd_; }
     };
 
     static TwoImm8mData EncodeTwoImms(uint32_t);
 };
 
 class Op2Reg : public Operand2
 {
   public:
     explicit Op2Reg(Register rm, ShiftType type, datastore::RIS shiftImm)
       : Operand2(datastore::Reg(rm.code(), type, 0, shiftImm.encode()))
     { }
 
     explicit Op2Reg(Register rm, ShiftType type, datastore::RRS shiftReg)
       : Operand2(datastore::Reg(rm.code(), type, 1, shiftReg.encode()))
     { }
-
-  public:
-    bool isO2RegImmShift() const {
-        datastore::Reg r(*this);
-        return !r.RRS;
-    }
-    O2RegImmShift toO2RegImmShift() const;
-
-    bool isO2RegRegShift() const {
-        datastore::Reg r(*this);
-        return r.RRS;
-    }
-    O2RegRegShift toO2RegRegShift() const;
+};
 
-    bool checkType(ShiftType type) const {
-        datastore::Reg r(*this);
-        return r.Type == type;
-    }
-    bool checkRM(Register rm) const {
-        datastore::Reg r(*this);
-        return r.RM == rm.code();
-    }
-    bool getRM(Register* rm) const {
-        datastore::Reg r(*this);
-        *rm = Register::FromCode(r.RM);
-        return true;
-    }
-};
+static_assert(sizeof(Op2Reg) == sizeof(datastore::Reg),
+              "datastore::Reg(const Op2Reg&) constructor relies on Reg/Op2Reg having same size");
 
 class O2RegImmShift : public Op2Reg
 {
   public:
     explicit O2RegImmShift(Register rn, ShiftType type, uint32_t shift)
       : Op2Reg(rn, type, datastore::RIS(shift))
     { }
-
-  public:
-    int getShift() const {
-        datastore::Reg r(*this);
-        datastore::RIS ris(r);
-        return ris.ShiftAmount;
-    }
 };
 
 class O2RegRegShift : public Op2Reg
 {
   public:
     explicit O2RegRegShift(Register rn, ShiftType type, Register rs)
       : Op2Reg(rn, type, datastore::RRS(rs.code()))
     { }
@@ -785,45 +752,46 @@ O2RegRegShift ror(Register r, Register a
 
 // An offset from a register to be used for ldr/str. This should include the
 // sign bit, since ARM has "signed-magnitude" offsets. That is it encodes an
 // unsigned offset, then the instruction specifies if the offset is positive or
 // negative. The +/- bit is necessary if the instruction set wants to be able to
 // have a negative register offset e.g. ldr pc, [r1,-r2];
 class DtrOff
 {
-    uint32_t data;
+    uint32_t data_;
 
   protected:
     explicit DtrOff(datastore::Imm12Data immdata, IsUp_ iu)
-      : data(immdata.encode() | (uint32_t)IsImmDTR | ((uint32_t)iu))
+      : data_(immdata.encode() | uint32_t(IsImmDTR) | uint32_t(iu))
     { }
 
     explicit DtrOff(datastore::Reg reg, IsUp_ iu = IsUp)
-      : data(reg.encode() | (uint32_t) IsNotImmDTR | iu)
+      : data_(reg.encode() | uint32_t(IsNotImmDTR) | iu)
     { }
 
   public:
-    uint32_t encode() const { return data; }
+    uint32_t encode() const { return data_; }
 };
 
 class DtrOffImm : public DtrOff
 {
   public:
     explicit DtrOffImm(int32_t imm)
       : DtrOff(datastore::Imm12Data(mozilla::Abs(imm)), imm >= 0 ? IsUp : IsDown)
     {
         MOZ_ASSERT(mozilla::Abs(imm) < 4096);
     }
 };
 
 class DtrOffReg : public DtrOff
 {
     // These are designed to be called by a constructor of a subclass.
-    // Constructing the necessary RIS/RRS structures are annoying.
+    // Constructing the necessary RIS/RRS structures is annoying.
+
   protected:
     explicit DtrOffReg(Register rn, ShiftType type, datastore::RIS shiftImm, IsUp_ iu = IsUp)
       : DtrOff(datastore::Reg(rn.code(), type, 0, shiftImm.encode()), iu)
     { }
 
     explicit DtrOffReg(Register rn, ShiftType type, datastore::RRS shiftReg, IsUp_ iu = IsUp)
       : DtrOff(datastore::Reg(rn.code(), type, 1, shiftReg.encode()), iu)
     { }
@@ -846,56 +814,50 @@ class DtrRegRegShift : public DtrOffReg
 };
 
 // We will frequently want to bundle a register with its offset so that we have
 // an "operand" to a load instruction.
 class DTRAddr
 {
     friend class Operand;
 
-    uint32_t data;
+    uint32_t data_;
 
   public:
     explicit DTRAddr(Register reg, DtrOff dtr)
-      : data(dtr.encode() | (reg.code() << 16))
+      : data_(dtr.encode() | (reg.code() << 16))
     { }
 
-  private:
-    explicit DTRAddr(uint32_t blob)
-      : data(blob)
-    { }
-
-  public:
     uint32_t encode() const {
-        return data;
+        return data_;
     }
 
     Register getBase() const {
-        return Register::FromCode((data >> 16) &0xf);
+        return Register::FromCode((data_ >> 16) & 0xf);
     }
 };
 
 // Offsets for the extended data transfer instructions:
 // ldrsh, ldrd, ldrsb, etc.
 class EDtrOff
 {
-    uint32_t data;
+    uint32_t data_;
 
   protected:
     explicit EDtrOff(datastore::Imm8Data imm8, IsUp_ iu = IsUp)
-      : data(imm8.encode() | IsImmEDTR | (uint32_t)iu)
+      : data_(imm8.encode() | IsImmEDTR | uint32_t(iu))
     { }
 
     explicit EDtrOff(Register rm, IsUp_ iu = IsUp)
-      : data(rm.code() | IsNotImmEDTR | iu)
+      : data_(rm.code() | IsNotImmEDTR | iu)
     { }
 
   public:
     uint32_t encode() const {
-        return data;
+        return data_;
     }
 };
 
 class EDtrOffImm : public EDtrOff
 {
   public:
     explicit EDtrOffImm(int32_t imm)
       : EDtrOff(datastore::Imm8Data(mozilla::Abs(imm)), (imm >= 0) ? IsUp : IsDown)
@@ -911,47 +873,47 @@ class EDtrOffReg : public EDtrOff
   public:
     explicit EDtrOffReg(Register rm)
       : EDtrOff(rm)
     { }
 };
 
 class EDtrAddr
 {
-    uint32_t data;
+    uint32_t data_;
 
   public:
     explicit EDtrAddr(Register r, EDtrOff off)
-      : data(RN(r) | off.encode())
+      : data_(RN(r) | off.encode())
     { }
 
     uint32_t encode() const {
-        return data;
+        return data_;
     }
 #ifdef DEBUG
     Register maybeOffsetRegister() const {
-        if (data & IsImmEDTR)
+        if (data_ & IsImmEDTR)
             return InvalidReg;
-        return Register::FromCode(data & 0xf);
+        return Register::FromCode(data_ & 0xf);
     }
 #endif
 };
 
 class VFPOff
 {
-    uint32_t data;
+    uint32_t data_;
 
   protected:
     explicit VFPOff(datastore::Imm8VFPOffData imm, IsUp_ isup)
-      : data(imm.encode() | (uint32_t)isup)
+      : data_(imm.encode() | uint32_t(isup))
     { }
 
   public:
     uint32_t encode() const {
-        return data;
+        return data_;
     }
 };
 
 class VFPOffImm : public VFPOff
 {
   public:
     explicit VFPOffImm(int32_t imm)
       : VFPOff(datastore::Imm8VFPOffData(mozilla::Abs(imm) / 4), imm < 0 ? IsDown : IsUp)
@@ -959,206 +921,197 @@ class VFPOffImm : public VFPOff
         MOZ_ASSERT(mozilla::Abs(imm) <= 255 * 4);
     }
 };
 
 class VFPAddr
 {
     friend class Operand;
 
-    uint32_t data;
+    uint32_t data_;
 
   public:
     explicit VFPAddr(Register base, VFPOff off)
-      : data(RN(base) | off.encode())
+      : data_(RN(base) | off.encode())
     { }
 
-  protected:
-    VFPAddr(uint32_t blob)
-      : data(blob)
-    { }
-
-  public:
     uint32_t encode() const {
-        return data;
+        return data_;
     }
 };
 
 class VFPImm
 {
-    uint32_t data;
+    uint32_t data_;
 
   public:
     explicit VFPImm(uint32_t topWordOfDouble);
 
-  public:
     static const VFPImm One;
 
     uint32_t encode() const {
-        return data;
+        return data_;
     }
     bool isValid() const {
-        return data != -1U;
+        return data_ != -1U;
     }
 };
 
 // A BOffImm is an immediate that is used for branches. Namely, it is the offset
 // that will be encoded in the branch instruction. This is the only sane way of
 // constructing a branch.
 class BOffImm
 {
     friend class InstBranchImm;
 
-    uint32_t data;
+    uint32_t data_;
 
   public:
     explicit BOffImm(int offset)
-      : data ((offset - 8) >> 2 & 0x00ffffff)
+      : data_((offset - 8) >> 2 & 0x00ffffff)
     {
         MOZ_ASSERT((offset & 0x3) == 0);
         if (!IsInRange(offset))
             MOZ_CRASH("BOffImm offset out of range");
     }
 
     explicit BOffImm()
-      : data(INVALID)
+      : data_(INVALID)
     { }
 
   private:
-    BOffImm(Instruction& inst);
+    explicit BOffImm(const Instruction& inst);
 
   public:
-    static const int INVALID = 0x00800000;
+    static const uint32_t INVALID = 0x00800000;
 
     uint32_t encode() const {
-        return data;
+        return data_;
     }
     int32_t decode() const {
-        return ((((int32_t)data) << 8) >> 6) + 8;
+        return ((int32_t(data_) << 8) >> 6) + 8;
     }
 
     static bool IsInRange(int offset) {
         if ((offset - 8) < -33554432)
             return false;
         if ((offset - 8) > 33554428)
             return false;
         return true;
     }
 
     bool isInvalid() const {
-        return data == uint32_t(INVALID);
+        return data_ == INVALID;
     }
     Instruction* getDest(Instruction* src) const;
 };
 
 class Imm16
 {
-    uint32_t lower : 12;
-    uint32_t pad : 4;
-    uint32_t upper : 4;
-    uint32_t invalid : 12;
+    uint32_t lower_ : 12;
+    uint32_t pad_ : 4;
+    uint32_t upper_ : 4;
+    uint32_t invalid_ : 12;
 
   public:
     explicit Imm16();
     explicit Imm16(uint32_t imm);
     explicit Imm16(Instruction& inst);
 
     uint32_t encode() const {
-        return lower | upper << 16;
+        return lower_ | (upper_ << 16);
     }
     uint32_t decode() const {
-        return lower | upper << 12;
+        return lower_ | (upper_ << 12);
     }
 
-    bool isInvalid () const {
-        return invalid;
+    bool isInvalid() const {
+        return invalid_;
     }
 };
 
 // I would preffer that these do not exist, since there are essentially no
 // instructions that would ever take more than one of these, however, the MIR
 // wants to only have one type of arguments to functions, so bugger.
 class Operand
 {
     // The encoding of registers is the same for OP2, DTR and EDTR yet the type
     // system doesn't let us express this, so choices must be made.
   public:
-    enum Tag_ {
+    enum class Tag : uint8_t {
         OP2,
         MEM,
         FOP
     };
 
   private:
-    Tag_ Tag : 3;
-    uint32_t reg : 5;
-    int32_t offset;
+    Tag tag_ : 8;
+    uint32_t reg_ : 5;
+    int32_t offset_;
 
   public:
-    explicit Operand(Register reg_)
-      : Tag(OP2), reg(reg_.code())
+    explicit Operand(Register reg)
+      : tag_(Tag::OP2), reg_(reg.code())
     { }
 
     explicit Operand(FloatRegister freg)
-      : Tag(FOP), reg(freg.code())
+      : tag_(Tag::FOP), reg_(freg.code())
     { }
 
     explicit Operand(Register base, Imm32 off)
-      : Tag(MEM), reg(base.code()), offset(off.value)
+      : tag_(Tag::MEM), reg_(base.code()), offset_(off.value)
     { }
 
     explicit Operand(Register base, int32_t off)
-      : Tag(MEM), reg(base.code()), offset(off)
+      : tag_(Tag::MEM), reg_(base.code()), offset_(off)
     { }
 
     explicit Operand(const Address& addr)
-      : Tag(MEM), reg(addr.base.code()), offset(addr.offset)
+      : tag_(Tag::MEM), reg_(addr.base.code()), offset_(addr.offset)
     { }
 
   public:
-    Tag_ getTag() const {
-        return Tag;
+    Tag tag() const {
+        return tag_;
     }
 
     Operand2 toOp2() const {
-        MOZ_ASSERT(Tag == OP2);
-        return O2Reg(Register::FromCode(reg));
+        MOZ_ASSERT(tag_ == Tag::OP2);
+        return O2Reg(Register::FromCode(reg_));
     }
 
     Register toReg() const {
-        MOZ_ASSERT(Tag == OP2);
-        return Register::FromCode(reg);
+        MOZ_ASSERT(tag_ == Tag::OP2);
+        return Register::FromCode(reg_);
     }
 
-    void toAddr(Register* r, Imm32* dest) const {
-        MOZ_ASSERT(Tag == MEM);
-        *r = Register::FromCode(reg);
-        *dest = Imm32(offset);
-    }
     Address toAddress() const {
-        MOZ_ASSERT(Tag == MEM);
-        return Address(Register::FromCode(reg), offset);
+        MOZ_ASSERT(tag_ == Tag::MEM);
+        return Address(Register::FromCode(reg_), offset_);
     }
     int32_t disp() const {
-        MOZ_ASSERT(Tag == MEM);
-        return offset;
+        MOZ_ASSERT(tag_ == Tag::MEM);
+        return offset_;
     }
 
     int32_t base() const {
-        MOZ_ASSERT(Tag == MEM);
-        return reg;
+        MOZ_ASSERT(tag_ == Tag::MEM);
+        return reg_;
     }
     Register baseReg() const {
-        return Register::FromCode(reg);
+        MOZ_ASSERT(tag_ == Tag::MEM);
+        return Register::FromCode(reg_);
     }
     DTRAddr toDTRAddr() const {
-        return DTRAddr(baseReg(), DtrOffImm(offset));
+        MOZ_ASSERT(tag_ == Tag::MEM);
+        return DTRAddr(baseReg(), DtrOffImm(offset_));
     }
     VFPAddr toVFPAddr() const {
-        return VFPAddr(baseReg(), VFPOffImm(offset));
+        MOZ_ASSERT(tag_ == Tag::MEM);
+        return VFPAddr(baseReg(), VFPOffImm(offset_));
     }
 };
 
 inline Imm32
 Imm64::firstHalf() const
 {
     return low();
 }
@@ -1313,21 +1266,25 @@ class Assembler : public AssemblerShared
     static uint32_t AsmPoolMaxOffset;
     static uint32_t GetPoolMaxOffset();
 
   protected:
     // Structure for fixing up pc-relative loads/jumps when a the machine code
     // gets moved (executable copy, gc, etc.).
     struct RelativePatch
     {
-        void* target;
-        Relocation::Kind kind;
+        void* target_;
+        Relocation::Kind kind_;
+
+      public:
         RelativePatch(void* target, Relocation::Kind kind)
-            : target(target), kind(kind)
+          : target_(target), kind_(kind)
         { }
+        void* target() const { return target_; }
+        Relocation::Kind kind() const { return kind_; }
     };
 
     // TODO: this should actually be a pool-like object. It is currently a big
     // hack, and probably shouldn't exist.
     js::Vector<RelativePatch, 8, SystemAllocPolicy> jumps_;
 
     CompactBufferWriter jumpRelocations_;
     CompactBufferWriter dataRelocations_;
@@ -2253,17 +2210,17 @@ class InstMovT : public InstMovWT
     static InstMovT* AsTHIS (const Instruction& i);
 };
 
 class InstALU : public Instruction
 {
     static const int32_t ALUMask = 0xc << 24;
 
   public:
-    InstALU (Register rd, Register rn, Operand2 op2, ALUOp op, SBit s, Assembler::Condition c)
+    InstALU(Register rd, Register rn, Operand2 op2, ALUOp op, SBit s, Assembler::Condition c)
       : Instruction(maybeRD(rd) | maybeRN(rn) | op2.encode() | op | s, c)
     { }
 
     static bool IsTHIS (const Instruction& i);
     static InstALU* AsTHIS (const Instruction& i);
 
     void extractOp(ALUOp* ret);
     bool checkOp(ALUOp op);
@@ -2416,18 +2373,16 @@ GetDoubleArgStackDisp(uint32_t usedIntAr
     }
     uint32_t doubleSlots = usedFloatArgs - NumFloatArgRegs;
     doubleSlots *= 2;
     return (intSlots + doubleSlots + *padding) * sizeof(intptr_t);
 }
 
 #endif
 
-
-
 class DoubleEncoder
 {
     struct DoubleEntry
     {
         uint32_t dblTop;
         datastore::Imm8VFPImmData data;
     };
 
--- a/js/src/jit/arm/MacroAssembler-arm-inl.h
+++ b/js/src/jit/arm/MacroAssembler-arm-inl.h
@@ -2116,17 +2116,17 @@ MacroAssembler::wasmPatchBoundsCheck(uin
     InstCMP* cmp = inst->as<InstCMP>();
 
     Register index;
     cmp->extractOp1(&index);
 
     MOZ_ASSERT(cmp->extractOp2().isImm8());
 
     Imm8 imm8 = Imm8(limit);
-    MOZ_RELEASE_ASSERT(!imm8.invalid);
+    MOZ_RELEASE_ASSERT(!imm8.invalid());
 
     *inst = InstALU(InvalidReg, index, imm8, OpCmp, SetCC, Always);
     // Don't call Auto Flush Cache; the wasm caller has done this for us.
 }
 
 //}}} check_macroassembler_style
 // ===============================================================
 
--- a/js/src/jit/arm/MacroAssembler-arm.cpp
+++ b/js/src/jit/arm/MacroAssembler-arm.cpp
@@ -237,61 +237,60 @@ bool
 MacroAssemblerARM::alu_dbl(Register src1, Imm32 imm, Register dest, ALUOp op,
                            SBit s, Condition c)
 {
     if ((s == SetCC && ! condsAreSafe(op)) || !can_dbl(op))
         return false;
 
     ALUOp interop = getDestVariant(op);
     Imm8::TwoImm8mData both = Imm8::EncodeTwoImms(imm.value);
-    if (both.fst.invalid)
+    if (both.fst().invalid())
         return false;
 
     // For the most part, there is no good reason to set the condition codes for
     // the first instruction. We can do better things if the second instruction
     // doesn't have a dest, such as check for overflow by doing first operation
     // don't do second operation if first operation overflowed. This preserves
     // the overflow condition code. Unfortunately, it is horribly brittle.
-    as_alu(dest, src1, Operand2(both.fst), interop, LeaveCC, c);
-    as_alu(dest, dest, Operand2(both.snd), op, s, c);
+    as_alu(dest, src1, Operand2(both.fst()), interop, LeaveCC, c);
+    as_alu(dest, dest, Operand2(both.snd()), op, s, c);
     return true;
 }
 
 void
 MacroAssemblerARM::ma_alu(Register src1, Imm32 imm, Register dest, AutoRegisterScope& scratch,
                           ALUOp op, SBit s, Condition c)
 {
     // ma_mov should be used for moves.
     MOZ_ASSERT(op != OpMov);
     MOZ_ASSERT(op != OpMvn);
     MOZ_ASSERT(src1 != scratch);
 
     // As it turns out, if you ask for a compare-like instruction you *probably*
     // want it to set condition codes.
-    if (dest == InvalidReg)
-        MOZ_ASSERT(s == SetCC);
+    MOZ_ASSERT_IF(dest == InvalidReg, s == SetCC);
 
     // The operator gives us the ability to determine how this can be used.
     Imm8 imm8 = Imm8(imm.value);
     // One instruction: If we can encode it using an imm8m, then do so.
-    if (!imm8.invalid) {
+    if (!imm8.invalid()) {
         as_alu(dest, src1, imm8, op, s, c);
         return;
     }
 
     // One instruction, negated:
     Imm32 negImm = imm;
     Register negDest;
     ALUOp negOp = ALUNeg(op, dest, scratch, &negImm, &negDest);
     Imm8 negImm8 = Imm8(negImm.value);
     // 'add r1, r2, -15' can be replaced with 'sub r1, r2, 15'.
     // The dest can be replaced (InvalidReg => scratch).
     // This is useful if we wish to negate tst. tst has an invalid (aka not
     // used) dest, but its negation bic requires a dest.
-    if (negOp != OpInvalid && !negImm8.invalid) {
+    if (negOp != OpInvalid && !negImm8.invalid()) {
         as_alu(negDest, src1, negImm8, negOp, s, c);
         return;
     }
 
     // Start by attempting to generate a two instruction form. Some things
     // cannot be made into two-inst forms correctly. Namely, adds dest, src,
     // 0xffff. Since we want the condition codes (and don't know which ones
     // will be checked), we need to assume that the overflow flag will be
@@ -306,19 +305,19 @@ MacroAssemblerARM::ma_alu(Register src1,
         return;
 
     ma_mov(imm, scratch, c);
     as_alu(dest, src1, O2Reg(scratch), op, s, c);
 }
 
 void
 MacroAssemblerARM::ma_alu(Register src1, Operand op2, Register dest, ALUOp op,
-            SBit s, Assembler::Condition c)
-{
-    MOZ_ASSERT(op2.getTag() == Operand::OP2);
+                          SBit s, Assembler::Condition c)
+{
+    MOZ_ASSERT(op2.tag() == Operand::Tag::OP2);
     as_alu(dest, src1, op2.toOp2(), op, s, c);
 }
 
 void
 MacroAssemblerARM::ma_alu(Register src1, Operand2 op2, Register dest, ALUOp op, SBit s, Condition c)
 {
     as_alu(dest, src1, op2, op, s, c);
 }
@@ -384,24 +383,24 @@ MacroAssemblerARM::ma_mov(Register src, 
         as_mov(dest, O2Reg(src), s, c);
 }
 
 void
 MacroAssemblerARM::ma_mov(Imm32 imm, Register dest, Assembler::Condition c)
 {
     // Try mov with Imm8 operand.
     Imm8 imm8 = Imm8(imm.value);
-    if (!imm8.invalid) {
+    if (!imm8.invalid()) {
         as_alu(dest, InvalidReg, imm8, OpMov, LeaveCC, c);
         return;
     }
 
     // Try mvn with Imm8 operand.
     Imm8 negImm8 = Imm8(~imm.value);
-    if (!negImm8.invalid) {
+    if (!negImm8.invalid()) {
         as_alu(dest, InvalidReg, negImm8, OpMvn, LeaveCC, c);
         return;
     }
 
     // Try movw/movt.
     if (HasMOVWT()) {
         // ARMv7 supports movw/movt. movw zero-extends its 16 bit argument,
         // so we can set the register this way. movt leaves the bottom 16
@@ -769,17 +768,17 @@ MacroAssemblerARM::ma_cmp(Register src1,
     ma_alu(src1, imm, InvalidReg, scratch, OpCmp, SetCC, c);
 }
 
 void
 MacroAssemblerARM::ma_cmp(Register src1, ImmTag tag, Condition c)
 {
     // ImmTag comparisons can always be done without use of a scratch register.
     Imm8 negtag = Imm8(-tag.value);
-    MOZ_ASSERT(!negtag.invalid);
+    MOZ_ASSERT(!negtag.invalid());
     as_cmn(src1, negtag, c);
 }
 
 void
 MacroAssemblerARM::ma_cmp(Register src1, ImmWord ptr, AutoRegisterScope& scratch, Condition c)
 {
     ma_cmp(src1, Imm32(ptr.value), scratch, c);
 }
@@ -790,21 +789,21 @@ MacroAssemblerARM::ma_cmp(Register src1,
     ma_mov(ptr, scratch);
     ma_cmp(src1, scratch, c);
 }
 
 void
 MacroAssemblerARM::ma_cmp(Register src1, Operand op, AutoRegisterScope& scratch,
                           AutoRegisterScope& scratch2, Condition c)
 {
-    switch (op.getTag()) {
-      case Operand::OP2:
+    switch (op.tag()) {
+      case Operand::Tag::OP2:
         as_cmp(src1, op.toOp2(), c);
         break;
-      case Operand::MEM:
+      case Operand::Tag::MEM:
         ma_ldr(op.toAddress(), scratch, scratch2);
         as_cmp(src1, O2Reg(scratch), c);
         break;
       default:
         MOZ_CRASH("trying to compare FP and integer registers");
     }
 }
 
@@ -1204,43 +1203,43 @@ MacroAssemblerARM::ma_dataTransferN(Load
         // At this point, both off - bottom and off + neg_bottom will be
         // reasonable-ish quantities.
         //
         // Note a neg_bottom of 0x1000 can not be encoded as an immediate
         // negative offset in the instruction and this occurs when bottom is
         // zero, so this case is guarded against below.
         if (off < 0) {
             Operand2 sub_off = Imm8(-(off - bottom)); // sub_off = bottom - off
-            if (!sub_off.invalid) {
+            if (!sub_off.invalid()) {
                 // - sub_off = off - bottom
                 as_sub(scratch, rn, sub_off, LeaveCC, cc);
                 return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(bottom)), cc);
             }
 
             // sub_off = -neg_bottom - off
             sub_off = Imm8(-(off + neg_bottom));
-            if (!sub_off.invalid && bottom != 0) {
+            if (!sub_off.invalid() && bottom != 0) {
                 // Guarded against by: bottom != 0
                 MOZ_ASSERT(neg_bottom < 0x1000);
                 // - sub_off = neg_bottom + off
                 as_sub(scratch, rn, sub_off, LeaveCC, cc);
                 return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(-neg_bottom)), cc);
             }
         } else {
             // sub_off = off - bottom
             Operand2 sub_off = Imm8(off - bottom);
-            if (!sub_off.invalid) {
+            if (!sub_off.invalid()) {
                 //  sub_off = off - bottom
                 as_add(scratch, rn, sub_off, LeaveCC, cc);
                 return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(bottom)), cc);
             }
 
             // sub_off = neg_bottom + off
             sub_off = Imm8(off + neg_bottom);
-            if (!sub_off.invalid && bottom != 0) {
+            if (!sub_off.invalid() && bottom != 0) {
                 // Guarded against by: bottom != 0
                 MOZ_ASSERT(neg_bottom < 0x1000);
                 // sub_off = neg_bottom + off
                 as_add(scratch, rn, sub_off, LeaveCC,  cc);
                 return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(-neg_bottom)), cc);
             }
         }
 
@@ -1259,47 +1258,47 @@ MacroAssemblerARM::ma_dataTransferN(Load
         // reasonable-ish quantities.
         //
         // Note a neg_bottom of 0x100 can not be encoded as an immediate
         // negative offset in the instruction and this occurs when bottom is
         // zero, so this case is guarded against below.
         if (off < 0) {
             // sub_off = bottom - off
             Operand2 sub_off = Imm8(-(off - bottom));
-            if (!sub_off.invalid) {
+            if (!sub_off.invalid()) {
                 // - sub_off = off - bottom
                 as_sub(scratch, rn, sub_off, LeaveCC, cc);
                 return as_extdtr(ls, size, IsSigned, Offset, rt,
                                  EDtrAddr(scratch, EDtrOffImm(bottom)),
                                  cc);
             }
             // sub_off = -neg_bottom - off
             sub_off = Imm8(-(off + neg_bottom));
-            if (!sub_off.invalid && bottom != 0) {
+            if (!sub_off.invalid() && bottom != 0) {
                 // Guarded against by: bottom != 0
                 MOZ_ASSERT(neg_bottom < 0x100);
                 // - sub_off = neg_bottom + off
                 as_sub(scratch, rn, sub_off, LeaveCC, cc);
                 return as_extdtr(ls, size, IsSigned, Offset, rt,
                                  EDtrAddr(scratch, EDtrOffImm(-neg_bottom)),
                                  cc);
             }
         } else {
             // sub_off = off - bottom
             Operand2 sub_off = Imm8(off - bottom);
-            if (!sub_off.invalid) {
+            if (!sub_off.invalid()) {
                 // sub_off = off - bottom
                 as_add(scratch, rn, sub_off, LeaveCC, cc);
                 return as_extdtr(ls, size, IsSigned, Offset, rt,
                                  EDtrAddr(scratch, EDtrOffImm(bottom)),
                                  cc);
             }
             // sub_off = neg_bottom + off
             sub_off = Imm8(off + neg_bottom);
-            if (!sub_off.invalid && bottom != 0) {
+            if (!sub_off.invalid() && bottom != 0) {
                 // Guarded against by: bottom != 0
                 MOZ_ASSERT(neg_bottom < 0x100);
                 // sub_off = neg_bottom + off
                 as_add(scratch, rn, sub_off, LeaveCC,  cc);
                 return as_extdtr(ls, size, IsSigned, Offset, rt,
                                  EDtrAddr(scratch, EDtrOffImm(-neg_bottom)),
                                  cc);
             }
@@ -1720,41 +1719,41 @@ MacroAssemblerARM::ma_vdtr(LoadStore ls,
     // reasonable-ish quantities.
     //
     // Note a neg_bottom of 0x400 can not be encoded as an immediate negative
     // offset in the instruction and this occurs when bottom is zero, so this
     // case is guarded against below.
     if (off < 0) {
         // sub_off = bottom - off
         Operand2 sub_off = Imm8(-(off - bottom));
-        if (!sub_off.invalid) {
+        if (!sub_off.invalid()) {
             // - sub_off = off - bottom
             as_sub(scratch, base, sub_off, LeaveCC, cc);
             return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(bottom)), cc);
         }
         // sub_off = -neg_bottom - off
         sub_off = Imm8(-(off + neg_bottom));
-        if (!sub_off.invalid && bottom != 0) {
+        if (!sub_off.invalid() && bottom != 0) {
             // Guarded against by: bottom != 0
             MOZ_ASSERT(neg_bottom < 0x400);
             // - sub_off = neg_bottom + off
             as_sub(scratch, base, sub_off, LeaveCC, cc);
             return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(-neg_bottom)), cc);
         }
     } else {
         // sub_off = off - bottom
         Operand2 sub_off = Imm8(off - bottom);
-        if (!sub_off.invalid) {
+        if (!sub_off.invalid()) {
             // sub_off = off - bottom
             as_add(scratch, base, sub_off, LeaveCC, cc);
             return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(bottom)), cc);
         }
         // sub_off = neg_bottom + off
         sub_off = Imm8(off + neg_bottom);
-        if (!sub_off.invalid && bottom != 0) {
+        if (!sub_off.invalid() && bottom != 0) {
             // Guarded against by: bottom != 0
             MOZ_ASSERT(neg_bottom < 0x400);
             // sub_off = neg_bottom + off
             as_add(scratch, base, sub_off, LeaveCC, cc);
             return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(-neg_bottom)), cc);
         }
     }
 
--- a/js/src/jit/mips-shared/Assembler-mips-shared.h
+++ b/js/src/jit/mips-shared/Assembler-mips-shared.h
@@ -489,17 +489,17 @@ class BOffImm16
 
     explicit BOffImm16(int offset)
       : data ((offset - 4) >> 2 & Imm16Mask)
     {
         MOZ_ASSERT((offset & 0x3) == 0);
         MOZ_ASSERT(IsInRange(offset));
     }
     static bool IsInRange(int offset) {
-        if ((offset - 4) < (INT16_MIN << 2))
+        if ((offset - 4) < int(unsigned(INT16_MIN) << 2))
             return false;
         if ((offset - 4) > (INT16_MAX << 2))
             return false;
         return true;
     }
     static const uint32_t INVALID = 0x00020000;
     BOffImm16()
       : data(INVALID)
@@ -631,17 +631,17 @@ class GSImm13
     }
     int32_t decodeSigned() {
         return value;
     }
     uint32_t decodeUnsigned() {
         return value;
     }
     static bool IsInRange(int32_t imm) {
-        return imm >= (-256 << 4) && imm <= (255 << 4);
+        return imm >= int32_t(uint32_t(-256) << 4) && imm <= (255 << 4);
     }
 };
 
 class Operand
 {
   public:
     enum Tag {
         REG,
--- a/js/src/jit/mips32/Simulator-mips32.cpp
+++ b/js/src/jit/mips32/Simulator-mips32.cpp
@@ -1611,130 +1611,130 @@ Simulator::get_pc() const
 // executed in the simulator.  Since the host is typically IA32 we will not
 // get the correct MIPS-like behaviour on unaligned accesses.
 
 int
 Simulator::readW(uint32_t addr, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory read from bad address: 0x%08x, pc=0x%08x\n",
+        printf("Memory read from bad address: 0x%08x, pc=0x%08" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & kPointerAlignmentMask) == 0) {
         intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned read at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned read at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeW(uint32_t addr, int value, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory write to bad address: 0x%08x, pc=0x%08x\n",
+        printf("Memory write to bad address: 0x%08x, pc=0x%08" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & kPointerAlignmentMask) == 0) {
         intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned write at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned write at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 double
 Simulator::readD(uint32_t addr, SimInstruction* instr)
 {
     if ((addr & kDoubleAlignmentMask) == 0) {
         double* ptr = reinterpret_cast<double*>(addr);
         return *ptr;
     }
-    printf("Unaligned (double) read at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned (double) read at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeD(uint32_t addr, double value, SimInstruction* instr)
 {
     if ((addr & kDoubleAlignmentMask) == 0) {
         double* ptr = reinterpret_cast<double*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned (double) write at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned (double) write at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 uint16_t
 Simulator::readHU(uint32_t addr, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned unsigned halfword read at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned unsigned halfword read at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 int16_t
 Simulator::readH(uint32_t addr, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         int16_t* ptr = reinterpret_cast<int16_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned signed halfword read at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned signed halfword read at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeH(uint32_t addr, uint16_t value, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned unsigned halfword write at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned unsigned halfword write at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 void
 Simulator::writeH(uint32_t addr, int16_t value, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         int16_t* ptr = reinterpret_cast<int16_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned halfword write at 0x%08x, pc=0x%08x\n",
+    printf("Unaligned halfword write at 0x%08x, pc=0x%08" PRIxPTR "\n",
            addr,
            reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 uint32_t
 Simulator::readBU(uint32_t addr)
 {
@@ -1789,17 +1789,17 @@ Simulator::overRecursedWithExtra(uint32_
     uintptr_t newsp = getRegister(sp) - extra;
     return newsp <= stackLimit();
 }
 
 // Unsupported instructions use format to print an error and stop execution.
 void
 Simulator::format(SimInstruction* instr, const char* format)
 {
-    printf("Simulator found unsupported instruction:\n 0x%08x: %s\n",
+    printf("Simulator found unsupported instruction:\n 0x%08" PRIxPTR ": %s\n",
            reinterpret_cast<intptr_t>(instr), format);
     MOZ_CRASH();
 }
 
 // Note: With the code below we assume that all runtime calls return a 64 bits
 // result. If they don't, the v1 result register contains a bogus value, which
 // is fine because it is caller-saved.
 typedef int64_t (*Prototype_General0)();
--- a/js/src/jit/mips64/MacroAssembler-mips64-inl.h
+++ b/js/src/jit/mips64/MacroAssembler-mips64-inl.h
@@ -405,16 +405,18 @@ MacroAssembler::rotateRight64(Register c
 
 template <typename T1, typename T2>
 void
 MacroAssembler::cmpPtrSet(Condition cond, T1 lhs, T2 rhs, Register dest)
 {
     ma_cmp_set(dest, lhs, rhs, cond);
 }
 
+// Also see below for specializations of cmpPtrSet.
+
 template <typename T1, typename T2>
 void
 MacroAssembler::cmp32Set(Condition cond, T1 lhs, T2 rhs, Register dest)
 {
     ma_cmp_set(dest, lhs, rhs, cond);
 }
 
 // ===============================================================
@@ -706,16 +708,47 @@ MacroAssembler::wasmPatchBoundsCheck(uin
 {
     // Replace with new value
     Assembler::UpdateLoad64Value((Instruction*) patchAt, limit);
 }
 
 //}}} check_macroassembler_style
 // ===============================================================
 
+// The specializations for cmpPtrSet are outside the braces because check_macroassembler_style can't yet
+// deal with specializations.
+
+template<>
+inline void
+MacroAssembler::cmpPtrSet(Assembler::Condition cond, Address lhs, ImmPtr rhs,
+                          Register dest)
+{
+    loadPtr(lhs, ScratchRegister);
+    movePtr(rhs, SecondScratchReg);
+    cmpPtrSet(cond, ScratchRegister, SecondScratchReg, dest);
+}
+
+template<>
+inline void
+MacroAssembler::cmpPtrSet(Assembler::Condition cond, Register lhs, Address rhs,
+                          Register dest)
+{
+    loadPtr(rhs, ScratchRegister);
+    cmpPtrSet(cond, lhs, ScratchRegister, dest);
+}
+
+template<>
+inline void
+MacroAssembler::cmp32Set(Assembler::Condition cond, Register lhs, Address rhs,
+                         Register dest)
+{
+    load32(rhs, ScratchRegister);
+    cmp32Set(cond, lhs, ScratchRegister, dest);
+}
+
 void
 MacroAssemblerMIPS64Compat::incrementInt32Value(const Address& addr)
 {
     asMasm().add32(Imm32(1), addr);
 }
 
 void
 MacroAssemblerMIPS64Compat::computeEffectiveAddress(const BaseIndex& address, Register dest)
--- a/js/src/jit/mips64/MacroAssembler-mips64.cpp
+++ b/js/src/jit/mips64/MacroAssembler-mips64.cpp
@@ -1977,41 +1977,16 @@ MacroAssemblerMIPS64Compat::ensureDouble
 
     bind(&isDouble);
     unboxDouble(source, dest);
 
     bind(&done);
 }
 
 void
-MacroAssemblerMIPS64Compat::cmpPtrSet(Assembler::Condition cond, Address lhs, ImmPtr rhs,
-                                      Register dest)
-{
-    loadPtr(lhs, ScratchRegister);
-    movePtr(rhs, SecondScratchReg);
-    cmpPtrSet(cond, ScratchRegister, SecondScratchReg, dest);
-}
-
-void
-MacroAssemblerMIPS64Compat::cmpPtrSet(Assembler::Condition cond, Register lhs, Address rhs,
-                                      Register dest)
-{
-    loadPtr(rhs, ScratchRegister);
-    cmpPtrSet(cond, lhs, ScratchRegister, dest);
-}
-
-void
-MacroAssemblerMIPS64Compat::cmp32Set(Assembler::Condition cond, Register lhs, Address rhs,
-                                     Register dest)
-{
-    load32(rhs, ScratchRegister);
-    cmp32Set(cond, lhs, ScratchRegister, dest);
-}
-
-void
 MacroAssemblerMIPS64Compat::checkStackAlignment()
 {
 #ifdef DEBUG
     Label aligned;
     as_andi(ScratchRegister, sp, ABIStackAlignment - 1);
     ma_b(ScratchRegister, zero, &aligned, Equal, ShortJump);
     as_break(BREAK_STACK_UNALIGNED);
     bind(&aligned);
--- a/js/src/jit/mips64/Simulator-mips64.cpp
+++ b/js/src/jit/mips64/Simulator-mips64.cpp
@@ -26,16 +26,17 @@
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "jit/mips64/Simulator-mips64.h"
 
 #include "mozilla/Casting.h"
 #include "mozilla/FloatingPoint.h"
+#include "mozilla/IntegerPrintfMacros.h"
 #include "mozilla/Likely.h"
 #include "mozilla/MathAlgorithms.h"
 
 #include <float.h>
 
 #include "jit/mips64/Assembler-mips64.h"
 #include "threading/LockGuard.h"
 #include "vm/Runtime.h"
@@ -567,18 +568,18 @@ Simulator::Create(JSContext* cx)
         return nullptr;
     }
 
     if (getenv("MIPS_SIM_ICACHE_CHECKS"))
         Simulator::ICacheCheckingEnabled = true;
 
     int64_t stopAt;
     char* stopAtStr = getenv("MIPS_SIM_STOP_AT");
-    if (stopAtStr && sscanf(stopAtStr, "%ld", &stopAt) == 1) {
-        fprintf(stderr, "\nStopping simulation at icount %ld\n", stopAt);
+    if (stopAtStr && sscanf(stopAtStr, "%" PRIi64, &stopAt) == 1) {
+        fprintf(stderr, "\nStopping simulation at icount %" PRIi64 "\n", stopAt);
         Simulator::StopSimAt = stopAt;
     }
 
     return sim;
 }
 
 void
 Simulator::Destroy(Simulator* sim)
@@ -680,18 +681,18 @@ MipsDebugger::getValue(const char* desc,
 {
     Register reg = Register::FromName(desc);
     if (reg != InvalidReg) {
         *value = getRegisterValue(reg.code());
         return true;
     }
 
     if (strncmp(desc, "0x", 2) == 0)
-        return sscanf(desc, "%lx", reinterpret_cast<uint64_t*>(value)) == 1;
-    return sscanf(desc, "%li", value) == 1;
+        return sscanf(desc, "%" PRIu64, reinterpret_cast<uint64_t*>(value)) == 1;
+    return sscanf(desc, "%" PRIi64, value) == 1;
 }
 
 bool
 MipsDebugger::setBreakpoint(SimInstruction* breakpc)
 {
     // Check if a breakpoint can be set. If not return without any side-effects.
     if (sim_->break_pc_ != nullptr)
         return false;
@@ -731,40 +732,40 @@ MipsDebugger::redoBreakpoints()
 }
 
 void
 MipsDebugger::printAllRegs()
 {
     int64_t value;
     for (uint32_t i = 0; i < Registers::Total; i++) {
         value = getRegisterValue(i);
-        printf("%3s: 0x%016lx %20ld   ", Registers::GetName(i), value, value);
+        printf("%3s: 0x%016" PRIx64 " %20" PRIi64 "   ", Registers::GetName(i), value, value);
 
         if (i % 2)
             printf("\n");
     }
     printf("\n");
 
     value = getRegisterValue(Simulator::LO);
-    printf(" LO: 0x%016lx %20ld   ", value, value);
+    printf(" LO: 0x%016" PRIx64 " %20" PRIi64 "   ", value, value);
     value = getRegisterValue(Simulator::HI);
-    printf(" HI: 0x%016lx %20ld\n", value, value);
+    printf(" HI: 0x%016" PRIx64 " %20" PRIi64 "\n", value, value);
     value = getRegisterValue(Simulator::pc);
-    printf(" pc: 0x%016lx\n", value);
+    printf(" pc: 0x%016" PRIx64 "\n", value);
 }
 
 void
 MipsDebugger::printAllRegsIncludingFPU()
 {
     printAllRegs();
 
     printf("\n\n");
     // f0, f1, f2, ... f31.
     for (uint32_t i = 0; i < FloatRegisters::TotalPhys; i++) {
-        printf("%3s: 0x%016lx\tflt: %-8.4g\tdbl: %-16.4g\n",
+        printf("%3s: 0x%016" PRIi64 "\tflt: %-8.4g\tdbl: %-16.4g\n",
                FloatRegisters::GetName(i),
                getFPURegisterValueLong(i),
                getFPURegisterValueFloat(i),
                getFPURegisterValueDouble(i));
     }
 }
 
 static char*
@@ -902,19 +903,19 @@ MipsDebugger::debug()
                         printAllRegs();
                     } else if (strcmp(arg1, "allf") == 0) {
                         printAllRegsIncludingFPU();
                     } else {
                         Register reg = Register::FromName(arg1);
                         FloatRegisters::Encoding fReg = FloatRegisters::FromName(arg1);
                         if (reg != InvalidReg) {
                             value = getRegisterValue(reg.code());
-                            printf("%s: 0x%016lx %20ld \n", arg1, value, value);
+                            printf("%s: 0x%016" PRIi64 " %20" PRIi64 " \n", arg1, value, value);
                         } else if (fReg != FloatRegisters::Invalid) {
-                            printf("%3s: 0x%016lx\tflt: %-8.4g\tdbl: %-16.4g\n",
+                            printf("%3s: 0x%016" PRIi64 "\tflt: %-8.4g\tdbl: %-16.4g\n",
                                    FloatRegisters::GetName(fReg),
                                    getFPURegisterValueLong(fReg),
                                    getFPURegisterValueFloat(fReg),
                                    getFPURegisterValueDouble(fReg));
                         } else {
                             printf("%s unrecognized\n", arg1);
                         }
                     }
@@ -944,17 +945,17 @@ MipsDebugger::debug()
                 } else {
                     if (!getValue(argv[next_arg], &words)) {
                         words = 10;
                     }
                 }
                 end = cur + words;
 
                 while (cur < end) {
-                    printf("  %p:  0x%016lx %20ld", cur, *cur, *cur);
+                    printf("  %p:  0x%016" PRIx64 " %20" PRIi64, cur, *cur, *cur);
                     printf("\n");
                     cur++;
                 }
 
             } else if ((strcmp(cmd, "disasm") == 0) ||
                        (strcmp(cmd, "dpc") == 0) ||
                        (strcmp(cmd, "di") == 0)) {
                 uint8_t* cur = nullptr;
@@ -1633,197 +1634,197 @@ Simulator::writeB(uint64_t addr, int8_t 
 
 uint16_t
 Simulator::readHU(uint64_t addr, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned unsigned halfword read at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned unsigned halfword read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 int16_t
 Simulator::readH(uint64_t addr, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         int16_t* ptr = reinterpret_cast<int16_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned signed halfword read at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned signed halfword read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeH(uint64_t addr, uint16_t value, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned unsigned halfword write at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned unsigned halfword write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 void
 Simulator::writeH(uint64_t addr, int16_t value, SimInstruction* instr)
 {
     if ((addr & 1) == 0) {
         int16_t* ptr = reinterpret_cast<int16_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned halfword write at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned halfword write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 uint32_t
 Simulator::readWU(uint64_t addr, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory read from bad address: 0x%016lx, pc=0x%016lx\n",
+        printf("Memory read from bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & 3) == 0) {
         uint32_t* ptr = reinterpret_cast<uint32_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned read at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 int32_t
 Simulator::readW(uint64_t addr, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory read from bad address: 0x%016lx, pc=0x%016lx\n",
+        printf("Memory read from bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & 3) == 0) {
         int32_t* ptr = reinterpret_cast<int32_t*>(addr);
         return *ptr;
     }
-    printf("Unaligned read at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeW(uint64_t addr, uint32_t value, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory write to bad address: 0x%016lx, pc=0x%016lx\n",
+        printf("Memory write to bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & 3) == 0) {
         uint32_t* ptr = reinterpret_cast<uint32_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned write at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 void
 Simulator::writeW(uint64_t addr, int32_t value, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory write to bad address: 0x%016lx, pc=0x%016lx\n",
+        printf("Memory write to bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & 3) == 0) {
         int32_t* ptr = reinterpret_cast<int32_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned write at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 int64_t
 Simulator::readDW(uint64_t addr, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory read from bad address: 0x%016lx, pc=0x%016lx\n",
+        printf("Memory read from bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & kPointerAlignmentMask) == 0) {
         int64_t* ptr = reinterpret_cast<int64_t*>(addr);
         return* ptr;
     }
-    printf("Unaligned read at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeDW(uint64_t addr, int64_t value, SimInstruction* instr)
 {
     if (addr < 0x400) {
         // This has to be a NULL-dereference, drop into debugger.
-        printf("Memory write to bad address: 0x%016lx, pc=0x%016lx\n",
+        printf("Memory write to bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
                addr, reinterpret_cast<intptr_t>(instr));
         MOZ_CRASH();
     }
     if ((addr & kPointerAlignmentMask) == 0) {
         int64_t* ptr = reinterpret_cast<int64_t*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned write at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 double
 Simulator::readD(uint64_t addr, SimInstruction* instr)
 {
     if ((addr & kDoubleAlignmentMask) == 0) {
         double* ptr = reinterpret_cast<double*>(addr);
         return *ptr;
     }
-    printf("Unaligned (double) read at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned (double) read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
     return 0;
 }
 
 void
 Simulator::writeD(uint64_t addr, double value, SimInstruction* instr)
 {
     if ((addr & kDoubleAlignmentMask) == 0) {
         double* ptr = reinterpret_cast<double*>(addr);
         *ptr = value;
         return;
     }
-    printf("Unaligned (double) write at 0x%016lx, pc=0x%016lx\n",
+    printf("Unaligned (double) write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n",
            addr, reinterpret_cast<intptr_t>(instr));
     MOZ_CRASH();
 }
 
 uintptr_t
 Simulator::stackLimit() const
 {
     return stackLimit_;
@@ -2116,17 +2117,17 @@ Simulator::isWatchpoint(uint32_t code)
     return (code <= kMaxWatchpointCode);
 }
 
 void
 Simulator::printWatchpoint(uint32_t code)
 {
     MipsDebugger dbg(this);
     ++break_count_;
-    printf("\n---- break %d marker: %20ld  (instr count: %20ld) ----\n",
+    printf("\n---- break %d marker: %20" PRIi64 "  (instr count: %20" PRIi64 ") ----\n",
            code, break_count_, icount_);
     dbg.printAllRegs();  // Print registers and continue running.
 }
 
 void
 Simulator::handleStop(uint32_t code, SimInstruction* instr)
 {
     // Stop if it is enabled, otherwise go on jumping over the stop
--- a/js/src/jit/mips64/Trampoline-mips64.cpp
+++ b/js/src/jit/mips64/Trampoline-mips64.cpp
@@ -458,17 +458,17 @@ JitRuntime::generateArgumentsRectifier(J
     // arguments to push to the stack.  Then we push a JitFrameLayout.  We
     // compute the padding expressed in the number of extra |undefined| values
     // to push on the stack.
     static_assert(sizeof(JitFrameLayout) % JitStackAlignment == 0,
       "No need to consider the JitFrameLayout for aligning the stack");
     static_assert(JitStackAlignment % sizeof(Value) == 0,
       "Ensure that we can pad the stack by pushing extra UndefinedValue");
 
-    MOZ_ASSERT(IsPowerOfTwo(JitStackValueAlignment));
+    MOZ_ASSERT(mozilla::IsPowerOfTwo(JitStackValueAlignment));
     masm.add32(Imm32(JitStackValueAlignment - 1 /* for padding */ + 1 /* for |this| */), numArgsReg);
     masm.add32(t2, numArgsReg);
     masm.and32(Imm32(~(JitStackValueAlignment - 1)), numArgsReg);
 
     // Load the number of |undefined|s to push into t1.
     masm.as_dsubu(t1, numArgsReg, s3);
 
     // Caller:
--- a/js/src/jit/shared/Lowering-shared-inl.h
+++ b/js/src/jit/shared/Lowering-shared-inl.h
@@ -834,12 +834,25 @@ LIRGeneratorShared::useInt64OrConstant(M
         return LInt64Allocation(LAllocation(mir->toConstant()), LAllocation());
 #else
         return LInt64Allocation(LAllocation(mir->toConstant()));
 #endif
     }
     return useInt64(mir, useAtStart);
 }
 
+LInt64Allocation
+LIRGeneratorShared::useInt64RegisterOrConstant(MDefinition* mir, bool useAtStart)
+{
+    if (mir->isConstant()) {
+#if defined(JS_NUNBOX32)
+        return LInt64Allocation(LAllocation(mir->toConstant()), LAllocation());
+#else
+        return LInt64Allocation(LAllocation(mir->toConstant()));
+#endif
+    }
+    return useInt64Register(mir, useAtStart);
+}
+
 } // namespace jit
 } // namespace js
 
 #endif /* jit_shared_Lowering_shared_inl_h */
--- a/js/src/jit/shared/Lowering-shared.h
+++ b/js/src/jit/shared/Lowering-shared.h
@@ -183,21 +183,25 @@ class LIRGeneratorShared : public MDefin
     inline LBoxAllocation useBoxOrTypedOrConstant(MDefinition* mir, bool useConstant);
 
     // Returns an int64 allocation for an Int64-typed instruction.
     inline LInt64Allocation useInt64(MDefinition* mir, LUse::Policy policy, bool useAtStart);
     inline LInt64Allocation useInt64(MDefinition* mir, bool useAtStart = false);
     inline LInt64Allocation useInt64AtStart(MDefinition* mir);
     inline LInt64Allocation useInt64OrConstant(MDefinition* mir, bool useAtStart = false);
     inline LInt64Allocation useInt64Register(MDefinition* mir, bool useAtStart = false);
+    inline LInt64Allocation useInt64RegisterOrConstant(MDefinition* mir, bool useAtStart = false);
     inline LInt64Allocation useInt64Fixed(MDefinition* mir, Register64 regs, bool useAtStart = false);
 
     LInt64Allocation useInt64RegisterAtStart(MDefinition* mir) {
         return useInt64Register(mir, /* useAtStart = */ true);
     }
+    LInt64Allocation useInt64RegisterOrConstantAtStart(MDefinition* mir) {
+        return useInt64RegisterOrConstant(mir, /* useAtStart = */ true);
+    }
     LInt64Allocation useInt64OrConstantAtStart(MDefinition* mir) {
         return useInt64OrConstant(mir, /* useAtStart = */ true);
     }
 
     // Rather than defining a new virtual register, sets |ins| to have the same
     // virtual register as |as|.
     inline void redefine(MDefinition* ins, MDefinition* as);
 
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -3888,17 +3888,17 @@ JS::CompileOptions::CompileOptions(JSCon
 {
     this->version = (version != JSVERSION_UNKNOWN) ? version : cx->findVersion();
 
     strictOption = cx->options().strictMode();
     extraWarningsOption = cx->compartment()->behaviors().extraWarnings(cx);
     werrorOption = cx->options().werror();
     if (!cx->options().asmJS())
         asmJSOption = AsmJSOption::Disabled;
-    else if (cx->compartment()->debuggerObservesWasm())
+    else if (cx->compartment()->debuggerObservesAsmJS())
         asmJSOption = AsmJSOption::DisabledByDebugger;
     else
         asmJSOption = AsmJSOption::Enabled;
     throwOnAsmJSValidationFailureOption = cx->options().throwOnAsmJSValidationFailure();
 }
 
 static bool
 Compile(JSContext* cx, const ReadOnlyCompileOptions& options, ScopeKind scopeKind,
--- a/js/src/jscompartment.cpp
+++ b/js/src/jscompartment.cpp
@@ -1083,17 +1083,17 @@ JSCompartment::ensureDelazifyScriptsForD
 }
 
 void
 JSCompartment::updateDebuggerObservesFlag(unsigned flag)
 {
     MOZ_ASSERT(isDebuggee());
     MOZ_ASSERT(flag == DebuggerObservesAllExecution ||
                flag == DebuggerObservesCoverage ||
-               flag == DebuggerObservesWasm);
+               flag == DebuggerObservesAsmJS);
 
     GlobalObject* global = zone()->runtimeFromMainThread()->gc.isForegroundSweeping()
                            ? unsafeUnbarrieredMaybeGlobal()
                            : maybeGlobal();
     const GlobalObject::DebuggerVector* v = global->getDebuggers();
     for (auto p = v->begin(); p != v->end(); p++) {
         Debugger* dbg = *p;
         if (flag == DebuggerObservesAllExecution ? dbg->observesAllExecution() :
--- a/js/src/jscompartment.h
+++ b/js/src/jscompartment.h
@@ -551,28 +551,28 @@ struct JSCompartment
      * slot for the former, or a special slot for the latter.
      */
     JSObject*                    gcIncomingGrayPointers;
 
   private:
     enum {
         IsDebuggee = 1 << 0,
         DebuggerObservesAllExecution = 1 << 1,
-        DebuggerObservesWasm = 1 << 2,
+        DebuggerObservesAsmJS = 1 << 2,
         DebuggerObservesCoverage = 1 << 3,
         DebuggerNeedsDelazification = 1 << 4
     };
 
     unsigned debugModeBits;
     friend class AutoRestoreCompartmentDebugMode;
 
     static const unsigned DebuggerObservesMask = IsDebuggee |
                                                  DebuggerObservesAllExecution |
                                                  DebuggerObservesCoverage |
-                                                 DebuggerObservesWasm;
+                                                 DebuggerObservesAsmJS;
 
     void updateDebuggerObservesFlag(unsigned flag);
 
     bool getNonWrapperObjectForCurrentCompartment(JSContext* cx, js::MutableHandleObject obj);
     bool getOrCreateWrapper(JSContext* cx, js::HandleObject existing, js::MutableHandleObject obj);
 
   public:
     JSCompartment(JS::Zone* zone, const JS::CompartmentOptions& options);
@@ -704,17 +704,17 @@ struct JSCompartment
     // invariants of JSCompartment's debug mode bits, JSScript::isDebuggee,
     // InterpreterFrame::isDebuggee, and BaselineFrame::isDebuggee are
     // enumerated below.
     //
     // 1. When a compartment's isDebuggee() == true, relazification and lazy
     //    parsing are disabled.
     //
     //    Whether AOT wasm is disabled is togglable by the Debugger API. By
-    //    default it is disabled. See debuggerObservesWasm below.
+    //    default it is disabled. See debuggerObservesAsmJS below.
     //
     // 2. When a compartment's debuggerObservesAllExecution() == true, all of
     //    the compartment's scripts are considered debuggee scripts.
     //
     // 3. A script is considered a debuggee script either when, per above, its
     //    compartment is observing all execution, or if it has breakpoints set.
     //
     // 4. A debuggee script always pushes a debuggee frame.
@@ -753,22 +753,22 @@ struct JSCompartment
     }
 
     // True if this compartment's global is a debuggee of some Debugger object
     // whose allowUnobservedAsmJS flag is false.
     //
     // Note that since AOT wasm functions cannot bail out, this flag really
     // means "observe wasm from this point forward". We cannot make
     // already-compiled wasm code observable to Debugger.
-    bool debuggerObservesWasm() const {
-        static const unsigned Mask = IsDebuggee | DebuggerObservesWasm;
+    bool debuggerObservesAsmJS() const {
+        static const unsigned Mask = IsDebuggee | DebuggerObservesAsmJS;
         return (debugModeBits & Mask) == Mask;
     }
-    void updateDebuggerObservesWasm() {
-        updateDebuggerObservesFlag(DebuggerObservesWasm);
+    void updateDebuggerObservesAsmJS() {
+        updateDebuggerObservesFlag(DebuggerObservesAsmJS);
     }
 
     // True if this compartment's global is a debuggee of some Debugger object
     // whose collectCoverageInfo flag is true.
     bool debuggerObservesCoverage() const {
         static const unsigned Mask = DebuggerObservesCoverage;
         return (debugModeBits & Mask) == Mask;
     }
--- a/js/src/jsscript.h
+++ b/js/src/jsscript.h
@@ -1898,27 +1898,28 @@ class LazyScript : public gc::TenuredCel
     // Add padding so LazyScript is gc::Cell aligned. Make padding protected
     // instead of private to suppress -Wunused-private-field compiler warnings.
   protected:
 #if JS_BITS_PER_WORD == 32
     uint32_t padding;
 #endif
 
   private:
+    static const uint32_t NumClosedOverBindingsBits = 21;
+    static const uint32_t NumInnerFunctionsBits = 20;
+
     struct PackedView {
         // Assorted bits that should really be in ScriptSourceObject.
         uint32_t version : 8;
 
         uint32_t shouldDeclareArguments : 1;
         uint32_t hasThisBinding : 1;
         uint32_t isAsync : 1;
-        // The number of bits should match to NumClosedOverBindingsLimit.
-        uint32_t numClosedOverBindings : 21;
-        // The number of bits should match to NumInnerFunctionsLimit.
-        uint32_t numInnerFunctions : 20;
+        uint32_t numClosedOverBindings : NumClosedOverBindingsBits;
+        uint32_t numInnerFunctions : NumInnerFunctionsBits;
 
         uint32_t generatorKindBits : 2;
 
         // N.B. These are booleans but need to be uint32_t to pack correctly on MSVC.
         // If you add another boolean here, make sure to initialze it in
         // LazyScript::CreateRaw().
         uint32_t strict : 1;
         uint32_t bindingsAccessedDynamically : 1;
@@ -1948,18 +1949,18 @@ class LazyScript : public gc::TenuredCel
     // Create a LazyScript without initializing the closedOverBindings and the
     // innerFunctions. To be GC-safe, the caller must initialize both vectors
     // with valid atoms and functions.
     static LazyScript* CreateRaw(ExclusiveContext* cx, HandleFunction fun,
                                  uint64_t packedData, uint32_t begin, uint32_t end,
                                  uint32_t lineno, uint32_t column);
 
   public:
-    static const uint32_t NumClosedOverBindingsLimit = 1 << 21;
-    static const uint32_t NumInnerFunctionsLimit = 1 << 20;
+    static const uint32_t NumClosedOverBindingsLimit = 1 << NumClosedOverBindingsBits;
+    static const uint32_t NumInnerFunctionsLimit = 1 << NumInnerFunctionsBits;
 
     // Create a LazyScript and initialize closedOverBindings and innerFunctions
     // with the provided vectors.
     static LazyScript* Create(ExclusiveContext* cx, HandleFunction fun,
                               const frontend::AtomVector& closedOverBindings,
                               Handle<GCVector<JSFunction*, 8>> innerFunctions,
                               JSVersion version, uint32_t begin, uint32_t end,
                               uint32_t lineno, uint32_t column);
--- a/js/src/old-configure.in
+++ b/js/src/old-configure.in
@@ -150,30 +150,31 @@ case "$target" in
 *-mingw*)
     if test "$GCC" != "yes"; then
         # Check to see if we are really running in a msvc environemnt
         _WIN32_MSVC=1
 
         # Make sure compilers are valid
         CFLAGS="$CFLAGS -TC -nologo"
         CXXFLAGS="$CXXFLAGS -TP -nologo"
+        if test -z "$CLANG_CL"; then
+            CFLAGS="$CFLAGS -utf-8"
+            CXXFLAGS="$CXXFLAGS -utf-8"
+        fi
         # MSVC warning C4345 warns of newly conformant behavior as of VS2003.
         # MSVC warning C4351 warns of newly conformant behavior as of VS2005.
         # MSVC warning C4800 warns when a value is implicitly cast to bool,
         # because this also forces narrowing to a single byte, which can be a
         # perf hit.  But this matters so little in practice (and often we want
         # that behavior) that it's better to turn it off.
         # _CRT_SECURE_NO_WARNINGS disables warnings about using MSVC-specific
         # secure CRT functions.
-        # MSVC warning C4819 warns some UTF-8 characters (e.g. copyright sign)
-        # on non-Western system locales even if it is in a comment.
         # MSVC warning wd4595 warns non-member operator new or delete functions
         # may not be declared inline, as of VS2015 Update 2.
-        CFLAGS="$CFLAGS -wd4819"
-        CXXFLAGS="$CXXFLAGS -wd4345 -wd4351 -wd4800 -wd4819 -wd4595 -D_CRT_SECURE_NO_WARNINGS"
+        CXXFLAGS="$CXXFLAGS -wd4345 -wd4351 -wd4800 -wd4595 -D_CRT_SECURE_NO_WARNINGS"
         AC_LANG_SAVE
         AC_LANG_C
         AC_TRY_COMPILE([#include <stdio.h>],
             [ printf("Hello World\n"); ],,
             AC_MSG_ERROR([\$(CC) test failed.  You must have MS VC++ in your path to build.]) )
 
         AC_LANG_CPLUSPLUS
         AC_TRY_COMPILE([#include <new.h>],
--- a/js/src/tests/ecma_5/String/string-space-trim.js
+++ b/js/src/tests/ecma_5/String/string-space-trim.js
@@ -1,16 +1,16 @@
 /* Generated by make_unicode.py DO NOT MODIFY */
-/* Unicode version: 6.2.0 */
+/* Unicode version: 9.0.0 */
 
 /*
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/licenses/publicdomain/
  */
-var onlySpace = String.fromCharCode(0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000, 0xfeff);
+var onlySpace = String.fromCharCode(0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000, 0xfeff);
 
 assertEq(onlySpace.trim(), "");
 assertEq((onlySpace + 'aaaa').trim(), 'aaaa');
 assertEq(('aaaa' + onlySpace).trim(), 'aaaa');
 assertEq((onlySpace + 'aaaa' + onlySpace).trim(), 'aaaa');
 
 if (typeof reportCompare === "function")
     reportCompare(true, true);
--- a/js/src/tests/ecma_5/String/string-upper-lower-mapping.js
+++ b/js/src/tests/ecma_5/String/string-upper-lower-mapping.js
@@ -1,10 +1,10 @@
 /* Generated by make_unicode.py DO NOT MODIFY */
-/* Unicode version: 6.2.0 */
+/* Unicode version: 9.0.0 */
 
 /*
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/licenses/publicdomain/
  */
 var mapping = [
   [0x0, 0x0], /* <control> (NULL) */
   [0x1, 0x1], /* <control> (START OF HEADING) */
@@ -605,33 +605,33 @@ var mapping = [
   [0x186, 0x254], /* LATIN SMALL LETTER OPEN O */
   [0x255, 0x255], /* LATIN SMALL LETTER C WITH CURL (LATIN SMALL LETTER C CURL) */
   [0x189, 0x256], /* LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) */
   [0x18a, 0x257], /* LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) */
   [0x258, 0x258], /* LATIN SMALL LETTER REVERSED E */
   [0x18f, 0x259], /* LATIN SMALL LETTER SCHWA */
   [0x25a, 0x25a], /* LATIN SMALL LETTER SCHWA WITH HOOK (LATIN SMALL LETTER SCHWA HOOK) */
   [0x190, 0x25b], /* LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) */
-  [0x25c, 0x25c], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */
+  [0xa7ab, 0x25c], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */
   [0x25d, 0x25d], /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK (LATIN SMALL LETTER REVERSED EPSILON HOOK) */
   [0x25e, 0x25e], /* LATIN SMALL LETTER CLOSED REVERSED OPEN E (LATIN SMALL LETTER CLOSED REVERSED EPSILON) */
   [0x25f, 0x25f], /* LATIN SMALL LETTER DOTLESS J WITH STROKE (LATIN SMALL LETTER DOTLESS J BAR) */
   [0x193, 0x260], /* LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) */
-  [0x261, 0x261], /* LATIN SMALL LETTER SCRIPT G */
+  [0xa7ac, 0x261], /* LATIN SMALL LETTER SCRIPT G */
   [0x262, 0x262], /* LATIN LETTER SMALL CAPITAL G */
   [0x194, 0x263], /* LATIN SMALL LETTER GAMMA */
   [0x264, 0x264], /* LATIN SMALL LETTER RAMS HORN (LATIN SMALL LETTER BABY GAMMA) */
   [0xa78d, 0x265], /* LATIN SMALL LETTER TURNED H */
   [0xa7aa, 0x266], /* LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) */
   [0x267, 0x267], /* LATIN SMALL LETTER HENG WITH HOOK (LATIN SMALL LETTER HENG HOOK) */
   [0x197, 0x268], /* LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) */
   [0x196, 0x269], /* LATIN SMALL LETTER IOTA */
-  [0x26a, 0x26a], /* LATIN LETTER SMALL CAPITAL I */
+  [0xa7ae, 0x26a], /* LATIN LETTER SMALL CAPITAL I */
   [0x2c62, 0x26b], /* LATIN SMALL LETTER L WITH MIDDLE TILDE */
-  [0x26c, 0x26c], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */
+  [0xa7ad, 0x26c], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */
   [0x26d, 0x26d], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK (LATIN SMALL LETTER L RETROFLEX HOOK) */
   [0x26e, 0x26e], /* LATIN SMALL LETTER LEZH (LATIN SMALL LETTER L YOGH) */
   [0x19c, 0x26f], /* LATIN SMALL LETTER TURNED M */
   [0x270, 0x270], /* LATIN SMALL LETTER TURNED M WITH LONG LEG */
   [0x2c6e, 0x271], /* LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) */
   [0x19d, 0x272], /* LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) */
   [0x273, 0x273], /* LATIN SMALL LETTER N WITH RETROFLEX HOOK (LATIN SMALL LETTER N RETROFLEX HOOK) */
   [0x274, 0x274], /* LATIN LETTER SMALL CAPITAL N */
@@ -648,17 +648,17 @@ var mapping = [
   [0x27f, 0x27f], /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK (LATIN SMALL LETTER REVERSED FISHHOOK R) */
   [0x1a6, 0x280], /* LATIN LETTER SMALL CAPITAL R */
   [0x281, 0x281], /* LATIN LETTER SMALL CAPITAL INVERTED R */
   [0x282, 0x282], /* LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) */
   [0x1a9, 0x283], /* LATIN SMALL LETTER ESH */
   [0x284, 0x284], /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK (LATIN SMALL LETTER DOTLESS J BAR HOOK) */
   [0x285, 0x285], /* LATIN SMALL LETTER SQUAT REVERSED ESH */
   [0x286, 0x286], /* LATIN SMALL LETTER ESH WITH CURL (LATIN SMALL LETTER ESH CURL) */
-  [0x287, 0x287], /* LATIN SMALL LETTER TURNED T */
+  [0xa7b1, 0x287], /* LATIN SMALL LETTER TURNED T */
   [0x1ae, 0x288], /* LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) */
   [0x244, 0x289], /* LATIN SMALL LETTER U BAR */
   [0x1b1, 0x28a], /* LATIN SMALL LETTER UPSILON */
   [0x1b2, 0x28b], /* LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) */
   [0x245, 0x28c], /* LATIN SMALL LETTER TURNED V */
   [0x28d, 0x28d], /* LATIN SMALL LETTER TURNED W */
   [0x28e, 0x28e], /* LATIN SMALL LETTER TURNED Y */
   [0x28f, 0x28f], /* LATIN LETTER SMALL CAPITAL Y */
@@ -670,18 +670,18 @@ var mapping = [
   [0x295, 0x295], /* LATIN LETTER PHARYNGEAL VOICED FRICATIVE (LATIN LETTER REVERSED GLOTTAL STOP) */
   [0x296, 0x296], /* LATIN LETTER INVERTED GLOTTAL STOP */
   [0x297, 0x297], /* LATIN LETTER STRETCHED C */
   [0x298, 0x298], /* LATIN LETTER BILABIAL CLICK (LATIN LETTER BULLSEYE) */
   [0x299, 0x299], /* LATIN LETTER SMALL CAPITAL B */
   [0x29a, 0x29a], /* LATIN SMALL LETTER CLOSED OPEN E (LATIN SMALL LETTER CLOSED EPSILON) */
   [0x29b, 0x29b], /* LATIN LETTER SMALL CAPITAL G WITH HOOK (LATIN LETTER SMALL CAPITAL G HOOK) */
   [0x29c, 0x29c], /* LATIN LETTER SMALL CAPITAL H */
-  [0x29d, 0x29d], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */
-  [0x29e, 0x29e], /* LATIN SMALL LETTER TURNED K */
+  [0xa7b2, 0x29d], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */
+  [0xa7b0, 0x29e], /* LATIN SMALL LETTER TURNED K */
   [0x29f, 0x29f], /* LATIN LETTER SMALL CAPITAL L */
   [0x2a0, 0x2a0], /* LATIN SMALL LETTER Q WITH HOOK (LATIN SMALL LETTER Q HOOK) */
   [0x2a1, 0x2a1], /* LATIN LETTER GLOTTAL STOP WITH STROKE (LATIN LETTER GLOTTAL STOP BAR) */
   [0x2a2, 0x2a2], /* LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE (LATIN LETTER REVERSED GLOTTAL STOP BAR) */
   [0x2a3, 0x2a3], /* LATIN SMALL LETTER DZ DIGRAPH (LATIN SMALL LETTER D Z) */
   [0x2a4, 0x2a4], /* LATIN SMALL LETTER DEZH DIGRAPH (LATIN SMALL LETTER D YOGH) */
   [0x2a5, 0x2a5], /* LATIN SMALL LETTER DZ DIGRAPH WITH CURL (LATIN SMALL LETTER D Z CURL) */
   [0x2a6, 0x2a6], /* LATIN SMALL LETTER TS DIGRAPH (LATIN SMALL LETTER T S) */
@@ -896,17 +896,17 @@ var mapping = [
   [0x376, 0x377], /* GREEK SMALL LETTER PAMPHYLIAN DIGAMMA */
   [0x378, 0x378],
   [0x379, 0x379],
   [0x37a, 0x37a], /* GREEK YPOGEGRAMMENI (GREEK SPACING IOTA BELOW) */
   [0x3fd, 0x37b], /* GREEK SMALL REVERSED LUNATE SIGMA SYMBOL */
   [0x3fe, 0x37c], /* GREEK SMALL DOTTED LUNATE SIGMA SYMBOL */
   [0x3ff, 0x37d], /* GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL */
   [0x37e, 0x37e], /* GREEK QUESTION MARK */
-  [0x37f, 0x37f],
+  [0x37f, 0x3f3], /* GREEK CAPITAL LETTER YOT */
   [0x380, 0x380],
   [0x381, 0x381],
   [0x382, 0x382],
   [0x383, 0x383],
   [0x384, 0x384], /* GREEK TONOS (GREEK SPACING TONOS) */
   [0x385, 0x385], /* GREEK DIALYTIKA TONOS (GREEK SPACING DIAERESIS TONOS) */
   [0x386, 0x3ac], /* GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) */
   [0x387, 0x387], /* GREEK ANO TELEIA */
@@ -1012,17 +1012,17 @@ var mapping = [
   [0x3ea, 0x3eb], /* COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) */
   [0x3ec, 0x3ed], /* COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) */
   [0x3ec, 0x3ed], /* COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) */
   [0x3ee, 0x3ef], /* COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) */
   [0x3ee, 0x3ef], /* COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) */
   [0x39a, 0x3f0], /* GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) */
   [0x3a1, 0x3f1], /* GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) */
   [0x3f9, 0x3f2], /* GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) */
-  [0x3f3, 0x3f3], /* GREEK LETTER YOT */
+  [0x37f, 0x3f3], /* GREEK LETTER YOT */
   [0x3f4, 0x3b8], /* GREEK CAPITAL THETA SYMBOL */
   [0x395, 0x3f5], /* GREEK LUNATE EPSILON SYMBOL */
   [0x3f6, 0x3f6], /* GREEK REVERSED LUNATE EPSILON SYMBOL */
   [0x3f7, 0x3f8], /* GREEK CAPITAL LETTER SHO */
   [0x3f7, 0x3f8], /* GREEK SMALL LETTER SHO */
   [0x3f9, 0x3f2], /* GREEK CAPITAL LUNATE SIGMA SYMBOL */
   [0x3fa, 0x3fb], /* GREEK CAPITAL LETTER SAN */
   [0x3fa, 0x3fb], /* GREEK SMALL LETTER SAN */
@@ -1321,24 +1321,24 @@ var mapping = [
   [0x520, 0x521], /* CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK */
   [0x520, 0x521], /* CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK */
   [0x522, 0x523], /* CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK */
   [0x522, 0x523], /* CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK */
   [0x524, 0x525], /* CYRILLIC CAPITAL LETTER PE WITH DESCENDER */
   [0x524, 0x525], /* CYRILLIC SMALL LETTER PE WITH DESCENDER */
   [0x526, 0x527], /* CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER */
   [0x526, 0x527], /* CYRILLIC SMALL LETTER SHHA WITH DESCENDER */
-  [0x528, 0x528],
-  [0x529, 0x529],
-  [0x52a, 0x52a],
-  [0x52b, 0x52b],
-  [0x52c, 0x52c],
-  [0x52d, 0x52d],
-  [0x52e, 0x52e],
-  [0x52f, 0x52f],
+  [0x528, 0x529], /* CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK */
+  [0x528, 0x529], /* CYRILLIC SMALL LETTER EN WITH LEFT HOOK */
+  [0x52a, 0x52b], /* CYRILLIC CAPITAL LETTER DZZHE */
+  [0x52a, 0x52b], /* CYRILLIC SMALL LETTER DZZHE */
+  [0x52c, 0x52d], /* CYRILLIC CAPITAL LETTER DCHE */
+  [0x52c, 0x52d], /* CYRILLIC SMALL LETTER DCHE */
+  [0x52e, 0x52f], /* CYRILLIC CAPITAL LETTER EL WITH DESCENDER */
+  [0x52e, 0x52f], /* CYRILLIC SMALL LETTER EL WITH DESCENDER */
   [0x530, 0x530],
   [0x531, 0x561], /* ARMENIAN CAPITAL LETTER AYB */
   [0x532, 0x562], /* ARMENIAN CAPITAL LETTER BEN */
   [0x533, 0x563], /* ARMENIAN CAPITAL LETTER GIM */
   [0x534, 0x564], /* ARMENIAN CAPITAL LETTER DA */
   [0x535, 0x565], /* ARMENIAN CAPITAL LETTER ECH */
   [0x536, 0x566], /* ARMENIAN CAPITAL LETTER ZA */
   [0x537, 0x567], /* ARMENIAN CAPITAL LETTER EH */
@@ -1422,18 +1422,18 @@ var mapping = [
   [0x555, 0x585], /* ARMENIAN SMALL LETTER OH */
   [0x556, 0x586], /* ARMENIAN SMALL LETTER FEH */
   [0x587, 0x587], /* ARMENIAN SMALL LIGATURE ECH YIWN */
   [0x588, 0x588],
   [0x589, 0x589], /* ARMENIAN FULL STOP (ARMENIAN PERIOD) */
   [0x58a, 0x58a], /* ARMENIAN HYPHEN */
   [0x58b, 0x58b],
   [0x58c, 0x58c],
-  [0x58d, 0x58d],
-  [0x58e, 0x58e],
+  [0x58d, 0x58d], /* RIGHT-FACING ARMENIAN ETERNITY SIGN */
+  [0x58e, 0x58e], /* LEFT-FACING ARMENIAN ETERNITY SIGN */
   [0x58f, 0x58f], /* ARMENIAN DRAM SIGN */
   [0x590, 0x590],
   [0x591, 0x591], /* HEBREW ACCENT ETNAHTA */
   [0x592, 0x592], /* HEBREW ACCENT SEGOL */
   [0x593, 0x593], /* HEBREW ACCENT SHALSHELET */
   [0x594, 0x594], /* HEBREW ACCENT ZAQEF QATAN */
   [0x595, 0x595], /* HEBREW ACCENT ZAQEF GADOL */
   [0x596, 0x596], /* HEBREW ACCENT TIPEHA */
@@ -1542,17 +1542,17 @@ var mapping = [
   [0x5fd, 0x5fd],
   [0x5fe, 0x5fe],
   [0x5ff, 0x5ff],
   [0x600, 0x600], /* ARABIC NUMBER SIGN */
   [0x601, 0x601], /* ARABIC SIGN SANAH */
   [0x602, 0x602], /* ARABIC FOOTNOTE MARKER */
   [0x603, 0x603], /* ARABIC SIGN SAFHA */
   [0x604, 0x604], /* ARABIC SIGN SAMVAT */
-  [0x605, 0x605],
+  [0x605, 0x605], /* ARABIC NUMBER MARK ABOVE */
   [0x606, 0x606], /* ARABIC-INDIC CUBE ROOT */
   [0x607, 0x607], /* ARABIC-INDIC FOURTH ROOT */
   [0x608, 0x608], /* ARABIC RAY */
   [0x609, 0x609], /* ARABIC-INDIC PER MILLE SIGN */
   [0x60a, 0x60a], /* ARABIC-INDIC PER TEN THOUSAND SIGN */
   [0x60b, 0x60b], /* AFGHANI SIGN */
   [0x60c, 0x60c], /* ARABIC COMMA */
   [0x60d, 0x60d], /* ARABIC DATE SEPARATOR */
@@ -1565,17 +1565,17 @@ var mapping = [
   [0x614, 0x614], /* ARABIC SIGN TAKHALLUS */
   [0x615, 0x615], /* ARABIC SMALL HIGH TAH */
   [0x616, 0x616], /* ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH */
   [0x617, 0x617], /* ARABIC SMALL HIGH ZAIN */
   [0x618, 0x618], /* ARABIC SMALL FATHA */
   [0x619, 0x619], /* ARABIC SMALL DAMMA */
   [0x61a, 0x61a], /* ARABIC SMALL KASRA */
   [0x61b, 0x61b], /* ARABIC SEMICOLON */
-  [0x61c, 0x61c],
+  [0x61c, 0x61c], /* ARABIC LETTER MARK */
   [0x61d, 0x61d],
   [0x61e, 0x61e], /* ARABIC TRIPLE DOT PUNCTUATION MARK */
   [0x61f, 0x61f], /* ARABIC QUESTION MARK */
   [0x620, 0x620], /* ARABIC LETTER KASHMIRI YEH */
   [0x621, 0x621], /* ARABIC LETTER HAMZA (ARABIC LETTER HAMZAH) */
   [0x622, 0x622], /* ARABIC LETTER ALEF WITH MADDA ABOVE (ARABIC LETTER MADDAH ON ALEF) */
   [0x623, 0x623], /* ARABIC LETTER ALEF WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON ALEF) */
   [0x624, 0x624], /* ARABIC LETTER WAW WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON WAW) */
@@ -2210,45 +2210,45 @@ var mapping = [
   [0x899, 0x899],
   [0x89a, 0x89a],
   [0x89b, 0x89b],
   [0x89c, 0x89c],
   [0x89d, 0x89d],
   [0x89e, 0x89e],
   [0x89f, 0x89f],
   [0x8a0, 0x8a0], /* ARABIC LETTER BEH WITH SMALL V BELOW */
-  [0x8a1, 0x8a1],
+  [0x8a1, 0x8a1], /* ARABIC LETTER BEH WITH HAMZA ABOVE */
   [0x8a2, 0x8a2], /* ARABIC LETTER JEEM WITH TWO DOTS ABOVE */
   [0x8a3, 0x8a3], /* ARABIC LETTER TAH WITH TWO DOTS ABOVE */
   [0x8a4, 0x8a4], /* ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE */
   [0x8a5, 0x8a5], /* ARABIC LETTER QAF WITH DOT BELOW */
   [0x8a6, 0x8a6], /* ARABIC LETTER LAM WITH DOUBLE BAR */
   [0x8a7, 0x8a7], /* ARABIC LETTER MEEM WITH THREE DOTS ABOVE */
   [0x8a8, 0x8a8], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE */
   [0x8a9, 0x8a9], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE */
   [0x8aa, 0x8aa], /* ARABIC LETTER REH WITH LOOP */
   [0x8ab, 0x8ab], /* ARABIC LETTER WAW WITH DOT WITHIN */
   [0x8ac, 0x8ac], /* ARABIC LETTER ROHINGYA YEH */
-  [0x8ad, 0x8ad],
-  [0x8ae, 0x8ae],
-  [0x8af, 0x8af],
-  [0x8b0, 0x8b0],
-  [0x8b1, 0x8b1],
-  [0x8b2, 0x8b2],
-  [0x8b3, 0x8b3],
-  [0x8b4, 0x8b4],
+  [0x8ad, 0x8ad], /* ARABIC LETTER LOW ALEF */
+  [0x8ae, 0x8ae], /* ARABIC LETTER DAL WITH THREE DOTS BELOW */
+  [0x8af, 0x8af], /* ARABIC LETTER SAD WITH THREE DOTS BELOW */
+  [0x8b0, 0x8b0], /* ARABIC LETTER GAF WITH INVERTED STROKE */
+  [0x8b1, 0x8b1], /* ARABIC LETTER STRAIGHT WAW */
+  [0x8b2, 0x8b2], /* ARABIC LETTER ZAIN WITH INVERTED V ABOVE */
+  [0x8b3, 0x8b3], /* ARABIC LETTER AIN WITH THREE DOTS BELOW */
+  [0x8b4, 0x8b4], /* ARABIC LETTER KAF WITH DOT BELOW */
   [0x8b5, 0x8b5],
-  [0x8b6, 0x8b6],
-  [0x8b7, 0x8b7],
-  [0x8b8, 0x8b8],
-  [0x8b9, 0x8b9],
-  [0x8ba, 0x8ba],
-  [0x8bb, 0x8bb],
-  [0x8bc, 0x8bc],
-  [0x8bd, 0x8bd],
+  [0x8b6, 0x8b6], /* ARABIC LETTER BEH WITH SMALL MEEM ABOVE */
+  [0x8b7, 0x8b7], /* ARABIC LETTER PEH WITH SMALL MEEM ABOVE */
+  [0x8b8, 0x8b8], /* ARABIC LETTER TEH WITH SMALL TEH ABOVE */
+  [0x8b9, 0x8b9], /* ARABIC LETTER REH WITH SMALL NOON ABOVE */
+  [0x8ba, 0x8ba], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE */
+  [0x8bb, 0x8bb], /* ARABIC LETTER AFRICAN FEH */
+  [0x8bc, 0x8bc], /* ARABIC LETTER AFRICAN QAF */
+  [0x8bd, 0x8bd], /* ARABIC LETTER AFRICAN NOON */
   [0x8be, 0x8be],
   [0x8bf, 0x8bf],
   [0x8c0, 0x8c0],
   [0x8c1, 0x8c1],
   [0x8c2, 0x8c2],
   [0x8c3, 0x8c3],
   [0x8c4, 0x8c4],
   [0x8c5, 0x8c5],
@@ -2261,32 +2261,32 @@ var mapping = [
   [0x8cc, 0x8cc],
   [0x8cd, 0x8cd],
   [0x8ce, 0x8ce],
   [0x8cf, 0x8cf],
   [0x8d0, 0x8d0],
   [0x8d1, 0x8d1],
   [0x8d2, 0x8d2],
   [0x8d3, 0x8d3],
-  [0x8d4, 0x8d4],
-  [0x8d5, 0x8d5],
-  [0x8d6, 0x8d6],
-  [0x8d7, 0x8d7],
-  [0x8d8, 0x8d8],
-  [0x8d9, 0x8d9],
-  [0x8da, 0x8da],
-  [0x8db, 0x8db],
-  [0x8dc, 0x8dc],
-  [0x8dd, 0x8dd],
-  [0x8de, 0x8de],
-  [0x8df, 0x8df],
-  [0x8e0, 0x8e0],
-  [0x8e1, 0x8e1],
-  [0x8e2, 0x8e2],
-  [0x8e3, 0x8e3],
+  [0x8d4, 0x8d4], /* ARABIC SMALL HIGH WORD AR-RUB */
+  [0x8d5, 0x8d5], /* ARABIC SMALL HIGH SAD */
+  [0x8d6, 0x8d6], /* ARABIC SMALL HIGH AIN */
+  [0x8d7, 0x8d7], /* ARABIC SMALL HIGH QAF */
+  [0x8d8, 0x8d8], /* ARABIC SMALL HIGH NOON WITH KASRA */
+  [0x8d9, 0x8d9], /* ARABIC SMALL LOW NOON WITH KASRA */
+  [0x8da, 0x8da], /* ARABIC SMALL HIGH WORD ATH-THALATHA */
+  [0x8db, 0x8db], /* ARABIC SMALL HIGH WORD AS-SAJDA */
+  [0x8dc, 0x8dc], /* ARABIC SMALL HIGH WORD AN-NISF */
+  [0x8dd, 0x8dd], /* ARABIC SMALL HIGH WORD SAKTA */
+  [0x8de, 0x8de], /* ARABIC SMALL HIGH WORD QIF */
+  [0x8df, 0x8df], /* ARABIC SMALL HIGH WORD WAQFA */
+  [0x8e0, 0x8e0], /* ARABIC SMALL HIGH FOOTNOTE MARKER */
+  [0x8e1, 0x8e1], /* ARABIC SMALL HIGH SIGN SAFHA */
+  [0x8e2, 0x8e2], /* ARABIC DISPUTED END OF AYAH */
+  [0x8e3, 0x8e3], /* ARABIC TURNED DAMMA BELOW */
   [0x8e4, 0x8e4], /* ARABIC CURLY FATHA */
   [0x8e5, 0x8e5], /* ARABIC CURLY DAMMA */
   [0x8e6, 0x8e6], /* ARABIC CURLY KASRA */
   [0x8e7, 0x8e7], /* ARABIC CURLY FATHATAN */
   [0x8e8, 0x8e8], /* ARABIC CURLY DAMMATAN */
   [0x8e9, 0x8e9], /* ARABIC CURLY KASRATAN */
   [0x8ea, 0x8ea], /* ARABIC TONE ONE DOT ABOVE */
   [0x8eb, 0x8eb], /* ARABIC TONE TWO DOTS ABOVE */
@@ -2304,17 +2304,17 @@ var mapping = [
   [0x8f7, 0x8f7], /* ARABIC LEFT ARROWHEAD ABOVE */
   [0x8f8, 0x8f8], /* ARABIC RIGHT ARROWHEAD ABOVE */
   [0x8f9, 0x8f9], /* ARABIC LEFT ARROWHEAD BELOW */
   [0x8fa, 0x8fa], /* ARABIC RIGHT ARROWHEAD BELOW */
   [0x8fb, 0x8fb], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE */
   [0x8fc, 0x8fc], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT */
   [0x8fd, 0x8fd], /* ARABIC RIGHT ARROWHEAD ABOVE WITH DOT */
   [0x8fe, 0x8fe], /* ARABIC DAMMA WITH DOT */
-  [0x8ff, 0x8ff],
+  [0x8ff, 0x8ff], /* ARABIC MARK SIDEWAYS NOON GHUNNA */
   [0x900, 0x900], /* DEVANAGARI SIGN INVERTED CANDRABINDU */
   [0x901, 0x901], /* DEVANAGARI SIGN CANDRABINDU */
   [0x902, 0x902], /* DEVANAGARI SIGN ANUSVARA */
   [0x903, 0x903], /* DEVANAGARI SIGN VISARGA */
   [0x904, 0x904], /* DEVANAGARI LETTER SHORT A */
   [0x905, 0x905], /* DEVANAGARI LETTER A */
   [0x906, 0x906], /* DEVANAGARI LETTER AA */
   [0x907, 0x907], /* DEVANAGARI LETTER I */
@@ -2425,25 +2425,25 @@ var mapping = [
   [0x970, 0x970], /* DEVANAGARI ABBREVIATION SIGN */
   [0x971, 0x971], /* DEVANAGARI SIGN HIGH SPACING DOT */
   [0x972, 0x972], /* DEVANAGARI LETTER CANDRA A */
   [0x973, 0x973], /* DEVANAGARI LETTER OE */
   [0x974, 0x974], /* DEVANAGARI LETTER OOE */
   [0x975, 0x975], /* DEVANAGARI LETTER AW */
   [0x976, 0x976], /* DEVANAGARI LETTER UE */
   [0x977, 0x977], /* DEVANAGARI LETTER UUE */
-  [0x978, 0x978],
+  [0x978, 0x978], /* DEVANAGARI LETTER MARWARI DDA */
   [0x979, 0x979], /* DEVANAGARI LETTER ZHA */
   [0x97a, 0x97a], /* DEVANAGARI LETTER HEAVY YA */
   [0x97b, 0x97b], /* DEVANAGARI LETTER GGA */
   [0x97c, 0x97c], /* DEVANAGARI LETTER JJA */
   [0x97d, 0x97d], /* DEVANAGARI LETTER GLOTTAL STOP */
   [0x97e, 0x97e], /* DEVANAGARI LETTER DDDA */
   [0x97f, 0x97f], /* DEVANAGARI LETTER BBA */
-  [0x980, 0x980],
+  [0x980, 0x980], /* BENGALI ANJI */
   [0x981, 0x981], /* BENGALI SIGN CANDRABINDU */
   [0x982, 0x982], /* BENGALI SIGN ANUSVARA */
   [0x983, 0x983], /* BENGALI SIGN VISARGA */
   [0x984, 0x984],
   [0x985, 0x985], /* BENGALI LETTER A */
   [0x986, 0x986], /* BENGALI LETTER AA */
   [0x987, 0x987], /* BENGALI LETTER I */
   [0x988, 0x988], /* BENGALI LETTER II */
@@ -2810,17 +2810,17 @@ var mapping = [
   [0xaf1, 0xaf1], /* GUJARATI RUPEE SIGN */
   [0xaf2, 0xaf2],
   [0xaf3, 0xaf3],
   [0xaf4, 0xaf4],
   [0xaf5, 0xaf5],
   [0xaf6, 0xaf6],
   [0xaf7, 0xaf7],
   [0xaf8, 0xaf8],
-  [0xaf9, 0xaf9],
+  [0xaf9, 0xaf9], /* GUJARATI LETTER ZHA */
   [0xafa, 0xafa],
   [0xafb, 0xafb],
   [0xafc, 0xafc],
   [0xafd, 0xafd],
   [0xafe, 0xafe],
   [0xaff, 0xaff],
   [0xb00, 0xb00],
   [0xb01, 0xb01], /* ORIYA SIGN CANDRABINDU */
@@ -3073,17 +3073,17 @@ var mapping = [
   [0xbf8, 0xbf8], /* TAMIL AS ABOVE SIGN */
   [0xbf9, 0xbf9], /* TAMIL RUPEE SIGN */
   [0xbfa, 0xbfa], /* TAMIL NUMBER SIGN */
   [0xbfb, 0xbfb],
   [0xbfc, 0xbfc],
   [0xbfd, 0xbfd],
   [0xbfe, 0xbfe],
   [0xbff, 0xbff],
-  [0xc00, 0xc00],
+  [0xc00, 0xc00], /* TELUGU SIGN COMBINING CANDRABINDU ABOVE */
   [0xc01, 0xc01], /* TELUGU SIGN CANDRABINDU */
   [0xc02, 0xc02], /* TELUGU SIGN ANUSVARA */
   [0xc03, 0xc03], /* TELUGU SIGN VISARGA */
   [0xc04, 0xc04],
   [0xc05, 0xc05], /* TELUGU LETTER A */
   [0xc06, 0xc06], /* TELUGU LETTER AA */
   [0xc07, 0xc07], /* TELUGU LETTER I */
   [0xc08, 0xc08], /* TELUGU LETTER II */
@@ -3125,17 +3125,17 @@ var mapping = [
   [0xc2c, 0xc2c], /* TELUGU LETTER BA */
   [0xc2d, 0xc2d], /* TELUGU LETTER BHA */
   [0xc2e, 0xc2e], /* TELUGU LETTER MA */
   [0xc2f, 0xc2f], /* TELUGU LETTER YA */
   [0xc30, 0xc30], /* TELUGU LETTER RA */
   [0xc31, 0xc31], /* TELUGU LETTER RRA */
   [0xc32, 0xc32], /* TELUGU LETTER LA */
   [0xc33, 0xc33], /* TELUGU LETTER LLA */
-  [0xc34, 0xc34],
+  [0xc34, 0xc34], /* TELUGU LETTER LLLA */
   [0xc35, 0xc35], /* TELUGU LETTER VA */
   [0xc36, 0xc36], /* TELUGU LETTER SHA */
   [0xc37, 0xc37], /* TELUGU LETTER SSA */
   [0xc38, 0xc38], /* TELUGU LETTER SA */
   [0xc39, 0xc39], /* TELUGU LETTER HA */
   [0xc3a, 0xc3a],
   [0xc3b, 0xc3b],
   [0xc3c, 0xc3c],
@@ -3163,17 +3163,17 @@ var mapping = [
   [0xc52, 0xc52],
   [0xc53, 0xc53],
   [0xc54, 0xc54],
   [0xc55, 0xc55], /* TELUGU LENGTH MARK */
   [0xc56, 0xc56], /* TELUGU AI LENGTH MARK */
   [0xc57, 0xc57],
   [0xc58, 0xc58], /* TELUGU LETTER TSA */
   [0xc59, 0xc59], /* TELUGU LETTER DZA */
-  [0xc5a, 0xc5a],
+  [0xc5a, 0xc5a], /* TELUGU LETTER RRRA */
   [0xc5b, 0xc5b],
   [0xc5c, 0xc5c],
   [0xc5d, 0xc5d],
   [0xc5e, 0xc5e],
   [0xc5f, 0xc5f],
   [0xc60, 0xc60], /* TELUGU LETTER VOCALIC RR */
   [0xc61, 0xc61], /* TELUGU LETTER VOCALIC LL */
   [0xc62, 0xc62], /* TELUGU VOWEL SIGN VOCALIC L */
@@ -3201,18 +3201,18 @@ var mapping = [
   [0xc78, 0xc78], /* TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR */
   [0xc79, 0xc79], /* TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR */
   [0xc7a, 0xc7a], /* TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR */
   [0xc7b, 0xc7b], /* TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR */
   [0xc7c, 0xc7c], /* TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR */
   [0xc7d, 0xc7d], /* TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR */
   [0xc7e, 0xc7e], /* TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR */
   [0xc7f, 0xc7f], /* TELUGU SIGN TUUMU */
-  [0xc80, 0xc80],
-  [0xc81, 0xc81],
+  [0xc80, 0xc80], /* KANNADA SIGN SPACING CANDRABINDU */
+  [0xc81, 0xc81], /* KANNADA SIGN CANDRABINDU */
   [0xc82, 0xc82], /* KANNADA SIGN ANUSVARA */
   [0xc83, 0xc83], /* KANNADA SIGN VISARGA */
   [0xc84, 0xc84],
   [0xc85, 0xc85], /* KANNADA LETTER A */
   [0xc86, 0xc86], /* KANNADA LETTER AA */
   [0xc87, 0xc87], /* KANNADA LETTER I */
   [0xc88, 0xc88], /* KANNADA LETTER II */
   [0xc89, 0xc89], /* KANNADA LETTER U */
@@ -3330,17 +3330,17 @@ var mapping = [
   [0xcf9, 0xcf9],
   [0xcfa, 0xcfa],
   [0xcfb, 0xcfb],
   [0xcfc, 0xcfc],
   [0xcfd, 0xcfd],
   [0xcfe, 0xcfe],
   [0xcff, 0xcff],
   [0xd00, 0xd00],
-  [0xd01, 0xd01],
+  [0xd01, 0xd01], /* MALAYALAM SIGN CANDRABINDU */
   [0xd02, 0xd02], /* MALAYALAM SIGN ANUSVARA */
   [0xd03, 0xd03], /* MALAYALAM SIGN VISARGA */
   [0xd04, 0xd04],
   [0xd05, 0xd05], /* MALAYALAM LETTER A */
   [0xd06, 0xd06], /* MALAYALAM LETTER AA */
   [0xd07, 0xd07], /* MALAYALAM LETTER I */
   [0xd08, 0xd08], /* MALAYALAM LETTER II */
   [0xd09, 0xd09], /* MALAYALAM LETTER U */
@@ -3408,33 +3408,33 @@ var mapping = [
   [0xd47, 0xd47], /* MALAYALAM VOWEL SIGN EE */
   [0xd48, 0xd48], /* MALAYALAM VOWEL SIGN AI */
   [0xd49, 0xd49],
   [0xd4a, 0xd4a], /* MALAYALAM VOWEL SIGN O */
   [0xd4b, 0xd4b], /* MALAYALAM VOWEL SIGN OO */
   [0xd4c, 0xd4c], /* MALAYALAM VOWEL SIGN AU */
   [0xd4d, 0xd4d], /* MALAYALAM SIGN VIRAMA */
   [0xd4e, 0xd4e], /* MALAYALAM LETTER DOT REPH */
-  [0xd4f, 0xd4f],
+  [0xd4f, 0xd4f], /* MALAYALAM SIGN PARA */
   [0xd50, 0xd50],
   [0xd51, 0xd51],
   [0xd52, 0xd52],
   [0xd53, 0xd53],
-  [0xd54, 0xd54],
-  [0xd55, 0xd55],
-  [0xd56, 0xd56],
+  [0xd54, 0xd54], /* MALAYALAM LETTER CHILLU M */
+  [0xd55, 0xd55], /* MALAYALAM LETTER CHILLU Y */
+  [0xd56, 0xd56], /* MALAYALAM LETTER CHILLU LLL */
   [0xd57, 0xd57], /* MALAYALAM AU LENGTH MARK */
-  [0xd58, 0xd58],
-  [0xd59, 0xd59],
-  [0xd5a, 0xd5a],
-  [0xd5b, 0xd5b],
-  [0xd5c, 0xd5c],
-  [0xd5d, 0xd5d],
-  [0xd5e, 0xd5e],
-  [0xd5f, 0xd5f],
+  [0xd58, 0xd58], /* MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH */
+  [0xd59, 0xd59], /* MALAYALAM FRACTION ONE FORTIETH */
+  [0xd5a, 0xd5a], /* MALAYALAM FRACTION THREE EIGHTIETHS */
+  [0xd5b, 0xd5b], /* MALAYALAM FRACTION ONE TWENTIETH */
+  [0xd5c, 0xd5c], /* MALAYALAM FRACTION ONE TENTH */
+  [0xd5d, 0xd5d], /* MALAYALAM FRACTION THREE TWENTIETHS */
+  [0xd5e, 0xd5e], /* MALAYALAM FRACTION ONE FIFTH */
+  [0xd5f, 0xd5f], /* MALAYALAM LETTER ARCHAIC II */
   [0xd60, 0xd60], /* MALAYALAM LETTER VOCALIC RR */
   [0xd61, 0xd61], /* MALAYALAM LETTER VOCALIC LL */
   [0xd62, 0xd62], /* MALAYALAM VOWEL SIGN VOCALIC L */
   [0xd63, 0xd63], /* MALAYALAM VOWEL SIGN VOCALIC LL */
   [0xd64, 0xd64],
   [0xd65, 0xd65],
   [0xd66, 0xd66], /* MALAYALAM DIGIT ZERO */
   [0xd67, 0xd67], /* MALAYALAM DIGIT ONE */
@@ -3447,19 +3447,19 @@ var mapping = [
   [0xd6e, 0xd6e], /* MALAYALAM DIGIT EIGHT */
   [0xd6f, 0xd6f], /* MALAYALAM DIGIT NINE */
   [0xd70, 0xd70], /* MALAYALAM NUMBER TEN */
   [0xd71, 0xd71], /* MALAYALAM NUMBER ONE HUNDRED */
   [0xd72, 0xd72], /* MALAYALAM NUMBER ONE THOUSAND */
   [0xd73, 0xd73], /* MALAYALAM FRACTION ONE QUARTER */
   [0xd74, 0xd74], /* MALAYALAM FRACTION ONE HALF */
   [0xd75, 0xd75], /* MALAYALAM FRACTION THREE QUARTERS */
-  [0xd76, 0xd76],
-  [0xd77, 0xd77],
-  [0xd78, 0xd78],
+  [0xd76, 0xd76], /* MALAYALAM FRACTION ONE SIXTEENTH */
+  [0xd77, 0xd77], /* MALAYALAM FRACTION ONE EIGHTH */
+  [0xd78, 0xd78], /* MALAYALAM FRACTION THREE SIXTEENTHS */
   [0xd79, 0xd79], /* MALAYALAM DATE MARK */
   [0xd7a, 0xd7a], /* MALAYALAM LETTER CHILLU NN */
   [0xd7b, 0xd7b], /* MALAYALAM LETTER CHILLU N */
   [0xd7c, 0xd7c], /* MALAYALAM LETTER CHILLU RR */
   [0xd7d, 0xd7d], /* MALAYALAM LETTER CHILLU L */
   [0xd7e, 0xd7e], /* MALAYALAM LETTER CHILLU LL */
   [0xd7f, 0xd7f], /* MALAYALAM LETTER CHILLU K */
   [0xd80, 0xd80],
@@ -3559,26 +3559,26 @@ var mapping = [
   [0xdde, 0xdde], /* SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */
   [0xddf, 0xddf], /* SINHALA VOWEL SIGN GAYANUKITTA */
   [0xde0, 0xde0],
   [0xde1, 0xde1],
   [0xde2, 0xde2],
   [0xde3, 0xde3],
   [0xde4, 0xde4],
   [0xde5, 0xde5],
-  [0xde6, 0xde6],
-  [0xde7, 0xde7],
-  [0xde8, 0xde8],
-  [0xde9, 0xde9],
-  [0xdea, 0xdea],
-  [0xdeb, 0xdeb],
-  [0xdec, 0xdec],
-  [0xded, 0xded],
-  [0xdee, 0xdee],
-  [0xdef, 0xdef],
+  [0xde6, 0xde6], /* SINHALA LITH DIGIT ZERO */
+  [0xde7, 0xde7], /* SINHALA LITH DIGIT ONE */
+  [0xde8, 0xde8], /* SINHALA LITH DIGIT TWO */
+  [0xde9, 0xde9], /* SINHALA LITH DIGIT THREE */
+  [0xdea, 0xdea], /* SINHALA LITH DIGIT FOUR */
+  [0xdeb, 0xdeb], /* SINHALA LITH DIGIT FIVE */
+  [0xdec, 0xdec], /* SINHALA LITH DIGIT SIX */
+  [0xded, 0xded], /* SINHALA LITH DIGIT SEVEN */
+  [0xdee, 0xdee], /* SINHALA LITH DIGIT EIGHT */
+  [0xdef, 0xdef], /* SINHALA LITH DIGIT NINE */
   [0xdf0, 0xdf0],
   [0xdf1, 0xdf1],
   [0xdf2, 0xdf2], /* SINHALA VOWEL SIGN DIGA GAETTA-PILLA */
   [0xdf3, 0xdf3], /* SINHALA VOWEL SIGN DIGA GAYANUKITTA */
   [0xdf4, 0xdf4], /* SINHALA PUNCTUATION KUNDDALIYA */
   [0xdf5, 0xdf5],
   [0xdf6, 0xdf6],
   [0xdf7, 0xdf7],
@@ -5025,110 +5025,110 @@ var mapping = [
   [0x1398, 0x1398], /* ETHIOPIC TONAL MARK DERET-HIDET */
   [0x1399, 0x1399], /* ETHIOPIC TONAL MARK KURT */
   [0x139a, 0x139a],
   [0x139b, 0x139b],
   [0x139c, 0x139c],
   [0x139d, 0x139d],
   [0x139e, 0x139e],
   [0x139f, 0x139f],
-  [0x13a0, 0x13a0], /* CHEROKEE LETTER A */
-  [0x13a1, 0x13a1], /* CHEROKEE LETTER E */
-  [0x13a2, 0x13a2], /* CHEROKEE LETTER I */
-  [0x13a3, 0x13a3], /* CHEROKEE LETTER O */
-  [0x13a4, 0x13a4], /* CHEROKEE LETTER U */
-  [0x13a5, 0x13a5], /* CHEROKEE LETTER V */
-  [0x13a6, 0x13a6], /* CHEROKEE LETTER GA */
-  [0x13a7, 0x13a7], /* CHEROKEE LETTER KA */
-  [0x13a8, 0x13a8], /* CHEROKEE LETTER GE */
-  [0x13a9, 0x13a9], /* CHEROKEE LETTER GI */
-  [0x13aa, 0x13aa], /* CHEROKEE LETTER GO */
-  [0x13ab, 0x13ab], /* CHEROKEE LETTER GU */
-  [0x13ac, 0x13ac], /* CHEROKEE LETTER GV */
-  [0x13ad, 0x13ad], /* CHEROKEE LETTER HA */
-  [0x13ae, 0x13ae], /* CHEROKEE LETTER HE */
-  [0x13af, 0x13af], /* CHEROKEE LETTER HI */
-  [0x13b0, 0x13b0], /* CHEROKEE LETTER HO */
-  [0x13b1, 0x13b1], /* CHEROKEE LETTER HU */
-  [0x13b2, 0x13b2], /* CHEROKEE LETTER HV */
-  [0x13b3, 0x13b3], /* CHEROKEE LETTER LA */
-  [0x13b4, 0x13b4], /* CHEROKEE LETTER LE */
-  [0x13b5, 0x13b5], /* CHEROKEE LETTER LI */
-  [0x13b6, 0x13b6], /* CHEROKEE LETTER LO */
-  [0x13b7, 0x13b7], /* CHEROKEE LETTER LU */
-  [0x13b8, 0x13b8], /* CHEROKEE LETTER LV */
-  [0x13b9, 0x13b9], /* CHEROKEE LETTER MA */
-  [0x13ba, 0x13ba], /* CHEROKEE LETTER ME */
-  [0x13bb, 0x13bb], /* CHEROKEE LETTER MI */
-  [0x13bc, 0x13bc], /* CHEROKEE LETTER MO */
-  [0x13bd, 0x13bd], /* CHEROKEE LETTER MU */
-  [0x13be, 0x13be], /* CHEROKEE LETTER NA */
-  [0x13bf, 0x13bf], /* CHEROKEE LETTER HNA */
-  [0x13c0, 0x13c0], /* CHEROKEE LETTER NAH */
-  [0x13c1, 0x13c1], /* CHEROKEE LETTER NE */
-  [0x13c2, 0x13c2], /* CHEROKEE LETTER NI */
-  [0x13c3, 0x13c3], /* CHEROKEE LETTER NO */
-  [0x13c4, 0x13c4], /* CHEROKEE LETTER NU */
-  [0x13c5, 0x13c5], /* CHEROKEE LETTER NV */
-  [0x13c6, 0x13c6], /* CHEROKEE LETTER QUA */
-  [0x13c7, 0x13c7], /* CHEROKEE LETTER QUE */
-  [0x13c8, 0x13c8], /* CHEROKEE LETTER QUI */
-  [0x13c9, 0x13c9], /* CHEROKEE LETTER QUO */
-  [0x13ca, 0x13ca], /* CHEROKEE LETTER QUU */
-  [0x13cb, 0x13cb], /* CHEROKEE LETTER QUV */
-  [0x13cc, 0x13cc], /* CHEROKEE LETTER SA */
-  [0x13cd, 0x13cd], /* CHEROKEE LETTER S */
-  [0x13ce, 0x13ce], /* CHEROKEE LETTER SE */
-  [0x13cf, 0x13cf], /* CHEROKEE LETTER SI */
-  [0x13d0, 0x13d0], /* CHEROKEE LETTER SO */
-  [0x13d1, 0x13d1], /* CHEROKEE LETTER SU */
-  [0x13d2, 0x13d2], /* CHEROKEE LETTER SV */
-  [0x13d3, 0x13d3], /* CHEROKEE LETTER DA */
-  [0x13d4, 0x13d4], /* CHEROKEE LETTER TA */
-  [0x13d5, 0x13d5], /* CHEROKEE LETTER DE */
-  [0x13d6, 0x13d6], /* CHEROKEE LETTER TE */
-  [0x13d7, 0x13d7], /* CHEROKEE LETTER DI */
-  [0x13d8, 0x13d8], /* CHEROKEE LETTER TI */
-  [0x13d9, 0x13d9], /* CHEROKEE LETTER DO */
-  [0x13da, 0x13da], /* CHEROKEE LETTER DU */
-  [0x13db, 0x13db], /* CHEROKEE LETTER DV */
-  [0x13dc, 0x13dc], /* CHEROKEE LETTER DLA */
-  [0x13dd, 0x13dd], /* CHEROKEE LETTER TLA */
-  [0x13de, 0x13de], /* CHEROKEE LETTER TLE */
-  [0x13df, 0x13df], /* CHEROKEE LETTER TLI */
-  [0x13e0, 0x13e0], /* CHEROKEE LETTER TLO */
-  [0x13e1, 0x13e1], /* CHEROKEE LETTER TLU */
-  [0x13e2, 0x13e2], /* CHEROKEE LETTER TLV */
-  [0x13e3, 0x13e3], /* CHEROKEE LETTER TSA */
-  [0x13e4, 0x13e4], /* CHEROKEE LETTER TSE */
-  [0x13e5, 0x13e5], /* CHEROKEE LETTER TSI */
-  [0x13e6, 0x13e6], /* CHEROKEE LETTER TSO */
-  [0x13e7, 0x13e7], /* CHEROKEE LETTER TSU */
-  [0x13e8, 0x13e8], /* CHEROKEE LETTER TSV */
-  [0x13e9, 0x13e9], /* CHEROKEE LETTER WA */
-  [0x13ea, 0x13ea], /* CHEROKEE LETTER WE */
-  [0x13eb, 0x13eb], /* CHEROKEE LETTER WI */
-  [0x13ec, 0x13ec], /* CHEROKEE LETTER WO */
-  [0x13ed, 0x13ed], /* CHEROKEE LETTER WU */
-  [0x13ee, 0x13ee], /* CHEROKEE LETTER WV */
-  [0x13ef, 0x13ef], /* CHEROKEE LETTER YA */
-  [0x13f0, 0x13f0], /* CHEROKEE LETTER YE */
-  [0x13f1, 0x13f1], /* CHEROKEE LETTER YI */
-  [0x13f2, 0x13f2], /* CHEROKEE LETTER YO */
-  [0x13f3, 0x13f3], /* CHEROKEE LETTER YU */
-  [0x13f4, 0x13f4], /* CHEROKEE LETTER YV */
-  [0x13f5, 0x13f5],
+  [0x13a0, 0xab70], /* CHEROKEE LETTER A */
+  [0x13a1, 0xab71], /* CHEROKEE LETTER E */
+  [0x13a2, 0xab72], /* CHEROKEE LETTER I */
+  [0x13a3, 0xab73], /* CHEROKEE LETTER O */
+  [0x13a4, 0xab74], /* CHEROKEE LETTER U */
+  [0x13a5, 0xab75], /* CHEROKEE LETTER V */
+  [0x13a6, 0xab76], /* CHEROKEE LETTER GA */
+  [0x13a7, 0xab77], /* CHEROKEE LETTER KA */
+  [0x13a8, 0xab78], /* CHEROKEE LETTER GE */
+  [0x13a9, 0xab79], /* CHEROKEE LETTER GI */
+  [0x13aa, 0xab7a], /* CHEROKEE LETTER GO */
+  [0x13ab, 0xab7b], /* CHEROKEE LETTER GU */
+  [0x13ac, 0xab7c], /* CHEROKEE LETTER GV */
+  [0x13ad, 0xab7d], /* CHEROKEE LETTER HA */
+  [0x13ae, 0xab7e], /* CHEROKEE LETTER HE */
+  [0x13af, 0xab7f], /* CHEROKEE LETTER HI */
+  [0x13b0, 0xab80], /* CHEROKEE LETTER HO */
+  [0x13b1, 0xab81], /* CHEROKEE LETTER HU */
+  [0x13b2, 0xab82], /* CHEROKEE LETTER HV */
+  [0x13b3, 0xab83], /* CHEROKEE LETTER LA */
+  [0x13b4, 0xab84], /* CHEROKEE LETTER LE */
+  [0x13b5, 0xab85], /* CHEROKEE LETTER LI */
+  [0x13b6, 0xab86], /* CHEROKEE LETTER LO */
+  [0x13b7, 0xab87], /* CHEROKEE LETTER LU */
+  [0x13b8, 0xab88], /* CHEROKEE LETTER LV */
+  [0x13b9, 0xab89], /* CHEROKEE LETTER MA */
+  [0x13ba, 0xab8a], /* CHEROKEE LETTER ME */
+  [0x13bb, 0xab8b], /* CHEROKEE LETTER MI */
+  [0x13bc, 0xab8c], /* CHEROKEE LETTER MO */
+  [0x13bd, 0xab8d], /* CHEROKEE LETTER MU */
+  [0x13be, 0xab8e], /* CHEROKEE LETTER NA */
+  [0x13bf, 0xab8f], /* CHEROKEE LETTER HNA */
+  [0x13c0, 0xab90], /* CHEROKEE LETTER NAH */
+  [0x13c1, 0xab91], /* CHEROKEE LETTER NE */
+  [0x13c2, 0xab92], /* CHEROKEE LETTER NI */
+  [0x13c3, 0xab93], /* CHEROKEE LETTER NO */
+  [0x13c4, 0xab94], /* CHEROKEE LETTER NU */
+  [0x13c5, 0xab95], /* CHEROKEE LETTER NV */
+  [0x13c6, 0xab96], /* CHEROKEE LETTER QUA */
+  [0x13c7, 0xab97], /* CHEROKEE LETTER QUE */
+  [0x13c8, 0xab98], /* CHEROKEE LETTER QUI */
+  [0x13c9, 0xab99], /* CHEROKEE LETTER QUO */
+  [0x13ca, 0xab9a], /* CHEROKEE LETTER QUU */
+  [0x13cb, 0xab9b], /* CHEROKEE LETTER QUV */
+  [0x13cc, 0xab9c], /* CHEROKEE LETTER SA */
+  [0x13cd, 0xab9d], /* CHEROKEE LETTER S */
+  [0x13ce, 0xab9e], /* CHEROKEE LETTER SE */
+  [0x13cf, 0xab9f], /* CHEROKEE LETTER SI */
+  [0x13d0, 0xaba0], /* CHEROKEE LETTER SO */
+  [0x13d1, 0xaba1], /* CHEROKEE LETTER SU */
+  [0x13d2, 0xaba2], /* CHEROKEE LETTER SV */
+  [0x13d3, 0xaba3], /* CHEROKEE LETTER DA */
+  [0x13d4, 0xaba4], /* CHEROKEE LETTER TA */
+  [0x13d5, 0xaba5], /* CHEROKEE LETTER DE */
+  [0x13d6, 0xaba6], /* CHEROKEE LETTER TE */
+  [0x13d7, 0xaba7], /* CHEROKEE LETTER DI */
+  [0x13d8, 0xaba8], /* CHEROKEE LETTER TI */
+  [0x13d9, 0xaba9], /* CHEROKEE LETTER DO */
+  [0x13da, 0xabaa], /* CHEROKEE LETTER DU */
+  [0x13db, 0xabab], /* CHEROKEE LETTER DV */
+  [0x13dc, 0xabac], /* CHEROKEE LETTER DLA */
+  [0x13dd, 0xabad], /* CHEROKEE LETTER TLA */
+  [0x13de, 0xabae], /* CHEROKEE LETTER TLE */
+  [0x13df, 0xabaf], /* CHEROKEE LETTER TLI */
+  [0x13e0, 0xabb0], /* CHEROKEE LETTER TLO */
+  [0x13e1, 0xabb1], /* CHEROKEE LETTER TLU */
+  [0x13e2, 0xabb2], /* CHEROKEE LETTER TLV */
+  [0x13e3, 0xabb3], /* CHEROKEE LETTER TSA */
+  [0x13e4, 0xabb4], /* CHEROKEE LETTER TSE */
+  [0x13e5, 0xabb5], /* CHEROKEE LETTER TSI */
+  [0x13e6, 0xabb6], /* CHEROKEE LETTER TSO */
+  [0x13e7, 0xabb7], /* CHEROKEE LETTER TSU */
+  [0x13e8, 0xabb8], /* CHEROKEE LETTER TSV */
+  [0x13e9, 0xabb9], /* CHEROKEE LETTER WA */
+  [0x13ea, 0xabba], /* CHEROKEE LETTER WE */
+  [0x13eb, 0xabbb], /* CHEROKEE LETTER WI */
+  [0x13ec, 0xabbc], /* CHEROKEE LETTER WO */
+  [0x13ed, 0xabbd], /* CHEROKEE LETTER WU */
+  [0x13ee, 0xabbe], /* CHEROKEE LETTER WV */
+  [0x13ef, 0xabbf], /* CHEROKEE LETTER YA */
+  [0x13f0, 0x13f8], /* CHEROKEE LETTER YE */
+  [0x13f1, 0x13f9], /* CHEROKEE LETTER YI */
+  [0x13f2, 0x13fa], /* CHEROKEE LETTER YO */
+  [0x13f3, 0x13fb], /* CHEROKEE LETTER YU */
+  [0x13f4, 0x13fc], /* CHEROKEE LETTER YV */
+  [0x13f5, 0x13fd], /* CHEROKEE LETTER MV */
   [0x13f6, 0x13f6],
   [0x13f7, 0x13f7],
-  [0x13f8, 0x13f8],
-  [0x13f9, 0x13f9],
-  [0x13fa, 0x13fa],
-  [0x13fb, 0x13fb],
-  [0x13fc, 0x13fc],
-  [0x13fd, 0x13fd],
+  [0x13f0, 0x13f8], /* CHEROKEE SMALL LETTER YE */
+  [0x13f1, 0x13f9], /* CHEROKEE SMALL LETTER YI */
+  [0x13f2, 0x13fa], /* CHEROKEE SMALL LETTER YO */
+  [0x13f3, 0x13fb], /* CHEROKEE SMALL LETTER YU */
+  [0x13f4, 0x13fc], /* CHEROKEE SMALL LETTER YV */
+  [0x13f5, 0x13fd], /* CHEROKEE SMALL LETTER MV */
   [0x13fe, 0x13fe],
   [0x13ff, 0x13ff],
   [0x1400, 0x1400], /* CANADIAN SYLLABICS HYPHEN */
   [0x1401, 0x1401], /* CANADIAN SYLLABICS E */
   [0x1402, 0x1402], /* CANADIAN SYLLABICS AAI */
   [0x1403, 0x1403], /* CANADIAN SYLLABICS I */
   [0x1404, 0x1404], /* CANADIAN SYLLABICS II */
   [0x1405, 0x1405], /* CANADIAN SYLLABICS O */
@@ -5874,24 +5874,24 @@ var mapping = [
   [0x16e9, 0x16e9], /* RUNIC LETTER Q */
   [0x16ea, 0x16ea], /* RUNIC LETTER X */
   [0x16eb, 0x16eb], /* RUNIC SINGLE PUNCTUATION */
   [0x16ec, 0x16ec], /* RUNIC MULTIPLE PUNCTUATION */
   [0x16ed, 0x16ed], /* RUNIC CROSS PUNCTUATION */
   [0x16ee, 0x16ee], /* RUNIC ARLAUG SYMBOL */
   [0x16ef, 0x16ef], /* RUNIC TVIMADUR SYMBOL */
   [0x16f0, 0x16f0], /* RUNIC BELGTHOR SYMBOL */
-  [0x16f1, 0x16f1],
-  [0x16f2, 0x16f2],
-  [0x16f3, 0x16f3],
-  [0x16f4, 0x16f4],
-  [0x16f5, 0x16f5],
-  [0x16f6, 0x16f6],
-  [0x16f7, 0x16f7],
-  [0x16f8, 0x16f8],
+  [0x16f1, 0x16f1], /* RUNIC LETTER K */
+  [0x16f2, 0x16f2], /* RUNIC LETTER SH */
+  [0x16f3, 0x16f3], /* RUNIC LETTER OO */
+  [0x16f4, 0x16f4], /* RUNIC LETTER FRANKS CASKET OS */
+  [0x16f5, 0x16f5], /* RUNIC LETTER FRANKS CASKET IS */
+  [0x16f6, 0x16f6], /* RUNIC LETTER FRANKS CASKET EH */
+  [0x16f7, 0x16f7], /* RUNIC LETTER FRANKS CASKET AC */
+  [0x16f8, 0x16f8], /* RUNIC LETTER FRANKS CASKET AESC */
   [0x16f9, 0x16f9],
   [0x16fa, 0x16fa],
   [0x16fb, 0x16fb],
   [0x16fc, 0x16fc],
   [0x16fd, 0x16fd],
   [0x16fe, 0x16fe],
   [0x16ff, 0x16ff],
   [0x1700, 0x1700], /* TAGALOG LETTER A */
@@ -6430,18 +6430,18 @@ var mapping = [
   [0x1915, 0x1915], /* LIMBU LETTER YA */
   [0x1916, 0x1916], /* LIMBU LETTER RA */
   [0x1917, 0x1917], /* LIMBU LETTER LA */
   [0x1918, 0x1918], /* LIMBU LETTER WA */
   [0x1919, 0x1919], /* LIMBU LETTER SHA */
   [0x191a, 0x191a], /* LIMBU LETTER SSA */
   [0x191b, 0x191b], /* LIMBU LETTER SA */
   [0x191c, 0x191c], /* LIMBU LETTER HA */
-  [0x191d, 0x191d],
-  [0x191e, 0x191e],
+  [0x191d, 0x191d], /* LIMBU LETTER GYAN */
+  [0x191e, 0x191e], /* LIMBU LETTER TRA */
   [0x191f, 0x191f],
   [0x1920, 0x1920], /* LIMBU VOWEL SIGN A */
   [0x1921, 0x1921], /* LIMBU VOWEL SIGN I */
   [0x1922, 0x1922], /* LIMBU VOWEL SIGN U */
   [0x1923, 0x1923], /* LIMBU VOWEL SIGN EE */
   [0x1924, 0x1924], /* LIMBU VOWEL SIGN AI */
   [0x1925, 0x1925], /* LIMBU VOWEL SIGN OO */
   [0x1926, 0x1926], /* LIMBU VOWEL SIGN AU */
@@ -6833,31 +6833,31 @@ var mapping = [
   [0x1aa8, 0x1aa8], /* TAI THAM SIGN KAAN */
   [0x1aa9, 0x1aa9], /* TAI THAM SIGN KAANKUU */
   [0x1aaa, 0x1aaa], /* TAI THAM SIGN SATKAAN */
   [0x1aab, 0x1aab], /* TAI THAM SIGN SATKAANKUU */
   [0x1aac, 0x1aac], /* TAI THAM SIGN HANG */
   [0x1aad, 0x1aad], /* TAI THAM SIGN CAANG */
   [0x1aae, 0x1aae],
   [0x1aaf, 0x1aaf],
-  [0x1ab0, 0x1ab0],
-  [0x1ab1, 0x1ab1],
-  [0x1ab2, 0x1ab2],
-  [0x1ab3, 0x1ab3],
-  [0x1ab4, 0x1ab4],
-  [0x1ab5, 0x1ab5],
-  [0x1ab6, 0x1ab6],
-  [0x1ab7, 0x1ab7],
-  [0x1ab8, 0x1ab8],
-  [0x1ab9, 0x1ab9],
-  [0x1aba, 0x1aba],
-  [0x1abb, 0x1abb],
-  [0x1abc, 0x1abc],
-  [0x1abd, 0x1abd],
-  [0x1abe, 0x1abe],
+  [0x1ab0, 0x1ab0], /* COMBINING DOUBLED CIRCUMFLEX ACCENT */
+  [0x1ab1, 0x1ab1], /* COMBINING DIAERESIS-RING */
+  [0x1ab2, 0x1ab2], /* COMBINING INFINITY */
+  [0x1ab3, 0x1ab3], /* COMBINING DOWNWARDS ARROW */
+  [0x1ab4, 0x1ab4], /* COMBINING TRIPLE DOT */
+  [0x1ab5, 0x1ab5], /* COMBINING X-X BELOW */
+  [0x1ab6, 0x1ab6], /* COMBINING WIGGLY LINE BELOW */
+  [0x1ab7, 0x1ab7], /* COMBINING OPEN MARK BELOW */
+  [0x1ab8, 0x1ab8], /* COMBINING DOUBLE OPEN MARK BELOW */
+  [0x1ab9, 0x1ab9], /* COMBINING LIGHT CENTRALIZATION STROKE BELOW */
+  [0x1aba, 0x1aba], /* COMBINING STRONG CENTRALIZATION STROKE BELOW */
+  [0x1abb, 0x1abb], /* COMBINING PARENTHESES ABOVE */
+  [0x1abc, 0x1abc], /* COMBINING DOUBLE PARENTHESES ABOVE */
+  [0x1abd, 0x1abd], /* COMBINING PARENTHESES BELOW */
+  [0x1abe, 0x1abe], /* COMBINING PARENTHESES OVERLAY */
   [0x1abf, 0x1abf],
   [0x1ac0, 0x1ac0],
   [0x1ac1, 0x1ac1],
   [0x1ac2, 0x1ac2],
   [0x1ac3, 0x1ac3],
   [0x1ac4, 0x1ac4],
   [0x1ac5, 0x1ac5],
   [0x1ac6, 0x1ac6],
@@ -7297,25 +7297,25 @@ var mapping = [
   [0x1c78, 0x1c78], /* OL CHIKI MU TTUDDAG */
   [0x1c79, 0x1c79], /* OL CHIKI GAAHLAA TTUDDAAG */
   [0x1c7a, 0x1c7a], /* OL CHIKI MU-GAAHLAA TTUDDAAG */
   [0x1c7b, 0x1c7b], /* OL CHIKI RELAA */
   [0x1c7c, 0x1c7c], /* OL CHIKI PHAARKAA */
   [0x1c7d, 0x1c7d], /* OL CHIKI AHAD */
   [0x1c7e, 0x1c7e], /* OL CHIKI PUNCTUATION MUCAAD */
   [0x1c7f, 0x1c7f], /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */
-  [0x1c80, 0x1c80],
-  [0x1c81, 0x1c81],
-  [0x1c82, 0x1c82],
-  [0x1c83, 0x1c83],
-  [0x1c84, 0x1c84],
-  [0x1c85, 0x1c85],
-  [0x1c86, 0x1c86],
-  [0x1c87, 0x1c87],
-  [0x1c88, 0x1c88],
+  [0x412, 0x1c80], /* CYRILLIC SMALL LETTER ROUNDED VE */
+  [0x414, 0x1c81], /* CYRILLIC SMALL LETTER LONG-LEGGED DE */
+  [0x41e, 0x1c82], /* CYRILLIC SMALL LETTER NARROW O */
+  [0x421, 0x1c83], /* CYRILLIC SMALL LETTER WIDE ES */
+  [0x422, 0x1c84], /* CYRILLIC SMALL LETTER TALL TE */
+  [0x422, 0x1c85], /* CYRILLIC SMALL LETTER THREE-LEGGED TE */
+  [0x42a, 0x1c86], /* CYRILLIC SMALL LETTER TALL HARD SIGN */
+  [0x462, 0x1c87], /* CYRILLIC SMALL LETTER TALL YAT */
+  [0xa64a, 0x1c88], /* CYRILLIC SMALL LETTER UNBLENDED UK */
   [0x1c89, 0x1c89],
   [0x1c8a, 0x1c8a],
   [0x1c8b, 0x1c8b],
   [0x1c8c, 0x1c8c],
   [0x1c8d, 0x1c8d],
   [0x1c8e, 0x1c8e],
   [0x1c8f, 0x1c8f],
   [0x1c90, 0x1c90],
@@ -7417,18 +7417,18 @@ var mapping = [
   [0x1cf0, 0x1cf0], /* VEDIC SIGN RTHANG LONG ANUSVARA */
   [0x1cf1, 0x1cf1], /* VEDIC SIGN ANUSVARA UBHAYATO MUKHA */
   [0x1cf2, 0x1cf2], /* VEDIC SIGN ARDHAVISARGA */
   [0x1cf3, 0x1cf3], /* VEDIC SIGN ROTATED ARDHAVISARGA */
   [0x1cf4, 0x1cf4], /* VEDIC TONE CANDRA ABOVE */
   [0x1cf5, 0x1cf5], /* VEDIC SIGN JIHVAMULIYA */
   [0x1cf6, 0x1cf6], /* VEDIC SIGN UPADHMANIYA */
   [0x1cf7, 0x1cf7],
-  [0x1cf8, 0x1cf8],
-  [0x1cf9, 0x1cf9],
+  [0x1cf8, 0x1cf8], /* VEDIC TONE RING ABOVE */
+  [0x1cf9, 0x1cf9], /* VEDIC TONE DOUBLE RING ABOVE */
   [0x1cfa, 0x1cfa],
   [0x1cfb, 0x1cfb],
   [0x1cfc, 0x1cfc],
   [0x1cfd, 0x1cfd],
   [0x1cfe, 0x1cfe],
   [0x1cff, 0x1cff],
   [0x1d00, 0x1d00], /* LATIN LETTER SMALL CAPITAL A */
   [0x1d01, 0x1d01], /* LATIN LETTER SMALL CAPITAL AE */
@@ -7656,37 +7656,37 @@ var mapping = [
   [0x1ddf, 0x1ddf], /* COMBINING LATIN LETTER SMALL CAPITAL M */
   [0x1de0, 0x1de0], /* COMBINING LATIN SMALL LETTER N */
   [0x1de1, 0x1de1], /* COMBINING LATIN LETTER SMALL CAPITAL N */
   [0x1de2, 0x1de2], /* COMBINING LATIN LETTER SMALL CAPITAL R */
   [0x1de3, 0x1de3], /* COMBINING LATIN SMALL LETTER R ROTUNDA */
   [0x1de4, 0x1de4], /* COMBINING LATIN SMALL LETTER S */
   [0x1de5, 0x1de5], /* COMBINING LATIN SMALL LETTER LONG S */
   [0x1de6, 0x1de6], /* COMBINING LATIN SMALL LETTER Z */
-  [0x1de7, 0x1de7],
-  [0x1de8, 0x1de8],
-  [0x1de9, 0x1de9],
-  [0x1dea, 0x1dea],
-  [0x1deb, 0x1deb],
-  [0x1dec, 0x1dec],
-  [0x1ded, 0x1ded],
-  [0x1dee, 0x1dee],
-  [0x1def, 0x1def],
-  [0x1df0, 0x1df0],
-  [0x1df1, 0x1df1],
-  [0x1df2, 0x1df2],
-  [0x1df3, 0x1df3],
-  [0x1df4, 0x1df4],
-  [0x1df5, 0x1df5],
+  [0x1de7, 0x1de7], /* COMBINING LATIN SMALL LETTER ALPHA */
+  [0x1de8, 0x1de8], /* COMBINING LATIN SMALL LETTER B */
+  [0x1de9, 0x1de9], /* COMBINING LATIN SMALL LETTER BETA */
+  [0x1dea, 0x1dea], /* COMBINING LATIN SMALL LETTER SCHWA */
+  [0x1deb, 0x1deb], /* COMBINING LATIN SMALL LETTER F */
+  [0x1dec, 0x1dec], /* COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
+  [0x1ded, 0x1ded], /* COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE */
+  [0x1dee, 0x1dee], /* COMBINING LATIN SMALL LETTER P */
+  [0x1def, 0x1def], /* COMBINING LATIN SMALL LETTER ESH */
+  [0x1df0, 0x1df0], /* COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE */
+  [0x1df1, 0x1df1], /* COMBINING LATIN SMALL LETTER W */
+  [0x1df2, 0x1df2], /* COMBINING LATIN SMALL LETTER A WITH DIAERESIS */
+  [0x1df3, 0x1df3], /* COMBINING LATIN SMALL LETTER O WITH DIAERESIS */
+  [0x1df4, 0x1df4], /* COMBINING LATIN SMALL LETTER U WITH DIAERESIS */
+  [0x1df5, 0x1df5], /* COMBINING UP TACK ABOVE */
   [0x1df6, 0x1df6],
   [0x1df7, 0x1df7],
   [0x1df8, 0x1df8],
   [0x1df9, 0x1df9],
   [0x1dfa, 0x1dfa],
-  [0x1dfb, 0x1dfb],
+  [0x1dfb, 0x1dfb], /* COMBINING DELETION MARK */
   [0x1dfc, 0x1dfc], /* COMBINING DOUBLE INVERTED BREVE BELOW */
   [0x1dfd, 0x1dfd], /* COMBINING ALMOST EQUAL TO BELOW */
   [0x1dfe, 0x1dfe], /* COMBINING LEFT ARROWHEAD ABOVE */
   [0x1dff, 0x1dff], /* COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW */
   [0x1e00, 0x1e01], /* LATIN CAPITAL LETTER A WITH RING BELOW */
   [0x1e00, 0x1e01], /* LATIN SMALL LETTER A WITH RING BELOW */
   [0x1e02, 0x1e03], /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
   [0x1e02, 0x1e03], /* LATIN SMALL LETTER B WITH DOT ABOVE */
@@ -8295,20 +8295,20 @@ var mapping = [
   [0x205e, 0x205e], /* VERTICAL FOUR DOTS */
   [0x205f, 0x205f], /* MEDIUM MATHEMATICAL SPACE */
   [0x2060, 0x2060], /* WORD JOINER */
   [0x2061, 0x2061], /* FUNCTION APPLICATION */
   [0x2062, 0x2062], /* INVISIBLE TIMES */
   [0x2063, 0x2063], /* INVISIBLE SEPARATOR */
   [0x2064, 0x2064], /* INVISIBLE PLUS */
   [0x2065, 0x2065],
-  [0x2066, 0x2066],
-  [0x2067, 0x2067],
-  [0x2068, 0x2068],
-  [0x2069, 0x2069],
+  [0x2066, 0x2066], /* LEFT-TO-RIGHT ISOLATE */
+  [0x2067, 0x2067], /* RIGHT-TO-LEFT ISOLATE */
+  [0x2068, 0x2068], /* FIRST STRONG ISOLATE */
+  [0x2069, 0x2069], /* POP DIRECTIONAL ISOLATE */
   [0x206a, 0x206a], /* INHIBIT SYMMETRIC SWAPPING */
   [0x206b, 0x206b], /* ACTIVATE SYMMETRIC SWAPPING */
   [0x206c, 0x206c], /* INHIBIT ARABIC FORM SHAPING */
   [0x206d, 0x206d], /* ACTIVATE ARABIC FORM SHAPING */
   [0x206e, 0x206e], /* NATIONAL DIGIT SHAPES */
   [0x206f, 0x206f], /* NOMINAL DIGIT SHAPES */
   [0x2070, 0x2070], /* SUPERSCRIPT ZERO (SUPERSCRIPT DIGIT ZERO) */
   [0x2071, 0x2071], /* SUPERSCRIPT LATIN SMALL LETTER I */
@@ -8380,20 +8380,20 @@ var mapping = [
   [0x20b3, 0x20b3], /* AUSTRAL SIGN */
   [0x20b4, 0x20b4], /* HRYVNIA SIGN */
   [0x20b5, 0x20b5], /* CEDI SIGN */
   [0x20b6, 0x20b6], /* LIVRE TOURNOIS SIGN */
   [0x20b7, 0x20b7], /* SPESMILO SIGN */
   [0x20b8, 0x20b8], /* TENGE SIGN */
   [0x20b9, 0x20b9], /* INDIAN RUPEE SIGN */
   [0x20ba, 0x20ba], /* TURKISH LIRA SIGN */
-  [0x20bb, 0x20bb],
-  [0x20bc, 0x20bc],
-  [0x20bd, 0x20bd],
-  [0x20be, 0x20be],
+  [0x20bb, 0x20bb], /* NORDIC MARK SIGN */
+  [0x20bc, 0x20bc], /* MANAT SIGN */
+  [0x20bd, 0x20bd], /* RUBLE SIGN */
+  [0x20be, 0x20be], /* LARI SIGN */
   [0x20bf, 0x20bf],
   [0x20c0, 0x20c0],
   [0x20c1, 0x20c1],
   [0x20c2, 0x20c2],
   [0x20c3, 0x20c3],
   [0x20c4, 0x20c4],
   [0x20c5, 0x20c5],
   [0x20c6, 0x20c6],
@@ -8587,18 +8587,18 @@ var mapping = [
   [0x2182, 0x2182], /* ROMAN NUMERAL TEN THOUSAND */
   [0x2183, 0x2184], /* ROMAN NUMERAL REVERSED ONE HUNDRED */
   [0x2183, 0x2184], /* LATIN SMALL LETTER REVERSED C */
   [0x2185, 0x2185], /* ROMAN NUMERAL SIX LATE FORM */
   [0x2186, 0x2186], /* ROMAN NUMERAL FIFTY EARLY FORM */
   [0x2187, 0x2187], /* ROMAN NUMERAL FIFTY THOUSAND */
   [0x2188, 0x2188], /* ROMAN NUMERAL ONE HUNDRED THOUSAND */
   [0x2189, 0x2189], /* VULGAR FRACTION ZERO THIRDS */
-  [0x218a, 0x218a],
-  [0x218b, 0x218b],
+  [0x218a, 0x218a], /* TURNED DIGIT TWO */
+  [0x218b, 0x218b], /* TURNED DIGIT THREE */
   [0x218c, 0x218c],
   [0x218d, 0x218d],
   [0x218e, 0x218e],
   [0x218f, 0x218f],
   [0x2190, 0x2190], /* LEFTWARDS ARROW (LEFT ARROW) */
   [0x2191, 0x2191], /* UPWARDS ARROW (UP ARROW) */
   [0x2192, 0x2192], /* RIGHTWARDS ARROW (RIGHT ARROW) */
   [0x2193, 0x2193], /* DOWNWARDS ARROW (DOWN ARROW) */
@@ -9205,27 +9205,27 @@ var mapping = [
   [0x23ec, 0x23ec], /* BLACK DOWN-POINTING DOUBLE TRIANGLE */
   [0x23ed, 0x23ed], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
   [0x23ee, 0x23ee], /* BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
   [0x23ef, 0x23ef], /* BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR */
   [0x23f0, 0x23f0], /* ALARM CLOCK */
   [0x23f1, 0x23f1], /* STOPWATCH */
   [0x23f2, 0x23f2], /* TIMER CLOCK */
   [0x23f3, 0x23f3], /* HOURGLASS WITH FLOWING SAND */
-  [0x23f4, 0x23f4],
-  [0x23f5, 0x23f5],
-  [0x23f6, 0x23f6],
-  [0x23f7, 0x23f7],
-  [0x23f8, 0x23f8],
-  [0x23f9, 0x23f9],
-  [0x23fa, 0x23fa],
-  [0x23fb, 0x23fb],
-  [0x23fc, 0x23fc],
-  [0x23fd, 0x23fd],
-  [0x23fe, 0x23fe],
+  [0x23f4, 0x23f4], /* BLACK MEDIUM LEFT-POINTING TRIANGLE */
+  [0x23f5, 0x23f5], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE */
+  [0x23f6, 0x23f6], /* BLACK MEDIUM UP-POINTING TRIANGLE */
+  [0x23f7, 0x23f7], /* BLACK MEDIUM DOWN-POINTING TRIANGLE */
+  [0x23f8, 0x23f8], /* DOUBLE VERTICAL BAR */
+  [0x23f9, 0x23f9], /* BLACK SQUARE FOR STOP */
+  [0x23fa, 0x23fa], /* BLACK CIRCLE FOR RECORD */
+  [0x23fb, 0x23fb], /* POWER SYMBOL */
+  [0x23fc, 0x23fc], /* POWER ON-OFF SYMBOL */
+  [0x23fd, 0x23fd], /* POWER ON SYMBOL */
+  [0x23fe, 0x23fe], /* POWER SLEEP SYMBOL */
   [0x23ff, 0x23ff],
   [0x2400, 0x2400], /* SYMBOL FOR NULL (GRAPHIC FOR NULL) */
   [0x2401, 0x2401], /* SYMBOL FOR START OF HEADING (GRAPHIC FOR START OF HEADING) */
   [0x2402, 0x2402], /* SYMBOL FOR START OF TEXT (GRAPHIC FOR START OF TEXT) */
   [0x2403, 0x2403], /* SYMBOL FOR END OF TEXT (GRAPHIC FOR END OF TEXT) */
   [0x2404, 0x2404], /* SYMBOL FOR END OF TRANSMISSION (GRAPHIC FOR END OF TRANSMISSION) */
   [0x2405, 0x2405], /* SYMBOL FOR ENQUIRY (GRAPHIC FOR ENQUIRY) */
   [0x2406, 0x2406], /* SYMBOL FOR ACKNOWLEDGE (GRAPHIC FOR ACKNOWLEDGE) */
@@ -9985,17 +9985,17 @@ var mapping = [
   [0x26f8, 0x26f8], /* ICE SKATE */
   [0x26f9, 0x26f9], /* PERSON WITH BALL */
   [0x26fa, 0x26fa], /* TENT */
   [0x26fb, 0x26fb], /* JAPANESE BANK SYMBOL */
   [0x26fc, 0x26fc], /* HEADSTONE GRAVEYARD SYMBOL */
   [0x26fd, 0x26fd], /* FUEL PUMP */
   [0x26fe, 0x26fe], /* CUP ON BLACK SQUARE */
   [0x26ff, 0x26ff], /* WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE */
-  [0x2700, 0x2700],
+  [0x2700, 0x2700], /* BLACK SAFETY SCISSORS */
   [0x2701, 0x2701], /* UPPER BLADE SCISSORS */
   [0x2702, 0x2702], /* BLACK SCISSORS */
   [0x2703, 0x2703], /* LOWER BLADE SCISSORS */
   [0x2704, 0x2704], /* WHITE SCISSORS */
   [0x2705, 0x2705], /* WHITE HEAVY CHECK MARK */
   [0x2706, 0x2706], /* TELEPHONE LOCATION SIGN */
   [0x2707, 0x2707], /* TAPE DRIVE */
   [0x2708, 0x2708], /* AIRPLANE */
@@ -11086,149 +11086,149 @@ var mapping = [
   [0x2b45, 0x2b45], /* LEFTWARDS QUADRUPLE ARROW */
   [0x2b46, 0x2b46], /* RIGHTWARDS QUADRUPLE ARROW */
   [0x2b47, 0x2b47], /* REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
   [0x2b48, 0x2b48], /* RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
   [0x2b49, 0x2b49], /* TILDE OPERATOR ABOVE LEFTWARDS ARROW */
   [0x2b4a, 0x2b4a], /* LEFTWARDS ARROW ABOVE ALMOST EQUAL TO */
   [0x2b4b, 0x2b4b], /* LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
   [0x2b4c, 0x2b4c], /* RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
-  [0x2b4d, 0x2b4d],
-  [0x2b4e, 0x2b4e],
-  [0x2b4f, 0x2b4f],
+  [0x2b4d, 0x2b4d], /* DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW */
+  [0x2b4e, 0x2b4e], /* SHORT SLANTED NORTH ARROW */
+  [0x2b4f, 0x2b4f], /* SHORT BACKSLANTED SOUTH ARROW */
   [0x2b50, 0x2b50], /* WHITE MEDIUM STAR */
   [0x2b51, 0x2b51], /* BLACK SMALL STAR */
   [0x2b52, 0x2b52], /* WHITE SMALL STAR */
   [0x2b53, 0x2b53], /* BLACK RIGHT-POINTING PENTAGON */
   [0x2b54, 0x2b54], /* WHITE RIGHT-POINTING PENTAGON */
   [0x2b55, 0x2b55], /* HEAVY LARGE CIRCLE */
   [0x2b56, 0x2b56], /* HEAVY OVAL WITH OVAL INSIDE */
   [0x2b57, 0x2b57], /* HEAVY CIRCLE WITH CIRCLE INSIDE */
   [0x2b58, 0x2b58], /* HEAVY CIRCLE */
   [0x2b59, 0x2b59], /* HEAVY CIRCLED SALTIRE */
-  [0x2b5a, 0x2b5a],
-  [0x2b5b, 0x2b5b],
-  [0x2b5c, 0x2b5c],
-  [0x2b5d, 0x2b5d],
-  [0x2b5e, 0x2b5e],
-  [0x2b5f, 0x2b5f],
-  [0x2b60, 0x2b60],
-  [0x2b61, 0x2b61],
-  [0x2b62, 0x2b62],
-  [0x2b63, 0x2b63],
-  [0x2b64, 0x2b64],
-  [0x2b65, 0x2b65],
-  [0x2b66, 0x2b66],
-  [0x2b67, 0x2b67],
-  [0x2b68, 0x2b68],
-  [0x2b69, 0x2b69],
-  [0x2b6a, 0x2b6a],
-  [0x2b6b, 0x2b6b],
-  [0x2b6c, 0x2b6c],
-  [0x2b6d, 0x2b6d],
-  [0x2b6e, 0x2b6e],
-  [0x2b6f, 0x2b6f],
-  [0x2b70, 0x2b70],
-  [0x2b71, 0x2b71],
-  [0x2b72, 0x2b72],
-  [0x2b73, 0x2b73],
+  [0x2b5a, 0x2b5a], /* SLANTED NORTH ARROW WITH HOOKED HEAD */
+  [0x2b5b, 0x2b5b], /* BACKSLANTED SOUTH ARROW WITH HOOKED TAIL */
+  [0x2b5c, 0x2b5c], /* SLANTED NORTH ARROW WITH HORIZONTAL TAIL */
+  [0x2b5d, 0x2b5d], /* BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL */
+  [0x2b5e, 0x2b5e], /* BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
+  [0x2b5f, 0x2b5f], /* SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
+  [0x2b60, 0x2b60], /* LEFTWARDS TRIANGLE-HEADED ARROW */
+  [0x2b61, 0x2b61], /* UPWARDS TRIANGLE-HEADED ARROW */
+  [0x2b62, 0x2b62], /* RIGHTWARDS TRIANGLE-HEADED ARROW */
+  [0x2b63, 0x2b63], /* DOWNWARDS TRIANGLE-HEADED ARROW */
+  [0x2b64, 0x2b64], /* LEFT RIGHT TRIANGLE-HEADED ARROW */
+  [0x2b65, 0x2b65], /* UP DOWN TRIANGLE-HEADED ARROW */
+  [0x2b66, 0x2b66], /* NORTH WEST TRIANGLE-HEADED ARROW */
+  [0x2b67, 0x2b67], /* NORTH EAST TRIANGLE-HEADED ARROW */
+  [0x2b68, 0x2b68], /* SOUTH EAST TRIANGLE-HEADED ARROW */
+  [0x2b69, 0x2b69], /* SOUTH WEST TRIANGLE-HEADED ARROW */
+  [0x2b6a, 0x2b6a], /* LEFTWARDS TRIANGLE-HEADED DASHED ARROW */
+  [0x2b6b, 0x2b6b], /* UPWARDS TRIANGLE-HEADED DASHED ARROW */
+  [0x2b6c, 0x2b6c], /* RIGHTWARDS TRIANGLE-HEADED DASHED ARROW */
+  [0x2b6d, 0x2b6d], /* DOWNWARDS TRIANGLE-HEADED DASHED ARROW */
+  [0x2b6e, 0x2b6e], /* CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
+  [0x2b6f, 0x2b6f], /* ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
+  [0x2b70, 0x2b70], /* LEFTWARDS TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b71, 0x2b71], /* UPWARDS TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b72, 0x2b72], /* RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b73, 0x2b73], /* DOWNWARDS TRIANGLE-HEADED ARROW TO BAR */
   [0x2b74, 0x2b74],
   [0x2b75, 0x2b75],
-  [0x2b76, 0x2b76],
-  [0x2b77, 0x2b77],
-  [0x2b78, 0x2b78],
-  [0x2b79, 0x2b79],
-  [0x2b7a, 0x2b7a],
-  [0x2b7b, 0x2b7b],
-  [0x2b7c, 0x2b7c],
-  [0x2b7d, 0x2b7d],
-  [0x2b7e, 0x2b7e],
-  [0x2b7f, 0x2b7f],
-  [0x2b80, 0x2b80],
-  [0x2b81, 0x2b81],
-  [0x2b82, 0x2b82],
-  [0x2b83, 0x2b83],
-  [0x2b84, 0x2b84],
-  [0x2b85, 0x2b85],
-  [0x2b86, 0x2b86],
-  [0x2b87, 0x2b87],
-  [0x2b88, 0x2b88],
-  [0x2b89, 0x2b89],
-  [0x2b8a, 0x2b8a],
-  [0x2b8b, 0x2b8b],
-  [0x2b8c, 0x2b8c],
-  [0x2b8d, 0x2b8d],
-  [0x2b8e, 0x2b8e],
-  [0x2b8f, 0x2b8f],
-  [0x2b90, 0x2b90],
-  [0x2b91, 0x2b91],
-  [0x2b92, 0x2b92],
-  [0x2b93, 0x2b93],
-  [0x2b94, 0x2b94],
-  [0x2b95, 0x2b95],
+  [0x2b76, 0x2b76], /* NORTH WEST TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b77, 0x2b77], /* NORTH EAST TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b78, 0x2b78], /* SOUTH EAST TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b79, 0x2b79], /* SOUTH WEST TRIANGLE-HEADED ARROW TO BAR */
+  [0x2b7a, 0x2b7a], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+  [0x2b7b, 0x2b7b], /* UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+  [0x2b7c, 0x2b7c], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+  [0x2b7d, 0x2b7d], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+  [0x2b7e, 0x2b7e], /* HORIZONTAL TAB KEY */
+  [0x2b7f, 0x2b7f], /* VERTICAL TAB KEY */
+  [0x2b80, 0x2b80], /* LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW */
+  [0x2b81, 0x2b81], /* UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW */
+  [0x2b82, 0x2b82], /* RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW */
+  [0x2b83, 0x2b83], /* DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW */
+  [0x2b84, 0x2b84], /* LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS */
+  [0x2b85, 0x2b85], /* UPWARDS TRIANGLE-HEADED PAIRED ARROWS */
+  [0x2b86, 0x2b86], /* RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS */
+  [0x2b87, 0x2b87], /* DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS */
+  [0x2b88, 0x2b88], /* LEFTWARDS BLACK CIRCLED WHITE ARROW */
+  [0x2b89, 0x2b89], /* UPWARDS BLACK CIRCLED WHITE ARROW */
+  [0x2b8a, 0x2b8a], /* RIGHTWARDS BLACK CIRCLED WHITE ARROW */
+  [0x2b8b, 0x2b8b], /* DOWNWARDS BLACK CIRCLED WHITE ARROW */
+  [0x2b8c, 0x2b8c], /* ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW */
+  [0x2b8d, 0x2b8d], /* ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW */
+  [0x2b8e, 0x2b8e], /* ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW */
+  [0x2b8f, 0x2b8f], /* ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW */
+  [0x2b90, 0x2b90], /* RETURN LEFT */
+  [0x2b91, 0x2b91], /* RETURN RIGHT */
+  [0x2b92, 0x2b92], /* NEWLINE LEFT */
+  [0x2b93, 0x2b93], /* NEWLINE RIGHT */
+  [0x2b94, 0x2b94], /* FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE */
+  [0x2b95, 0x2b95], /* RIGHTWARDS BLACK ARROW */
   [0x2b96, 0x2b96],
   [0x2b97, 0x2b97],
-  [0x2b98, 0x2b98],
-  [0x2b99, 0x2b99],
-  [0x2b9a, 0x2b9a],
-  [0x2b9b, 0x2b9b],
-  [0x2b9c, 0x2b9c],
-  [0x2b9d, 0x2b9d],
-  [0x2b9e, 0x2b9e],
-  [0x2b9f, 0x2b9f],
-  [0x2ba0, 0x2ba0],
-  [0x2ba1, 0x2ba1],
-  [0x2ba2, 0x2ba2],
-  [0x2ba3, 0x2ba3],
-  [0x2ba4, 0x2ba4],
-  [0x2ba5, 0x2ba5],
-  [0x2ba6, 0x2ba6],
-  [0x2ba7, 0x2ba7],
-  [0x2ba8, 0x2ba8],
-  [0x2ba9, 0x2ba9],
-  [0x2baa, 0x2baa],
-  [0x2bab, 0x2bab],
-  [0x2bac, 0x2bac],
-  [0x2bad, 0x2bad],
-  [0x2bae, 0x2bae],
-  [0x2baf, 0x2baf],
-  [0x2bb0, 0x2bb0],
-  [0x2bb1, 0x2bb1],
-  [0x2bb2, 0x2bb2],
-  [0x2bb3, 0x2bb3],
-  [0x2bb4, 0x2bb4],
-  [0x2bb5, 0x2bb5],
-  [0x2bb6, 0x2bb6],
-  [0x2bb7, 0x2bb7],
-  [0x2bb8, 0x2bb8],
-  [0x2bb9, 0x2bb9],
+  [0x2b98, 0x2b98], /* THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD */
+  [0x2b99, 0x2b99], /* THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD */
+  [0x2b9a, 0x2b9a], /* THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD */
+  [0x2b9b, 0x2b9b], /* THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD */
+  [0x2b9c, 0x2b9c], /* BLACK LEFTWARDS EQUILATERAL ARROWHEAD */
+  [0x2b9d, 0x2b9d], /* BLACK UPWARDS EQUILATERAL ARROWHEAD */
+  [0x2b9e, 0x2b9e], /* BLACK RIGHTWARDS EQUILATERAL ARROWHEAD */
+  [0x2b9f, 0x2b9f], /* BLACK DOWNWARDS EQUILATERAL ARROWHEAD */
+  [0x2ba0, 0x2ba0], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
+  [0x2ba1, 0x2ba1], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
+  [0x2ba2, 0x2ba2], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
+  [0x2ba3, 0x2ba3], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
+  [0x2ba4, 0x2ba4], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
+  [0x2ba5, 0x2ba5], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
+  [0x2ba6, 0x2ba6], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
+  [0x2ba7, 0x2ba7], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
+  [0x2ba8, 0x2ba8], /* BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW */
+  [0x2ba9, 0x2ba9], /* BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */
+  [0x2baa, 0x2baa], /* BLACK CURVED UPWARDS AND LEFTWARDS ARROW */
+  [0x2bab, 0x2bab], /* BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */
+  [0x2bac, 0x2bac], /* BLACK CURVED LEFTWARDS AND UPWARDS ARROW */
+  [0x2bad, 0x2bad], /* BLACK CURVED RIGHTWARDS AND UPWARDS ARROW */
+  [0x2bae, 0x2bae], /* BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW */
+  [0x2baf, 0x2baf], /* BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW */
+  [0x2bb0, 0x2bb0], /* RIBBON ARROW DOWN LEFT */
+  [0x2bb1, 0x2bb1], /* RIBBON ARROW DOWN RIGHT */
+  [0x2bb2, 0x2bb2], /* RIBBON ARROW UP LEFT */
+  [0x2bb3, 0x2bb3], /* RIBBON ARROW UP RIGHT */
+  [0x2bb4, 0x2bb4], /* RIBBON ARROW LEFT UP */
+  [0x2bb5, 0x2bb5], /* RIBBON ARROW RIGHT UP */
+  [0x2bb6, 0x2bb6], /* RIBBON ARROW LEFT DOWN */
+  [0x2bb7, 0x2bb7], /* RIBBON ARROW RIGHT DOWN */
+  [0x2bb8, 0x2bb8], /* UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR */
+  [0x2bb9, 0x2bb9], /* UP ARROWHEAD IN A RECTANGLE BOX */
   [0x2bba, 0x2bba],
   [0x2bbb, 0x2bbb],
   [0x2bbc, 0x2bbc],
-  [0x2bbd, 0x2bbd],
-  [0x2bbe, 0x2bbe],
-  [0x2bbf, 0x2bbf],
-  [0x2bc0, 0x2bc0],
-  [0x2bc1, 0x2bc1],
-  [0x2bc2, 0x2bc2],
-  [0x2bc3, 0x2bc3],
-  [0x2bc4, 0x2bc4],
-  [0x2bc5, 0x2bc5],
-  [0x2bc6, 0x2bc6],
-  [0x2bc7, 0x2bc7],
-  [0x2bc8, 0x2bc8],
+  [0x2bbd, 0x2bbd], /* BALLOT BOX WITH LIGHT X */
+  [0x2bbe, 0x2bbe], /* CIRCLED X */
+  [0x2bbf, 0x2bbf], /* CIRCLED BOLD X */
+  [0x2bc0, 0x2bc0], /* BLACK SQUARE CENTRED */
+  [0x2bc1, 0x2bc1], /* BLACK DIAMOND CENTRED */
+  [0x2bc2, 0x2bc2], /* TURNED BLACK PENTAGON */
+  [0x2bc3, 0x2bc3], /* HORIZONTAL BLACK OCTAGON */
+  [0x2bc4, 0x2bc4], /* BLACK OCTAGON */
+  [0x2bc5, 0x2bc5], /* BLACK MEDIUM UP-POINTING TRIANGLE CENTRED */
+  [0x2bc6, 0x2bc6], /* BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED */
+  [0x2bc7, 0x2bc7], /* BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED */
+  [0x2bc8, 0x2bc8], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED */
   [0x2bc9, 0x2bc9],
-  [0x2bca, 0x2bca],
-  [0x2bcb, 0x2bcb],
-  [0x2bcc, 0x2bcc],
-  [0x2bcd, 0x2bcd],
-  [0x2bce, 0x2bce],
-  [0x2bcf, 0x2bcf],
-  [0x2bd0, 0x2bd0],
-  [0x2bd1, 0x2bd1],
+  [0x2bca, 0x2bca], /* TOP HALF BLACK CIRCLE */
+  [0x2bcb, 0x2bcb], /* BOTTOM HALF BLACK CIRCLE */
+  [0x2bcc, 0x2bcc], /* LIGHT FOUR POINTED BLACK CUSP */
+  [0x2bcd, 0x2bcd], /* ROTATED LIGHT FOUR POINTED BLACK CUSP */
+  [0x2bce, 0x2bce], /* WHITE FOUR POINTED CUSP */
+  [0x2bcf, 0x2bcf], /* ROTATED WHITE FOUR POINTED CUSP */
+  [0x2bd0, 0x2bd0], /* SQUARE POSITION INDICATOR */
+  [0x2bd1, 0x2bd1], /* UNCERTAINTY SIGN */
   [0x2bd2, 0x2bd2],
   [0x2bd3, 0x2bd3],
   [0x2bd4, 0x2bd4],
   [0x2bd5, 0x2bd5],
   [0x2bd6, 0x2bd6],
   [0x2bd7, 0x2bd7],
   [0x2bd8, 0x2bd8],
   [0x2bd9, 0x2bd9],
@@ -11245,20 +11245,20 @@ var mapping = [
   [0x2be4, 0x2be4],
   [0x2be5, 0x2be5],
   [0x2be6, 0x2be6],
   [0x2be7, 0x2be7],
   [0x2be8, 0x2be8],
   [0x2be9, 0x2be9],
   [0x2bea, 0x2bea],
   [0x2beb, 0x2beb],
-  [0x2bec, 0x2bec],
-  [0x2bed, 0x2bed],
-  [0x2bee, 0x2bee],
-  [0x2bef, 0x2bef],
+  [0x2bec, 0x2bec], /* LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+  [0x2bed, 0x2bed], /* UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+  [0x2bee, 0x2bee], /* RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+  [0x2bef, 0x2bef], /* DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
   [0x2bf0, 0x2bf0],
   [0x2bf1, 0x2bf1],
   [0x2bf2, 0x2bf2],
   [0x2bf3, 0x2bf3],
   [0x2bf4, 0x2bf4],
   [0x2bf5, 0x2bf5],
   [0x2bf6, 0x2bf6],
   [0x2bf7, 0x2bf7],
@@ -11837,25 +11837,25 @@ var mapping = [
   [0x2e34, 0x2e34], /* RAISED COMMA */
   [0x2e35, 0x2e35], /* TURNED SEMICOLON */
   [0x2e36, 0x2e36], /* DAGGER WITH LEFT GUARD */
   [0x2e37, 0x2e37], /* DAGGER WITH RIGHT GUARD */
   [0x2e38, 0x2e38], /* TURNED DAGGER */
   [0x2e39, 0x2e39], /* TOP HALF SECTION SIGN */
   [0x2e3a, 0x2e3a], /* TWO-EM DASH */
   [0x2e3b, 0x2e3b], /* THREE-EM DASH */
-  [0x2e3c, 0x2e3c],
-  [0x2e3d, 0x2e3d],
-  [0x2e3e, 0x2e3e],
-  [0x2e3f, 0x2e3f],
-  [0x2e40, 0x2e40],
-  [0x2e41, 0x2e41],
-  [0x2e42, 0x2e42],
-  [0x2e43, 0x2e43],
-  [0x2e44, 0x2e44],
+  [0x2e3c, 0x2e3c], /* STENOGRAPHIC FULL STOP */
+  [0x2e3d, 0x2e3d], /* VERTICAL SIX DOTS */
+  [0x2e3e, 0x2e3e], /* WIGGLY VERTICAL LINE */
+  [0x2e3f, 0x2e3f], /* CAPITULUM */
+  [0x2e40, 0x2e40], /* DOUBLE HYPHEN */
+  [0x2e41, 0x2e41], /* REVERSED COMMA */
+  [0x2e42, 0x2e42], /* DOUBLE LOW-REVERSED-9 QUOTATION MARK */
+  [0x2e43, 0x2e43], /* DASH WITH LEFT UPTURN */
+  [0x2e44, 0x2e44], /* DOUBLE SUSPENSION MARK */
   [0x2e45, 0x2e45],
   [0x2e46, 0x2e46],
   [0x2e47, 0x2e47],
   [0x2e48, 0x2e48],
   [0x2e49, 0x2e49],
   [0x2e4a, 0x2e4a],
   [0x2e4b, 0x2e4b],
   [0x2e4c, 0x2e4c],
@@ -40910,25 +40910,25 @@ var mapping = [
   [0x9fc5, 0x9fc5], /* CJK Ideograph */
   [0x9fc6, 0x9fc6], /* CJK Ideograph */
   [0x9fc7, 0x9fc7], /* CJK Ideograph */
   [0x9fc8, 0x9fc8], /* CJK Ideograph */
   [0x9fc9, 0x9fc9], /* CJK Ideograph */
   [0x9fca, 0x9fca], /* CJK Ideograph */
   [0x9fcb, 0x9fcb], /* CJK Ideograph */
   [0x9fcc, 0x9fcc], /* CJK Ideograph */
-  [0x9fcd, 0x9fcd],
-  [0x9fce, 0x9fce],
-  [0x9fcf, 0x9fcf],
-  [0x9fd0, 0x9fd0],
-  [0x9fd1, 0x9fd1],
-  [0x9fd2, 0x9fd2],
-  [0x9fd3, 0x9fd3],
-  [0x9fd4, 0x9fd4],
-  [0x9fd5, 0x9fd5],
+  [0x9fcd, 0x9fcd], /* CJK Ideograph */
+  [0x9fce, 0x9fce], /* CJK Ideograph */
+  [0x9fcf, 0x9fcf], /* CJK Ideograph */
+  [0x9fd0, 0x9fd0], /* CJK Ideograph */
+  [0x9fd1, 0x9fd1], /* CJK Ideograph */
+  [0x9fd2, 0x9fd2], /* CJK Ideograph */
+  [0x9fd3, 0x9fd3], /* CJK Ideograph */
+  [0x9fd4, 0x9fd4], /* CJK Ideograph */
+  [0x9fd5, 0x9fd5], /* CJK Ideograph */
   [0x9fd6, 0x9fd6],
   [0x9fd7, 0x9fd7],
   [0x9fd8, 0x9fd8],
   [0x9fd9, 0x9fd9],
   [0x9fda, 0x9fda],
   [0x9fdb, 0x9fdb],
   [0x9fdc, 0x9fdc],
   [0x9fdd, 0x9fdd],
@@ -42649,23 +42649,23 @@ var mapping = [
   [0xa690, 0xa691], /* CYRILLIC CAPITAL LETTER TSSE */
   [0xa690, 0xa691], /* CYRILLIC SMALL LETTER TSSE */
   [0xa692, 0xa693], /* CYRILLIC CAPITAL LETTER TCHE */
   [0xa692, 0xa693], /* CYRILLIC SMALL LETTER TCHE */
   [0xa694, 0xa695], /* CYRILLIC CAPITAL LETTER HWE */
   [0xa694, 0xa695], /* CYRILLIC SMALL LETTER HWE */
   [0xa696, 0xa697], /* CYRILLIC CAPITAL LETTER SHWE */
   [0xa696, 0xa697], /* CYRILLIC SMALL LETTER SHWE */
-  [0xa698, 0xa698],
-  [0xa699, 0xa699],
-  [0xa69a, 0xa69a],
-  [0xa69b, 0xa69b],
-  [0xa69c, 0xa69c],
-  [0xa69d, 0xa69d],
-  [0xa69e, 0xa69e],
+  [0xa698, 0xa699], /* CYRILLIC CAPITAL LETTER DOUBLE O */
+  [0xa698, 0xa699], /* CYRILLIC SMALL LETTER DOUBLE O */
+  [0xa69a, 0xa69b], /* CYRILLIC CAPITAL LETTER CROSSED O */
+  [0xa69a, 0xa69b], /* CYRILLIC SMALL LETTER CROSSED O */
+  [0xa69c, 0xa69c], /* MODIFIER LETTER CYRILLIC HARD SIGN */
+  [0xa69d, 0xa69d], /* MODIFIER LETTER CYRILLIC SOFT SIGN */
+  [0xa69e, 0xa69e], /* COMBINING CYRILLIC LETTER EF */
   [0xa69f, 0xa69f], /* COMBINING CYRILLIC LETTER IOTIFIED E */
   [0xa6a0, 0xa6a0], /* BAMUM LETTER A */
   [0xa6a1, 0xa6a1], /* BAMUM LETTER KA */
   [0xa6a2, 0xa6a2], /* BAMUM LETTER U */
   [0xa6a3, 0xa6a3], /* BAMUM LETTER KU */
   [0xa6a4, 0xa6a4], /* BAMUM LETTER EE */
   [0xa6a5, 0xa6a5], /* BAMUM LETTER REE */
   [0xa6a6, 0xa6a6], /* BAMUM LETTER TAE */
@@ -42896,57 +42896,57 @@ var mapping = [
   [0xa786, 0xa787], /* LATIN SMALL LETTER INSULAR T */
   [0xa788, 0xa788], /* MODIFIER LETTER LOW CIRCUMFLEX ACCENT */
   [0xa789, 0xa789], /* MODIFIER LETTER COLON */
   [0xa78a, 0xa78a], /* MODIFIER LETTER SHORT EQUALS SIGN */
   [0xa78b, 0xa78c], /* LATIN CAPITAL LETTER SALTILLO */
   [0xa78b, 0xa78c], /* LATIN SMALL LETTER SALTILLO */
   [0xa78d, 0x265], /* LATIN CAPITAL LETTER TURNED H */
   [0xa78e, 0xa78e], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT */
-  [0xa78f, 0xa78f],
+  [0xa78f, 0xa78f], /* LATIN LETTER SINOLOGICAL DOT */
   [0xa790, 0xa791], /* LATIN CAPITAL LETTER N WITH DESCENDER */
   [0xa790, 0xa791], /* LATIN SMALL LETTER N WITH DESCENDER */
   [0xa792, 0xa793], /* LATIN CAPITAL LETTER C WITH BAR */
   [0xa792, 0xa793], /* LATIN SMALL LETTER C WITH BAR */
-  [0xa794, 0xa794],
-  [0xa795, 0xa795],
-  [0xa796, 0xa796],
-  [0xa797, 0xa797],
-  [0xa798, 0xa798],
-  [0xa799, 0xa799],
-  [0xa79a, 0xa79a],
-  [0xa79b, 0xa79b],
-  [0xa79c, 0xa79c],
-  [0xa79d, 0xa79d],
-  [0xa79e, 0xa79e],
-  [0xa79f, 0xa79f],
+  [0xa794, 0xa794], /* LATIN SMALL LETTER C WITH PALATAL HOOK */
+  [0xa795, 0xa795], /* LATIN SMALL LETTER H WITH PALATAL HOOK */
+  [0xa796, 0xa797], /* LATIN CAPITAL LETTER B WITH FLOURISH */
+  [0xa796, 0xa797], /* LATIN SMALL LETTER B WITH FLOURISH */
+  [0xa798, 0xa799], /* LATIN CAPITAL LETTER F WITH STROKE */
+  [0xa798, 0xa799], /* LATIN SMALL LETTER F WITH STROKE */
+  [0xa79a, 0xa79b], /* LATIN CAPITAL LETTER VOLAPUK AE */
+  [0xa79a, 0xa79b], /* LATIN SMALL LETTER VOLAPUK AE */
+  [0xa79c, 0xa79d], /* LATIN CAPITAL LETTER VOLAPUK OE */
+  [0xa79c, 0xa79d], /* LATIN SMALL LETTER VOLAPUK OE */
+  [0xa79e, 0xa79f], /* LATIN CAPITAL LETTER VOLAPUK UE */
+  [0xa79e, 0xa79f], /* LATIN SMALL LETTER VOLAPUK UE */
   [0xa7a0, 0xa7a1], /* LATIN CAPITAL LETTER G WITH OBLIQUE STROKE */
   [0xa7a0, 0xa7a1], /* LATIN SMALL LETTER G WITH OBLIQUE STROKE */
   [0xa7a2, 0xa7a3], /* LATIN CAPITAL LETTER K WITH OBLIQUE STROKE */
   [0xa7a2, 0xa7a3], /* LATIN SMALL LETTER K WITH OBLIQUE STROKE */
   [0xa7a4, 0xa7a5], /* LATIN CAPITAL LETTER N WITH OBLIQUE STROKE */
   [0xa7a4, 0xa7a5], /* LATIN SMALL LETTER N WITH OBLIQUE STROKE */
   [0xa7a6, 0xa7a7], /* LATIN CAPITAL LETTER R WITH OBLIQUE STROKE */
   [0xa7a6, 0xa7a7], /* LATIN SMALL LETTER R WITH OBLIQUE STROKE */
   [0xa7a8, 0xa7a9], /* LATIN CAPITAL LETTER S WITH OBLIQUE STROKE */
   [0xa7a8, 0xa7a9], /* LATIN SMALL LETTER S WITH OBLIQUE STROKE */
   [0xa7aa, 0x266], /* LATIN CAPITAL LETTER H WITH HOOK */
-  [0xa7ab, 0xa7ab],
-  [0xa7ac, 0xa7ac],
-  [0xa7ad, 0xa7ad],
-  [0xa7ae, 0xa7ae],
+  [0xa7ab, 0x25c], /* LATIN CAPITAL LETTER REVERSED OPEN E */
+  [0xa7ac, 0x261], /* LATIN CAPITAL LETTER SCRIPT G */
+  [0xa7ad, 0x26c], /* LATIN CAPITAL LETTER L WITH BELT */
+  [0xa7ae, 0x26a], /* LATIN CAPITAL LETTER SMALL CAPITAL I */
   [0xa7af, 0xa7af],
-  [0xa7b0, 0xa7b0],
-  [0xa7b1, 0xa7b1],
-  [0xa7b2, 0xa7b2],
-  [0xa7b3, 0xa7b3],
-  [0xa7b4, 0xa7b4],
-  [0xa7b5, 0xa7b5],
-  [0xa7b6, 0xa7b6],
-  [0xa7b7, 0xa7b7],
+  [0xa7b0, 0x29e], /* LATIN CAPITAL LETTER TURNED K */
+  [0xa7b1, 0x287], /* LATIN CAPITAL LETTER TURNED T */
+  [0xa7b2, 0x29d], /* LATIN CAPITAL LETTER J WITH CROSSED-TAIL */
+  [0xa7b3, 0xab53], /* LATIN CAPITAL LETTER CHI */
+  [0xa7b4, 0xa7b5], /* LATIN CAPITAL LETTER BETA */
+  [0xa7b4, 0xa7b5], /* LATIN SMALL LETTER BETA */
+  [0xa7b6, 0xa7b7], /* LATIN CAPITAL LETTER OMEGA */
+  [0xa7b6, 0xa7b7], /* LATIN SMALL LETTER OMEGA */
   [0xa7b8, 0xa7b8],
   [0xa7b9, 0xa7b9],
   [0xa7ba, 0xa7ba],
   [0xa7bb, 0xa7bb],
   [0xa7bc, 0xa7bc],
   [0xa7bd, 0xa7bd],
   [0xa7be, 0xa7be],
   [0xa7bf, 0xa7bf],
@@ -43000,17 +43000,17 @@ var mapping = [
   [0xa7ef, 0xa7ef],
   [0xa7f0, 0xa7f0],
   [0xa7f1, 0xa7f1],
   [0xa7f2, 0xa7f2],
   [0xa7f3, 0xa7f3],
   [0xa7f4, 0xa7f4],
   [0xa7f5, 0xa7f5],
   [0xa7f6, 0xa7f6],
-  [0xa7f7, 0xa7f7],
+  [0xa7f7, 0xa7f7], /* LATIN EPIGRAPHIC LETTER SIDEWAYS I */
   [0xa7f8, 0xa7f8], /* MODIFIER LETTER CAPITAL H WITH STROKE */
   [0xa7f9, 0xa7f9], /* MODIFIER LETTER SMALL LIGATURE OE */
   [0xa7fa, 0xa7fa], /* LATIN LETTER SMALL CAPITAL TURNED M */
   [0xa7fb, 0xa7fb], /* LATIN EPIGRAPHIC LETTER REVERSED F */
   [0xa7fc, 0xa7fc], /* LATIN EPIGRAPHIC LETTER REVERSED P */
   [0xa7fd, 0xa7fd], /* LATIN EPIGRAPHIC LETTER INVERTED M */
   [0xa7fe, 0xa7fe], /* LATIN EPIGRAPHIC LETTER I LONGA */
   [0xa7ff, 0xa7ff], /* LATIN EPIGRAPHIC LETTER ARCHAIC M */
@@ -43206,17 +43206,17 @@ var mapping = [
   [0xa8bd, 0xa8bd], /* SAURASHTRA VOWEL SIGN VOCALIC LL */
   [0xa8be, 0xa8be], /* SAURASHTRA VOWEL SIGN E */
   [0xa8bf, 0xa8bf], /* SAURASHTRA VOWEL SIGN EE */
   [0xa8c0, 0xa8c0], /* SAURASHTRA VOWEL SIGN AI */
   [0xa8c1, 0xa8c1], /* SAURASHTRA VOWEL SIGN O */
   [0xa8c2, 0xa8c2], /* SAURASHTRA VOWEL SIGN OO */
   [0xa8c3, 0xa8c3], /* SAURASHTRA VOWEL SIGN AU */
   [0xa8c4, 0xa8c4], /* SAURASHTRA SIGN VIRAMA */
-  [0xa8c5, 0xa8c5],
+  [0xa8c5, 0xa8c5], /* SAURASHTRA SIGN CANDRABINDU */
   [0xa8c6, 0xa8c6],
   [0xa8c7, 0xa8c7],
   [0xa8c8, 0xa8c8],
   [0xa8c9, 0xa8c9],
   [0xa8ca, 0xa8ca],
   [0xa8cb, 0xa8cb],
   [0xa8cc, 0xa8cc],
   [0xa8cd, 0xa8cd],
@@ -43261,18 +43261,18 @@ var mapping = [
   [0xa8f4, 0xa8f4], /* DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA */
   [0xa8f5, 0xa8f5], /* DEVANAGARI SIGN CANDRABINDU TWO */
   [0xa8f6, 0xa8f6], /* DEVANAGARI SIGN CANDRABINDU THREE */
   [0xa8f7, 0xa8f7], /* DEVANAGARI SIGN CANDRABINDU AVAGRAHA */
   [0xa8f8, 0xa8f8], /* DEVANAGARI SIGN PUSHPIKA */
   [0xa8f9, 0xa8f9], /* DEVANAGARI GAP FILLER */
   [0xa8fa, 0xa8fa], /* DEVANAGARI CARET */
   [0xa8fb, 0xa8fb], /* DEVANAGARI HEADSTROKE */
-  [0xa8fc, 0xa8fc],
-  [0xa8fd, 0xa8fd],
+  [0xa8fc, 0xa8fc], /* DEVANAGARI SIGN SIDDHAM */
+  [0xa8fd, 0xa8fd], /* DEVANAGARI JAIN OM */
   [0xa8fe, 0xa8fe],
   [0xa8ff, 0xa8ff],
   [0xa900, 0xa900], /* KAYAH LI DIGIT ZERO */
   [0xa901, 0xa901], /* KAYAH LI DIGIT ONE */
   [0xa902, 0xa902], /* KAYAH LI DIGIT TWO */
   [0xa903, 0xa903], /* KAYAH LI DIGIT THREE */
   [0xa904, 0xa904], /* KAYAH LI DIGIT FOUR */
   [0xa905, 0xa905], /* KAYAH LI DIGIT FIVE */
@@ -43489,47 +43489,47 @@ var mapping = [
   [0xa9d8, 0xa9d8], /* JAVANESE DIGIT EIGHT */
   [0xa9d9, 0xa9d9], /* JAVANESE DIGIT NINE */
   [0xa9da, 0xa9da],
   [0xa9db, 0xa9db],
   [0xa9dc, 0xa9dc],
   [0xa9dd, 0xa9dd],
   [0xa9de, 0xa9de], /* JAVANESE PADA TIRTA TUMETES */
   [0xa9df, 0xa9df], /* JAVANESE PADA ISEN-ISEN */
-  [0xa9e0, 0xa9e0],
-  [0xa9e1, 0xa9e1],
-  [0xa9e2, 0xa9e2],
-  [0xa9e3, 0xa9e3],
-  [0xa9e4, 0xa9e4],
-  [0xa9e5, 0xa9e5],
-  [0xa9e6, 0xa9e6],
-  [0xa9e7, 0xa9e7],
-  [0xa9e8, 0xa9e8],
-  [0xa9e9, 0xa9e9],
-  [0xa9ea, 0xa9ea],
-  [0xa9eb, 0xa9eb],
-  [0xa9ec, 0xa9ec],
-  [0xa9ed, 0xa9ed],
-  [0xa9ee, 0xa9ee],
-  [0xa9ef, 0xa9ef],
-  [0xa9f0, 0xa9f0],
-  [0xa9f1, 0xa9f1],
-  [0xa9f2, 0xa9f2],
-  [0xa9f3, 0xa9f3],
-  [0xa9f4, 0xa9f4],
-  [0xa9f5, 0xa9f5],
-  [0xa9f6, 0xa9f6],
-  [0xa9f7, 0xa9f7],
-  [0xa9f8, 0xa9f8],
-  [0xa9f9, 0xa9f9],
-  [0xa9fa, 0xa9fa],
-  [0xa9fb, 0xa9fb],
-  [0xa9fc, 0xa9fc],
-  [0xa9fd, 0xa9fd],
-  [0xa9fe, 0xa9fe],
+  [0xa9e0, 0xa9e0], /* MYANMAR LETTER SHAN GHA */
+  [0xa9e1, 0xa9e1], /* MYANMAR LETTER SHAN CHA */
+  [0xa9e2, 0xa9e2], /* MYANMAR LETTER SHAN JHA */
+  [0xa9e3, 0xa9e3], /* MYANMAR LETTER SHAN NNA */
+  [0xa9e4, 0xa9e4], /* MYANMAR LETTER SHAN BHA */
+  [0xa9e5, 0xa9e5], /* MYANMAR SIGN SHAN SAW */
+  [0xa9e6, 0xa9e6], /* MYANMAR MODIFIER LETTER SHAN REDUPLICATION */
+  [0xa9e7, 0xa9e7], /* MYANMAR LETTER TAI LAING NYA */
+  [0xa9e8, 0xa9e8], /* MYANMAR LETTER TAI LAING FA */
+  [0xa9e9, 0xa9e9], /* MYANMAR LETTER TAI LAING GA */
+  [0xa9ea, 0xa9ea], /* MYANMAR LETTER TAI LAING GHA */
+  [0xa9eb, 0xa9eb], /* MYANMAR LETTER TAI LAING JA */
+  [0xa9ec, 0xa9ec], /* MYANMAR LETTER TAI LAING JHA */
+  [0xa9ed, 0xa9ed], /* MYANMAR LETTER TAI LAING DDA */
+  [0xa9ee, 0xa9ee], /* MYANMAR LETTER TAI LAING DDHA */
+  [0xa9ef, 0xa9ef], /* MYANMAR LETTER TAI LAING NNA */
+  [0xa9f0, 0xa9f0], /* MYANMAR TAI LAING DIGIT ZERO */
+  [0xa9f1, 0xa9f1], /* MYANMAR TAI LAING DIGIT ONE */
+  [0xa9f2, 0xa9f2], /* MYANMAR TAI LAING DIGIT TWO */
+  [0xa9f3, 0xa9f3], /* MYANMAR TAI LAING DIGIT THREE */
+  [0xa9f4, 0xa9f4], /* MYANMAR TAI LAING DIGIT FOUR */
+  [0xa9f5, 0xa9f5], /* MYANMAR TAI LAING DIGIT FIVE */
+  [0xa9f6, 0xa9f6], /* MYANMAR TAI LAING DIGIT SIX */
+  [0xa9f7, 0xa9f7], /* MYANMAR TAI LAING DIGIT SEVEN */
+  [0xa9f8, 0xa9f8], /* MYANMAR TAI LAING DIGIT EIGHT */
+  [0xa9f9, 0xa9f9], /* MYANMAR TAI LAING DIGIT NINE */
+  [0xa9fa, 0xa9fa], /* MYANMAR LETTER TAI LAING LLA */
+  [0xa9fb, 0xa9fb], /* MYANMAR LETTER TAI LAING DA */
+  [0xa9fc, 0xa9fc], /* MYANMAR LETTER TAI LAING DHA */
+  [0xa9fd, 0xa9fd], /* MYANMAR LETTER TAI LAING BA */
+  [0xa9fe, 0xa9fe], /* MYANMAR LETTER TAI LAING BHA */
   [0xa9ff, 0xa9ff],
   [0xaa00, 0xaa00], /* CHAM LETTER A */
   [0xaa01, 0xaa01], /* CHAM LETTER I */
   [0xaa02, 0xaa02], /* CHAM LETTER U */
   [0xaa03, 0xaa03], /* CHAM LETTER E */
   [0xaa04, 0xaa04], /* CHAM LETTER AI */
   [0xaa05, 0xaa05], /* CHAM LETTER O */
   [0xaa06, 0xaa06], /* CHAM LETTER KA */
@@ -43645,20 +43645,20 @@ var mapping = [
   [0xaa74, 0xaa74], /* MYANMAR LOGOGRAM KHAMTI OAY */
   [0xaa75, 0xaa75], /* MYANMAR LOGOGRAM KHAMTI QN */
   [0xaa76, 0xaa76], /* MYANMAR LOGOGRAM KHAMTI HM */
   [0xaa77, 0xaa77], /* MYANMAR SYMBOL AITON EXCLAMATION */
   [0xaa78, 0xaa78], /* MYANMAR SYMBOL AITON ONE */
   [0xaa79, 0xaa79], /* MYANMAR SYMBOL AITON TWO */
   [0xaa7a, 0xaa7a], /* MYANMAR LETTER AITON RA */
   [0xaa7b, 0xaa7b], /* MYANMAR SIGN PAO KAREN TONE */
-  [0xaa7c, 0xaa7c],
-  [0xaa7d, 0xaa7d],
-  [0xaa7e, 0xaa7e],
-  [0xaa7f, 0xaa7f],
+  [0xaa7c, 0xaa7c], /* MYANMAR SIGN TAI LAING TONE-2 */
+  [0xaa7d, 0xaa7d], /* MYANMAR SIGN TAI LAING TONE-5 */
+  [0xaa7e, 0xaa7e], /* MYANMAR LETTER SHWE PALAUNG CHA */
+  [0xaa7f, 0xaa7f], /* MYANMAR LETTER SHWE PALAUNG SHA */
   [0xaa80, 0xaa80], /* TAI VIET LETTER LOW KO */
   [0xaa81, 0xaa81], /* TAI VIET LETTER HIGH KO */
   [0xaa82, 0xaa82], /* TAI VIET LETTER LOW KHO */
   [0xaa83, 0xaa83], /* TAI VIET LETTER HIGH KHO */
   [0xaa84, 0xaa84], /* TAI VIET LETTER LOW KHHO */
   [0xaa85, 0xaa85], /* TAI VIET LETTER HIGH KHHO */
   [0xaa86, 0xaa86], /* TAI VIET LETTER LOW GO */
   [0xaa87, 0xaa87], /* TAI VIET LETTER HIGH GO */
@@ -43825,160 +43825,160 @@ var mapping = [
   [0xab28, 0xab28], /* ETHIOPIC SYLLABLE BBA */
   [0xab29, 0xab29], /* ETHIOPIC SYLLABLE BBU */
   [0xab2a, 0xab2a], /* ETHIOPIC SYLLABLE BBI */
   [0xab2b, 0xab2b], /* ETHIOPIC SYLLABLE BBAA */
   [0xab2c, 0xab2c], /* ETHIOPIC SYLLABLE BBEE */
   [0xab2d, 0xab2d], /* ETHIOPIC SYLLABLE BBE */
   [0xab2e, 0xab2e], /* ETHIOPIC SYLLABLE BBO */
   [0xab2f, 0xab2f],
-  [0xab30, 0xab30],
-  [0xab31, 0xab31],
-  [0xab32, 0xab32],
-  [0xab33, 0xab33],
-  [0xab34, 0xab34],
-  [0xab35, 0xab35],
-  [0xab36, 0xab36],
-  [0xab37, 0xab37],
-  [0xab38, 0xab38],
-  [0xab39, 0xab39],
-  [0xab3a, 0xab3a],
-  [0xab3b, 0xab3b],
-  [0xab3c, 0xab3c],
-  [0xab3d, 0xab3d],
-  [0xab3e, 0xab3e],
-  [0xab3f, 0xab3f],
-  [0xab40, 0xab40],
-  [0xab41, 0xab41],
-  [0xab42, 0xab42],
-  [0xab43, 0xab43],
-  [0xab44, 0xab44],
-  [0xab45, 0xab45],
-  [0xab46, 0xab46],
-  [0xab47, 0xab47],
-  [0xab48, 0xab48],
-  [0xab49, 0xab49],
-  [0xab4a, 0xab4a],
-  [0xab4b, 0xab4b],
-  [0xab4c, 0xab4c],
-  [0xab4d, 0xab4d],
-  [0xab4e, 0xab4e],
-  [0xab4f, 0xab4f],
-  [0xab50, 0xab50],
-  [0xab51, 0xab51],
-  [0xab52, 0xab52],
-  [0xab53, 0xab53],
-  [0xab54, 0xab54],
-  [0xab55, 0xab55],
-  [0xab56, 0xab56],
-  [0xab57, 0xab57],
-  [0xab58, 0xab58],
-  [0xab59, 0xab59],
-  [0xab5a, 0xab5a],
-  [0xab5b, 0xab5b],
-  [0xab5c, 0xab5c],
-  [0xab5d, 0xab5d],
-  [0xab5e, 0xab5e],
-  [0xab5f, 0xab5f],
-  [0xab60, 0xab60],
-  [0xab61, 0xab61],
-  [0xab62, 0xab62],
-  [0xab63, 0xab63],
-  [0xab64, 0xab64],
-  [0xab65, 0xab65],
+  [0xab30, 0xab30], /* LATIN SMALL LETTER BARRED ALPHA */
+  [0xab31, 0xab31], /* LATIN SMALL LETTER A REVERSED-SCHWA */
+  [0xab32, 0xab32], /* LATIN SMALL LETTER BLACKLETTER E */
+  [0xab33, 0xab33], /* LATIN SMALL LETTER BARRED E */
+  [0xab34, 0xab34], /* LATIN SMALL LETTER E WITH FLOURISH */
+  [0xab35, 0xab35], /* LATIN SMALL LETTER LENIS F */
+  [0xab36, 0xab36], /* LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL */
+  [0xab37, 0xab37], /* LATIN SMALL LETTER L WITH INVERTED LAZY S */
+  [0xab38, 0xab38], /* LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
+  [0xab39, 0xab39], /* LATIN SMALL LETTER L WITH MIDDLE RING */
+  [0xab3a, 0xab3a], /* LATIN SMALL LETTER M WITH CROSSED-TAIL */
+  [0xab3b, 0xab3b], /* LATIN SMALL LETTER N WITH CROSSED-TAIL */
+  [0xab3c, 0xab3c], /* LATIN SMALL LETTER ENG WITH CROSSED-TAIL */
+  [0xab3d, 0xab3d], /* LATIN SMALL LETTER BLACKLETTER O */
+  [0xab3e, 0xab3e], /* LATIN SMALL LETTER BLACKLETTER O WITH STROKE */
+  [0xab3f, 0xab3f], /* LATIN SMALL LETTER OPEN O WITH STROKE */
+  [0xab40, 0xab40], /* LATIN SMALL LETTER INVERTED OE */
+  [0xab41, 0xab41], /* LATIN SMALL LETTER TURNED OE WITH STROKE */
+  [0xab42, 0xab42], /* LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE */
+  [0xab43, 0xab43], /* LATIN SMALL LETTER TURNED O OPEN-O */
+  [0xab44, 0xab44], /* LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE */
+  [0xab45, 0xab45], /* LATIN SMALL LETTER STIRRUP R */
+  [0xab46, 0xab46], /* LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG */
+  [0xab47, 0xab47], /* LATIN SMALL LETTER R WITHOUT HANDLE */
+  [0xab48, 0xab48], /* LATIN SMALL LETTER DOUBLE R */
+  [0xab49, 0xab49], /* LATIN SMALL LETTER R WITH CROSSED-TAIL */
+  [0xab4a, 0xab4a], /* LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL */
+  [0xab4b, 0xab4b], /* LATIN SMALL LETTER SCRIPT R */
+  [0xab4c, 0xab4c], /* LATIN SMALL LETTER SCRIPT R WITH RING */
+  [0xab4d, 0xab4d], /* LATIN SMALL LETTER BASELINE ESH */
+  [0xab4e, 0xab4e], /* LATIN SMALL LETTER U WITH SHORT RIGHT LEG */
+  [0xab4f, 0xab4f], /* LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG */
+  [0xab50, 0xab50], /* LATIN SMALL LETTER UI */
+  [0xab51, 0xab51], /* LATIN SMALL LETTER TURNED UI */
+  [0xab52, 0xab52], /* LATIN SMALL LETTER U WITH LEFT HOOK */
+  [0xa7b3, 0xab53], /* LATIN SMALL LETTER CHI */
+  [0xab54, 0xab54], /* LATIN SMALL LETTER CHI WITH LOW RIGHT RING */
+  [0xab55, 0xab55], /* LATIN SMALL LETTER CHI WITH LOW LEFT SERIF */
+  [0xab56, 0xab56], /* LATIN SMALL LETTER X WITH LOW RIGHT RING */
+  [0xab57, 0xab57], /* LATIN SMALL LETTER X WITH LONG LEFT LEG */
+  [0xab58, 0xab58], /* LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING */
+  [0xab59, 0xab59], /* LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF */
+  [0xab5a, 0xab5a], /* LATIN SMALL LETTER Y WITH SHORT RIGHT LEG */
+  [0xab5b, 0xab5b], /* MODIFIER BREVE WITH INVERTED BREVE */
+  [0xab5c, 0xab5c], /* MODIFIER LETTER SMALL HENG */
+  [0xab5d, 0xab5d], /* MODIFIER LETTER SMALL L WITH INVERTED LAZY S */
+  [0xab5e, 0xab5e], /* MODIFIER LETTER SMALL L WITH MIDDLE TILDE */
+  [0xab5f, 0xab5f], /* MODIFIER LETTER SMALL U WITH LEFT HOOK */
+  [0xab60, 0xab60], /* LATIN SMALL LETTER SAKHA YAT */
+  [0xab61, 0xab61], /* LATIN SMALL LETTER IOTIFIED E */
+  [0xab62, 0xab62], /* LATIN SMALL LETTER OPEN OE */
+  [0xab63, 0xab63], /* LATIN SMALL LETTER UO */
+  [0xab64, 0xab64], /* LATIN SMALL LETTER INVERTED ALPHA */
+  [0xab65, 0xab65], /* GREEK LETTER SMALL CAPITAL OMEGA */
   [0xab66, 0xab66],
   [0xab67, 0xab67],
   [0xab68, 0xab68],
   [0xab69, 0xab69],
   [0xab6a, 0xab6a],
   [0xab6b, 0xab6b],
   [0xab6c, 0xab6c],
   [0xab6d, 0xab6d],
   [0xab6e, 0xab6e],
   [0xab6f, 0xab6f],
-  [0xab70, 0xab70],
-  [0xab71, 0xab71],
-  [0xab72, 0xab72],
-  [0xab73, 0xab73],
-  [0xab74, 0xab74],
-  [0xab75, 0xab75],
-  [0xab76, 0xab76],
-  [0xab77, 0xab77],
-  [0xab78, 0xab78],
-  [0xab79, 0xab79],
-  [0xab7a, 0xab7a],
-  [0xab7b, 0xab7b],
-  [0xab7c, 0xab7c],
-  [0xab7d, 0xab7d],
-  [0xab7e, 0xab7e],
-  [0xab7f, 0xab7f],
-  [0xab80, 0xab80],
-  [0xab81, 0xab81],
-  [0xab82, 0xab82],
-  [0xab83, 0xab83],
-  [0xab84, 0xab84],
-  [0xab85, 0xab85],
-  [0xab86, 0xab86],
-  [0xab87, 0xab87],
-  [0xab88, 0xab88],
-  [0xab89, 0xab89],
-  [0xab8a, 0xab8a],
-  [0xab8b, 0xab8b],
-  [0xab8c, 0xab8c],
-  [0xab8d, 0xab8d],
-  [0xab8e, 0xab8e],
-  [0xab8f, 0xab8f],
-  [0xab90, 0xab90],
-  [0xab91, 0xab91],
-  [0xab92, 0xab92],
-  [0xab93, 0xab93],
-  [0xab94, 0xab94],
-  [0xab95, 0xab95],
-  [0xab96, 0xab96],
-  [0xab97, 0xab97],
-  [0xab98, 0xab98],
-  [0xab99, 0xab99],
-  [0xab9a, 0xab9a],
-  [0xab9b, 0xab9b],
-  [0xab9c, 0xab9c],
-  [0xab9d, 0xab9d],
-  [0xab9e, 0xab9e],
-  [0xab9f, 0xab9f],
-  [0xaba0, 0xaba0],
-  [0xaba1, 0xaba1],
-  [0xaba2, 0xaba2],
-  [0xaba3, 0xaba3],
-  [0xaba4, 0xaba4],
-  [0xaba5, 0xaba5],
-  [0xaba6, 0xaba6],
-  [0xaba7, 0xaba7],
-  [0xaba8, 0xaba8],
-  [0xaba9, 0xaba9],
-  [0xabaa, 0xabaa],
-  [0xabab, 0xabab],
-  [0xabac, 0xabac],
-  [0xabad, 0xabad],
-  [0xabae, 0xabae],
-  [0xabaf, 0xabaf],
-  [0xabb0, 0xabb0],
-  [0xabb1, 0xabb1],
-  [0xabb2, 0xabb2],
-  [0xabb3, 0xabb3],
-  [0xabb4, 0xabb4],
-  [0xabb5, 0xabb5],
-  [0xabb6, 0xabb6],
-  [0xabb7, 0xabb7],
-  [0xabb8, 0xabb8],
-  [0xabb9, 0xabb9],
-  [0xabba, 0xabba],
-  [0xabbb, 0xabbb],
-  [0xabbc, 0xabbc],
-  [0xabbd, 0xabbd],
-  [0xabbe, 0xabbe],
-  [0xabbf, 0xabbf],
+  [0x13a0, 0xab70], /* CHEROKEE SMALL LETTER A */
+  [0x13a1, 0xab71], /* CHEROKEE SMALL LETTER E */
+  [0x13a2, 0xab72], /* CHEROKEE SMALL LETTER I */
+  [0x13a3, 0xab73], /* CHEROKEE SMALL LETTER O */
+  [0x13a4, 0xab74], /* CHEROKEE SMALL LETTER U */
+  [0x13a5, 0xab75], /* CHEROKEE SMALL LETTER V */
+  [0x13a6, 0xab76], /* CHEROKEE SMALL LETTER GA */
+  [0x13a7, 0xab77], /* CHEROKEE SMALL LETTER KA */
+  [0x13a8, 0xab78], /* CHEROKEE SMALL LETTER GE */
+  [0x13a9, 0xab79], /* CHEROKEE SMALL LETTER GI */
+  [0x13aa, 0xab7a], /* CHEROKEE SMALL LETTER GO */
+  [0x13ab, 0xab7b], /* CHEROKEE SMALL LETTER GU */
+  [0x13ac, 0xab7c], /* CHEROKEE SMALL LETTER GV */
+  [0x13ad, 0xab7d], /* CHEROKEE SMALL LETTER HA */
+  [0x13ae, 0xab7e], /* CHEROKEE SMALL LETTER HE */
+  [0x13af, 0xab7f], /* CHEROKEE SMALL LETTER HI */
+  [0x13b0, 0xab80], /* CHEROKEE SMALL LETTER HO */
+  [0x13b1, 0xab81], /* CHEROKEE SMALL LETTER HU */
+  [0x13b2, 0xab82], /* CHEROKEE SMALL LETTER HV */
+  [0x13b3, 0xab83], /* CHEROKEE SMALL LETTER LA */
+  [0x13b4, 0xab84], /* CHEROKEE SMALL LETTER LE */
+  [0x13b5, 0xab85], /* CHEROKEE SMALL LETTER LI */
+  [0x13b6, 0xab86], /* CHEROKEE SMALL LETTER LO */
+  [0x13b7, 0xab87], /* CHEROKEE SMALL LETTER LU */
+  [0x13b8, 0xab88], /* CHEROKEE SMALL LETTER LV */
+  [0x13b9, 0xab89], /* CHEROKEE SMALL LETTER MA */
+  [0x13ba, 0xab8a], /* CHEROKEE SMALL LETTER ME */
+  [0x13bb, 0xab8b], /* CHEROKEE SMALL LETTER MI */
+  [0x13bc, 0xab8c], /* CHEROKEE SMALL LETTER MO */
+  [0x13bd, 0xab8d], /* CHEROKEE SMALL LETTER MU */
+  [0x13be, 0xab8e], /* CHEROKEE SMALL LETTER NA */
+  [0x13bf, 0xab8f], /* CHEROKEE SMALL LETTER HNA */
+  [0x13c0, 0xab90], /* CHEROKEE SMALL LETTER NAH */
+  [0x13c1, 0xab91], /* CHEROKEE SMALL LETTER NE */
+  [0x13c2, 0xab92], /* CHEROKEE SMALL LETTER NI */
+  [0x13c3, 0xab93], /* CHEROKEE SMALL LETTER NO */
+  [0x13c4, 0xab94], /* CHEROKEE SMALL LETTER NU */
+  [0x13c5, 0xab95], /* CHEROKEE SMALL LETTER NV */
+  [0x13c6, 0xab96], /* CHEROKEE SMALL LETTER QUA */
+  [0x13c7, 0xab97], /* CHEROKEE SMALL LETTER QUE */
+  [0x13c8, 0xab98], /* CHEROKEE SMALL LETTER QUI */
+  [0x13c9, 0xab99], /* CHEROKEE SMALL LETTER QUO */
+  [0x13ca, 0xab9a], /* CHEROKEE SMALL LETTER QUU */
+  [0x13cb, 0xab9b], /* CHEROKEE SMALL LETTER QUV */
+  [0x13cc, 0xab9c], /* CHEROKEE SMALL LETTER SA */
+  [0x13cd, 0xab9d], /* CHEROKEE SMALL LETTER S */
+  [0x13ce, 0xab9e], /* CHEROKEE SMALL LETTER SE */
+  [0x13cf, 0xab9f], /* CHEROKEE SMALL LETTER SI */
+  [0x13d0, 0xaba0], /* CHEROKEE SMALL LETTER SO */
+  [0x13d1, 0xaba1], /* CHEROKEE SMALL LETTER SU */
+  [0x13d2, 0xaba2], /* CHEROKEE SMALL LETTER SV */
+  [0x13d3, 0xaba3], /* CHEROKEE SMALL LETTER DA */
+  [0x13d4, 0xaba4], /* CHEROKEE SMALL LETTER TA */
+  [0x13d5, 0xaba5], /* CHEROKEE SMALL LETTER DE */
+  [0x13d6, 0xaba6], /* CHEROKEE SMALL LETTER TE */
+  [0x13d7, 0xaba7], /* CHEROKEE SMALL LETTER DI */
+  [0x13d8, 0xaba8], /* CHEROKEE SMALL LETTER TI */
+  [0x13d9, 0xaba9], /* CHEROKEE SMALL LETTER DO */
+  [0x13da, 0xabaa], /* CHEROKEE SMALL LETTER DU */
+  [0x13db, 0xabab], /* CHEROKEE SMALL LETTER DV */
+  [0x13dc, 0xabac], /* CHEROKEE SMALL LETTER DLA */
+  [0x13dd, 0xabad], /* CHEROKEE SMALL LETTER TLA */
+  [0x13de, 0xabae], /* CHEROKEE SMALL LETTER TLE */
+  [0x13df, 0xabaf], /* CHEROKEE SMALL LETTER TLI */
+  [0x13e0, 0xabb0], /* CHEROKEE SMALL LETTER TLO */
+  [0x13e1, 0xabb1], /* CHEROKEE SMALL LETTER TLU */
+  [0x13e2, 0xabb2], /* CHEROKEE SMALL LETTER TLV */
+  [0x13e3, 0xabb3], /* CHEROKEE SMALL LETTER TSA */
+  [0x13e4, 0xabb4], /* CHEROKEE SMALL LETTER TSE */
+  [0x13e5, 0xabb5], /* CHEROKEE SMALL LETTER TSI */
+  [0x13e6, 0xabb6], /* CHEROKEE SMALL LETTER TSO */
+  [0x13e7, 0xabb7], /* CHEROKEE SMALL LETTER TSU */
+  [0x13e8, 0xabb8], /* CHEROKEE SMALL LETTER TSV */
+  [0x13e9, 0xabb9], /* CHEROKEE SMALL LETTER WA */
+  [0x13ea, 0xabba], /* CHEROKEE SMALL LETTER WE */
+  [0x13eb, 0xabbb], /* CHEROKEE SMALL LETTER WI */
+  [0x13ec, 0xabbc], /* CHEROKEE SMALL LETTER WO */
+  [0x13ed, 0xabbd], /* CHEROKEE SMALL LETTER WU */
+  [0x13ee, 0xabbe], /* CHEROKEE SMALL LETTER WV */
+  [0x13ef, 0xabbf], /* CHEROKEE SMALL LETTER YA */
   [0xabc0, 0xabc0], /* MEETEI MAYEK LETTER KOK */
   [0xabc1, 0xabc1], /* MEETEI MAYEK LETTER SAM */
   [0xabc2, 0xabc2], /* MEETEI MAYEK LETTER LAI */
   [0xabc3, 0xabc3], /* MEETEI MAYEK LETTER MIT */
   [0xabc4, 0xabc4], /* MEETEI MAYEK LETTER PA */
   [0xabc5, 0xabc5], /* MEETEI MAYEK LETTER NA */
   [0xabc6, 0xabc6], /* MEETEI MAYEK LETTER CHIL */
   [0xabc7, 0xabc7], /* MEETEI MAYEK LETTER TIL */
@@ -65064,25 +65064,25 @@ var mapping = [
   [0xfe1f, 0xfe1f],
   [0xfe20, 0xfe20], /* COMBINING LIGATURE LEFT HALF */
   [0xfe21, 0xfe21], /* COMBINING LIGATURE RIGHT HALF */
   [0xfe22, 0xfe22], /* COMBINING DOUBLE TILDE LEFT HALF */
   [0xfe23, 0xfe23], /* COMBINING DOUBLE TILDE RIGHT HALF */
   [0xfe24, 0xfe24], /* COMBINING MACRON LEFT HALF */
   [0xfe25, 0xfe25], /* COMBINING MACRON RIGHT HALF */
   [0xfe26, 0xfe26], /* COMBINING CONJOINING MACRON */
-  [0xfe27, 0xfe27],
-  [0xfe28, 0xfe28],
-  [0xfe29, 0xfe29],
-  [0xfe2a, 0xfe2a],
-  [0xfe2b, 0xfe2b],
-  [0xfe2c, 0xfe2c],
-  [0xfe2d, 0xfe2d],
-  [0xfe2e, 0xfe2e],
-  [0xfe2f, 0xfe2f],
+  [0xfe27, 0xfe27], /* COMBINING LIGATURE LEFT HALF BELOW */
+  [0xfe28, 0xfe28], /* COMBINING LIGATURE RIGHT HALF BELOW */
+  [0xfe29, 0xfe29], /* COMBINING TILDE LEFT HALF BELOW */
+  [0xfe2a, 0xfe2a], /* COMBINING TILDE RIGHT HALF BELOW */
+  [0xfe2b, 0xfe2b], /* COMBINING MACRON LEFT HALF BELOW */
+  [0xfe2c, 0xfe2c], /* COMBINING MACRON RIGHT HALF BELOW */
+  [0xfe2d, 0xfe2d], /* COMBINING CONJOINING MACRON BELOW */
+  [0xfe2e, 0xfe2e], /* COMBINING CYRILLIC TITLO LEFT HALF */
+  [0xfe2f, 0xfe2f], /* COMBINING CYRILLIC TITLO RIGHT HALF */
   [0xfe30, 0xfe30], /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (GLYPH FOR VERTICAL TWO DOT LEADER) */
   [0xfe31, 0xfe31], /* PRESENTATION FORM FOR VERTICAL EM DASH (GLYPH FOR VERTICAL EM DASH) */
   [0xfe32, 0xfe32], /* PRESENTATION FORM FOR VERTICAL EN DASH (GLYPH FOR VERTICAL EN DASH) */
   [0xfe33, 0xfe33], /* PRESENTATION FORM FOR VERTICAL LOW LINE (GLYPH FOR VERTICAL SPACING UNDERSCORE) */
   [0xfe34, 0xfe34], /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE) */
   [0xfe35, 0xfe35], /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (GLYPH FOR VERTICAL OPENING PARENTHESIS) */
   [0xfe36, 0xfe36], /* PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (GLYPH FOR VERTICAL CLOSING PARENTHESIS) */
   [0xfe37, 0xfe37], /* PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET (GLYPH FOR VERTICAL OPENING CURLY BRACKET) */
--- a/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js
+++ b/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js
@@ -1,10 +1,10 @@
 /* Generated by make_unicode.py DO NOT MODIFY */
-/* Unicode version: 8.0.0 */
+/* Unicode version: 9.0.0 */
 
 /*
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/licenses/publicdomain/
  */
 
 var BUGNUMBER = 1135377;
 var summary = "Implement RegExp unicode flag -- ignoreCase flag.";
@@ -458,16 +458,17 @@ test(0x25b,0x190);
 test(0x25c,0xa7ab);
 test(0x260,0x193);
 test(0x261,0xa7ac);
 test(0x263,0x194);
 test(0x265,0xa78d);
 test(0x266,0xa7aa);
 test(0x268,0x197);
 test(0x269,0x196);
+test(0x26a,0xa7ae);
 test(0x26b,0x2c62);
 test(0x26c,0xa7ad);
 test(0x26f,0x19c);
 test(0x271,0x2c6e);
 test(0x272,0x19d);
 test(0x275,0x19f);
 test(0x27d,0x2c64);
 test(0x280,0x1a6);
@@ -616,73 +617,73 @@ test(0x409,0x459);
 test(0x40a,0x45a);
 test(0x40b,0x45b);
 test(0x40c,0x45c);
 test(0x40d,0x45d);
 test(0x40e,0x45e);
 test(0x40f,0x45f);
 test(0x410,0x430);
 test(0x411,0x431);
-test(0x412,0x432);
+test(0x412,0x432,0x1c80);
 test(0x413,0x433);
-test(0x414,0x434);
+test(0x414,0x434,0x1c81);
 test(0x415,0x435);
 test(0x416,0x436);
 test(0x417,0x437);
 test(0x418,0x438);
 test(0x419,0x439);
 test(0x41a,0x43a);
 test(0x41b,0x43b);
 test(0x41c,0x43c);
 test(0x41d,0x43d);
-test(0x41e,0x43e);
+test(0x41e,0x43e,0x1c82);
 test(0x41f,0x43f);
 test(0x420,0x440);
-test(0x421,0x441);
-test(0x422,0x442);
+test(0x421,0x441,0x1c83);
+test(0x422,0x442,0x1c84,0x1c85);
 test(0x423,0x443);
 test(0x424,0x444);
 test(0x425,0x445);
 test(0x426,0x446);
 test(0x427,0x447);
 test(0x428,0x448);
 test(0x429,0x449);
-test(0x42a,0x44a);
+test(0x42a,0x44a,0x1c86);
 test(0x42b,0x44b);
 test(0x42c,0x44c);
 test(0x42d,0x44d);
 test(0x42e,0x44e);
 test(0x42f,0x44f);
 test(0x430,0x410);
 test(0x431,0x411);
-test(0x432,0x412);
+test(0x432,0x412,0x1c80);
 test(0x433,0x413);
-test(0x434,0x414);
+test(0x434,0x414,0x1c81);
 test(0x435,0x415);
 test(0x436,0x416);
 test(0x437,0x417);
 test(0x438,0x418);
 test(0x439,0x419);
 test(0x43a,0x41a);
 test(0x43b,0x41b);
 test(0x43c,0x41c);
 test(0x43d,0x41d);
-test(0x43e,0x41e);
+test(0x43e,0x41e,0x1c82);
 test(0x43f,0x41f);
 test(0x440,0x420);
-test(0x441,0x421);
-test(0x442,0x422);
+test(0x441,0x421,0x1c83);
+test(0x442,0x422,0x1c84,0x1c85);
 test(0x443,0x423);
 test(0x444,0x424);
 test(0x445,0x425);
 test(0x446,0x426);
 test(0x447,0x427);
 test(0x448,0x428);
 test(0x449,0x429);
-test(0x44a,0x42a);
+test(0x44a,0x42a,0x1c86);
 test(0x44b,0x42b);
 test(0x44c,0x42c);
 test(0x44d,0x42d);
 test(0x44e,0x42e);
 test(0x44f,0x42f);
 test(0x450,0x400);
 test(0x451,0x401);
 test(0x452,0x402);
@@ -696,18 +697,18 @@ test(0x459,0x409);
 test(0x45a,0x40a);
 test(0x45b,0x40b);
 test(0x45c,0x40c);
 test(0x45d,0x40d);
 test(0x45e,0x40e);
 test(0x45f,0x40f);
 test(0x460,0x461);
 test(0x461,0x460);
-test(0x462,0x463);
-test(0x463,0x462);
+test(0x462,0x463,0x1c87);
+test(0x463,0x462,0x1c87);
 test(0x464,0x465);
 test(0x465,0x464);
 test(0x466,0x467);
 test(0x467,0x466);
 test(0x468,0x469);
 test(0x469,0x468);
 test(0x46a,0x46b);
 test(0x46b,0x46a);
@@ -1102,16 +1103,25 @@ test(0x13f3,0x13fb);
 test(0x13f4,0x13fc);
 test(0x13f5,0x13fd);
 test(0x13f8,0x13f0);
 test(0x13f9,0x13f1);
 test(0x13fa,0x13f2);
 test(0x13fb,0x13f3);
 test(0x13fc,0x13f4);
 test(0x13fd,0x13f5);
+test(0x1c80,0x432,0x412);
+test(0x1c81,0x434,0x414);
+test(0x1c82,0x43e,0x41e);
+test(0x1c83,0x441,0x421);
+test(0x1c84,0x442,0x422,0x1c85);
+test(0x1c85,0x442,0x422,0x1c84);
+test(0x1c86,0x44a,0x42a);
+test(0x1c87,0x463,0x462);
+test(0x1c88,0xa64b,0xa64a);
 test(0x1d79,0xa77d);
 test(0x1d7d,0x2c63);
 test(0x1e00,0x1e01);
 test(0x1e01,0x1e00);
 test(0x1e02,0x1e03);
 test(0x1e03,0x1e02);
 test(0x1e04,0x1e05);
 test(0x1e05,0x1e04);
@@ -1909,18 +1919,18 @@ test(0xa641,0xa640);
 test(0xa642,0xa643);
 test(0xa643,0xa642);
 test(0xa644,0xa645);
 test(0xa645,0xa644);
 test(0xa646,0xa647);
 test(0xa647,0xa646);
 test(0xa648,0xa649);
 test(0xa649,0xa648);
-test(0xa64a,0xa64b);
-test(0xa64b,0xa64a);
+test(0xa64a,0xa64b,0x1c88);
+test(0xa64b,0x1c88,0xa64a);
 test(0xa64c,0xa64d);
 test(0xa64d,0xa64c);
 test(0xa64e,0xa64f);
 test(0xa64f,0xa64e);
 test(0xa650,0xa651);
 test(0xa651,0xa650);
 test(0xa652,0xa653);
 test(0xa653,0xa652);
@@ -2095,16 +2105,17 @@ test(0xa7a5,0xa7a4);
 test(0xa7a6,0xa7a7);
 test(0xa7a7,0xa7a6);
 test(0xa7a8,0xa7a9);
 test(0xa7a9,0xa7a8);
 test(0xa7aa,0x266);
 test(0xa7ab,0x25c);
 test(0xa7ac,0x261);
 test(0xa7ad,0x26c);
+test(0xa7ae,0x26a);
 test(0xa7b0,0x29e);
 test(0xa7b1,0x287);
 test(0xa7b2,0x29d);
 test(0xa7b3,0xab53);
 test(0xa7b4,0xa7b5);
 test(0xa7b5,0xa7b4);
 test(0xa7b6,0xa7b7);
 test(0xa7b7,0xa7b6);
@@ -2316,16 +2327,88 @@ test(0x10447,0x1041f);
 test(0x10448,0x10420);
 test(0x10449,0x10421);
 test(0x1044a,0x10422);
 test(0x1044b,0x10423);
 test(0x1044c,0x10424);
 test(0x1044d,0x10425);
 test(0x1044e,0x10426);
 test(0x1044f,0x10427);
+test(0x104b0,0x104d8);
+test(0x104b1,0x104d9);
+test(0x104b2,0x104da);
+test(0x104b3,0x104db);
+test(0x104b4,0x104dc);
+test(0x104b5,0x104dd);
+test(0x104b6,0x104de);
+test(0x104b7,0x104df);
+test(0x104b8,0x104e0);
+test(0x104b9,0x104e1);
+test(0x104ba,0x104e2);
+test(0x104bb,0x104e3);
+test(0x104bc,0x104e4);
+test(0x104bd,0x104e5);
+test(0x104be,0x104e6);
+test(0x104bf,0x104e7);
+test(0x104c0,0x104e8);
+test(0x104c1,0x104e9);
+test(0x104c2,0x104ea);
+test(0x104c3,0x104eb);
+test(0x104c4,0x104ec);
+test(0x104c5,0x104ed);
+test(0x104c6,0x104ee);
+test(0x104c7,0x104ef);
+test(0x104c8,0x104f0);
+test(0x104c9,0x104f1);
+test(0x104ca,0x104f2);
+test(0x104cb,0x104f3);
+test(0x104cc,0x104f4);
+test(0x104cd,0x104f5);
+test(0x104ce,0x104f6);
+test(0x104cf,0x104f7);
+test(0x104d0,0x104f8);
+test(0x104d1,0x104f9);
+test(0x104d2,0x104fa);
+test(0x104d3,0x104fb);
+test(0x104d8,0x104b0);
+test(0x104d9,0x104b1);
+test(0x104da,0x104b2);
+test(0x104db,0x104b3);
+test(0x104dc,0x104b4);
+test(0x104dd,0x104b5);
+test(0x104de,0x104b6);
+test(0x104df,0x104b7);
+test(0x104e0,0x104b8);
+test(0x104e1,0x104b9);
+test(0x104e2,0x104ba);
+test(0x104e3,0x104bb);
+test(0x104e4,0x104bc);
+test(0x104e5,0x104bd);
+test(0x104e6,0x104be);
+test(0x104e7,0x104bf);
+test(0x104e8,0x104c0);
+test(0x104e9,0x104c1);
+test(0x104ea,0x104c2);
+test(0x104eb,0x104c3);
+test(0x104ec,0x104c4);
+test(0x104ed,0x104c5);
+test(0x104ee,0x104c6);
+test(0x104ef,0x104c7);
+test(0x104f0,0x104c8);
+test(0x104f1,0x104c9);
+test(0x104f2,0x104ca);
+test(0x104f3,0x104cb);
+test(0x104f4,0x104cc);
+test(0x104f5,0x104cd);
+test(0x104f6,0x104ce);
+test(0x104f7,0x104cf);
+test(0x104f8,0x104d0);
+test(0x104f9,0x104d1);
+test(0x104fa,0x104d2);
+test(0x104fb,0x104d3);
 test(0x10c80,0x10cc0);
 test(0x10c81,0x10cc1);
 test(0x10c82,0x10cc2);
 test(0x10c83,0x10cc3);
 test(0x10c84,0x10cc4);
 test(0x10c85,0x10cc5);
 test(0x10c86,0x10cc6);
 test(0x10c87,0x10cc7);
@@ -2482,11 +2565,79 @@ test(0x118d7,0x118b7);
 test(0x118d8,0x118b8);
 test(0x118d9,0x118b9);
 test(0x118da,0x118ba);
 test(0x118db,0x118bb);
 test(0x118dc,0x118bc);
 test(0x118dd,0x118bd);
 test(0x118de,0x118be);
 test(0x118df,0x118bf);
+test(0x1e900,0x1e922);
+test(0x1e901,0x1e923);
+test(0x1e902,0x1e924);
+test(0x1e903,0x1e925);
+test(0x1e904,0x1e926);
+test(0x1e905,0x1e927);
+test(0x1e906,0x1e928);
+test(0x1e907,0x1e929);
+test(0x1e908,0x1e92a);
+test(0x1e909,0x1e92b);
+test(0x1e90a,0x1e92c);
+test(0x1e90b,0x1e92d);
+test(0x1e90c,0x1e92e);
+test(0x1e90d,0x1e92f);
+test(0x1e90e,0x1e930);
+test(0x1e90f,0x1e931);
+test(0x1e910,0x1e932);
+test(0x1e911,0x1e933);
+test(0x1e912,0x1e934);
+test(0x1e913,0x1e935);
+test(0x1e914,0x1e936);
+test(0x1e915,0x1e937);
+test(0x1e916,0x1e938);
+test(0x1e917,0x1e939);
+test(0x1e918,0x1e93a);
+test(0x1e919,0x1e93b);
+test(0x1e91a,0x1e93c);
+test(0x1e91b,0x1e93d);
+test(0x1e91c,0x1e93e);
+test(0x1e91d,0x1e93f);
+test(0x1e91e,0x1e940);
+test(0x1e91f,0x1e941);
+test(0x1e920,0x1e942);
+test(0x1e921,0x1e943);
+test(0x1e922,0x1e900);
+test(0x1e923,0x1e901);
+test(0x1e924,0x1e902);
+test(0x1e925,0x1e903);
+test(0x1e926,0x1e904);
+test(0x1e927,0x1e905);
+test(0x1e928,0x1e906);
+test(0x1e929,0x1e907);
+test(0x1e92a,0x1e908);
+test(0x1e92b,0x1e909);
+test(0x1e92c,0x1e90a);
+test(0x1e92d,0x1e90b);
+test(0x1e92e,0x1e90c);
+test(0x1e92f,0x1e90d);
+test(0x1e930,0x1e90e);
+test(0x1e931,0x1e90f);
+test(0x1e932,0x1e910);
+test(0x1e933,0x1e911);
+test(0x1e934,0x1e912);
+test(0x1e935,0x1e913);
+test(0x1e936,0x1e914);
+test(0x1e937,0x1e915);
+test(0x1e938,0x1e916);
+test(0x1e939,0x1e917);
+test(0x1e93a,0x1e918);
+test(0x1e93b,0x1e919);
+test(0x1e93c,0x1e91a);
+test(0x1e93d,0x1e91b);
+test(0x1e93e,0x1e91c);
+test(0x1e93f,0x1e91d);
+test(0x1e940,0x1e91e);
+test(0x1e941,0x1e91f);
+test(0x1e942,0x1e920);
+test(0x1e943,0x1e921);
 
 if (typeof reportCompare === "function")
     reportCompare(true, true);
--- a/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js
+++ b/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js
@@ -1,10 +1,10 @@
 /* Generated by make_unicode.py DO NOT MODIFY */
-/* Unicode version: 6.2.0 */
+/* Unicode version: 9.0.0 */
 
 /*
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/licenses/publicdomain/
  */
 assertEq(String.fromCodePoint(0x10428).toUpperCase().codePointAt(0), 0x10400);
 assertEq(String.fromCodePoint(0x10429).toUpperCase().codePointAt(0), 0x10401);
 assertEq(String.fromCodePoint(0x1042a).toUpperCase().codePointAt(0), 0x10402);
@@ -40,16 +40,169 @@ assertEq(String.fromCodePoint(0x10447).t
 assertEq(String.fromCodePoint(0x10448).toUpperCase().codePointAt(0), 0x10420);
 assertEq(String.fromCodePoint(0x10449).toUpperCase().codePointAt(0), 0x10421);
 assertEq(String.fromCodePoint(0x1044a).toUpperCase().codePointAt(0), 0x10422);
 assertEq(String.fromCodePoint(0x1044b).toUpperCase().codePointAt(0), 0x10423);
 assertEq(String.fromCodePoint(0x1044c).toUpperCase().codePointAt(0), 0x10424);
 assertEq(String.fromCodePoint(0x1044d).toUpperCase().codePointAt(0), 0x10425);
 assertEq(String.fromCodePoint(0x1044e).toUpperCase().codePointAt(0), 0x10426);
 assertEq(String.fromCodePoint(0x1044f).toUpperCase().codePointAt(0), 0x10427);
+assertEq(String.fromCodePoint(0x104d8).toUpperCase().codePointAt(0), 0x104b0);
+assertEq(String.fromCodePoint(0x104d9).toUpperCase().codePointAt(0), 0x104b1);
+assertEq(String.fromCodePoint(0x104da).toUpperCase().codePointAt(0), 0x104b2);
+assertEq(String.fromCodePoint(0x104db).toUpperCase().codePointAt(0), 0x104b3);
+assertEq(String.fromCodePoint(0x104dc).toUpperCase().codePointAt(0), 0x104b4);
+assertEq(String.fromCodePoint(0x104dd).toUpperCase().codePointAt(0), 0x104b5);
+assertEq(String.fromCodePoint(0x104de).toUpperCase().codePointAt(0), 0x104b6);
+assertEq(String.fromCodePoint(0x104df).toUpperCase().codePointAt(0), 0x104b7);
+assertEq(String.fromCodePoint(0x104e0).toUpperCase().codePointAt(0), 0x104b8);
+assertEq(String.fromCodePoint(0x104e1).toUpperCase().codePointAt(0), 0x104b9);
+assertEq(String.fromCodePoint(0x104e2).toUpperCase().codePointAt(0), 0x104ba);
+assertEq(String.fromCodePoint(0x104e3).toUpperCase().codePointAt(0), 0x104bb);
+assertEq(String.fromCodePoint(0x104e4).toUpperCase().codePointAt(0), 0x104bc);
+assertEq(String.fromCodePoint(0x104e5).toUpperCase().codePointAt(0), 0x104bd);
+assertEq(String.fromCodePoint(0x104e6).toUpperCase().codePointAt(0), 0x104be);
+assertEq(String.fromCodePoint(0x104e7).toUpperCase().codePointAt(0), 0x104bf);
+assertEq(String.fromCodePoint(0x104e8).toUpperCase().codePointAt(0), 0x104c0);
+assertEq(String.fromCodePoint(0x104e9).toUpperCase().codePointAt(0), 0x104c1);
+assertEq(String.fromCodePoint(0x104ea).toUpperCase().codePointAt(0), 0x104c2);
+assertEq(String.fromCodePoint(0x104eb).toUpperCase().codePointAt(0), 0x104c3);
+assertEq(String.fromCodePoint(0x104ec).toUpperCase().codePointAt(0), 0x104c4);
+assertEq(String.fromCodePoint(0x104ed).toUpperCase().codePointAt(0), 0x104c5);
+assertEq(String.fromCodePoint(0x104ee).toUpperCase().codePointAt(0), 0x104c6);
+assertEq(String.fromCodePoint(0x104ef).toUpperCase().codePointAt(0), 0x104c7);
+assertEq(String.fromCodePoint(0x104f0).toUpperCase().codePointAt(0), 0x104c8);
+assertEq(String.fromCodePoint(0x104f1).toUpperCase().codePointAt(0), 0x104c9);
+assertEq(String.fromCodePoint(0x104f2).toUpperCase().codePointAt(0), 0x104ca);
+assertEq(String.fromCodePoint(0x104f3).toUpperCase().codePointAt(0), 0x104cb);
+assertEq(String.fromCodePoint(0x104f4).toUpperCase().codePointAt(0), 0x104cc);
+assertEq(String.fromCodePoint(0x104f5).toUpperCase().codePointAt(0), 0x104cd);
+assertEq(String.fromCodePoint(0x104f6).toUpperCase().codePointAt(0), 0x104ce);
+assertEq(String.fromCodePoint(0x104f7).toUpperCase().codePointAt(0), 0x104cf);
+assertEq(String.fromCodePoint(0x104f8).toUpperCase().codePointAt(0), 0x104d0);
+assertEq(String.fromCodePoint(0x104f9).toUpperCase().codePointAt(0), 0x104d1);
+assertEq(String.fromCodePoint(0x104fa).toUpperCase().codePointAt(0), 0x104d2);
+assertEq(String.fromCodePoint(0x104fb).toUpperCase().codePointAt(0), 0x104d3);
+assertEq(String.fromCodePoint(0x10cc0).toUpperCase().codePointAt(0), 0x10c80);
+assertEq(String.fromCodePoint(0x10cc1).toUpperCase().codePointAt(0), 0x10c81);
+assertEq(String.fromCodePoint(0x10cc2).toUpperCase().codePointAt(0), 0x10c82);
+assertEq(String.fromCodePoint(0x10cc3).toUpperCase().codePointAt(0), 0x10c83);
+assertEq(String.fromCodePoint(0x10cc4).toUpperCase().codePointAt(0), 0x10c84);
+assertEq(String.fromCodePoint(0x10cc5).toUpperCase().codePointAt(0), 0x10c85);
+assertEq(String.fromCodePoint(0x10cc6).toUpperCase().codePointAt(0), 0x10c86);
+assertEq(String.fromCodePoint(0x10cc7).toUpperCase().codePointAt(0), 0x10c87);
+assertEq(String.fromCodePoint(0x10cc8).toUpperCase().codePointAt(0), 0x10c88);
+assertEq(String.fromCodePoint(0x10cc9).toUpperCase().codePointAt(0), 0x10c89);
+assertEq(String.fromCodePoint(0x10cca).toUpperCase().codePointAt(0), 0x10c8a);
+assertEq(String.fromCodePoint(0x10ccb).toUpperCase().codePointAt(0), 0x10c8b);
+assertEq(String.fromCodePoint(0x10ccc).toUpperCase().codePointAt(0), 0x10c8c);
+assertEq(String.fromCodePoint(0x10ccd).toUpperCase().codePointAt(0), 0x10c8d);
+assertEq(String.fromCodePoint(0x10cce).toUpperCase().codePointAt(0), 0x10c8e);
+assertEq(String.fromCodePoint(0x10ccf).toUpperCase().codePointAt(0), 0x10c8f);
+assertEq(String.fromCodePoint(0x10cd0).toUpperCase().codePointAt(0), 0x10c90);
+assertEq(String.fromCodePoint(0x10cd1).toUpperCase().codePointAt(0), 0x10c91);
+assertEq(String.fromCodePoint(0x10cd2).toUpperCase().codePointAt(0), 0x10c92);
+assertEq(String.fromCodePoint(0x10cd3).toUpperCase().codePointAt(0), 0x10c93);
+assertEq(String.fromCodePoint(0x10cd4).toUpperCase().codePointAt(0), 0x10c94);
+assertEq(String.fromCodePoint(0x10cd5).toUpperCase().codePointAt(0), 0x10c95);
+assertEq(String.fromCodePoint(0x10cd6).toUpperCase().codePointAt(0), 0x10c96);
+assertEq(String.fromCodePoint(0x10cd7).toUpperCase().codePointAt(0), 0x10c97);
+assertEq(String.fromCodePoint(0x10cd8).toUpperCase().codePointAt(0), 0x10c98);
+assertEq(String.fromCodePoint(0x10cd9).toUpperCase().codePointAt(0), 0x10c99);
+assertEq(String.fromCodePoint(0x10cda).toUpperCase().codePointAt(0), 0x10c9a);
+assertEq(String.fromCodePoint(0x10cdb).toUpperCase().codePointAt(0), 0x10c9b);
+assertEq(String.fromCodePoint(0x10cdc).toUpperCase().codePointAt(0), 0x10c9c);
+assertEq(String.fromCodePoint(0x10cdd).toUpperCase().codePointAt(0), 0x10c9d);
+assertEq(String.fromCodePoint(0x10cde).toUpperCase().codePointAt(0), 0x10c9e);
+assertEq(String.fromCodePoint(0x10cdf).toUpperCase().codePointAt(0), 0x10c9f);
+assertEq(String.fromCodePoint(0x10ce0).toUpperCase().codePointAt(0), 0x10ca0);
+assertEq(String.fromCodePoint(0x10ce1).toUpperCase().codePointAt(0), 0x10ca1);
+assertEq(String.fromCodePoint(0x10ce2).toUpperCase().codePointAt(0), 0x10ca2);
+assertEq(String.fromCodePoint(0x10ce3).toUpperCase().codePointAt(0), 0x10ca3);
+assertEq(String.fromCodePoint(0x10ce4).toUpperCase().codePointAt(0), 0x10ca4);
+assertEq(String.fromCodePoint(0x10ce5).toUpperCase().codePointAt(0), 0x10ca5);
+assertEq(String.fromCodePoint(0x10ce6).toUpperCase().codePointAt(0), 0x10ca6);
+assertEq(String.fromCodePoint(0x10ce7).toUpperCase().codePointAt(0), 0x10ca7);
+assertEq(String.fromCodePoint(0x10ce8).toUpperCase().codePointAt(0), 0x10ca8);
+assertEq(String.fromCodePoint(0x10ce9).toUpperCase().codePointAt(0), 0x10ca9);
+assertEq(String.fromCodePoint(0x10cea).toUpperCase().codePointAt(0), 0x10caa);
+assertEq(String.fromCodePoint(0x10ceb).toUpperCase().codePointAt(0), 0x10cab);
+assertEq(String.fromCodePoint(0x10cec).toUpperCase().codePointAt(0), 0x10cac);
+assertEq(String.fromCodePoint(0x10ced).toUpperCase().codePointAt(0), 0x10cad);
+assertEq(String.fromCodePoint(0x10cee).toUpperCase().codePointAt(0), 0x10cae);
+assertEq(String.fromCodePoint(0x10cef).toUpperCase().codePointAt(0), 0x10caf);
+assertEq(String.fromCodePoint(0x10cf0).toUpperCase().codePointAt(0), 0x10cb0);
+assertEq(String.fromCodePoint(0x10cf1).toUpperCase().codePointAt(0), 0x10cb1);
+assertEq(String.fromCodePoint(0x10cf2).toUpperCase().codePointAt(0), 0x10cb2);
+assertEq(String.fromCodePoint(0x118c0).toUpperCase().codePointAt(0), 0x118a0);
+assertEq(String.fromCodePoint(0x118c1).toUpperCase().codePointAt(0), 0x118a1);
+assertEq(String.fromCodePoint(0x118c2).toUpperCase().codePointAt(0), 0x118a2);
+assertEq(String.fromCodePoint(0x118c3).toUpperCase().codePointAt(0), 0x118a3);
+assertEq(String.fromCodePoint(0x118c4).toUpperCase().codePointAt(0), 0x118a4);
+assertEq(String.fromCodePoint(0x118c5).toUpperCase().codePointAt(0), 0x118a5);
+assertEq(String.fromCodePoint(0x118c6).toUpperCase().codePointAt(0), 0x118a6);
+assertEq(String.fromCodePoint(0x118c7).toUpperCase().codePointAt(0), 0x118a7);
+assertEq(String.fromCodePoint(0x118c8).toUpperCase().codePointAt(0), 0x118a8);
+assertEq(String.fromCodePoint(0x118c9).toUpperCase().codePointAt(0), 0x118a9);
+assertEq(String.fromCodePoint(0x118ca).toUpperCase().codePointAt(0), 0x118aa);
+assertEq(String.fromCodePoint(0x118cb).toUpperCase().codePointAt(0), 0x118ab);
+assertEq(String.fromCodePoint(0x118cc).toUpperCase().codePointAt(0), 0x118ac);
+assertEq(String.fromCodePoint(0x118cd).toUpperCase().codePointAt(0), 0x118ad);
+assertEq(String.fromCodePoint(0x118ce).toUpperCase().codePointAt(0), 0x118ae);
+assertEq(String.fromCodePoint(0x118cf).toUpperCase().codePointAt(0), 0x118af);
+assertEq(String.fromCodePoint(0x118d0).toUpperCase().codePointAt(0), 0x118b0);
+assertEq(String.fromCodePoint(0x118d1).toUpperCase().codePointAt(0), 0x118b1);
+assertEq(String.fromCodePoint(0x118d2).toUpperCase().codePointAt(0), 0x118b2);
+assertEq(String.fromCodePoint(0x118d3).toUpperCase().codePointAt(0), 0x118b3);
+assertEq(String.fromCodePoint(0x118d4).toUpperCase().codePointAt(0), 0x118b4);
+assertEq(String.fromCodePoint(0x118d5).toUpperCase().codePointAt(0), 0x118b5);
+assertEq(String.fromCodePoint(0x118d6).toUpperCase().codePointAt(0), 0x118b6);
+assertEq(String.fromCodePoint(0x118d7).toUpperCase().codePointAt(0), 0x118b7);
+assertEq(String.fromCodePoint(0x118d8).toUpperCase().codePointAt(0), 0x118b8);
+assertEq(String.fromCodePoint(0x118d9).toUpperCase().codePointAt(0), 0x118b9);
+assertEq(String.fromCodePoint(0x118da).toUpperCase().codePointAt(0), 0x118ba);
+assertEq(String.fromCodePoint(0x118db).toUpperCase().codePointAt(0), 0x118bb);
+assertEq(String.fromCodePoint(0x118dc).toUpperCase().codePointAt(0), 0x118bc);
+assertEq(String.fromCodePoint(0x118dd).toUpperCase().codePointAt(0), 0x118bd);
+assertEq(String.fromCodePoint(0x118de).toUpperCase().codePointAt(0), 0x118be);
+assertEq(String.fromCodePoint(0x118df).toUpperCase().codePointAt(0), 0x118bf);
+assertEq(String.fromCodePoint(0x1e922).toUpperCase().codePointAt(0), 0x1e900);
+assertEq(String.fromCodePoint(0x1e923).toUpperCase().codePointAt(0), 0x1e901);
+assertEq(String.fromCodePoint(0x1e924).toUpperCase().codePointAt(0), 0x1e902);
+assertEq(String.fromCodePoint(0x1e925).toUpperCase().codePointAt(0), 0x1e903);
+assertEq(String.fromCodePoint(0x1e926).toUpperCase().codePointAt(0), 0x1e904);
+assertEq(String.fromCodePoint(0x1e927).toUpperCase().codePointAt(0), 0x1e905);
+assertEq(String.fromCodePoint(0x1e928).toUpperCase().codePointAt(0), 0x1e906);
+assertEq(String.fromCodePoint(0x1e929).toUpperCase().codePointAt(0), 0x1e907);
+assertEq(String.fromCodePoint(0x1e92a).toUpperCase().codePointAt(0), 0x1e908);
+assertEq(String.fromCodePoint(0x1e92b).toUpperCase().codePointAt(0), 0x1e909);
+assertEq(String.fromCodePoint(0x1e92c).toUpperCase().codePointAt(0), 0x1e90a);
+assertEq(String.fromCodePoint(0x1e92d).toUpperCase().codePointAt(0), 0x1e90b);
+assertEq(String.fromCodePoint(0x1e92e).toUpperCase().codePointAt(0), 0x1e90c);
+assertEq(String.fromCodePoint(0x1e92f).toUpperCase().codePointAt(0), 0x1e90d);
+assertEq(String.fromCodePoint(0x1e930).toUpperCase().codePointAt(0), 0x1e90e);
+assertEq(String.fromCodePoint(0x1e931).toUpperCase().codePointAt(0), 0x1e90f);
+assertEq(String.fromCodePoint(0x1e932).toUpperCase().codePointAt(0), 0x1e910);
+assertEq(String.fromCodePoint(0x1e933).toUpperCase().codePointAt(0), 0x1e911);
+assertEq(String.fromCodePoint(0x1e934).toUpperCase().codePointAt(0), 0x1e912);
+assertEq(String.fromCodePoint(0x1e935).toUpperCase().codePointAt(0), 0x1e913);
+assertEq(String.fromCodePoint(0x1e936).toUpperCase().codePointAt(0), 0x1e914);
+assertEq(String.fromCodePoint(0x1e937).toUpperCase().codePointAt(0), 0x1e915);
+assertEq(String.fromCodePoint(0x1e938).toUpperCase().codePointAt(0), 0x1e916);
+assertEq(String.fromCodePoint(0x1e939).toUpperCase().codePointAt(0), 0x1e917);
+assertEq(String.fromCodePoint(0x1e93a).toUpperCase().codePointAt(0), 0x1e918);
+assertEq(String.fromCodePoint(0x1e93b).toUpperCase().codePointAt(0), 0x1e919);
+assertEq(String.fromCodePoint(0x1e93c).toUpperCase().codePointAt(0), 0x1e91a);
+assertEq(String.fromCodePoint(0x1e93d).toUpperCase().codePointAt(0), 0x1e91b);
+assertEq(String.fromCodePoint(0x1e93e).toUpperCase().codePointAt(0), 0x1e91c);
+assertEq(String.fromCodePoint(0x1e93f).toUpperCase().codePointAt(0), 0x1e91d);
+assertEq(String.fromCodePoint(0x1e940).toUpperCase().codePointAt(0), 0x1e91e);
+assertEq(String.fromCodePoint(0x1e941).toUpperCase().codePointAt(0), 0x1e91f);
+assertEq(String.fromCodePoint(0x1e942).toUpperCase().codePointAt(0), 0x1e920);
+assertEq(String.fromCodePoint(0x1e943).toUpperCase().codePointAt(0), 0x1e921);
 assertEq(String.fromCodePoint(0x10400).toLowerCase().codePointAt(0), 0x10428);
 assertEq(String.fromCodePoint(0x10401).toLowerCase().codePointAt(0), 0x10429);
 assertEq(String.fromCodePoint(0x10402).toLowerCase().codePointAt(0), 0x1042a);
 assertEq(String.fromCodePoint(0x10403).toLowerCase().codePointAt(0), 0x1042b);
 assertEq(String.fromCodePoint(0x10404).toLowerCase().codePointAt(0), 0x1042c);
 assertEq(String.fromCodePoint(0x10405).toLowerCase().codePointAt(0), 0x1042d);
 assertEq(String.fromCodePoint(0x10406).toLowerCase().codePointAt(0), 0x1042e);
 assertEq(String.fromCodePoint(0x10407).toLowerCase().codePointAt(0), 0x1042f);
@@ -80,11 +233,164 @@ assertEq(String.fromCodePoint(0x1041f).t
 assertEq(String.fromCodePoint(0x10420).toLowerCase().codePointAt(0), 0x10448);
 assertEq(String.fromCodePoint(0x10421).toLowerCase().codePointAt(0), 0x10449);
 assertEq(String.fromCodePoint(0x10422).toLowerCase().codePointAt(0), 0x1044a);
 assertEq(String.fromCodePoint(0x10423).toLowerCase().codePointAt(0), 0x1044b);
 assertEq(String.fromCodePoint(0x10424).toLowerCase().codePointAt(0), 0x1044c);
 assertEq(String.fromCodePoint(0x10425).toLowerCase().codePointAt(0), 0x1044d);
 assertEq(String.fromCodePoint(0x10426).toLowerCase().codePointAt(0), 0x1044e);
 assertEq(String.fromCodePoint(0x10427).toLowerCase().codePointAt(0), 0x1044f);
+assertEq(String.fromCodePoint(0x104b0).toLowerCase().codePointAt(0), 0x104d8);
+assertEq(String.fromCodePoint(0x104b1).toLowerCase().codePointAt(0), 0x104d9);
+assertEq(String.fromCodePoint(0x104b2).toLowerCase().codePointAt(0), 0x104da);
+assertEq(String.fromCodePoint(0x104b3).toLowerCase().codePointAt(0), 0x104db);
+assertEq(String.fromCodePoint(0x104b4).toLowerCase().codePointAt(0), 0x104dc);
+assertEq(String.fromCodePoint(0x104b5).toLowerCase().codePointAt(0), 0x104dd);
+assertEq(String.fromCodePoint(0x104b6).toLowerCase().codePointAt(0), 0x104de);
+assertEq(String.fromCodePoint(0x104b7).toLowerCase().codePointAt(0), 0x104df);
+assertEq(String.fromCodePoint(0x104b8).toLowerCase().codePointAt(0), 0x104e0);
+assertEq(String.fromCodePoint(0x104b9).toLowerCase().codePointAt(0), 0x104e1);
+assertEq(String.fromCodePoint(0x104ba).toLowerCase().codePointAt(0), 0x104e2);
+assertEq(String.fromCodePoint(0x104bb).toLowerCase().codePointAt(0), 0x104e3);
+assertEq(String.fromCodePoint(0x104bc).toLowerCase().codePointAt(0), 0x104e4);
+assertEq(String.fromCodePoint(0x104bd).toLowerCase().codePointAt(0), 0x104e5);
+assertEq(String.fromCodePoint(0x104be).toLowerCase().codePointAt(0), 0x104e6);
+assertEq(String.fromCodePoint(0x104bf).toLowerCase().codePointAt(0), 0x104e7);
+assertEq(String.fromCodePoint(0x104c0).toLowerCase().codePointAt(0), 0x104e8);
+assertEq(String.fromCodePoint(0x104c1).toLowerCase().codePointAt(0), 0x104e9);
+assertEq(String.fromCodePoint(0x104c2).toLowerCase().codePointAt(0), 0x104ea);
+assertEq(String.fromCodePoint(0x104c3).toLowerCase().codePointAt(0), 0x104eb);
+assertEq(String.fromCodePoint(0x104c4).toLowerCase().codePointAt(0), 0x104ec);
+assertEq(String.fromCodePoint(0x104c5).toLowerCase().codePointAt(0), 0x104ed);
+assertEq(String.fromCodePoint(0x104c6).toLowerCase().codePointAt(0), 0x104ee);
+assertEq(String.fromCodePoint(0x104c7).toLowerCase().codePointAt(0), 0x104ef);
+assertEq(String.fromCodePoint(0x104c8).toLowerCase().codePointAt(0), 0x104f0);
+assertEq(String.fromCodePoint(0x104c9).toLowerCase().codePointAt(0), 0x104f1);
+assertEq(String.fromCodePoint(0x104ca).toLowerCase().codePointAt(0), 0x104f2);
+assertEq(String.fromCodePoint(0x104cb).toLowerCase().codePointAt(0), 0x104f3);
+assertEq(String.fromCodePoint(0x104cc).toLowerCase().codePointAt(0), 0x104f4);
+assertEq(String.fromCodePoint(0x104cd).toLowerCase().codePointAt(0), 0x104f5);
+assertEq(String.fromCodePoint(0x104ce).toLowerCase().codePointAt(0), 0x104f6);
+assertEq(String.fromCodePoint(0x104cf).toLowerCase().codePointAt(0), 0x104f7);
+assertEq(String.fromCodePoint(0x104d0).toLowerCase().codePointAt(0), 0x104f8);
+assertEq(String.fromCodePoint(0x104d1).toLowerCase().codePointAt(0), 0x104f9);
+assertEq(String.fromCodePoint(0x104d2).toLowerCase().codePointAt(0), 0x104fa);
+assertEq(String.fromCodePoint(0x104d3).toLowerCase().codePointAt(0), 0x104fb);
+assertEq(String.fromCodePoint(0x10c80).toLowerCase().codePointAt(0), 0x10cc0);
+assertEq(String.fromCodePoint(0x10c81).toLowerCase().codePointAt(0), 0x10cc1);
+assertEq(String.fromCodePoint(0x10c82).toLowerCase().codePointAt(0), 0x10cc2);
+assertEq(String.fromCodePoint(0x10c83).toLowerCase().codePointAt(0), 0x10cc3);
+assertEq(String.fromCodePoint(0x10c84).toLowerCase().codePointAt(0), 0x10cc4);
+assertEq(String.fromCodePoint(0x10c85).toLowerCase().codePointAt(0), 0x10cc5);
+assertEq(String.fromCodePoint(0x10c86).toLowerCase().codePointAt(0), 0x10cc6);
+assertEq(String.fromCodePoint(0x10c87).toLowerCase().codePointAt(0), 0x10cc7);
+assertEq(String.fromCodePoint(0x10c88).toLowerCase().codePointAt(0), 0x10cc8);
+assertEq(String.fromCodePoint(0x10c89).toLowerCase().codePointAt(0), 0x10cc9);
+assertEq(String.fromCodePoint(0x10c8a).toLowerCase().codePointAt(0), 0x10cca);
+assertEq(String.fromCodePoint(0x10c8b).toLowerCase().codePointAt(0), 0x10ccb);
+assertEq(String.fromCodePoint(0x10c8c).toLowerCase().codePointAt(0), 0x10ccc);
+assertEq(String.fromCodePoint(0x10c8d).toLowerCase().codePointAt(0), 0x10ccd);
+assertEq(String.fromCodePoint(0x10c8e).toLowerCase().codePointAt(0), 0x10cce);
+assertEq(String.fromCodePoint(0x10c8f).toLowerCase().codePointAt(0), 0x10ccf);
+assertEq(String.fromCodePoint(0x10c90).toLowerCase().codePointAt(0), 0x10cd0);
+assertEq(String.fromCodePoint(0x10c91).toLowerCase().codePointAt(0), 0x10cd1);
+assertEq(String.fromCodePoint(0x10c92).toLowerCase().codePointAt(0), 0x10cd2);
+assertEq(String.fromCodePoint(0x10c93).toLowerCase().codePointAt(0), 0x10cd3);
+assertEq(String.fromCodePoint(0x10c94).toLowerCase().codePointAt(0), 0x10cd4);
+assertEq(String.fromCodePoint(0x10c95).toLowerCase().codePointAt(0), 0x10cd5);
+assertEq(String.fromCodePoint(0x10c96).toLowerCase().codePointAt(0), 0x10cd6);
+assertEq(String.fromCodePoint(0x10c97).toLowerCase().codePointAt(0), 0x10cd7);
+assertEq(String.fromCodePoint(0x10c98).toLowerCase().codePointAt(0), 0x10cd8);
+assertEq(String.fromCodePoint(0x10c99).toLowerCase().codePointAt(0), 0x10cd9);
+assertEq(String.fromCodePoint(0x10c9a).toLowerCase().codePointAt(0), 0x10cda);
+assertEq(String.fromCodePoint(0x10c9b).toLowerCase().codePointAt(0), 0x10cdb);
+assertEq(String.fromCodePoint(0x10c9c).toLowerCase().codePointAt(0), 0x10cdc);
+assertEq(String.fromCodePoint(0x10c9d).toLowerCase().codePointAt(0), 0x10cdd);
+assertEq(String.fromCodePoint(0x10c9e).toLowerCase().codePointAt(0), 0x10cde);
+assertEq(String.fromCodePoint(0x10c9f).toLowerCase().codePointAt(0), 0x10cdf);
+assertEq(String.fromCodePoint(0x10ca0).toLowerCase().codePointAt(0), 0x10ce0);
+assertEq(String.fromCodePoint(0x10ca1).toLowerCase().codePointAt(0), 0x10ce1);
+assertEq(String.fromCodePoint(0x10ca2).toLowerCase().codePointAt(0), 0x10ce2);
+assertEq(String.fromCodePoint(0x10ca3).toLowerCase().codePointAt(0), 0x10ce3);
+assertEq(String.fromCodePoint(0x10ca4).toLowerCase().codePointAt(0), 0x10ce4);
+assertEq(String.fromCodePoint(0x10ca5).toLowerCase().codePointAt(0), 0x10ce5);
+assertEq(String.fromCodePoint(0x10ca6).toLowerCase().codePointAt(0), 0x10ce6);
+assertEq(String.fromCodePoint(0x10ca7).toLowerCase().codePointAt(0), 0x10ce7);
+assertEq(String.fromCodePoint(0x10ca8).toLowerCase().codePointAt(0), 0x10ce8);
+assertEq(String.fromCodePoint(0x10ca9).toLowerCase().codePointAt(0), 0x10ce9);
+assertEq(String.fromCodePoint(0x10caa).toLowerCase().codePointAt(0), 0x10cea);
+assertEq(String.fromCodePoint(0x10cab).toLowerCase().codePointAt(0), 0x10ceb);
+assertEq(String.fromCodePoint(0x10cac).toLowerCase().codePointAt(0), 0x10cec);
+assertEq(String.fromCodePoint(0x10cad).toLowerCase().codePointAt(0), 0x10ced);
+assertEq(String.fromCodePoint(0x10cae).toLowerCase().codePointAt(0), 0x10cee);
+assertEq(String.fromCodePoint(0x10caf).toLowerCase().codePointAt(0), 0x10cef);
+assertEq(String.fromCodePoint(0x10cb0).toLowerCase().codePointAt(0), 0x10cf0);
+assertEq(String.fromCodePoint(0x10cb1).toLowerCase().codePointAt(0), 0x10cf1);
+assertEq(String.fromCodePoint(0x10cb2).toLowerCase().codePointAt(0), 0x10cf2);
+assertEq(String.fromCodePoint(0x118a0).toLowerCase().codePointAt(0), 0x118c0);
+assertEq(String.fromCodePoint(0x118a1).toLowerCase().codePointAt(0), 0x118c1);
+assertEq(String.fromCodePoint(0x118a2).toLowerCase().codePointAt(0), 0x118c2);
+assertEq(String.fromCodePoint(0x118a3).toLowerCase().codePointAt(0), 0x118c3);
+assertEq(String.fromCodePoint(0x118a4).toLowerCase().codePointAt(0), 0x118c4);
+assertEq(String.fromCodePoint(0x118a5).toLowerCase().codePointAt(0), 0x118c5);
+assertEq(String.fromCodePoint(0x118a6).toLowerCase().codePointAt(0), 0x118c6);
+assertEq(String.fromCodePoint(0x118a7).toLowerCase().codePointAt(0), 0x118c7);
+assertEq(String.fromCodePoint(0x118a8).toLowerCase().codePointAt(0), 0x118c8);
+assertEq(String.fromCodePoint(0x118a9).toLowerCase().codePointAt(0), 0x118c9);
+assertEq(String.fromCodePoint(0x118aa).toLowerCase().codePointAt(0), 0x118ca);
+assertEq(String.fromCodePoint(0x118ab).toLowerCase().codePointAt(0), 0x118cb);
+assertEq(String.fromCodePoint(0x118ac).toLowerCase().codePointAt(0), 0x118cc);
+assertEq(String.fromCodePoint(0x118ad).toLowerCase().codePointAt(0), 0x118cd);
+assertEq(String.fromCodePoint(0x118ae).toLowerCase().codePointAt(0), 0x118ce);
+assertEq(String.fromCodePoint(0x118af).toLowerCase().codePointAt(0), 0x118cf);
+assertEq(String.fromCodePoint(0x118b0).toLowerCase().codePointAt(0), 0x118d0);
+assertEq(String.fromCodePoint(0x118b1).toLowerCase().codePointAt(0), 0x118d1);
+assertEq(String.fromCodePoint(0x118b2).toLowerCase().codePointAt(0), 0x118d2);
+assertEq(String.fromCodePoint(0x118b3).toLowerCase().codePointAt(0), 0x118d3);
+assertEq(String.fromCodePoint(0x118b4).toLowerCase().codePointAt(0), 0x118d4);
+assertEq(String.fromCodePoint(0x118b5).toLowerCase().codePointAt(0), 0x118d5);
+assertEq(String.fromCodePoint(0x118b6).toLowerCase().codePointAt(0), 0x118d6);
+assertEq(String.fromCodePoint(0x118b7).toLowerCase().codePointAt(0), 0x118d7);
+assertEq(String.fromCodePoint(0x118b8).toLowerCase().codePointAt(0), 0x118d8);
+assertEq(String.fromCodePoint(0x118b9).toLowerCase().codePointAt(0), 0x118d9);
+assertEq(String.fromCodePoint(0x118ba).toLowerCase().codePointAt(0), 0x118da);
+assertEq(String.fromCodePoint(0x118bb).toLowerCase().codePointAt(0), 0x118db);
+assertEq(String.fromCodePoint(0x118bc).toLowerCase().codePointAt(0), 0x118dc);
+assertEq(String.fromCodePoint(0x118bd).toLowerCase().codePointAt(0), 0x118dd);
+assertEq(String.fromCodePoint(0x118be).toLowerCase().codePointAt(0), 0x118de);
+assertEq(String.fromCodePoint(0x118bf).toLowerCase().codePointAt(0), 0x118df);
+assertEq(String.fromCodePoint(0x1e900).toLowerCase().codePointAt(0), 0x1e922);
+assertEq(String.fromCodePoint(0x1e901).toLowerCase().codePointAt(0), 0x1e923);
+assertEq(String.fromCodePoint(0x1e902).toLowerCase().codePointAt(0), 0x1e924);
+assertEq(String.fromCodePoint(0x1e903).toLowerCase().codePointAt(0), 0x1e925);
+assertEq(String.fromCodePoint(0x1e904).toLowerCase().codePointAt(0), 0x1e926);
+assertEq(String.fromCodePoint(0x1e905).toLowerCase().codePointAt(0), 0x1e927);
+assertEq(String.fromCodePoint(0x1e906).toLowerCase().codePointAt(0), 0x1e928);
+assertEq(String.fromCodePoint(0x1e907).toLowerCase().codePointAt(0), 0x1e929);
+assertEq(String.fromCodePoint(0x1e908).toLowerCase().codePointAt(0), 0x1e92a);
+assertEq(String.fromCodePoint(0x1e909).toLowerCase().codePointAt(0), 0x1e92b);
+assertEq(String.fromCodePoint(0x1e90a).toLowerCase().codePointAt(0), 0x1e92c);
+assertEq(String.fromCodePoint(0x1e90b).toLowerCase().codePointAt(0), 0x1e92d);
+assertEq(String.fromCodePoint(0x1e90c).toLowerCase().codePointAt(0), 0x1e92e);
+assertEq(String.fromCodePoint(0x1e90d).toLowerCase().codePointAt(0), 0x1e92f);
+assertEq(String.fromCodePoint(0x1e90e).toLowerCase().codePointAt(0), 0x1e930);
+assertEq(String.fromCodePoint(0x1e90f).toLowerCase().codePointAt(0), 0x1e931);
+assertEq(String.fromCodePoint(0x1e910).toLowerCase().codePointAt(0), 0x1e932);
+assertEq(String.fromCodePoint(0x1e911).toLowerCase().codePointAt(0), 0x1e933);
+assertEq(String.fromCodePoint(0x1e912).toLowerCase().codePointAt(0), 0x1e934);
+assertEq(String.fromCodePoint(0x1e913).toLowerCase().codePointAt(0), 0x1e935);
+assertEq(String.fromCodePoint(0x1e914).toLowerCase().codePointAt(0), 0x1e936);
+assertEq(String.fromCodePoint(0x1e915).toLowerCase().codePointAt(0), 0x1e937);
+assertEq(String.fromCodePoint(0x1e916).toLowerCase().codePointAt(0), 0x1e938);
+assertEq(String.fromCodePoint(0x1e917).toLowerCase().codePointAt(0), 0x1e939);
+assertEq(String.fromCodePoint(0x1e918).toLowerCase().codePointAt(0), 0x1e93a);
+assertEq(String.fromCodePoint(0x1e919).toLowerCase().codePointAt(0), 0x1e93b);
+assertEq(String.fromCodePoint(0x1e91a).toLowerCase().codePointAt(0), 0x1e93c);
+assertEq(String.fromCodePoint(0x1e91b).toLowerCase().codePointAt(0), 0x1e93d);
+assertEq(String.fromCodePoint(0x1e91c).toLowerCase().codePointAt(0), 0x1e93e);
+assertEq(String.fromCodePoint(0x1e91d).toLowerCase().codePointAt(0), 0x1e93f);
+assertEq(String.fromCodePoint(0x1e91e).toLowerCase().codePointAt(0), 0x1e940);
+assertEq(String.fromCodePoint(0x1e91f).toLowerCase().codePointAt(0), 0x1e941);
+assertEq(String.fromCodePoint(0x1e920).toLowerCase().codePointAt(0), 0x1e942);
+assertEq(String.fromCodePoint(0x1e921).toLowerCase().codePointAt(0), 0x1e943);
 
 if (typeof reportCompare === "function")
     reportCompare(true, true);
--- a/js/src/tests/ecma_6/Syntax/identifiers-with-extended-unicode-escape.js
+++ b/js/src/tests/ecma_6/Syntax/identifiers-with-extended-unicode-escape.js
@@ -45,31 +45,24 @@ const idStartSupplemental = [
     0x10300,    // OLD ITALIC LETTER A, Gc=Lo
     0x10400,    // DESERET CAPITAL LETTER LONG I, Gc=Lu
     0x10430,    // DESERET SMALL LETTER SHORT A, Gc=Ll
     0x16B40,    // PAHAWH HMONG SIGN VOS SEEV, Gc=Lm
 ];
 
 // From PropList.txt (Unicode 9):
 const otherIdStart = [
-    // Enable the following lines when Bug 1282724 is fixed.
-    // 0x1885,     // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
-    // 0x1886,     // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
+    0x1885,     // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
+    0x1886,     // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
     0x2118,     // SCRIPT CAPITAL P, Gc=Sm
     0x212E,     // ESTIMATED SYMBOL, Gc=So
     0x309B,     // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk
     0x309C,     // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk
 ];
 
-// Remove this list when we support Unicode 9 (Bug 1282724).
-const otherIdStart_Unicode9 = [
-    0x1885,     // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
-    0x1886,     // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
-];
-
 // From DerivedCoreProperties.txt (Unicode 9):
 // Derived Property: ID_Continue
 //  Characters that can continue an identifier.
 //  Generated from:
 //      ID_Start
 //    + Mn + Mc + Nd + Pc
 //    + Other_ID_Continue
 //    - Pattern_Syntax
@@ -100,17 +93,17 @@ const otherIdContinue = [
     0x136D,     // ETHIOPIC DIGIT FIVE, Gc=No
     0x136E,     // ETHIOPIC DIGIT SIX, Gc=No
     0x136F,     // ETHIOPIC DIGIT SEVEN, Gc=No
     0x1370,     // ETHIOPIC DIGIT EIGHT, Gc=No
     0x1371,     // ETHIOPIC DIGIT NINE, Gc=No
     0x19DA,     // NEW TAI LUE THAM DIGIT ONE, Gc=No
 ];
 
-for (let ident of [...idStart, ...otherIdStart, ...otherIdStart_Unicode9]) {
+for (let ident of [...idStart, ...otherIdStart]) {
     for (let count of leadingZeros) {
         let zeros = "0".repeat(count);
         eval(`
             let \\u{${zeros}${ident.toString(16)}} = 123;
             assertEq(${String.fromCodePoint(ident)}, 123);
         `);
     }
 }
@@ -123,17 +116,17 @@ for (let ident of [...idStartSupplementa
 }
 
 for (let ident of [...idContinue, ...idContinueSupplemental, ...otherIdContinue]) {
     for (let zeros of leadingZeros) {
         assertThrowsInstanceOf(() => eval(`\\u{${zeros}${ident.toString(16)}}`), SyntaxError);
     }
 }
 
-for (let ident of [...idStart, ...otherIdStart, ...otherIdStart_Unicode9, ...idContinue, ...otherIdContinue]) {
+for (let ident of [...idStart, ...otherIdStart, ...idContinue, ...otherIdContinue]) {
     for (let zeros of leadingZeros) {
         eval(`
             let A\\u{${zeros}${ident.toString(16)}} = 123;
             assertEq(${String.fromCodePoint(0x41, ident)}, 123);
         `);
     }
 }
 
--- a/js/src/tests/ecma_6/Syntax/unicode_other_id_start.js
+++ b/js/src/tests/ecma_6/Syntax/unicode_other_id_start.js
@@ -1,47 +1,40 @@
 /* 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/. */
 
 // From PropList.txt (Unicode 9):
 const otherIdStart = [
-    // Enable the following lines when Bug 1282724 is fixed.
-    // 0x1885,     // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
-    // 0x1886,     // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
+    0x1885,     // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
+    0x1886,     // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
     0x2118,     // SCRIPT CAPITAL P, Gc=Sm
     0x212E,     // ESTIMATED SYMBOL, Gc=So
     0x309B,     // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk
     0x309C,     // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk
 ];
 
-// Remove this list when we support Unicode 9 (Bug 1282724).
-const otherIdStart_Unicode9 = [
-    0x1885,     // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
-    0x1886,     // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
-];
-
 // Leading character in identifier.
-for (let ident of [...otherIdStart, ...otherIdStart_Unicode9]) {
+for (let ident of otherIdStart) {
     eval(`
         let ${String.fromCodePoint(ident)} = 123;
         assertEq(${String.fromCodePoint(ident)}, 123);
     `);
     eval(`
         let \\u${ident.toString(16).padStart(4, "0")} = 123;
         assertEq(${String.fromCodePoint(ident)}, 123);
     `);
     eval(`
         let \\u{${ident.toString(16)}} = 123;
         assertEq(${String.fromCodePoint(ident)}, 123);
     `);
 }
 
 // Not leading character in identifier.
-for (let ident of [...otherIdStart, ...otherIdStart_Unicode9]) {
+for (let ident of otherIdStart) {
     eval(`
         let A${String.fromCodePoint(ident)} = 123;
         assertEq(${String.fromCodePoint(0x41, ident)}, 123);
     `);
     eval(`
         let A\\u${ident.toString(16).padStart(4, "0")} = 123;
         assertEq(${String.fromCodePoint(0x41, ident)}, 123);
     `);
--- a/js/src/tests/jstests.list
+++ b/js/src/tests/jstests.list
@@ -34,16 +34,23 @@ skip script test262/intl402/ch12/12.2/12
 skip script test262/ch13/13.2/13.2-15-1.js
 skip script test262/ch11/11.4/11.4.1/11.4.1-5-a-28-s.js
 
 # ECMA-402 1st ed. required |timeZoneName: undefined|, but newer versions have
 # changed it to being the default time zone, cf. the NOTE in
 # Intl.DateTimeFormat.prototype.resolvedOptions().
 skip script test262/intl402/ch12/12.3/12.3.3.js
 
+# ECMA-262 6th ed. used Unicode 5.1, but we're now supporting Unicode 9.0.
+# Disable tests which require Unicode 5.1 semantics, or more specific disable
+# tests which expect that U+180E is a white space character.
+skip script test262/ch09/9.3/9.3.1/S9.3.1_A2.js
+skip script test262/ch09/9.3/9.3.1/S9.3.1_A3_T2.js
+skip script test262/ch09/9.3/9.3.1/S9.3.1_A3_T1.js
+
 #######################################################################
 # Tests disabled due to jstest limitations wrt imported test262 tests #
 #######################################################################
 
 # These tests are disabled because jstest doesn't understand @negative (without
 # a pattern) yet.
 skip script test262/ch07/7.2/S7.2_A5_T1.js
 skip script test262/ch07/7.2/S7.2_A5_T2.js
--- a/js/src/tests/lib/jittests.py
+++ b/js/src/tests/lib/jittests.py
@@ -164,25 +164,50 @@ class JitTest:
             variants = variants + [ opts + join_opts for opts in variants ];
 
         # For each list of jit flags, make a copy of the test.
         return [self.copy_and_extend_jitflags(v) for v in variants]
 
 
     COOKIE = '|jit-test|'
     CacheDir = JS_CACHE_DIR
+    Directives = {}
+
+    @classmethod
+    def find_directives(cls, file_name):
+        meta = ''
+        line = open(file_name).readline()
+        i = line.find(cls.COOKIE)
+        if i != -1:
+            meta = ';' + line[i + len(cls.COOKIE):].strip('\n')
+        return meta
 
     @classmethod
     def from_file(cls, path, options):
         test = cls(path)
 
-        line = open(path).readline()
-        i = line.find(cls.COOKIE)
-        if i != -1:
-            meta = line[i + len(cls.COOKIE):].strip('\n')
+        # If directives.txt exists in the test's directory then it may
+        # contain metainformation that will be catenated with
+        # whatever's in the test file.  The form of the directive in
+        # the directive file is the same as in the test file.  Only
+        # the first line is considered, just as for the test file.
+
+        dir_meta = ''
+        dir_name = os.path.dirname(path)
+        if dir_name in cls.Directives:
+            dir_meta = cls.Directives[dir_name]
+        else:
+            meta_file_name = os.path.join(dir_name, "directives.txt")
+            if os.path.exists(meta_file_name):
+                dir_meta = cls.find_directives(meta_file_name)
+            cls.Directives[dir_name] = dir_meta
+
+        meta = cls.find_directives(path)
+        if meta != '' or dir_meta != '':
+            meta = meta + dir_meta
             parts = meta.split(';')
             for part in parts:
                 part = part.strip()
                 if not part:
                     continue
                 name, _, value = part.partition(':')
                 if value:
                     value = value.strip()
@@ -215,20 +240,16 @@ class JitTest:
                         test.allow_overrecursed = True
                     elif name == 'valgrind':
                         test.valgrind = options.valgrind
                     elif name == 'tz-pacific':
                         test.tz_pacific = True
                     elif name == 'test-also-noasmjs':
                         if options.can_test_also_noasmjs:
                             test.test_also.append(['--no-asmjs'])
-                            # test-also-noasmjs is a sure indicator that the file contains asm.js code;
-                            # in that case we want to test the wasm baseline compiler too, as asm.js
-                            # is translated to wasm
-                            test.test_also.append(['--wasm-always-baseline'])
                     elif name == 'test-also-wasm-baseline':
                         if options.can_test_also_wasm_baseline:
                             test.test_also.append(['--wasm-always-baseline'])
                     elif name.startswith('test-also='):
                         test.test_also.append([name[len('test-also='):]])
                     elif name.startswith('test-join='):
                         test.test_join.append([name[len('test-join='):]])
                     elif name == 'module':
--- a/js/src/vm/CaseFolding.txt
+++ b/js/src/vm/CaseFolding.txt
@@ -1,15 +1,16 @@
-# CaseFolding-8.0.0.txt
-# Date: 2015-01-13, 18:16:36 GMT [MD]
+# CaseFolding-9.0.0.txt
+# Date: 2016-03-02, 18:54:54 GMT
+# © 2016 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# Copyright (c) 1991-2015 Unicode, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
-# For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see http://www.unicode.org/reports/tr44/
 #
 # Case Folding Properties
 #
 # This file is a supplement to the UnicodeData file.
 # It provides a case folding mapping generated from the Unicode Character Database.
 # If all characters are mapped according to the full mapping below, then
 # case differences (according to UnicodeData.txt and SpecialCasing.txt)
 # are eliminated.
@@ -588,16 +589,25 @@ 10C5; C; 2D25; # GEORGIAN CAPITAL LETTER
 10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN
 10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN
 13F8; C; 13F0; # CHEROKEE SMALL LETTER YE
 13F9; C; 13F1; # CHEROKEE SMALL LETTER YI
 13FA; C; 13F2; # CHEROKEE SMALL LETTER YO
 13FB; C; 13F3; # CHEROKEE SMALL LETTER YU
 13FC; C; 13F4; # CHEROKEE SMALL LETTER YV
 13FD; C; 13F5; # CHEROKEE SMALL LETTER MV
+1C80; C; 0432; # CYRILLIC SMALL LETTER ROUNDED VE
+1C81; C; 0434; # CYRILLIC SMALL LETTER LONG-LEGGED DE
+1C82; C; 043E; # CYRILLIC SMALL LETTER NARROW O
+1C83; C; 0441; # CYRILLIC SMALL LETTER WIDE ES
+1C84; C; 0442; # CYRILLIC SMALL LETTER TALL TE
+1C85; C; 0442; # CYRILLIC SMALL LETTER THREE-LEGGED TE
+1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN
+1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT
+1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK
 1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW
 1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE
 1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW
 1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW
 1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
 1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE
 1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW
 1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW
@@ -1158,16 +1168,17 @@ A7A0; C; A7A1; # LATIN CAPITAL LETTER G 
 A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
 A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
 A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
 A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
 A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK
 A7AB; C; 025C; # LATIN CAPITAL LETTER REVERSED OPEN E
 A7AC; C; 0261; # LATIN CAPITAL LETTER SCRIPT G
 A7AD; C; 026C; # LATIN CAPITAL LETTER L WITH BELT
+A7AE; C; 026A; # LATIN CAPITAL LETTER SMALL CAPITAL I
 A7B0; C; 029E; # LATIN CAPITAL LETTER TURNED K
 A7B1; C; 0287; # LATIN CAPITAL LETTER TURNED T
 A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL
 A7B3; C; AB53; # LATIN CAPITAL LETTER CHI
 A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA
 A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA
 AB70; C; 13A0; # CHEROKEE SMALL LETTER A
 AB71; C; 13A1; # CHEROKEE SMALL LETTER E
@@ -1322,16 +1333,52 @@ 1041F; C; 10447; # DESERET CAPITAL LETTE
 10420; C; 10448; # DESERET CAPITAL LETTER ZHEE
 10421; C; 10449; # DESERET CAPITAL LETTER ER
 10422; C; 1044A; # DESERET CAPITAL LETTER EL
 10423; C; 1044B; # DESERET CAPITAL LETTER EM
 10424; C; 1044C; # DESERET CAPITAL LETTER EN
 10425; C; 1044D; # DESERET CAPITAL LETTER ENG
 10426; C; 1044E; # DESERET CAPITAL LETTER OI
 10427; C; 1044F; # DESERET CAPITAL LETTER EW
+104B0; C; 104D8; # OSAGE CAPITAL LETTER A
+104B1; C; 104D9; # OSAGE CAPITAL LETTER AI
+104B2; C; 104DA; # OSAGE CAPITAL LETTER AIN
+104B3; C; 104DB; # OSAGE CAPITAL LETTER AH
+104B4; C; 104DC; # OSAGE CAPITAL LETTER BRA
+104B5; C; 104DD; # OSAGE CAPITAL LETTER CHA
+104B6; C; 104DE; # OSAGE CAPITAL LETTER EHCHA
+104B7; C; 104DF; # OSAGE CAPITAL LETTER E
+104B8; C; 104E0; # OSAGE CAPITAL LETTER EIN
+104B9; C; 104E1; # OSAGE CAPITAL LETTER HA
+104BA; C; 104E2; # OSAGE CAPITAL LETTER HYA
+104BB; C; 104E3; # OSAGE CAPITAL LETTER I
+104BC; C; 104E4; # OSAGE CAPITAL LETTER KA
+104BD; C; 104E5; # OSAGE CAPITAL LETTER EHKA
+104BE; C; 104E6; # OSAGE CAPITAL LETTER KYA
+104BF; C; 104E7; # OSAGE CAPITAL LETTER LA
+104C0; C; 104E8; # OSAGE CAPITAL LETTER MA
+104C1; C; 104E9; # OSAGE CAPITAL LETTER NA
+104C2; C; 104EA; # OSAGE CAPITAL LETTER O
+104C3; C; 104EB; # OSAGE CAPITAL LETTER OIN
+104C4; C; 104EC; # OSAGE CAPITAL LETTER PA
+104C5; C; 104ED; # OSAGE CAPITAL LETTER EHPA
+104C6; C; 104EE; # OSAGE CAPITAL LETTER SA
+104C7; C; 104EF; # OSAGE CAPITAL LETTER SHA
+104C8; C; 104F0; # OSAGE CAPITAL LETTER TA
+104C9; C; 104F1; # OSAGE CAPITAL LETTER EHTA
+104CA; C; 104F2; # OSAGE CAPITAL LETTER TSA
+104CB; C; 104F3; # OSAGE CAPITAL LETTER EHTSA
+104CC; C; 104F4; # OSAGE CAPITAL LETTER TSHA
+104CD; C; 104F5; # OSAGE CAPITAL LETTER DHA
+104CE; C; 104F6; # OSAGE CAPITAL LETTER U
+104CF; C; 104F7; # OSAGE CAPITAL LETTER WA
+104D0; C; 104F8; # OSAGE CAPITAL LETTER KHA
+104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA
+104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA
+104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA
 10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A
 10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA
 10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB
 10C83; C; 10CC3; # OLD HUNGARIAN CAPITAL LETTER AMB
 10C84; C; 10CC4; # OLD HUNGARIAN CAPITAL LETTER EC
 10C85; C; 10CC5; # OLD HUNGARIAN CAPITAL LETTER ENC
 10C86; C; 10CC6; # OLD HUNGARIAN CAPITAL LETTER ECS
 10C87; C; 10CC7; # OLD HUNGARIAN CAPITAL LETTER ED
@@ -1405,10 +1452,44 @@ 118B7; C; 118D7; # WARANG CITI CAPITAL L
 118B8; C; 118D8; # WARANG CITI CAPITAL LETTER PU
 118B9; C; 118D9; # WARANG CITI CAPITAL LETTER HIYO
 118BA; C; 118DA; # WARANG CITI CAPITAL LETTER HOLO
 118BB; C; 118DB; # WARANG CITI CAPITAL LETTER HORR
 118BC; C; 118DC; # WARANG CITI CAPITAL LETTER HAR
 118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU
 118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII
 118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO
+1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF
+1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI
+1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM
+1E903; C; 1E925; # ADLAM CAPITAL LETTER MIIM
+1E904; C; 1E926; # ADLAM CAPITAL LETTER BA
+1E905; C; 1E927; # ADLAM CAPITAL LETTER SINNYIIYHE
+1E906; C; 1E928; # ADLAM CAPITAL LETTER PE
+1E907; C; 1E929; # ADLAM CAPITAL LETTER BHE
+1E908; C; 1E92A; # ADLAM CAPITAL LETTER RA
+1E909; C; 1E92B; # ADLAM CAPITAL LETTER E
+1E90A; C; 1E92C; # ADLAM CAPITAL LETTER FA
+1E90B; C; 1E92D; # ADLAM CAPITAL LETTER I
+1E90C; C; 1E92E; # ADLAM CAPITAL LETTER O
+1E90D; C; 1E92F; # ADLAM CAPITAL LETTER DHA
+1E90E; C; 1E930; # ADLAM CAPITAL LETTER YHE
+1E90F; C; 1E931; # ADLAM CAPITAL LETTER WAW
+1E910; C; 1E932; # ADLAM CAPITAL LETTER NUN
+1E911; C; 1E933; # ADLAM CAPITAL LETTER KAF
+1E912; C; 1E934; # ADLAM CAPITAL LETTER YA
+1E913; C; 1E935; # ADLAM CAPITAL LETTER U
+1E914; C; 1E936; # ADLAM CAPITAL LETTER JIIM
+1E915; C; 1E937; # ADLAM CAPITAL LETTER CHI
+1E916; C; 1E938; # ADLAM CAPITAL LETTER HA
+1E917; C; 1E939; # ADLAM CAPITAL LETTER QAAF
+1E918; C; 1E93A; # ADLAM CAPITAL LETTER GA
+1E919; C; 1E93B; # ADLAM CAPITAL LETTER NYA
+1E91A; C; 1E93C; # ADLAM CAPITAL LETTER TU
+1E91B; C; 1E93D; # ADLAM CAPITAL LETTER NHA
+1E91C; C; 1E93E; # ADLAM CAPITAL LETTER VA
+1E91D; C; 1E93F; # ADLAM CAPITAL LETTER KHA
+1E91E; C; 1E940; # ADLAM CAPITAL LETTER GBE
+1E91F; C; 1E941; # ADLAM CAPITAL LETTER ZAL
+1E920; C; 1E942; # ADLAM CAPITAL LETTER KPO
+1E921; C; 1E943; # ADLAM CAPITAL LETTER SHA
 #
 # EOF
--- a/js/src/vm/Debugger.cpp
+++ b/js/src/vm/Debugger.cpp
@@ -2777,20 +2777,20 @@ Debugger::updateObservesCoverageOnDebugg
 
 void
 Debugger::updateObservesAsmJSOnDebuggees(IsObserving observing)
 {
     for (WeakGlobalObjectSet::Range r = debuggees.all(); !r.empty(); r.popFront()) {
         GlobalObject* global = r.front();
         JSCompartment* comp = global->compartment();
 
-        if (comp->debuggerObservesWasm() == observing)
+        if (comp->debuggerObservesAsmJS() == observing)
             continue;
 
-        comp->updateDebuggerObservesWasm();
+        comp->updateDebuggerObservesAsmJS();
     }
 }
 
 
 /*** Allocations Tracking *************************************************************************/
 
 /* static */ bool
 Debugger::cannotTrackAllocations(const GlobalObject& global)
@@ -3473,17 +3473,17 @@ Debugger::setAllowUnobservedAsmJS(JSCont
     THIS_DEBUGGER(cx, argc, vp, "set allowUnobservedAsmJS", args, dbg);
     if (!args.requireAtLeast(cx, "Debugger.set allowUnobservedAsmJS", 1))
         return false;
     dbg->allowUnobservedAsmJS = ToBoolean(args[0]);
 
     for (WeakGlobalObjectSet::Range r = dbg->debuggees.all(); !r.empty(); r.popFront()) {
         GlobalObject* global = r.front();
         JSCompartment* comp = global->compartment();
-        comp->updateDebuggerObservesWasm();
+        comp->updateDebuggerObservesAsmJS();
     }
 
     args.rval().setUndefined();
     return true;
 }
 
 /* static */ bool
 Debugger::getCollectCoverageInfo(JSContext* cx, unsigned argc, Value* vp)
@@ -3925,17 +3925,17 @@ Debugger::addDebuggeeGlobal(JSContext* c
     auto allocationsTrackingGuard = MakeScopeExit([&] {
         if (trackingAllocationSites && enabled)
             Debugger::removeAllocationsTracking(*global);
     });
 
     // (6)
     AutoRestoreCompartmentDebugMode debugModeGuard(debuggeeCompartment);
     debuggeeCompartment->setIsDebuggee();
-    debuggeeCompartment->updateDebuggerObservesWasm();
+    debuggeeCompartment->updateDebuggerObservesAsmJS();
     debuggeeCompartment->updateDebuggerObservesCoverage();
     if (observesAllExecution() && !ensureExecutionObservabilityOfCompartment(cx, debuggeeCompartment))
         return false;
 
     globalDebuggersGuard.release();
     debuggeesGuard.release();
     zoneDebuggersGuard.release();
     debuggeeZonesGuard.release();
@@ -4041,17 +4041,17 @@ Debugger::removeDebuggeeGlobal(FreeOp* f
      */
     if (trackingAllocationSites)
         Debugger::removeAllocationsTracking(*global);
 
     if (global->getDebuggers()->empty()) {
         global->compartment()->unsetIsDebuggee();
     } else {
         global->compartment()->updateDebuggerObservesAllExecution();
-        global->compartment()->updateDebuggerObservesWasm();
+        global->compartment()->updateDebuggerObservesAsmJS();
         global->compartment()->updateDebuggerObservesCoverage();
     }
 }
 
 
 static inline DebuggerSourceReferent GetSourceReferent(JSObject* obj);
 
 /*
@@ -8631,16 +8631,32 @@ DebuggerObject::errorMessageNameGetter(J
     if (result)
         args.rval().setString(result);
     else
         args.rval().setUndefined();
     return true;
 }
 
 /* static */ bool
+DebuggerObject::errorLineNumberGetter(JSContext *cx, unsigned argc, Value* vp)
+{
+    THIS_DEBUGOBJECT(cx, argc, vp, "get errorLineNumber", args, object)
+
+    return DebuggerObject::getErrorLineNumber(cx, object, args.rval());
+}
+
+/* static */ bool
+DebuggerObject::errorColumnNumberGetter(JSContext *cx, unsigned argc, Value* vp)
+{
+    THIS_DEBUGOBJECT(cx, argc, vp, "get errorColumnNumber", args, object)
+
+    return DebuggerObject::getErrorColumnNumber(cx, object, args.rval());
+}
+
+/* static */ bool
 DebuggerObject::isProxyGetter(JSContext* cx, unsigned argc, Value* vp)
 {
     THIS_DEBUGOBJECT(cx, argc, vp, "get isProxy", args, object)
 
     args.rval().setBoolean(object->isScriptedProxy());
     return true;
 }
 
@@ -9273,16 +9289,18 @@ const JSPropertySpec DebuggerObject::pro
     JS_PSG("script", DebuggerObject::scriptGetter, 0),
     JS_PSG("environment", DebuggerObject::environmentGetter, 0),
     JS_PSG("boundTargetFunction", DebuggerObject::boundTargetFunctionGetter, 0),
     JS_PSG("boundThis", DebuggerObject::boundThisGetter, 0),
     JS_PSG("boundArguments", DebuggerObject::boundArgumentsGetter, 0),
     JS_PSG("global", DebuggerObject::globalGetter, 0),
     JS_PSG("allocationSite", DebuggerObject::allocationSiteGetter, 0),
     JS_PSG("errorMessageName", DebuggerObject::errorMessageNameGetter, 0),
+    JS_PSG("errorLineNumber", DebuggerObject::errorLineNumberGetter, 0),
+    JS_PSG("errorColumnNumber", DebuggerObject::errorColumnNumberGetter, 0),
     JS_PSG("isProxy", DebuggerObject::isProxyGetter, 0),
     JS_PSG("proxyTarget", DebuggerObject::proxyTargetGetter, 0),
     JS_PSG("proxyHandler", DebuggerObject::proxyHandlerGetter, 0),
     JS_PS_END
 };
 
 #ifdef SPIDERMONKEY_PROMISE
 const JSPropertySpec DebuggerObject::promiseProperties_[] = {
@@ -9593,46 +9611,97 @@ DebuggerObject::getAllocationSite(JSCont
     if (!cx->compartment()->wrap(cx, &allocSite))
         return false;
 
     result.set(allocSite);
     return true;
 }
 
 /* static */ bool
-DebuggerObject::getErrorMessageName(JSContext* cx, HandleDebuggerObject object,
-                                    MutableHandleString result)
-{
-    RootedObject referent(cx, object->referent());
-
-    JSObject* obj = referent;
+DebuggerObject::getErrorReport(JSContext* cx, HandleObject maybeError, JSErrorReport*& report)
+{
+    JSObject* obj = maybeError;
     if (IsCrossCompartmentWrapper(obj))
         obj = CheckedUnwrap(obj);
 
     if (!obj) {
         JS_ReportErrorASCII(cx, "Permission denied to access object");
         return false;
     }
 
-    if (obj->is<ErrorObject>()) {
-        JSErrorReport* report = obj->as<ErrorObject>().getErrorReport();
-        if (report) {
-            const JSErrorFormatString* efs = GetErrorMessage(nullptr, report->errorNumber);
-            if (efs) {
-                RootedString str(cx, JS_NewStringCopyZ(cx, efs->name));
-                if (!cx->compartment()->wrap(cx, &str))
-                    return false;
-
-                result.set(str);
-                return true;
-            }
-        }
-    }
-
-    result.set(nullptr);
+    if (!obj->is<ErrorObject>()) {
+        report = nullptr;
+        return true;
+    }
+
+    report = obj->as<ErrorObject>().getErrorReport();
+    return true;
+}
+
+/* static */ bool
+DebuggerObject::getErrorMessageName(JSContext* cx, HandleDebuggerObject object,
+                                    MutableHandleString result)
+{
+    RootedObject referent(cx, object->referent());
+    JSErrorReport* report;
+    if (!getErrorReport(cx, referent, report))
+        return false;
+
+    if (!report) {
+        result.set(nullptr);
+        return true;
+    }
+
+    const JSErrorFormatString* efs = GetErrorMessage(nullptr, report->errorNumber);
+    if (!efs) {
+        result.set(nullptr);
+        return true;
+    }
+
+    RootedString str(cx, JS_NewStringCopyZ(cx, efs->name));
+    if (!cx->compartment()->wrap(cx, &str))
+        return false;
+
+    result.set(str);
+    return true;
+}
+
+/* static */ bool
+DebuggerObject::getErrorLineNumber(JSContext* cx, HandleDebuggerObject object,
+                                   MutableHandleValue result)
+{
+    RootedObject referent(cx, object->referent());
+    JSErrorReport* report;
+    if (!getErrorReport(cx, referent, report))
+        return false;
+
+    if (!report) {
+        result.setUndefined();
+        return true;
+    }
+
+    result.setNumber(report->lineno);
+    return true;
+}
+
+/* static */ bool
+DebuggerObject::getErrorColumnNumber(JSContext* cx, HandleDebuggerObject object,
+                                     MutableHandleValue result)
+{
+    RootedObject referent(cx, object->referent());
+    JSErrorReport* report;
+    if (!getErrorReport(cx, referent, report))
+        return false;
+
+    if (!report) {
+        result.setUndefined();
+        return true;
+    }
+
+    result.setNumber(report->column);
     return true;
 }
 
 #ifdef SPIDERMONKEY_PROMISE
 /* static */ bool
 DebuggerObject::getPromiseValue(JSContext* cx, HandleDebuggerObject object,
                                 MutableHandleValue result)
 {
--- a/js/src/vm/Debugger.h
+++ b/js/src/vm/Debugger.h
@@ -1241,16 +1241,20 @@ class DebuggerObject : public NativeObje
     static MOZ_MUST_USE bool getBoundThis(JSContext* cx, HandleDebuggerObject object,
                                           MutableHandleValue result);
     static MOZ_MUST_USE bool getBoundArguments(JSContext* cx, HandleDebuggerObject object,
                                                MutableHandle<ValueVector> result);
     static MOZ_MUST_USE bool getAllocationSite(JSContext* cx, HandleDebuggerObject object,
                                             MutableHandleObject result);
     static MOZ_MUST_USE bool getErrorMessageName(JSContext* cx, HandleDebuggerObject object,
                                                  MutableHandleString result);
+    static MOZ_MUST_USE bool getErrorLineNumber(JSContext* cx, HandleDebuggerObject object,
+                                                MutableHandleValue result);
+    static MOZ_MUST_USE bool getErrorColumnNumber(JSContext* cx, HandleDebuggerObject object,
+                                                  MutableHandleValue result);
     static MOZ_MUST_USE bool getScriptedProxyTarget(JSContext* cx, HandleDebuggerObject object,
                                                     MutableHandleDebuggerObject result);
     static MOZ_MUST_USE bool getScriptedProxyHandler(JSContext* cx, HandleDebuggerObject object,
                                                      MutableHandleDebuggerObject result);
 #ifdef SPIDERMONKEY_PROMISE
     static MOZ_MUST_USE bool getPromiseValue(JSContext* cx, HandleDebuggerObject object,
                                              MutableHandleValue result);
     static MOZ_MUST_USE bool getPromiseReason(JSContext* cx, HandleDebuggerObject object,
@@ -1362,16 +1366,18 @@ class DebuggerObject : public NativeObje
     static MOZ_MUST_USE bool scriptGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool environmentGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool boundTargetFunctionGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool boundThisGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool boundArgumentsGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool globalGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool allocationSiteGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool errorMessageNameGetter(JSContext* cx, unsigned argc, Value* vp);
+    static MOZ_MUST_USE bool errorLineNumberGetter(JSContext* cx, unsigned argc, Value* vp);
+    static MOZ_MUST_USE bool errorColumnNumberGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool isProxyGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool proxyTargetGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool proxyHandlerGetter(JSContext* cx, unsigned argc, Value* vp);
 #ifdef SPIDERMONKEY_PROMISE
     static MOZ_MUST_USE bool isPromiseGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool promiseStateGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool promiseValueGetter(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool promiseReasonGetter(JSContext* cx, unsigned argc, Value* vp);
@@ -1400,16 +1406,18 @@ class DebuggerObject : public NativeObje
     static MOZ_MUST_USE bool applyMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool asEnvironmentMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool forceLexicalInitializationByNameMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool executeInGlobalMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool executeInGlobalWithBindingsMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool makeDebuggeeValueMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool unsafeDereferenceMethod(JSContext* cx, unsigned argc, Value* vp);
     static MOZ_MUST_USE bool unwrapMethod(JSContext* cx, unsigned argc, Value* vp);
+    static MOZ_MUST_USE bool getErrorReport(JSContext* cx, HandleObject maybeError,
+                                            JSErrorReport*& report);
 };
 
 class BreakpointSite {
     friend class Breakpoint;
     friend struct ::JSCompartment;
     friend class ::JSScript;
     friend class Debugger;
 
--- a/js/src/vm/DerivedCoreProperties.txt
+++ b/js/src/vm/DerivedCoreProperties.txt
@@ -1,15 +1,16 @@
-# DerivedCoreProperties-6.2.0.txt
-# Date: 2012-05-20, 00:42:31 GMT [MD]
+# DerivedCoreProperties-9.0.0.txt
+# Date: 2016-06-01, 10:34:24 GMT
+# © 2016 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
 #
 # Unicode Character Database
-# Copyright (c) 1991-2012 Unicode, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
-# For documentation, see http://www.unicode.org/reports/tr44/
+#   For documentation, see http://www.unicode.org/reports/tr44/
 
 # ================================================
 
 # Derived Property: Math
 #  Generated from: Sm + Other_Math
 
 002B          ; Math # Sm       PLUS SIGN
 003C..003E    ; Math # Sm   [3] LESS-THAN SIGN..GREATER-THAN SIGN
@@ -78,17 +79,20 @@ 21CE..21CF    ; Math # Sm   [2] LEFT RIG
 21D0..21D1    ; Math # So   [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
 21D2          ; Math # Sm       RIGHTWARDS DOUBLE ARROW
 21D3          ; Math # So       DOWNWARDS DOUBLE ARROW
 21D4          ; Math # Sm       LEFT RIGHT DOUBLE ARROW
 21D5..21DB    ; Math # So   [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW
 21DD          ; Math # So       RIGHTWARDS SQUIGGLE ARROW
 21E4..21E5    ; Math # So   [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR
 21F4..22FF    ; Math # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
-2308..230B    ; Math # Sm   [4] LEFT CEILING..RIGHT FLOOR
+2308          ; Math # Ps       LEFT CEILING
+2309          ; Math # Pe       RIGHT CEILING
+230A          ; Math # Ps       LEFT FLOOR
+230B          ; Math # Pe       RIGHT FLOOR
 2320..2321    ; Math # Sm   [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
 237C          ; Math # Sm       RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
 239B..23B3    ; Math # Sm  [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
 23B4..23B5    ; Math # So   [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET
 23B7          ; Math # So       RADICAL SYMBOL BOTTOM
 23D0          ; Math # So       VERTICAL LINE EXTENSION
 23DC..23E1    ; Math # Sm   [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
 23E2          ; Math # So       WHITE TRAPEZIUM
@@ -249,17 +253,17 @@ 1EEA5..1EEA9  ; Math # Lo   [5] ARABIC M
 1EEAB..1EEBB  ; Math # Lo  [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
 1EEF0..1EEF1  ; Math # Sm   [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
 
 # Total code points: 2310
 
 # ================================================
 
 # Derived Property: Alphabetic
-#  Generated from: Lu+Ll+Lt+Lm+Lo+Nl + Other_Alphabetic
+#  Generated from: Uppercase + Lowercase + Lt + Lm + Lo + Nl + Other_Alphabetic
 
 0041..005A    ; Alphabetic # L&  [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
 0061..007A    ; Alphabetic # L&  [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
 00AA          ; Alphabetic # Lo       FEMININE ORDINAL INDICATOR
 00B5          ; Alphabetic # L&       MICRO SIGN
 00BA          ; Alphabetic # Lo       MASCULINE ORDINAL INDICATOR
 00C0..00D6    ; Alphabetic # L&  [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
 00D8..00F6    ; Alphabetic # L&  [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
@@ -276,23 +280,24 @@ 02E0..02E4    ; Alphabetic # Lm   [5] MO
 02EC          ; Alphabetic # Lm       MODIFIER LETTER VOICING
 02EE          ; Alphabetic # Lm       MODIFIER LETTER DOUBLE APOSTROPHE
 0345          ; Alphabetic # Mn       COMBINING GREEK YPOGEGRAMMENI
 0370..0373    ; Alphabetic # L&   [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
 0374          ; Alphabetic # Lm       GREEK NUMERAL SIGN
 0376..0377    ; Alphabetic # L&   [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
 037A          ; Alphabetic # Lm       GREEK YPOGEGRAMMENI
 037B..037D    ; Alphabetic # L&   [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037F          ; Alphabetic # L&       GREEK CAPITAL LETTER YOT
 0386          ; Alphabetic # L&       GREEK CAPITAL LETTER ALPHA WITH TONOS
 0388..038A    ; Alphabetic # L&   [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
 038C          ; Alphabetic # L&       GREEK CAPITAL LETTER OMICRON WITH TONOS
 038E..03A1    ; Alphabetic # L&  [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
 03A3..03F5    ; Alphabetic # L&  [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
 03F7..0481    ; Alphabetic # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
-048A..0527    ; Alphabetic # L& [158] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER SHHA WITH DESCENDER
+048A..052F    ; Alphabetic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER
 0531..0556    ; Alphabetic # L&  [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
 0559          ; Alphabetic # Lm       ARMENIAN MODIFIER LETTER LEFT HALF RING
 0561..0587    ; Alphabetic # L&  [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
 05B0..05BD    ; Alphabetic # Mn  [14] HEBREW POINT SHEVA..HEBREW POINT METEG
 05BF          ; Alphabetic # Mn       HEBREW POINT RAFE
 05C1..05C2    ; Alphabetic # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
 05C4..05C5    ; Alphabetic # Mn   [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
 05C7          ; Alphabetic # Mn       HEBREW POINT QAMATS QATAN
@@ -330,37 +335,36 @@ 0800..0815    ; Alphabetic # Lo  [22] SA
 0816..0817    ; Alphabetic # Mn   [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF
 081A          ; Alphabetic # Lm       SAMARITAN MODIFIER LETTER EPENTHETIC YUT
 081B..0823    ; Alphabetic # Mn   [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
 0824          ; Alphabetic # Lm       SAMARITAN MODIFIER LETTER SHORT A
 0825..0827    ; Alphabetic # Mn   [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
 0828          ; Alphabetic # Lm       SAMARITAN MODIFIER LETTER I
 0829..082C    ; Alphabetic # Mn   [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN
 0840..0858    ; Alphabetic # Lo  [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN
-08A0          ; Alphabetic # Lo       ARABIC LETTER BEH WITH SMALL V BELOW
-08A2..08AC    ; Alphabetic # Lo  [11] ARABIC LETTER JEEM WITH TWO DOTS ABOVE..ARABIC LETTER ROHINGYA YEH
-08E4..08E9    ; Alphabetic # Mn   [6] ARABIC CURLY FATHA..ARABIC CURLY KASRATAN
-08F0..08FE    ; Alphabetic # Mn  [15] ARABIC OPEN FATHATAN..ARABIC DAMMA WITH DOT
-0900..0902    ; Alphabetic # Mn   [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+08A0..08B4    ; Alphabetic # Lo  [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW
+08B6..08BD    ; Alphabetic # Lo   [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON
+08D4..08DF    ; Alphabetic # Mn  [12] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH WORD WAQFA
+08E3..08E9    ; Alphabetic # Mn   [7] ARABIC TURNED DAMMA BELOW..ARABIC CURLY KASRATAN
+08F0..0902    ; Alphabetic # Mn  [19] ARABIC OPEN FATHATAN..DEVANAGARI SIGN ANUSVARA
 0903          ; Alphabetic # Mc       DEVANAGARI SIGN VISARGA
 0904..0939    ; Alphabetic # Lo  [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
 093A          ; Alphabetic # Mn       DEVANAGARI VOWEL SIGN OE
 093B          ; Alphabetic # Mc       DEVANAGARI VOWEL SIGN OOE
 093D          ; Alphabetic # Lo       DEVANAGARI SIGN AVAGRAHA
 093E..0940    ; Alphabetic # Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
 0941..0948    ; Alphabetic # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
 0949..094C    ; Alphabetic # Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
 094E..094F    ; Alphabetic # Mc   [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW
 0950          ; Alphabetic # Lo       DEVANAGARI OM
 0955..0957    ; Alphabetic # Mn   [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE
 0958..0961    ; Alphabetic # Lo  [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
 0962..0963    ; Alphabetic # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
 0971          ; Alphabetic # Lm       DEVANAGARI SIGN HIGH SPACING DOT
-0972..0977    ; Alphabetic # Lo   [6] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER UUE
-0979..097F    ; Alphabetic # Lo   [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0972..0980    ; Alphabetic # Lo  [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI
 0981          ; Alphabetic # Mn       BENGALI SIGN CANDRABINDU
 0982..0983    ; Alphabetic # Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
 0985..098C    ; Alphabetic # Lo   [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
 098F..0990    ; Alphabetic # Lo   [2] BENGALI LETTER E..BENGALI LETTER AI
 0993..09A8    ; Alphabetic # Lo  [22] BENGALI LETTER O..BENGALI LETTER NA
 09AA..09B0    ; Alphabetic # Lo   [7] BENGALI LETTER PA..BENGALI LETTER RA
 09B2          ; Alphabetic # Lo       BENGALI LETTER LA
 09B6..09B9    ; Alphabetic # Lo   [4] BENGALI LETTER SHA..BENGALI LETTER HA
@@ -406,16 +410,17 @@ 0ABD          ; Alphabetic # Lo       GU
 0ABE..0AC0    ; Alphabetic # Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
 0AC1..0AC5    ; Alphabetic # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
 0AC7..0AC8    ; Alphabetic # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
 0AC9          ; Alphabetic # Mc       GUJARATI VOWEL SIGN CANDRA O
 0ACB..0ACC    ; Alphabetic # Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
 0AD0          ; Alphabetic # Lo       GUJARATI OM
 0AE0..0AE1    ; Alphabetic # Lo   [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
 0AE2..0AE3    ; Alphabetic # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AF9          ; Alphabetic # Lo       GUJARATI LETTER ZHA
 0B01          ; Alphabetic # Mn       ORIYA SIGN CANDRABINDU
 0B02..0B03    ; Alphabetic # Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
 0B05..0B0C    ; Alphabetic # Lo   [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
 0B0F..0B10    ; Alphabetic # Lo   [2] ORIYA LETTER E..ORIYA LETTER AI
 0B13..0B28    ; Alphabetic # Lo  [22] ORIYA LETTER O..ORIYA LETTER NA
 0B2A..0B30    ; Alphabetic # Lo   [7] ORIYA LETTER PA..ORIYA LETTER RA
 0B32..0B33    ; Alphabetic # Lo   [2] ORIYA LETTER LA..ORIYA LETTER LLA
 0B35..0B39    ; Alphabetic # Lo   [5] ORIYA LETTER VA..ORIYA LETTER HA
@@ -445,31 +450,33 @@ 0BA8..0BAA    ; Alphabetic # Lo   [3] TA
 0BAE..0BB9    ; Alphabetic # Lo  [12] TAMIL LETTER MA..TAMIL LETTER HA
 0BBE..0BBF    ; Alphabetic # Mc   [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
 0BC0          ; Alphabetic # Mn       TAMIL VOWEL SIGN II
 0BC1..0BC2    ; Alphabetic # Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
 0BC6..0BC8    ; Alphabetic # Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
 0BCA..0BCC    ; Alphabetic # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
 0BD0          ; Alphabetic # Lo       TAMIL OM
 0BD7          ; Alphabetic # Mc       TAMIL AU LENGTH MARK
+0C00          ; Alphabetic # Mn       TELUGU SIGN COMBINING CANDRABINDU ABOVE
 0C01..0C03    ; Alphabetic # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
 0C05..0C0C    ; Alphabetic # Lo   [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
 0C0E..0C10    ; Alphabetic # Lo   [3] TELUGU LETTER E..TELUGU LETTER AI
 0C12..0C28    ; Alphabetic # Lo  [23] TELUGU LETTER O..TELUGU LETTER NA
-0C2A..0C33    ; Alphabetic # Lo  [10] TELUGU LETTER PA..TELUGU LETTER LLA
-0C35..0C39    ; Alphabetic # Lo   [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C2A..0C39    ; Alphabetic # Lo  [16] TELUGU LETTER PA..TELUGU LETTER HA
 0C3D          ; Alphabetic # Lo       TELUGU SIGN AVAGRAHA
 0C3E..0C40    ; Alphabetic # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
 0C41..0C44    ; Alphabetic # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
 0C46..0C48    ; Alphabetic # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
 0C4A..0C4C    ; Alphabetic # Mn   [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU
 0C55..0C56    ; Alphabetic # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
-0C58..0C59    ; Alphabetic # Lo   [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C58..0C5A    ; Alphabetic # Lo   [3] TELUGU LETTER TSA..TELUGU LETTER RRRA
 0C60..0C61    ; Alphabetic # Lo   [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
 0C62..0C63    ; Alphabetic # Mn   [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C80          ; Alphabetic # Lo       KANNADA SIGN SPACING CANDRABINDU
+0C81          ; Alphabetic # Mn       KANNADA SIGN CANDRABINDU
 0C82..0C83    ; Alphabetic # Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
 0C85..0C8C    ; Alphabetic # Lo   [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
 0C8E..0C90    ; Alphabetic # Lo   [3] KANNADA LETTER E..KANNADA LETTER AI
 0C92..0CA8    ; Alphabetic # Lo  [23] KANNADA LETTER O..KANNADA LETTER NA
 0CAA..0CB3    ; Alphabetic # Lo  [10] KANNADA LETTER PA..KANNADA LETTER LLA
 0CB5..0CB9    ; Alphabetic # Lo   [5] KANNADA LETTER VA..KANNADA LETTER HA
 0CBD          ; Alphabetic # Lo       KANNADA SIGN AVAGRAHA
 0CBE          ; Alphabetic # Mc       KANNADA VOWEL SIGN AA
@@ -479,28 +486,30 @@ 0CC6          ; Alphabetic # Mn       KA
 0CC7..0CC8    ; Alphabetic # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
 0CCA..0CCB    ; Alphabetic # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
 0CCC          ; Alphabetic # Mn       KANNADA VOWEL SIGN AU
 0CD5..0CD6    ; Alphabetic # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
 0CDE          ; Alphabetic # Lo       KANNADA LETTER FA
 0CE0..0CE1    ; Alphabetic # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
 0CE2..0CE3    ; Alphabetic # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
 0CF1..0CF2    ; Alphabetic # Lo   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0D01          ; Alphabetic # Mn       MALAYALAM SIGN CANDRABINDU
 0D02..0D03    ; Alphabetic # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
 0D05..0D0C    ; Alphabetic # Lo   [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
 0D0E..0D10    ; Alphabetic # Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
 0D12..0D3A    ; Alphabetic # Lo  [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA
 0D3D          ; Alphabetic # Lo       MALAYALAM SIGN AVAGRAHA
 0D3E..0D40    ; Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
 0D41..0D44    ; Alphabetic # Mn   [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
 0D46..0D48    ; Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
 0D4A..0D4C    ; Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
 0D4E          ; Alphabetic # Lo       MALAYALAM LETTER DOT REPH
+0D54..0D56    ; Alphabetic # Lo   [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL
 0D57          ; Alphabetic # Mc       MALAYALAM AU LENGTH MARK
-0D60..0D61    ; Alphabetic # Lo   [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D5F..0D61    ; Alphabetic # Lo   [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL
 0D62..0D63    ; Alphabetic # Mn   [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
 0D7A..0D7F    ; Alphabetic # Lo   [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
 0D82..0D83    ; Alphabetic # Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
 0D85..0D96    ; Alphabetic # Lo  [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
 0D9A..0DB1    ; Alphabetic # Lo  [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
 0DB3..0DBB    ; Alphabetic # Lo   [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
 0DBD          ; Alphabetic # Lo       SINHALA LETTER DANTAJA LAYANNA
 0DC0..0DC6    ; Alphabetic # Lo   [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
@@ -591,22 +600,24 @@ 12B8..12BE    ; Alphabetic # Lo   [7] ET
 12C0          ; Alphabetic # Lo       ETHIOPIC SYLLABLE KXWA
 12C2..12C5    ; Alphabetic # Lo   [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
 12C8..12D6    ; Alphabetic # Lo  [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
 12D8..1310    ; Alphabetic # Lo  [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
 1312..1315    ; Alphabetic # Lo   [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
 1318..135A    ; Alphabetic # Lo  [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
 135F          ; Alphabetic # Mn       ETHIOPIC COMBINING GEMINATION MARK
 1380..138F    ; Alphabetic # Lo  [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
-13A0..13F4    ; Alphabetic # Lo  [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+13A0..13F5    ; Alphabetic # L&  [86] CHEROKEE LETTER A..CHEROKEE LETTER MV
+13F8..13FD    ; Alphabetic # L&   [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV
 1401..166C    ; Alphabetic # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
 166F..167F    ; Alphabetic # Lo  [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
 1681..169A    ; Alphabetic # Lo  [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
 16A0..16EA    ; Alphabetic # Lo  [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
 16EE..16F0    ; Alphabetic # Nl   [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+16F1..16F8    ; Alphabetic # Lo   [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC
 1700..170C    ; Alphabetic # Lo  [13] TAGALOG LETTER A..TAGALOG LETTER YA
 170E..1711    ; Alphabetic # Lo   [4] TAGALOG LETTER LA..TAGALOG LETTER HA
 1712..1713    ; Alphabetic # Mn   [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U
 1720..1731    ; Alphabetic # Lo  [18] HANUNOO LETTER A..HANUNOO LETTER HA
 1732..1733    ; Alphabetic # Mn   [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
 1740..1751    ; Alphabetic # Lo  [18] BUHID LETTER A..BUHID LETTER HA
 1752..1753    ; Alphabetic # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
 1760..176C    ; Alphabetic # Lo  [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
@@ -618,37 +629,38 @@ 17B7..17BD    ; Alphabetic # Mn   [7] KH
 17BE..17C5    ; Alphabetic # Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
 17C6          ; Alphabetic # Mn       KHMER SIGN NIKAHIT
 17C7..17C8    ; Alphabetic # Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
 17D7          ; Alphabetic # Lm       KHMER SIGN LEK TOO
 17DC          ; Alphabetic # Lo       KHMER SIGN AVAKRAHASANYA
 1820..1842    ; Alphabetic # Lo  [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
 1843          ; Alphabetic # Lm       MONGOLIAN LETTER TODO LONG VOWEL SIGN
 1844..1877    ; Alphabetic # Lo  [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
-1880..18A8    ; Alphabetic # Lo  [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+1880..1884    ; Alphabetic # Lo   [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885..1886    ; Alphabetic # Mn   [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887..18A8    ; Alphabetic # Lo  [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA
 18A9          ; Alphabetic # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
 18AA          ; Alphabetic # Lo       MONGOLIAN LETTER MANCHU ALI GALI LHA
 18B0..18F5    ; Alphabetic # Lo  [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
-1900..191C    ; Alphabetic # Lo  [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1900..191E    ; Alphabetic # Lo  [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA
 1920..1922    ; Alphabetic # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
 1923..1926    ; Alphabetic # Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
 1927..1928    ; Alphabetic # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
 1929..192B    ; Alphabetic # Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
 1930..1931    ; Alphabetic # Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
 1932          ; Alphabetic # Mn       LIMBU SMALL LETTER ANUSVARA
 1933..1938    ; Alphabetic # Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
 1950..196D    ; Alphabetic # Lo  [30] TAI LE LETTER KA..TAI LE LETTER AI
 1970..1974    ; Alphabetic # Lo   [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
 1980..19AB    ; Alphabetic # Lo  [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
-19B0..19C0    ; Alphabetic # Mc  [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
-19C1..19C7    ; Alphabetic # Lo   [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
-19C8..19C9    ; Alphabetic # Mc   [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19B0..19C9    ; Alphabetic # Lo  [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2
 1A00..1A16    ; Alphabetic # Lo  [23] BUGINESE LETTER KA..BUGINESE LETTER HA
 1A17..1A18    ; Alphabetic # Mn   [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
-1A19..1A1B    ; Alphabetic # Mc   [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A19..1A1A    ; Alphabetic # Mc   [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O
+1A1B          ; Alphabetic # Mn       BUGINESE VOWEL SIGN AE
 1A20..1A54    ; Alphabetic # Lo  [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
 1A55          ; Alphabetic # Mc       TAI THAM CONSONANT SIGN MEDIAL RA
 1A56          ; Alphabetic # Mn       TAI THAM CONSONANT SIGN MEDIAL LA
 1A57          ; Alphabetic # Mc       TAI THAM CONSONANT SIGN LA TANG LAI
 1A58..1A5E    ; Alphabetic # Mn   [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
 1A61          ; Alphabetic # Mc       TAI THAM VOWEL SIGN A
 1A62          ; Alphabetic # Mn       TAI THAM VOWEL SIGN MAI SAT
 1A63..1A64    ; Alphabetic # Mc   [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
@@ -669,42 +681,44 @@ 1B43          ; Alphabetic # Mc       BA
 1B45..1B4B    ; Alphabetic # Lo   [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
 1B80..1B81    ; Alphabetic # Mn   [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
 1B82          ; Alphabetic # Mc       SUNDANESE SIGN PANGWISAD
 1B83..1BA0    ; Alphabetic # Lo  [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
 1BA1          ; Alphabetic # Mc       SUNDANESE CONSONANT SIGN PAMINGKAL
 1BA2..1BA5    ; Alphabetic # Mn   [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
 1BA6..1BA7    ; Alphabetic # Mc   [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
 1BA8..1BA9    ; Alphabetic # Mn   [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
-1BAC..1BAD    ; Alphabetic # Mc   [2] SUNDANESE CONSONANT SIGN PASANGAN MA..SUNDANESE CONSONANT SIGN PASANGAN WA
+1BAC..1BAD    ; Alphabetic # Mn   [2] SUNDANESE CONSONANT SIGN PASANGAN MA..SUNDANESE CONSONANT SIGN PASANGAN WA
 1BAE..1BAF    ; Alphabetic # Lo   [2] SUNDANESE LETTE