Merge inbound to mozilla-central. a=merge
authorshindli <shindli@mozilla.com>
Thu, 12 Apr 2018 02:45:34 +0300
changeset 412874 1a9a362b9288cb36b4bf3f3b04550e9586474617
parent 412847 4fd59fe7f0f847701f154e03e463757baa021837 (current diff)
parent 412873 6ff8aaef28669cc3945291a182232680481256da (diff)
child 412875 88f297d206a65910871de724e9c8bb462f04d792
push id62510
push usershindli@mozilla.com
push dateWed, 11 Apr 2018 23:54:28 +0000
treeherderautoland@88f297d206a6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone61.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central. a=merge
dom/serviceworkers/test/fetch/context/beacon.sjs
dom/serviceworkers/test/fetch/context/context_test.js
dom/serviceworkers/test/fetch/context/csp-violate.sjs
dom/serviceworkers/test/fetch/context/index.html
dom/serviceworkers/test/fetch/context/parentsharedworker.js
dom/serviceworkers/test/fetch/context/parentworker.js
dom/serviceworkers/test/fetch/context/ping.html
dom/serviceworkers/test/fetch/context/realaudio.ogg
dom/serviceworkers/test/fetch/context/realimg.jpg
dom/serviceworkers/test/fetch/context/register.html
dom/serviceworkers/test/fetch/context/sharedworker.js
dom/serviceworkers/test/fetch/context/unregister.html
dom/serviceworkers/test/fetch/context/worker.js
dom/serviceworkers/test/fetch/context/xml.xml
dom/serviceworkers/test/test_request_context.js
dom/serviceworkers/test/test_request_context_audio.html
dom/serviceworkers/test/test_request_context_beacon.html
dom/serviceworkers/test/test_request_context_cache.html
dom/serviceworkers/test/test_request_context_cspreport.html
dom/serviceworkers/test/test_request_context_embed.html
dom/serviceworkers/test/test_request_context_fetch.html
dom/serviceworkers/test/test_request_context_font.html
dom/serviceworkers/test/test_request_context_frame.html
dom/serviceworkers/test/test_request_context_iframe.html
dom/serviceworkers/test/test_request_context_image.html
dom/serviceworkers/test/test_request_context_imagesrcset.html
dom/serviceworkers/test/test_request_context_internal.html
dom/serviceworkers/test/test_request_context_nestedworker.html
dom/serviceworkers/test/test_request_context_nestedworkerinsharedworker.html
dom/serviceworkers/test/test_request_context_object.html
dom/serviceworkers/test/test_request_context_picture.html
dom/serviceworkers/test/test_request_context_ping.html
dom/serviceworkers/test/test_request_context_plugin.html
dom/serviceworkers/test/test_request_context_script.html
dom/serviceworkers/test/test_request_context_sharedworker.html
dom/serviceworkers/test/test_request_context_style.html
dom/serviceworkers/test/test_request_context_track.html
dom/serviceworkers/test/test_request_context_video.html
dom/serviceworkers/test/test_request_context_worker.html
dom/serviceworkers/test/test_request_context_xhr.html
dom/serviceworkers/test/test_request_context_xslt.html
layout/generic/nsGfxScrollFrame.cpp
layout/painting/FrameLayerBuilder.cpp
layout/painting/nsDisplayList.h
testing/web-platform/meta/fetch/api/request/destination/fetch-destination-iframe.https.html.ini
testing/web-platform/meta/fetch/api/request/destination/fetch-destination-no-load-event.https.html.ini
testing/web-platform/meta/fetch/api/request/destination/fetch-destination-worker.https.html.ini
testing/web-platform/meta/fetch/api/request/destination/fetch-destination.https.html.ini
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,32 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-More ICU-build-related touching for bug 1447475, trying a CLOBBER after a previous build failure just in case.
-
-# HG changeset patch
-# User André Bargull <andre.bargull@gmail.com>
-# Date 1522162741 25200
-#      Tue Mar 27 07:59:01 2018 -0700
-# Node ID ff604dc06da17fef36d59350ae5f5842ff1f9061
-# Parent  db367b34a6a682ed6955ae6e893477381f8e3f4b
-Bug 1445465 - Part 4: Clobber for ICU update. r=clobber
-
-diff --git a/CLOBBER b/CLOBBER
---- a/CLOBBER
-+++ b/CLOBBER
-@@ -17,9 +17,9 @@
- #
- # Modifying this file will now automatically clobber the buildbot machines \o/
- #
- 
- # Are you updating CLOBBER because you think it's needed for your WebIDL
- # changes to stick? As of bug 928195, this shouldn't be necessary! Please
- # don't change CLOBBER for WebIDL changes any more.
- 
--Historically updating ICU has required a CLOBBER.  Bug 1445524 is a fairly notable ICU-related change, so play it safe and force a full rebuild, even if no problem along these lines has actually been observed.
-+Bug 1445465 - Update to ICU 61 requires clobber
+Bug 1453317 - Update VS2017 used for builds in automation to version 15.6.6.
--- a/accessible/base/TextAttrs.h
+++ b/accessible/base/TextAttrs.h
@@ -122,17 +122,22 @@ protected:
 
   /**
    * Base class to work with text attributes. See derived classes below.
    */
   template<class T>
   class TTextAttr : public TextAttr
   {
   public:
-    explicit TTextAttr(bool aGetRootValue) : mGetRootValue(aGetRootValue) {}
+    explicit TTextAttr(bool aGetRootValue)
+      : mGetRootValue(aGetRootValue)
+      , mIsDefined{ false }
+      , mIsRootDefined{ false }
+    {
+    }
 
     // TextAttr
     virtual void Expose(nsIPersistentProperties* aAttributes,
                         bool aIncludeDefAttrValue) override
     {
       if (mGetRootValue) {
         if (mIsRootDefined)
           ExposeValue(aAttributes, mRootNativeValue);
--- a/browser/config/tooltool-manifests/win32/releng.manifest
+++ b/browser/config/tooltool-manifests/win32/releng.manifest
@@ -1,21 +1,21 @@
 [
   {
     "size": 266240,
     "digest": "bb345b0e700ffab4d09436981f14b5de84da55a3f18a7f09ebc4364a4488acdeab8d46f447b12ac70f2da1444a68b8ce8b8675f0dae2ccf845e966d1df0f0869",
     "algorithm": "sha512",
     "filename": "mozmake.exe"
   },
   {
-    "version": "Visual Studio 2017 15.6.0 / SDK 10.0.15063.0",
-    "digest": "f99285fa6328da3c21839adabe6fc4dd1a792bcb6048a491ba7617a8ce3d0e21f8d18e9de03b65c90ce5bf37073637ba7c1497fb21ce920b6794d2c9819b4f9e",
-    "size": 309779153,
+    "version": "Visual Studio 2017 15.6.6 / SDK 10.0.15063.0",
+    "digest": "c2f0e618877da50f862e5b0ceb13a9affd86490d3779c2b1cb5ba75ea0156adad6df950d1ffbc053d725361fd04b2e57ab17ed5b7b57ffb7f7de2cd82d6edb72",
+    "size": 309779013,
     "algorithm": "sha512",
-    "filename": "vs2017_15.6.0.zip",
+    "filename": "vs2017_15.6.6.zip",
     "unpack": true
   },
   {
     "version": "makecab rev d2bc6797648b7a834782714a55d339d2fd4e58c8",
     "algorithm": "sha512",
     "visibility": "public",
     "filename": "makecab.tar.bz2",
     "unpack": true,
--- a/browser/config/tooltool-manifests/win64/releng.manifest
+++ b/browser/config/tooltool-manifests/win64/releng.manifest
@@ -1,21 +1,21 @@
 [
   {
     "size": 266240,
     "digest": "bb345b0e700ffab4d09436981f14b5de84da55a3f18a7f09ebc4364a4488acdeab8d46f447b12ac70f2da1444a68b8ce8b8675f0dae2ccf845e966d1df0f0869",
     "algorithm": "sha512",
     "filename": "mozmake.exe"
   },
   {
-    "version": "Visual Studio 2017 15.6.0 / SDK 10.0.15063.0",
-    "digest": "f99285fa6328da3c21839adabe6fc4dd1a792bcb6048a491ba7617a8ce3d0e21f8d18e9de03b65c90ce5bf37073637ba7c1497fb21ce920b6794d2c9819b4f9e",
-    "size": 309779153,
+    "version": "Visual Studio 2017 15.6.6 / SDK 10.0.15063.0",
+    "digest": "c2f0e618877da50f862e5b0ceb13a9affd86490d3779c2b1cb5ba75ea0156adad6df950d1ffbc053d725361fd04b2e57ab17ed5b7b57ffb7f7de2cd82d6edb72",
+    "size": 309779013,
     "algorithm": "sha512",
-    "filename": "vs2017_15.6.0.zip",
+    "filename": "vs2017_15.6.6.zip",
     "unpack": true
   },
   {
     "version": "makecab rev d2bc6797648b7a834782714a55d339d2fd4e58c8",
     "algorithm": "sha512",
     "visibility": "public",
     "filename": "makecab.tar.bz2",
     "unpack": true,
--- a/browser/modules/ContextMenu.jsm
+++ b/browser/modules/ContextMenu.jsm
@@ -534,23 +534,25 @@ class ContextMenu {
 
     let disableSetDesktopBg = null;
 
     // Media related cache info parent needs for saving
     let contentType = null;
     let contentDisposition = null;
     if (aEvent.target.nodeType == Ci.nsIDOMNode.ELEMENT_NODE &&
         aEvent.target instanceof Ci.nsIImageLoadingContent &&
-        aEvent.target.currentRequestFinalURI) {
+        aEvent.target.currentURI) {
       disableSetDesktopBg = this._disableSetDesktopBackground(aEvent.target);
 
       try {
         let imageCache = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools)
                                                          .getImgCacheForDocument(doc);
-        let props = imageCache.findEntryProperties(aEvent.target.currentRequestFinalURI, doc);
+        // The image cache's notion of where this image is located is
+        // the currentURI of the image loading content.
+        let props = imageCache.findEntryProperties(aEvent.target.currentURI, doc);
 
         try {
           contentType = props.get("type", Ci.nsISupportsCString).data;
         } catch (e) {}
 
         try {
           contentDisposition = props.get("content-disposition", Ci.nsISupportsCString).data;
         } catch (e) {}
@@ -825,16 +827,19 @@ class ContextMenu {
       }
 
       if (request &&
           (request.imageStatus & request.STATUS_LOAD_COMPLETE) &&
           !(request.imageStatus & request.STATUS_ERROR)) {
         context.onCompletedImage = true;
       }
 
+      // The actual URL the image was loaded from (after redirects) is the
+      // currentRequestFinalURI.  We should use that as the URL for purposes of
+      // deciding on the filename.
       context.mediaURL = context.target.currentRequestFinalURI.spec;
 
       const descURL = context.target.getAttribute("longdesc");
 
       if (descURL) {
         context.imageDescURL = this._makeURLAbsolute(context.target.ownerDocument.body.baseURI,
                                                     descURL);
       }
--- a/build/win32/mozconfig.vs2017
+++ b/build/win32/mozconfig.vs2017
@@ -1,11 +1,11 @@
 if [ -z "${VSPATH}" ]; then
     TOOLTOOL_DIR=${TOOLTOOL_DIR:-$topsrcdir}
-    VSPATH="$(cd ${TOOLTOOL_DIR} && pwd)/vs2017_15.6.0"
+    VSPATH="$(cd ${TOOLTOOL_DIR} && pwd)/vs2017_15.6.6"
 fi
 
 if [ -d "${VSPATH}" ]; then
     VSWINPATH="$(cd ${VSPATH} && pwd -W)"
 
     export WINDOWSSDKDIR="${VSWINPATH}/SDK"
     export WIN32_REDIST_DIR="${VSPATH}/VC/redist/x86/Microsoft.VC141.CRT"
     export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/x86"
--- a/build/win64/mozconfig.vs2017
+++ b/build/win64/mozconfig.vs2017
@@ -1,11 +1,11 @@
 if [ -z "${VSPATH}" ]; then
     TOOLTOOL_DIR=${TOOLTOOL_DIR:-$topsrcdir}
-    VSPATH="$(cd ${TOOLTOOL_DIR} && pwd)/vs2017_15.6.0"
+    VSPATH="$(cd ${TOOLTOOL_DIR} && pwd)/vs2017_15.6.6"
 fi
 
 if [ -d "${VSPATH}" ]; then
     VSWINPATH="$(cd ${VSPATH} && pwd -W)"
 
     export WINDOWSSDKDIR="${VSWINPATH}/SDK"
     export WIN32_REDIST_DIR=${VSPATH}/VC/redist/x64/Microsoft.VC141.CRT
     export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/x64"
--- a/db/sqlite3/src/sqlite3.c
+++ b/db/sqlite3/src/sqlite3.c
@@ -1,11 +1,11 @@
 /******************************************************************************
 ** This file is an amalgamation of many separate C source files from SQLite
-** version 3.23.0.  By combining all the individual C code files into this
+** version 3.23.1.  By combining all the individual C code files into this
 ** single large file, the entire code can be compiled as a single translation
 ** unit.  This allows many compilers to do optimizations that would not be
 ** possible if the files were compiled separately.  Performance improvements
 ** of 5% or more are commonly seen when SQLite is compiled as a single
 ** translation unit.
 **
 ** This file is all you need to compile SQLite.  To use SQLite in other
 ** programs, you need this file and the "sqlite3.h" header file that defines
@@ -1142,19 +1142,19 @@ extern "C" {
 ** or SHA3-256 hash of the entire source tree.  If the source code has
 ** been edited in any way since it was last checked in, then the last
 ** four hexadecimal digits of the hash may be modified.
 **
 ** See also: [sqlite3_libversion()],
 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 ** [sqlite_version()] and [sqlite_source_id()].
 */
-#define SQLITE_VERSION        "3.23.0"
-#define SQLITE_VERSION_NUMBER 3023000
-#define SQLITE_SOURCE_ID      "2018-04-02 11:04:16 736b53f57f70b23172c30880186dce7ad9baa3b74e3838cae5847cffb98f5cd2"
+#define SQLITE_VERSION        "3.23.1"
+#define SQLITE_VERSION_NUMBER 3023001
+#define SQLITE_SOURCE_ID      "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
 ** KEYWORDS: sqlite3_version sqlite3_sourceid
 **
 ** These interfaces provide the same information as the [SQLITE_VERSION],
 ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
 ** but are associated with the library instead of the header file.  ^(Cautious
@@ -11125,16 +11125,23 @@ SQLITE_API void sqlite3changegroup_delet
 ** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
 ** may set (*ppRebase) to point to a "rebase" that may be used with the 
 ** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase)
 ** is set to the size of the buffer in bytes. It is the responsibility of the
 ** caller to eventually free any such buffer using sqlite3_free(). The buffer
 ** is only allocated and populated if one or more conflicts were encountered
 ** while applying the patchset. See comments surrounding the sqlite3_rebaser
 ** APIs for further details.
+**
+** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter.
+**
+** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b>
+** and therefore subject to change.
 */
 SQLITE_API int sqlite3changeset_apply(
   sqlite3 *db,                    /* Apply change to "main" db of this handle */
   int nChangeset,                 /* Size of changeset in bytes */
   void *pChangeset,               /* Changeset blob */
   int(*xFilter)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     const char *zTab              /* Table name */
@@ -11155,19 +11162,38 @@ SQLITE_API int sqlite3changeset_apply_v2
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase
+  void **ppRebase, int *pnRebase, /* OUT: Rebase data */
+  int flags                       /* Combination of SESSION_APPLY_* flags */
 );
 
+/*
+** CAPI3REF: Flags for sqlite3changeset_apply_v2
+**
+** The following flags may passed via the 9th parameter to
+** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]:
+**
+** <dl>
+** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd>
+**   Usually, the sessions module encloses all operations performed by
+**   a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The
+**   SAVEPOINT is committed if the changeset or patchset is successfully
+**   applied, or rolled back if an error occurs. Specifying this flag
+**   causes the sessions module to omit this savepoint. In this case, if the
+**   caller has an open transaction or savepoint when apply_v2() is called, 
+**   it may revert the partially applied changeset by rolling it back.
+*/
+#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT   0x0001
+
 /* 
 ** CAPI3REF: Constants Passed To The Conflict Handler
 **
 ** Values that may be passed as the second argument to a conflict-handler.
 **
 ** <dl>
 ** <dt>SQLITE_CHANGESET_DATA<dd>
 **   The conflict handler is invoked with CHANGESET_DATA as the second argument
@@ -11418,16 +11444,17 @@ SQLITE_API void sqlite3rebaser_delete(sq
 ** CAPI3REF: Streaming Versions of API functions.
 **
 ** The six streaming API xxx_strm() functions serve similar purposes to the 
 ** corresponding non-streaming API functions:
 **
 ** <table border=1 style="margin-left:8ex;margin-right:8ex">
 **   <tr><th>Streaming function<th>Non-streaming equivalent</th>
 **   <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply] 
+**   <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2] 
 **   <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat] 
 **   <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert] 
 **   <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start] 
 **   <tr><td>sqlite3session_changeset_strm<td>[sqlite3session_changeset] 
 **   <tr><td>sqlite3session_patchset_strm<td>[sqlite3session_patchset] 
 ** </table>
 **
 ** Non-streaming functions that accept changesets (or patchsets) as input
@@ -11527,17 +11554,18 @@ SQLITE_API int sqlite3changeset_apply_v2
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase
+  void **ppRebase, int *pnRebase,
+  int flags
 );
 SQLITE_API int sqlite3changeset_concat_strm(
   int (*xInputA)(void *pIn, void *pData, int *pnData),
   void *pInA,
   int (*xInputB)(void *pIn, void *pData, int *pnData),
   void *pInB,
   int (*xOutput)(void *pOut, const void *pData, int nData),
   void *pOut
@@ -21282,16 +21310,17 @@ SQLITE_PRIVATE int sqlite3OsCheckReserve
 ** Use sqlite3OsFileControl() when we are doing something that might fail
 ** and we need to know about the failures.  Use sqlite3OsFileControlHint()
 ** when simply tossing information over the wall to the VFS and we do not
 ** really care if the VFS receives and understands the information since it
 ** is only a hint and can be safely ignored.  The sqlite3OsFileControlHint()
 ** routine has no return value since the return value would be meaningless.
 */
 SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
+  if( id->pMethods==0 ) return SQLITE_NOTFOUND;
 #ifdef SQLITE_TEST
   if( op!=SQLITE_FCNTL_COMMIT_PHASETWO
    && op!=SQLITE_FCNTL_LOCK_TIMEOUT
   ){
     /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite
     ** is using a regular VFS, it is called after the corresponding
     ** transaction has been committed. Injecting a fault at this point
     ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM
@@ -21299,17 +21328,16 @@ SQLITE_PRIVATE int sqlite3OsFileControl(
     **
     ** The core must call OsFileControl() though, not OsFileControlHint(),
     ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably
     ** means the commit really has failed and an error should be returned
     ** to the user.  */
     DO_OS_MALLOC_TEST(id);
   }
 #endif
-  if( id->pMethods==0 ) return SQLITE_NOTFOUND;
   return id->pMethods->xFileControl(id, op, pArg);
 }
 SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){
   if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg);
 }
 
 SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){
   int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize;
@@ -98995,35 +99023,60 @@ static int impliesNotNullRow(Walker *pWa
   ** but that is an illegal construct and the query will be rejected at
   ** a later stage of processing, so the TK_AGG_FUNCTION case does not
   ** need to be considered here. */
   assert( pExpr->op!=TK_AGG_COLUMN );
   testcase( pExpr->op==TK_AGG_FUNCTION );
 
   if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune;
   switch( pExpr->op ){
+    case TK_ISNOT:
+    case TK_NOT:
     case TK_ISNULL:
     case TK_IS:
     case TK_OR:
     case TK_CASE:
     case TK_IN:
     case TK_FUNCTION:
+      testcase( pExpr->op==TK_ISNOT );
+      testcase( pExpr->op==TK_NOT );
       testcase( pExpr->op==TK_ISNULL );
       testcase( pExpr->op==TK_IS );
       testcase( pExpr->op==TK_OR );
       testcase( pExpr->op==TK_CASE );
       testcase( pExpr->op==TK_IN );
       testcase( pExpr->op==TK_FUNCTION );
       return WRC_Prune;
     case TK_COLUMN:
       if( pWalker->u.iCur==pExpr->iTable ){
         pWalker->eCode = 1;
         return WRC_Abort;
       }
       return WRC_Prune;
+
+    /* Virtual tables are allowed to use constraints like x=NULL.  So
+    ** a term of the form x=y does not prove that y is not null if x
+    ** is the column of a virtual table */
+    case TK_EQ:
+    case TK_NE:
+    case TK_LT:
+    case TK_LE:
+    case TK_GT:
+    case TK_GE:
+      testcase( pExpr->op==TK_EQ );
+      testcase( pExpr->op==TK_NE );
+      testcase( pExpr->op==TK_LT );
+      testcase( pExpr->op==TK_LE );
+      testcase( pExpr->op==TK_GT );
+      testcase( pExpr->op==TK_GE );
+      if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->pTab))
+       || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->pTab))
+      ){
+       return WRC_Prune;
+      }
     default:
       return WRC_Continue;
   }
 }
 
 /*
 ** Return true (non-zero) if expression p can only be true if at least
 ** one column of table iTab is non-null.  In other words, return true
@@ -104601,17 +104654,17 @@ SQLITE_PRIVATE CollSeq *sqlite3LocateCol
 ** IMPLEMENTATION-OF: R-34230-56049 SQLite automatically increments
 ** the schema-version whenever the schema changes.
 */
 SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){
   sqlite3 *db = pParse->db;
   Vdbe *v = pParse->pVdbe;
   assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
   sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, 
-                    db->aDb[iDb].pSchema->schema_cookie+1);
+                   (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie));
 }
 
 /*
 ** Measure the number of characters needed to output the given
 ** identifier.  The number returned includes any quotes used
 ** but does not include the null terminator.
 **
 ** The estimate is conservative.  It might be larger that what is
@@ -124590,19 +124643,17 @@ static int selectExpander(Walker *pWalke
     return WRC_Abort;
   }
   assert( p->pSrc!=0 );
   if( (selFlags & SF_Expanded)!=0 ){
     return WRC_Prune;
   }
   pTabList = p->pSrc;
   pEList = p->pEList;
-  if( OK_IF_ALWAYS_TRUE(p->pWith) ){
-    sqlite3WithPush(pParse, p->pWith, 0);
-  }
+  sqlite3WithPush(pParse, p->pWith, 0);
 
   /* Make sure cursor numbers have been assigned to all entries in
   ** the FROM clause of the SELECT statement.
   */
   sqlite3SrcListAssignCursors(pParse, pTabList);
 
   /* Look up every table named in the FROM clause of the select.  If
   ** an entry of the FROM clause is a subquery instead of a table or view,
@@ -128055,17 +128106,17 @@ SQLITE_PRIVATE void sqlite3Update(
   }else{
     assert( pPk!=0 );
     nPk = pPk->nKeyCol;
     iPk = pParse->nMem+1;
     pParse->nMem += nPk;
     regKey = ++pParse->nMem;
     iEph = pParse->nTab++;
 
-    sqlite3VdbeAddOp2(v, OP_Null, 0, iPk);
+    sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1);
     addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
     sqlite3VdbeSetP4KeyInfo(pParse, pPk);
   }
 
   /* Begin the database scan. 
   **
   ** Do not consider a single-pass strategy for a multi-row update if
   ** there are any triggers or foreign keys to process, or rows may
@@ -130227,17 +130278,17 @@ SQLITE_API int sqlite3_vtab_config(sqlit
 ** planner logic in "where.c".  These definitions are broken out into
 ** a separate source file for easier editing.
 */
 
 /*
 ** Trace output macros
 */
 #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
-/***/ int sqlite3WhereTrace;
+/***/ extern int sqlite3WhereTrace;
 #endif
 #if defined(SQLITE_DEBUG) \
     && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE))
 # define WHERETRACE(K,X)  if(sqlite3WhereTrace&(K)) sqlite3DebugPrintf X
 # define WHERETRACE_ENABLED 1
 #else
 # define WHERETRACE(K,X)
 #endif
@@ -136880,18 +136931,18 @@ static int whereLoopAddBtreeIndex(
   LogEst saved_nOut;              /* Original value of pNew->nOut */
   int rc = SQLITE_OK;             /* Return code */
   LogEst rSize;                   /* Number of rows in the table */
   LogEst rLogSize;                /* Logarithm of table size */
   WhereTerm *pTop = 0, *pBtm = 0; /* Top and bottom range constraints */
 
   pNew = pBuilder->pNew;
   if( db->mallocFailed ) return SQLITE_NOMEM_BKPT;
-  WHERETRACE(0x800, ("BEGIN addBtreeIdx(%s), nEq=%d\n",
-                     pProbe->zName, pNew->u.btree.nEq));
+  WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d\n",
+                     pProbe->pTable->zName,pProbe->zName, pNew->u.btree.nEq));
 
   assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 );
   assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 );
   if( pNew->wsFlags & WHERE_BTM_LIMIT ){
     opMask = WO_LT|WO_LE;
   }else{
     assert( pNew->u.btree.nBtm==0 );
     opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE|WO_ISNULL|WO_IS;
@@ -137167,18 +137218,18 @@ static int whereLoopAddBtreeIndex(
     nIter += 5;
     whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nIter + nInMul);
     pNew->nOut = saved_nOut;
     pNew->u.btree.nEq = saved_nEq;
     pNew->nSkip = saved_nSkip;
     pNew->wsFlags = saved_wsFlags;
   }
 
-  WHERETRACE(0x800, ("END addBtreeIdx(%s), nEq=%d, rc=%d\n",
-                      pProbe->zName, saved_nEq, rc));
+  WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n",
+                      pProbe->pTable->zName, pProbe->zName, saved_nEq, rc));
   return rc;
 }
 
 /*
 ** Return True if it is possible that pIndex might be useful in
 ** implementing the ORDER BY clause in pBuilder.
 **
 ** Return False if pBuilder does not contain an ORDER BY clause or
@@ -137606,19 +137657,19 @@ static int whereLoopAddVirtualOne(
       WhereTerm *pTerm;
       int j = pIdxCons->iTermOffset;
       if( iTerm>=nConstraint
        || j<0
        || j>=pWC->nTerm
        || pNew->aLTerm[iTerm]!=0
        || pIdxCons->usable==0
       ){
-        rc = SQLITE_ERROR;
         sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName);
-        return rc;
+        testcase( pIdxInfo->needToFreeIdxStr );
+        return SQLITE_ERROR;
       }
       testcase( iTerm==nConstraint-1 );
       testcase( j==0 );
       testcase( j==pWC->nTerm-1 );
       pTerm = &pWC->a[j];
       pNew->prereq |= pTerm->prereqRight;
       assert( iTerm<pNew->nLSlot );
       pNew->aLTerm[iTerm] = pTerm;
@@ -137636,16 +137687,25 @@ static int whereLoopAddVirtualOne(
         pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE;
         *pbIn = 1; assert( (mExclude & WO_IN)==0 );
       }
     }
   }
   pNew->u.vtab.omitMask &= ~mNoOmit;
 
   pNew->nLTerm = mxTerm+1;
+  for(i=0; i<=mxTerm; i++){
+    if( pNew->aLTerm[i]==0 ){
+      /* The non-zero argvIdx values must be contiguous.  Raise an
+      ** error if they are not */
+      sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName);
+      testcase( pIdxInfo->needToFreeIdxStr );
+      return SQLITE_ERROR;
+    }
+  }
   assert( pNew->nLTerm<=pNew->nLSlot );
   pNew->u.vtab.idxNum = pIdxInfo->idxNum;
   pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr;
   pIdxInfo->needToFreeIdxStr = 0;
   pNew->u.vtab.idxStr = pIdxInfo->idxStr;
   pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ?
       pIdxInfo->nOrderBy : 0);
   pNew->rSetup = 0;
@@ -137751,16 +137811,17 @@ static int whereLoopAddVirtual(
   pNew->u.vtab.needFree = 0;
   nConstraint = p->nConstraint;
   if( whereLoopResize(pParse->db, pNew, nConstraint) ){
     sqlite3DbFree(pParse->db, p);
     return SQLITE_NOMEM_BKPT;
   }
 
   /* First call xBestIndex() with all constraints usable. */
+  WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName));
   WHERETRACE(0x40, ("  VirtualOne: all usable\n"));
   rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn);
 
   /* If the call to xBestIndex() with all terms enabled produced a plan
   ** that does not require any source tables (IOW: a plan with mBest==0),
   ** then there is no point in making any further calls to xBestIndex() 
   ** since they will all return the same result (if the xBestIndex()
   ** implementation is sane). */
@@ -137826,16 +137887,17 @@ static int whereLoopAddVirtual(
       WHERETRACE(0x40, ("  VirtualOne: all disabled and w/o IN\n"));
       rc = whereLoopAddVirtualOne(
           pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn);
     }
   }
 
   if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr);
   sqlite3DbFreeNN(pParse->db, p);
+  WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc));
   return rc;
 }
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
 
 /*
 ** Add WhereLoop entries to handle OR terms.  This works for either
 ** btrees or virtual tables.
 */
@@ -139966,27 +140028,27 @@ typedef union {
 #ifndef YYSTACKDEPTH
 #define YYSTACKDEPTH 100
 #endif
 #define sqlite3ParserARG_SDECL Parse *pParse;
 #define sqlite3ParserARG_PDECL ,Parse *pParse
 #define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse
 #define sqlite3ParserARG_STORE yypParser->pParse = pParse
 #define YYFALLBACK 1
-#define YYNSTATE             466
-#define YYNRULE              330
+#define YYNSTATE             472
+#define YYNRULE              333
 #define YYNTOKEN             143
-#define YY_MAX_SHIFT         465
-#define YY_MIN_SHIFTREDUCE   675
-#define YY_MAX_SHIFTREDUCE   1004
-#define YY_ERROR_ACTION      1005
-#define YY_ACCEPT_ACTION     1006
-#define YY_NO_ACTION         1007
-#define YY_MIN_REDUCE        1008
-#define YY_MAX_REDUCE        1337
+#define YY_MAX_SHIFT         471
+#define YY_MIN_SHIFTREDUCE   681
+#define YY_MAX_SHIFTREDUCE   1013
+#define YY_ERROR_ACTION      1014
+#define YY_ACCEPT_ACTION     1015
+#define YY_NO_ACTION         1016
+#define YY_MIN_REDUCE        1017
+#define YY_MAX_REDUCE        1349
 /************* End control #defines *******************************************/
 
 /* Define the yytestcase() macro to be a no-op if is not already defined
 ** otherwise.
 **
 ** Applications can choose to define yytestcase() in the %include section
 ** to a macro that can assist in verifying code coverage.  For production
 ** code the yytestcase() macro should be turned off.  But it is useful
@@ -140042,484 +140104,491 @@ typedef union {
 **                     yy_action.  Used to detect hash collisions.
 **  yy_shift_ofst[]    For each state, the offset into yy_action for
 **                     shifting terminals.
 **  yy_reduce_ofst[]   For each state, the offset into yy_action for
 **                     shifting non-terminals after a reduce.
 **  yy_default[]       Default action for each state.
 **
 *********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (1541)
+#define YY_ACTTAB_COUNT (1566)
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */  1006,  156,  156,    2, 1302,   90,   87,  179,   90,   87,
- /*    10 */   179,  460, 1048,  460,  465, 1010,  460,  333, 1130,  335,
- /*    20 */   246,  330,  112,  303,  439, 1258,  304,  419, 1129, 1087,
- /*    30 */    72,  798,   50,   50,   50,   50,  331,   30,   30,  799,
- /*    40 */   951,  364,  371,   97,   98,   88,  983,  983,  859,  862,
- /*    50 */   851,  851,   95,   95,   96,   96,   96,   96,  120,  371,
- /*    60 */   370,  120,  348,   22,   90,   87,  179,  438,  423,  438,
- /*    70 */   440,  335,  420,  385,   90,   87,  179,  116,   73,  163,
- /*    80 */   848,  848,  860,  863,   94,   94,   94,   94,   93,   93,
- /*    90 */    92,   92,   92,   91,  361,   97,   98,   88,  983,  983,
- /*   100 */   859,  862,  851,  851,   95,   95,   96,   96,   96,   96,
- /*   110 */   718,  365,  339,   93,   93,   92,   92,   92,   91,  361,
- /*   120 */    99,  371,  453,  335,   94,   94,   94,   94,   93,   93,
- /*   130 */    92,   92,   92,   91,  361,  852,   94,   94,   94,   94,
- /*   140 */    93,   93,   92,   92,   92,   91,  361,   97,   98,   88,
- /*   150 */   983,  983,  859,  862,  851,  851,   95,   95,   96,   96,
- /*   160 */    96,   96,   92,   92,   92,   91,  361,  838,  132,  195,
- /*   170 */    58,  244,  412,  409,  408,  335,  457,  457,  457,  304,
- /*   180 */    59,  332,  831,  407,  394,  962,  830,  391,   94,   94,
- /*   190 */    94,   94,   93,   93,   92,   92,   92,   91,  361,   97,
- /*   200 */    98,   88,  983,  983,  859,  862,  851,  851,   95,   95,
- /*   210 */    96,   96,   96,   96,  426,  357,  460,  830,  830,  832,
- /*   220 */    91,  361,  962,  963,  964,  195,  459,  335,  412,  409,
- /*   230 */   408,  280,  361,  820,  132,   11,   11,   50,   50,  407,
- /*   240 */    94,   94,   94,   94,   93,   93,   92,   92,   92,   91,
- /*   250 */   361,   97,   98,   88,  983,  983,  859,  862,  851,  851,
- /*   260 */    95,   95,   96,   96,   96,   96,  460,  221,  460,  264,
- /*   270 */   375,  254,  438,  428, 1276, 1276,  383, 1074, 1053,  335,
- /*   280 */   245,  422,  299,  713,  271,  271, 1074,   50,   50,   50,
- /*   290 */    50,  962,   94,   94,   94,   94,   93,   93,   92,   92,
- /*   300 */    92,   91,  361,   97,   98,   88,  983,  983,  859,  862,
- /*   310 */   851,  851,   95,   95,   96,   96,   96,   96,   90,   87,
- /*   320 */   179, 1306,  438,  437,  438,  418,  368,  253,  962,  963,
- /*   330 */   964,  335,  360,  360,  360,  706,  359,  358,  324,  962,
- /*   340 */  1281,  951,  364,  230,   94,   94,   94,   94,   93,   93,
- /*   350 */    92,   92,   92,   91,  361,   97,   98,   88,  983,  983,
- /*   360 */   859,  862,  851,  851,   95,   95,   96,   96,   96,   96,
- /*   370 */   769,  460,  120,  226,  226,  366,  962,  963,  964, 1089,
- /*   380 */   990,  900,  990,  335, 1057,  425,  421,  839,  759,  759,
- /*   390 */   425,  427,   50,   50,  432,  381,   94,   94,   94,   94,
- /*   400 */    93,   93,   92,   92,   92,   91,  361,   97,   98,   88,
- /*   410 */   983,  983,  859,  862,  851,  851,   95,   95,   96,   96,
- /*   420 */    96,   96,  460,  259,  460,  120,  117,  354,  942, 1332,
- /*   430 */   942, 1333, 1332,  278, 1333,  335,  680,  681,  682,  825,
- /*   440 */   201,  176,  303,   50,   50,   49,   49,  404,   94,   94,
- /*   450 */    94,   94,   93,   93,   92,   92,   92,   91,  361,   97,
- /*   460 */    98,   88,  983,  983,  859,  862,  851,  851,   95,   95,
- /*   470 */    96,   96,   96,   96,  199,  460,  380,  265,  433,  380,
- /*   480 */   265,  383,  256,  158,  258,  319, 1003,  335,  155,  940,
- /*   490 */   177,  940,  273,  379,  276,  322,   34,   34,  302,  962,
- /*   500 */    94,   94,   94,   94,   93,   93,   92,   92,   92,   91,
- /*   510 */   361,   97,   98,   88,  983,  983,  859,  862,  851,  851,
- /*   520 */    95,   95,   96,   96,   96,   96,  905,  905,  397,  460,
- /*   530 */   301,  158,  101,  319,  941,  340,  962,  963,  964,  313,
- /*   540 */   283,  449,  335,  327,  146, 1266, 1004,  257,  234,  248,
- /*   550 */    35,   35,   94,   94,   94,   94,   93,   93,   92,   92,
- /*   560 */    92,   91,  361,  709,  785, 1227,   97,   98,   88,  983,
- /*   570 */   983,  859,  862,  851,  851,   95,   95,   96,   96,   96,
- /*   580 */    96,  962, 1227, 1229,  245,  422,  838,  198,  197,  196,
- /*   590 */  1079, 1079, 1077, 1077, 1004, 1334,  320,  335,  172,  171,
- /*   600 */   709,  831,  159,  271,  271,  830,   76,   94,   94,   94,
- /*   610 */    94,   93,   93,   92,   92,   92,   91,  361,  962,  963,
- /*   620 */   964,   97,   98,   88,  983,  983,  859,  862,  851,  851,
- /*   630 */    95,   95,   96,   96,   96,   96,  830,  830,  832, 1157,
- /*   640 */  1157,  199, 1157,  173, 1227,  231,  232, 1282,    2,  335,
- /*   650 */   271,  764,  271,  820,  271,  271,  763,  389,  389,  389,
- /*   660 */   132,   79,   94,   94,   94,   94,   93,   93,   92,   92,
- /*   670 */    92,   91,  361,   97,   98,   88,  983,  983,  859,  862,
- /*   680 */   851,  851,   95,   95,   96,   96,   96,   96,  460,  264,
- /*   690 */   223,  460, 1257,  783, 1223, 1157, 1086, 1082,   80,  271,
- /*   700 */    78,  335,  340, 1031,  341,  344,  345,  902,  346,   10,
- /*   710 */    10,  902,   25,   25,   94,   94,   94,   94,   93,   93,
- /*   720 */    92,   92,   92,   91,  361,   97,   86,   88,  983,  983,
- /*   730 */   859,  862,  851,  851,   95,   95,   96,   96,   96,   96,
- /*   740 */  1157,  270,  395,  117,  233,  263,  235,   70,  456,  341,
- /*   750 */   225,  176,  335, 1305,  342,  133,  736,  966,  980,  249,
- /*   760 */  1150,  396,  325, 1085, 1028,  178,   94,   94,   94,   94,
- /*   770 */    93,   93,   92,   92,   92,   91,  361,   98,   88,  983,
- /*   780 */   983,  859,  862,  851,  851,   95,   95,   96,   96,   96,
- /*   790 */    96,  783,  783,  132,  120,  966,  120,  120,  120,  798,
- /*   800 */   252,  937,  335,  353,  321,  429,  355,  799,  822,  692,
- /*   810 */   390,  203,  446,  450,  372,  716,  454,   94,   94,   94,
- /*   820 */    94,   93,   93,   92,   92,   92,   91,  361,   88,  983,
- /*   830 */   983,  859,  862,  851,  851,   95,   95,   96,   96,   96,
- /*   840 */    96,   84,  455, 1225,    3, 1209,  120,  120,  382,  387,
- /*   850 */   120,  203, 1271,  716,  384,  168,  266,  203,  458,   72,
- /*   860 */   260, 1246,   84,  455,  178,    3,  378,   94,   94,   94,
- /*   870 */    94,   93,   93,   92,   92,   92,   91,  361,  350,  458,
- /*   880 */  1245,  362,  430,  213,  228,  290,  415,  285,  414,  200,
- /*   890 */   783,  882,  444,  726,  725,  405,  283,  921,  209,  921,
- /*   900 */   281,  132,  362,   72,  838,  289,  147,  733,  734,  392,
- /*   910 */    81,   82,  922,  444,  922,  267,  288,   83,  362,  462,
- /*   920 */   461,  272,  132,  830,   23,  838,  388,  923, 1216,  923,
- /*   930 */  1056,   81,   82,   84,  455,  899,    3,  899,   83,  362,
- /*   940 */   462,  461,  761,  962,  830,   75,    1,  443,  275,  747,
- /*   950 */   458,    5,  962,  204,  830,  830,  832,  833,   18,  748,
- /*   960 */   229,  962,  277,   19,  153,  317,  317,  316,  216,  314,
- /*   970 */   279,  460,  689,  362, 1055,  830,  830,  832,  833,   18,
- /*   980 */   962,  963,  964,  962,  444,  181,  460,  251,  981,  962,
- /*   990 */   963,  964,    8,    8,   20,  250,  838, 1070,  962,  963,
- /*  1000 */   964,  417,   81,   82,  768,  204,  347,   36,   36,   83,
- /*  1010 */   362,  462,  461, 1054,  284,  830,   84,  455, 1123,    3,
- /*  1020 */   962,  963,  964,  460,  183,  962,  981,  764,  889, 1107,
- /*  1030 */   460,  184,  763,  458,  132,  182,   74,  455,  460,    3,
- /*  1040 */   981,  898,  834,  898,    8,    8,  830,  830,  832,  833,
- /*  1050 */    18,    8,    8,  458,  219, 1156,  362, 1103,  349,    8,
- /*  1060 */     8,  240,  962,  963,  964,  236,  889,  444,  792,  336,
- /*  1070 */   158,  203,  885,  435,  700,  209,  362,  114,  981,  838,
- /*  1080 */   834,  227,  334, 1114,  441,   81,   82,  444,  442,  305,
- /*  1090 */   784,  306,   83,  362,  462,  461,  369, 1162,  830,  838,
- /*  1100 */   460, 1037,  237, 1030,  237,   81,   82,    7,   96,   96,
- /*  1110 */    96,   96,   83,  362,  462,  461, 1019, 1018,  830, 1020,
- /*  1120 */  1289,   37,   37,  400,   96,   96,   96,   96,   89,  830,
- /*  1130 */   830,  832,  833,   18, 1100,  318,  962,  292,   94,   94,
- /*  1140 */    94,   94,   93,   93,   92,   92,   92,   91,  361,  830,
- /*  1150 */   830,  832,  833,   18,   94,   94,   94,   94,   93,   93,
- /*  1160 */    92,   92,   92,   91,  361,  359,  358,  226,  226,  727,
- /*  1170 */   294,  296,  460,  962,  963,  964,  460,  989,  160,  425,
- /*  1180 */   170, 1295,  262,  460,  987,  374,  988,  386, 1145,  255,
- /*  1190 */   326,  460,  373,   38,   38,  410,  174,   39,   39,  413,
- /*  1200 */   460,  287,  460, 1053,   40,   40,  298,  728, 1220,  990,
- /*  1210 */   445,  990,   26,   26, 1219,  460,  311,  460,  169, 1292,
- /*  1220 */   460,   27,   27,   29,   29,  998,  460,  206,  135,  995,
- /*  1230 */  1265, 1263,  460,   57,   60,  460,   41,   41,   42,   42,
- /*  1240 */   460,   43,   43,  460,  343,  351,  460,    9,    9,  460,
- /*  1250 */   144,  460,  130,   44,   44,  460,  103,  103,  460,  137,
- /*  1260 */    70,   45,   45,  460,   46,   46,  460,   31,   31, 1142,
- /*  1270 */    47,   47,   48,   48,  460,  376,   32,   32,  460,  122,
- /*  1280 */   122,  460,  157,  460,  123,  123,  139,  124,  124,  460,
- /*  1290 */   186,  460,  377,  460,  115,   54,   54,  460,  403,   33,
- /*  1300 */    33,  460,  104,  104,   51,   51,  460,  161,  460,  140,
- /*  1310 */   105,  105,  106,  106,  102,  102,  460,  141,  121,  121,
- /*  1320 */   460,  142,  119,  119,  190,  460, 1152,  110,  110,  109,
- /*  1330 */   109,  702,  460,  148,  393,   65,  460,  107,  107,  460,
- /*  1340 */   323,  108,  108,  399,  460, 1234,   53,   53, 1214,  269,
- /*  1350 */   154,  416, 1115,   55,   55,  220,  401,   52,   52,  191,
- /*  1360 */    24,   24,  274,  192,  193,   28,   28, 1021,  328,  702,
- /*  1370 */  1073,  352, 1072,  718, 1071,  431, 1111, 1064,  329, 1045,
- /*  1380 */    69,  205,    6,  291, 1044,  286, 1112, 1043, 1304, 1110,
- /*  1390 */   293,  300,  295,  297, 1063, 1200, 1109,   77,  241,  448,
- /*  1400 */   356,  452,  436,  100,  214,   71,  434, 1027, 1093,   21,
- /*  1410 */   463,  242,  243,  957,  215,  217,  218,  464,  309,  307,
- /*  1420 */   308,  310, 1016,  125, 1250, 1251, 1011, 1249,  126,  127,
- /*  1430 */  1248,  113,  676,  337,  238,  338,  134,  363,  167, 1041,
- /*  1440 */  1040,   56,  247,  367,  180,  897,  111,  895,  136, 1038,
- /*  1450 */   818,  128,  138,  750,  261,  911,  185,  143,  145,   61,
- /*  1460 */    62,   63,   64,  129,  914,  187,  188,  910,  118,   12,
- /*  1470 */   189,  903,  268,  992,  203,  162,  398,  150,  149,  691,
- /*  1480 */   402,  288,  194,  406,  151,  411,   66,   13,  729,  239,
- /*  1490 */   282,   14,   67,  131,  837,  836,  865,  758,   15,    4,
- /*  1500 */    68,  762,  175,  222,  224,  424,  152,  869,  791,  202,
- /*  1510 */   786,   75,   72,  880,  866,  864,   16,   17,  920,  207,
- /*  1520 */   919,  208,  447,  946,  164,  211,  947,  210,  165,  451,
- /*  1530 */   868,  166,  315,  835,  701,   85,  212, 1297,  312,  952,
- /*  1540 */  1296,
+ /*     0 */  1169, 1015,  167,  167,    1,  168,  466, 1313,  466, 1083,
+ /*    10 */  1062,  466,   97,   94,  183, 1057,  466,  329, 1083,  342,
+ /*    20 */    97,   94,  183,  459,  459,  459,  436,   57,   57,   57,
+ /*    30 */    57,  807,   57,   57,  367,  367,  367,   57,   57,  808,
+ /*    40 */  1270, 1088, 1088,  104,  105,   95,  991,  991,  868,  871,
+ /*    50 */   860,  860,  102,  102,  103,  103,  103,  103,  233,  233,
+ /*    60 */   326, 1011,  449,  437,  449,  446,  351,  449,  461, 1142,
+ /*    70 */   463,  342,  449,  426, 1316,  209,  180,  742,   80,  299,
+ /*    80 */   857,  857,  869,  872,  101,  101,  101,  101,  100,  100,
+ /*    90 */    99,   99,   99,   98,  368,  104,  105,   95,  991,  991,
+ /*   100 */   868,  871,  860,  860,  102,  102,  103,  103,  103,  103,
+ /*   110 */    99,   99,   99,   98,  368,  355,   97,   94,  183,  228,
+ /*   120 */   106, 1012,  407,  342,  101,  101,  101,  101,  100,  100,
+ /*   130 */    99,   99,   99,   98,  368,  861,  101,  101,  101,  101,
+ /*   140 */   100,  100,   99,   99,   99,   98,  368,  104,  105,   95,
+ /*   150 */   991,  991,  868,  871,  860,  860,  102,  102,  103,  103,
+ /*   160 */   103,  103,  201,  368,  375,  420,  417,  416,  387,  273,
+ /*   170 */    65,   97,   94,  183,  168,  342,  415,  951, 1343,  396,
+ /*   180 */    66, 1343,  320,  959,  371,  970,  334,  340,  101,  101,
+ /*   190 */   101,  101,  100,  100,   99,   99,   99,   98,  368,  104,
+ /*   200 */   105,   95,  991,  991,  868,  871,  860,  860,  102,  102,
+ /*   210 */   103,  103,  103,  103,  373,  100,  100,   99,   99,   99,
+ /*   220 */    98,  368,  970,  971,  972,  201, 1100,  342,  420,  417,
+ /*   230 */   416,  287,  366,  365,  337,  970, 1162,  463,  949,  415,
+ /*   240 */   101,  101,  101,  101,  100,  100,   99,   99,   99,   98,
+ /*   250 */   368,  104,  105,   95,  991,  991,  868,  871,  860,  860,
+ /*   260 */   102,  102,  103,  103,  103,  103,  777,  241,  233,  233,
+ /*   270 */     9,  847,  970,  971,  972,  390,  998, 1141,  998,  342,
+ /*   280 */   463,  252,  829,  719,   98,  368,  840,  298,  338,  142,
+ /*   290 */   839,  339,  101,  101,  101,  101,  100,  100,   99,   99,
+ /*   300 */    99,   98,  368,  104,  105,   95,  991,  991,  868,  871,
+ /*   310 */   860,  860,  102,  102,  103,  103,  103,  103,  272,  466,
+ /*   320 */   392,  839,  839,  841,   97,   94,  183,  390, 1317,  253,
+ /*   330 */   456,  342,  125,  166,  807,  712,  208,  407,  386,  970,
+ /*   340 */    57,   57,  808,  238,  101,  101,  101,  101,  100,  100,
+ /*   350 */    99,   99,   99,   98,  368,  104,  105,   95,  991,  991,
+ /*   360 */   868,  871,  860,  860,  102,  102,  103,  103,  103,  103,
+ /*   370 */   466,  108,  466,  267,  465,  442,  970,  971,  972,  261,
+ /*   380 */   951, 1344,  909,  342, 1344,  142,  829,  848, 1292,  959,
+ /*   390 */   371,   55,   55,   57,   57,  242,  101,  101,  101,  101,
+ /*   400 */   100,  100,   99,   99,   99,   98,  368,  104,  105,   95,
+ /*   410 */   991,  991,  868,  871,  860,  860,  102,  102,  103,  103,
+ /*   420 */   103,  103,  272,  382,  262,  253,  456,  310,  364,  253,
+ /*   430 */   456,   86,  264,   84,  266,  342,  441,  176,  175,  834,
+ /*   440 */   464,  949,  767,  767,  332,  313, 1094,  396,  101,  101,
+ /*   450 */   101,  101,  100,  100,   99,   99,   99,   98,  368,  104,
+ /*   460 */   105,   95,  991,  991,  868,  871,  860,  860,  102,  102,
+ /*   470 */   103,  103,  103,  103,  227,  227,  233,  233,  233,  233,
+ /*   480 */   387,  273,  234,  234,  326,  950,  463,  342,  463,  298,
+ /*   490 */   463,  914,  914,  404,  463, 1037,  123,  265,   27,  970,
+ /*   500 */   101,  101,  101,  101,  100,  100,   99,   99,   99,   98,
+ /*   510 */   368,  104,  105,   95,  991,  991,  868,  871,  860,  860,
+ /*   520 */   102,  102,  103,  103,  103,  103,  435,  233,  233,  466,
+ /*   530 */   285,  686,  687,  688,  127,  271,  970,  971,  972,  463,
+ /*   540 */  1345,  327,  342,  407,  157, 1012,  988,   13,   13,  181,
+ /*   550 */    41,   41,  101,  101,  101,  101,  100,  100,   99,   99,
+ /*   560 */    99,   98,  368,  715,  794,  378,  104,  105,   95,  991,
+ /*   570 */   991,  868,  871,  860,  860,  102,  102,  103,  103,  103,
+ /*   580 */   103,  970,  378,  377,  346,  239,  847, 1086, 1086,  280,
+ /*   590 */  1169,  283,  204,  203,  202,  177,  298,  342,  407,  298,
+ /*   600 */   715,  840,  169,  299,  407,  839,   82,  101,  101,  101,
+ /*   610 */   101,  100,  100,   99,   99,   99,   98,  368,  970,  971,
+ /*   620 */   972,  104,  105,   95,  991,  991,  868,  871,  860,  860,
+ /*   630 */   102,  102,  103,  103,  103,  103,  839,  839,  841,  362,
+ /*   640 */   240,  124, 1169,  172,  126,  378, 1269, 1169, 1066,  342,
+ /*   650 */   253,  456,  407,  407,  407,  396,  352,  401,  407,  429,
+ /*   660 */   398,   85,  101,  101,  101,  101,  100,  100,   99,   99,
+ /*   670 */    99,   98,  368,  104,  105,   95,  991,  991,  868,  871,
+ /*   680 */   860,  860,  102,  102,  103,  103,  103,  103, 1169,  466,
+ /*   690 */   230,  233,  233,  792, 1235, 1095, 1091, 1293,    1,   77,
+ /*   700 */   278,  342,  205,  463,  974,  911, 1040,  348,  353,  911,
+ /*   710 */    42,   42,   79,  403,  101,  101,  101,  101,  100,  100,
+ /*   720 */    99,   99,   99,   98,  368,  104,   93,   95,  991,  991,
+ /*   730 */   868,  871,  860,  860,  102,  102,  103,  103,  103,  103,
+ /*   740 */   402,    9,  974,  243,  772,  458,  348,  232,  180,  771,
+ /*   750 */   946,  312,  342,  328,  363,  349,  143,  831,  389, 1278,
+ /*   760 */   211,  211,   21,  347,  432,  182,  101,  101,  101,  101,
+ /*   770 */   100,  100,   99,   99,   99,   98,  368,  105,   95,  991,
+ /*   780 */   991,  868,  871,  860,  860,  102,  102,  103,  103,  103,
+ /*   790 */   103,  792,  724,   22,  732,  731,  233,  233, 1239,  256,
+ /*   800 */   391,  274,  342,  211,   79,  360,  257,  413,  463,  397,
+ /*   810 */   207,  288,  260,  450,   79, 1239, 1241,  101,  101,  101,
+ /*   820 */   101,  100,  100,   99,   99,   99,   98,  368,   95,  991,
+ /*   830 */   991,  868,  871,  860,  860,  102,  102,  103,  103,  103,
+ /*   840 */   103,   91,  457,  296,    3,  233,  233,    5,  438,  212,
+ /*   850 */   331,  394,  739,  740,  295,  898,  894,  463,  460,  207,
+ /*   860 */   801, 1237,  722,  211,  698,  843, 1283,  101,  101,  101,
+ /*   870 */   101,  100,  100,   99,   99,   99,   98,  368, 1239,  380,
+ /*   880 */   357,  369,  233,  233,  989,  219,  236,  297,  423,  292,
+ /*   890 */   422,  206,  454,  898,  463,  970,   91,  457,  290,    3,
+ /*   900 */   722,  142,  268,  843,  847,  466, 1258,  149,  388,  425,
+ /*   910 */    88,   89,  769,  460,  930,   87,  447,   90,  369,  468,
+ /*   920 */   467,  385,  989,  839, 1257,  439,   57,   57,  395,  931,
+ /*   930 */  1065,  158,  970,  971,  972,  772,  369,  471, 1019,  399,
+ /*   940 */   771,  253,  456,  254,  932,  119,  891,  454,  233,  233,
+ /*   950 */     4,  970, 1096,  275,  839,  839,  841,  842,   19,  847,
+ /*   960 */   463,  449,  448,  163,  453,   88,   89,  776,  970, 1127,
+ /*   970 */   279,  930,   90,  369,  468,  467,   91,  457,  839,    3,
+ /*   980 */   235, 1064,  466, 1228,  233,  233,  931,  970,  970,  971,
+ /*   990 */   972,  970,  908,  460,  908,    2,  463,   81,  457,  212,
+ /*  1000 */     3,  932,  282,   10,   10,  970,  971,  972,  189,  839,
+ /*  1010 */   839,  841,  842,   19,  460,  284,  369,  354,  907,  286,
+ /*  1020 */   907,  753,  466, 1079,  970,  971,  972,  454,  970,  971,
+ /*  1030 */   972,  754,  970, 1063,  989,  372,  792,  369, 1118,  847,
+ /*  1040 */   291,  452,  466,   10,   10,   88,   89,  142,  454,  168,
+ /*  1050 */   300,  412,   90,  369,  468,  467,  793,  356,  839,  706,
+ /*  1060 */   847,  341,  121,   10,   10,  301,   88,   89,  379,  970,
+ /*  1070 */   971,  972,  989,   90,  369,  468,  467,  244,  205,  839,
+ /*  1080 */  1306,  245, 1135,  245,  250, 1168, 1114,  253,  456,  839,
+ /*  1090 */   839,  841,  842,   19, 1125,  237,  122,  451, 1174,  733,
+ /*  1100 */   324,  324,  323,  222,  321,  466, 1046,  695,  182,  225,
+ /*  1110 */   839,  839,  841,  842,   19,  103,  103,  103,  103,   96,
+ /*  1120 */   185,  466,  259, 1039, 1028,  170,   10,   10, 1027,  421,
+ /*  1130 */   258, 1029, 1300,  708,  792,  466,  408,  734,    8,  347,
+ /*  1140 */   444,  174,   12,   12,  290,  101,  101,  101,  101,  100,
+ /*  1150 */   100,   99,   99,   99,   98,  368,   32,   32,  466,  187,
+ /*  1160 */   466, 1111,  103,  103,  103,  103,  188,  466,  325,  138,
+ /*  1170 */   186,  708,  303,  305,  307,  358,  970,  270,  393,   43,
+ /*  1180 */    43,   44,   44, 1157,  333,  178,  418,  294,   45,   45,
+ /*  1190 */  1232,  318,  101,  101,  101,  101,  100,  100,   99,   99,
+ /*  1200 */    99,   98,  368,  381,  343,  366,  365,  466,  263,  253,
+ /*  1210 */   456,  466, 1062,  970,  971,  972, 1231,  997,  309,  466,
+ /*  1220 */   455,  466,  427,  466,  995,  173,  996, 1303,   46,   46,
+ /*  1230 */   145,  376,   37,   37, 1006, 1277,  466,  214, 1275,   64,
+ /*  1240 */    47,   47,   33,   33,   34,   34, 1003,   67,  466,  998,
+ /*  1250 */   350,  998,  466,  155,  233,  233,  466,   36,   36,   24,
+ /*  1260 */   140,   77, 1154,  466,  383,  466,  463,  428,  466,   48,
+ /*  1270 */    48,  466,  147,   49,   49,  466,  150,   50,   50,  466,
+ /*  1280 */   151,  152,  466,  384,   11,   11,   51,   51,  466,  110,
+ /*  1290 */   110,  153,   52,   52,  411,  466,   38,   38,  466,  191,
+ /*  1300 */    53,   53,  466,   54,   54,  466,  400,  466,  330,   39,
+ /*  1310 */    39,  466, 1164,  466,   25,  466,   56,   56,  466,  131,
+ /*  1320 */   131,   72,  466,  132,  132,  159,  133,  133,   61,   61,
+ /*  1330 */  1226,  195,   40,   40,  111,  111,   58,   58,  406,  112,
+ /*  1340 */   112,  466,  277,  113,  113,  466,  226,  466, 1246,  466,
+ /*  1350 */   197,  466,  164,  466,  409,  466,  198,  466,  199,  466,
+ /*  1360 */   335,  281,  109,  109,  466, 1030,  130,  130,  129,  129,
+ /*  1370 */   117,  117,  116,  116,  114,  114,  115,  115,   60,   60,
+ /*  1380 */    62,   62,  466,  359,  466,   59,   59,  424, 1082, 1081,
+ /*  1390 */  1080,  724, 1073, 1054,  336,  293, 1053, 1052, 1315,  431,
+ /*  1400 */   361,   76,  248,   31,   31,   35,   35, 1072,  249,  440,
+ /*  1410 */   302,  434,  213, 1122,    6,  311, 1212,  107,   83,  251,
+ /*  1420 */    78, 1123,  445,  220,  443, 1036,  304,   23, 1121,  469,
+ /*  1430 */   965,  221,  223, 1104,  314,  224,  344,  317,  315,  316,
+ /*  1440 */   470,  306, 1025, 1120,  308, 1262, 1020,  134,  120,  246,
+ /*  1450 */   682,  370,  171,  255, 1263,  135,  184, 1261, 1260,  374,
+ /*  1460 */   118,  906,  904,  827, 1050,  146,  136,  137,  148, 1049,
+ /*  1470 */    63, 1047,  756,  190,  269,  920,  154,  156,   68,   69,
+ /*  1480 */    70,   71,  139,  923,  192,  193,  144,  919,  345,  128,
+ /*  1490 */    14,  194,  276,  211, 1000,  405,  196,  161,  912,  160,
+ /*  1500 */    26,  697,  410,  295,  200,  289,  414,  162,  419,   73,
+ /*  1510 */    15,   16,  141,   74,   28,  247,  846,  845,  735,  874,
+ /*  1520 */   954,   75,  430,  955,   29,  433,  179,  229,  231,  800,
+ /*  1530 */   165,  795,   87,  210,  889,   79,  875,   17,  873,  877,
+ /*  1540 */   929,   18,  928,  216,  215,  878,   20,   30,  462,  844,
+ /*  1550 */   707,   92,  766,  770,    7,  322,  217,  218,  319, 1308,
+ /*  1560 */   960, 1016, 1016, 1016, 1016, 1307,
 };
 static const YYCODETYPE yy_lookahead[] = {
- /*     0 */   144,  145,  146,  147,  172,  222,  223,  224,  222,  223,
- /*    10 */   224,  152,  180,  152,  148,  149,  152,  173,  176,   19,
- /*    20 */   154,  173,  156,  152,  163,  242,  152,  163,  176,  163,
- /*    30 */    26,   31,  173,  174,  173,  174,  173,  173,  174,   39,
- /*    40 */     1,    2,  152,   43,   44,   45,   46,   47,   48,   49,
- /*    50 */    50,   51,   52,   53,   54,   55,   56,   57,  197,  169,
- /*    60 */   170,  197,  188,  197,  222,  223,  224,  208,  209,  208,
- /*    70 */   209,   19,  208,  152,  222,  223,  224,   22,   26,   24,
+ /*     0 */   152,  144,  145,  146,  147,  152,  152,  172,  152,  180,
+ /*    10 */   181,  152,  223,  224,  225,  180,  152,  164,  189,   19,
+ /*    20 */   223,  224,  225,  168,  169,  170,  163,  173,  174,  173,
+ /*    30 */   174,   31,  173,  174,  168,  169,  170,  173,  174,   39,
+ /*    40 */   243,  191,  192,   43,   44,   45,   46,   47,   48,   49,
+ /*    50 */    50,   51,   52,   53,   54,   55,   56,   57,  195,  196,
+ /*    60 */    22,   23,  208,  209,  208,  209,  218,  208,  209,  176,
+ /*    70 */   207,   19,  208,  209,   23,  212,  213,   26,   26,  152,
  /*    80 */    46,   47,   48,   49,   84,   85,   86,   87,   88,   89,
  /*    90 */    90,   91,   92,   93,   94,   43,   44,   45,   46,   47,
  /*   100 */    48,   49,   50,   51,   52,   53,   54,   55,   56,   57,
- /*   110 */   106,  245,  157,   88,   89,   90,   91,   92,   93,   94,
- /*   120 */    68,  231,  251,   19,   84,   85,   86,   87,   88,   89,
+ /*   110 */    90,   91,   92,   93,   94,  188,  223,  224,  225,  171,
+ /*   120 */    68,   83,  152,   19,   84,   85,   86,   87,   88,   89,
  /*   130 */    90,   91,   92,   93,   94,  101,   84,   85,   86,   87,
  /*   140 */    88,   89,   90,   91,   92,   93,   94,   43,   44,   45,
  /*   150 */    46,   47,   48,   49,   50,   51,   52,   53,   54,   55,
- /*   160 */    56,   57,   90,   91,   92,   93,   94,   82,   79,   99,
- /*   170 */    66,  200,  102,  103,  104,   19,  168,  169,  170,  152,
- /*   180 */    24,  210,   97,  113,  229,   59,  101,  232,   84,   85,
+ /*   160 */    56,   57,   99,   94,  194,  102,  103,  104,  109,  110,
+ /*   170 */    66,  223,  224,  225,  152,   19,  113,   22,   23,  152,
+ /*   180 */    24,   26,  160,    1,    2,   59,  164,  173,   84,   85,
  /*   190 */    86,   87,   88,   89,   90,   91,   92,   93,   94,   43,
  /*   200 */    44,   45,   46,   47,   48,   49,   50,   51,   52,   53,
- /*   210 */    54,   55,   56,   57,  152,  188,  152,  132,  133,  134,
- /*   220 */    93,   94,   96,   97,   98,   99,  152,   19,  102,  103,
- /*   230 */   104,   23,   94,   72,   79,  173,  174,  173,  174,  113,
+ /*   210 */    54,   55,   56,   57,  244,   88,   89,   90,   91,   92,
+ /*   220 */    93,   94,   96,   97,   98,   99,  196,   19,  102,  103,
+ /*   230 */   104,   23,   88,   89,  173,   59,  163,  207,   83,  113,
  /*   240 */    84,   85,   86,   87,   88,   89,   90,   91,   92,   93,
  /*   250 */    94,   43,   44,   45,   46,   47,   48,   49,   50,   51,
- /*   260 */    52,   53,   54,   55,   56,   57,  152,  171,  152,  108,
- /*   270 */   109,  110,  208,  209,  119,  120,  152,  180,  181,   19,
- /*   280 */   119,  120,  152,   23,  152,  152,  189,  173,  174,  173,
- /*   290 */   174,   59,   84,   85,   86,   87,   88,   89,   90,   91,
+ /*   260 */    52,   53,   54,   55,   56,   57,   90,  240,  195,  196,
+ /*   270 */   171,   82,   96,   97,   98,  152,  132,  176,  134,   19,
+ /*   280 */   207,  200,   72,   23,   93,   94,   97,  152,  173,   79,
+ /*   290 */   101,  210,   84,   85,   86,   87,   88,   89,   90,   91,
  /*   300 */    92,   93,   94,   43,   44,   45,   46,   47,   48,   49,
- /*   310 */    50,   51,   52,   53,   54,   55,   56,   57,  222,  223,
- /*   320 */   224,  186,  208,  209,  208,  209,  194,  194,   96,   97,
- /*   330 */    98,   19,  168,  169,  170,   23,   88,   89,  163,   59,
- /*   340 */     0,    1,    2,  219,   84,   85,   86,   87,   88,   89,
+ /*   310 */    50,   51,   52,   53,   54,   55,   56,   57,  108,  152,
+ /*   320 */   152,  132,  133,  134,  223,  224,  225,  152,  186,  119,
+ /*   330 */   120,   19,  197,  234,   31,   23,   26,  152,  239,   59,
+ /*   340 */   173,  174,   39,  220,   84,   85,   86,   87,   88,   89,
  /*   350 */    90,   91,   92,   93,   94,   43,   44,   45,   46,   47,
  /*   360 */    48,   49,   50,   51,   52,   53,   54,   55,   56,   57,
- /*   370 */    90,  152,  197,  195,  196,  243,   96,   97,   98,  196,
- /*   380 */   132,   11,  134,   19,  182,  207,  115,   23,  117,  118,
- /*   390 */   207,  163,  173,  174,  152,  220,   84,   85,   86,   87,
+ /*   370 */   152,   22,  152,   16,  152,  208,   96,   97,   98,  194,
+ /*   380 */    22,   23,   11,   19,   26,   79,   72,   23,    0,    1,
+ /*   390 */     2,  173,  174,  173,  174,  220,   84,   85,   86,   87,
  /*   400 */    88,   89,   90,   91,   92,   93,   94,   43,   44,   45,
  /*   410 */    46,   47,   48,   49,   50,   51,   52,   53,   54,   55,
- /*   420 */    56,   57,  152,   16,  152,  197,  171,  208,   22,   23,
- /*   430 */    22,   23,   26,   16,   26,   19,    7,    8,    9,   23,
- /*   440 */   212,  213,  152,  173,  174,  173,  174,   19,   84,   85,
+ /*   420 */    56,   57,  108,  109,  110,  119,  120,  152,  208,  119,
+ /*   430 */   120,  137,   75,  139,   77,   19,  152,   88,   89,   23,
+ /*   440 */   115,   83,  117,  118,  163,  227,  163,  152,   84,   85,
  /*   450 */    86,   87,   88,   89,   90,   91,   92,   93,   94,   43,
  /*   460 */    44,   45,   46,   47,   48,   49,   50,   51,   52,   53,
- /*   470 */    54,   55,   56,   57,   46,  152,  109,  110,  208,  109,
- /*   480 */   110,  152,   75,  152,   77,   22,   23,   19,  233,   83,
- /*   490 */   152,   83,   75,  238,   77,  164,  173,  174,  226,   59,
+ /*   470 */    54,   55,   56,   57,  195,  196,  195,  196,  195,  196,
+ /*   480 */   109,  110,  195,  196,   22,   23,  207,   19,  207,  152,
+ /*   490 */   207,  108,  109,  110,  207,  163,   22,  140,   24,   59,
  /*   500 */    84,   85,   86,   87,   88,   89,   90,   91,   92,   93,
  /*   510 */    94,   43,   44,   45,   46,   47,   48,   49,   50,   51,
- /*   520 */    52,   53,   54,   55,   56,   57,  108,  109,  110,  152,
- /*   530 */   152,  152,   22,   22,   23,  107,   96,   97,   98,  160,
- /*   540 */   112,  251,   19,  164,   22,  152,   83,  140,  219,  152,
+ /*   520 */    52,   53,   54,   55,   56,   57,  152,  195,  196,  152,
+ /*   530 */    16,    7,    8,    9,  197,  240,   96,   97,   98,  207,
+ /*   540 */   249,  250,   19,  152,   22,   83,   26,  173,  174,  152,
  /*   550 */   173,  174,   84,   85,   86,   87,   88,   89,   90,   91,
  /*   560 */    92,   93,   94,   59,  124,  152,   43,   44,   45,   46,
  /*   570 */    47,   48,   49,   50,   51,   52,   53,   54,   55,   56,
- /*   580 */    57,   59,  169,  170,  119,  120,   82,  108,  109,  110,
- /*   590 */   191,  192,  191,  192,   83,  248,  249,   19,   88,   89,
+ /*   580 */    57,   59,  169,  170,  157,  194,   82,  191,  192,   75,
+ /*   590 */   152,   77,  108,  109,  110,   26,  152,   19,  152,  152,
  /*   600 */    96,   97,   24,  152,  152,  101,  138,   84,   85,   86,
  /*   610 */    87,   88,   89,   90,   91,   92,   93,   94,   96,   97,
  /*   620 */    98,   43,   44,   45,   46,   47,   48,   49,   50,   51,
- /*   630 */    52,   53,   54,   55,   56,   57,  132,  133,  134,  152,
- /*   640 */   152,   46,  152,   26,  231,  194,  194,  146,  147,   19,
- /*   650 */   152,  116,  152,   72,  152,  152,  121,  152,  152,  152,
- /*   660 */    79,  138,   84,   85,   86,   87,   88,   89,   90,   91,
+ /*   630 */    52,   53,   54,   55,   56,   57,  132,  133,  134,  188,
+ /*   640 */   194,  197,  152,  123,  197,  232,  194,  152,  182,   19,
+ /*   650 */   119,  120,  152,  152,  152,  152,  218,  230,  152,  163,
+ /*   660 */   233,  138,   84,   85,   86,   87,   88,   89,   90,   91,
  /*   670 */    92,   93,   94,   43,   44,   45,   46,   47,   48,   49,
- /*   680 */    50,   51,   52,   53,   54,   55,   56,   57,  152,  108,
- /*   690 */    23,  152,  194,   26,  194,  152,  194,  194,  137,  152,
- /*   700 */   139,   19,  107,  166,  167,  218,  218,   29,  218,  173,
- /*   710 */   174,   33,  173,  174,   84,   85,   86,   87,   88,   89,
+ /*   680 */    50,   51,   52,   53,   54,   55,   56,   57,  152,  152,
+ /*   690 */    23,  195,  196,   26,  194,  194,  194,  146,  147,  130,
+ /*   700 */   194,   19,   46,  207,   59,   29,  166,  167,  218,   33,
+ /*   710 */   173,  174,   26,  218,   84,   85,   86,   87,   88,   89,
  /*   720 */    90,   91,   92,   93,   94,   43,   44,   45,   46,   47,
  /*   730 */    48,   49,   50,   51,   52,   53,   54,   55,   56,   57,
- /*   740 */   152,  194,   64,  171,  239,  239,  239,  130,  166,  167,
- /*   750 */   212,  213,   19,   23,  246,  247,   26,   59,   26,  152,
- /*   760 */   163,  218,  163,  163,  163,   98,   84,   85,   86,   87,
+ /*   740 */    64,  171,   97,  240,  116,  166,  167,  212,  213,  121,
+ /*   750 */    23,  152,   19,   26,  218,  247,  248,   23,   23,  152,
+ /*   760 */    26,   26,   22,  107,  163,   98,   84,   85,   86,   87,
  /*   770 */    88,   89,   90,   91,   92,   93,   94,   44,   45,   46,
  /*   780 */    47,   48,   49,   50,   51,   52,   53,   54,   55,   56,
- /*   790 */    57,  124,   26,   79,  197,   97,  197,  197,  197,   31,
- /*   800 */   152,   23,   19,   19,   26,   19,  218,   39,   23,   21,
- /*   810 */   238,   26,  163,  163,  100,   59,  163,   84,   85,   86,
+ /*   790 */    57,  124,  106,   53,  100,  101,  195,  196,  152,  152,
+ /*   800 */    23,   23,   19,   26,   26,   19,  152,   23,  207,  239,
+ /*   810 */    26,   23,  152,  163,   26,  169,  170,   84,   85,   86,
  /*   820 */    87,   88,   89,   90,   91,   92,   93,   94,   45,   46,
  /*   830 */    47,   48,   49,   50,   51,   52,   53,   54,   55,   56,
- /*   840 */    57,   19,   20,  152,   22,   23,  197,  197,   23,   19,
- /*   850 */   197,   26,  152,   97,   23,  123,   23,   26,   36,   26,
- /*   860 */   152,  152,   19,   20,   98,   22,   78,   84,   85,   86,
- /*   870 */    87,   88,   89,   90,   91,   92,   93,   94,   94,   36,
- /*   880 */   152,   59,   96,   99,  100,  101,  102,  103,  104,  105,
- /*   890 */   124,  103,   70,  100,  101,   23,  112,   12,   26,   12,
- /*   900 */    23,   79,   59,   26,   82,  101,   22,    7,    8,  152,
- /*   910 */    88,   89,   27,   70,   27,  152,  112,   95,   96,   97,
- /*   920 */    98,  152,   79,  101,   22,   82,   96,   42,  140,   42,
- /*   930 */   182,   88,   89,   19,   20,  132,   22,  134,   95,   96,
- /*   940 */    97,   98,   23,   59,  101,   26,   22,   62,  152,   62,
- /*   950 */    36,   22,   59,   24,  132,  133,  134,  135,  136,   72,
- /*   960 */     5,   59,  152,   22,   71,   10,   11,   12,   13,   14,
- /*   970 */   152,  152,   17,   59,  182,  132,  133,  134,  135,  136,
- /*   980 */    96,   97,   98,   59,   70,   30,  152,   32,   59,   96,
- /*   990 */    97,   98,  173,  174,   53,   40,   82,  152,   96,   97,
- /*  1000 */    98,   90,   88,   89,   90,   24,  187,  173,  174,   95,
- /*  1010 */    96,   97,   98,  152,  152,  101,   19,   20,  152,   22,
- /*  1020 */    96,   97,   98,  152,   69,   59,   97,  116,   59,  214,
- /*  1030 */   152,   76,  121,   36,   79,   80,   19,   20,  152,   22,
- /*  1040 */    59,  132,   59,  134,  173,  174,  132,  133,  134,  135,
- /*  1050 */   136,  173,  174,   36,  234,  152,   59,  152,  187,  173,
- /*  1060 */   174,  211,   96,   97,   98,  187,   97,   70,   23,  114,
- /*  1070 */   152,   26,   23,  187,   23,   26,   59,   26,   97,   82,
- /*  1080 */    97,   22,  164,  152,  152,   88,   89,   70,  192,  152,
- /*  1090 */   124,  152,   95,   96,   97,   98,  141,  152,  101,   82,
- /*  1100 */   152,  152,  184,  152,  186,   88,   89,  199,   54,   55,
- /*  1110 */    56,   57,   95,   96,   97,   98,  152,  152,  101,  152,
- /*  1120 */   152,  173,  174,  235,   54,   55,   56,   57,   58,  132,
- /*  1130 */   133,  134,  135,  136,  211,  150,   59,  211,   84,   85,
- /*  1140 */    86,   87,   88,   89,   90,   91,   92,   93,   94,  132,
- /*  1150 */   133,  134,  135,  136,   84,   85,   86,   87,   88,   89,
- /*  1160 */    90,   91,   92,   93,   94,   88,   89,  195,  196,   35,
- /*  1170 */   211,  211,  152,   96,   97,   98,  152,  100,  198,  207,
- /*  1180 */   171,  122,  240,  152,  107,  215,  109,  240,  202,  215,
- /*  1190 */   202,  152,  220,  173,  174,  177,  185,  173,  174,   65,
- /*  1200 */   152,  176,  152,  181,  173,  174,  215,   73,  176,  132,
- /*  1210 */   228,  134,  173,  174,  176,  152,  201,  152,  199,  155,
- /*  1220 */   152,  173,  174,  173,  174,   60,  152,  122,  244,   38,
- /*  1230 */   159,  159,  152,  241,  241,  152,  173,  174,  173,  174,
- /*  1240 */   152,  173,  174,  152,  159,  111,  152,  173,  174,  152,
- /*  1250 */    22,  152,   43,  173,  174,  152,  173,  174,  152,  190,
- /*  1260 */   130,  173,  174,  152,  173,  174,  152,  173,  174,  202,
- /*  1270 */   173,  174,  173,  174,  152,   18,  173,  174,  152,  173,
- /*  1280 */   174,  152,  221,  152,  173,  174,  193,  173,  174,  152,
- /*  1290 */   158,  152,  159,  152,   22,  173,  174,  152,   18,  173,
- /*  1300 */   174,  152,  173,  174,  173,  174,  152,  221,  152,  193,
- /*  1310 */   173,  174,  173,  174,  173,  174,  152,  193,  173,  174,
- /*  1320 */   152,  193,  173,  174,  158,  152,  190,  173,  174,  173,
- /*  1330 */   174,   59,  152,  190,  159,  137,  152,  173,  174,  152,
- /*  1340 */   202,  173,  174,   61,  152,  237,  173,  174,  202,  236,
- /*  1350 */    22,  107,  159,  173,  174,  159,  178,  173,  174,  158,
- /*  1360 */   173,  174,  159,  158,  158,  173,  174,  159,  178,   97,
- /*  1370 */   175,   63,  175,  106,  175,  125,  217,  183,  178,  175,
- /*  1380 */   107,  159,   22,  216,  177,  175,  217,  175,  175,  217,
- /*  1390 */   216,  159,  216,  216,  183,  225,  217,  137,  227,  178,
- /*  1400 */    94,  178,  126,  129,   25,  128,  127,  162,  206,   26,
- /*  1410 */   161,  230,  230,   13,  153,  153,    6,  151,  203,  205,
- /*  1420 */   204,  202,  151,  165,  171,  171,  151,  171,  165,  165,
- /*  1430 */   171,  179,    4,  250,  179,  250,  247,    3,   22,  171,
- /*  1440 */   171,  171,  142,   81,   15,   23,   16,   23,  131,  171,
- /*  1450 */   120,  111,  123,   20,   16,    1,  125,  123,  131,   53,
- /*  1460 */    53,   53,   53,  111,   96,   34,  122,    1,    5,   22,
- /*  1470 */   107,   67,  140,   74,   26,   24,   41,  107,   67,   20,
- /*  1480 */    19,  112,  105,   66,   22,   66,   22,   22,   28,   66,
- /*  1490 */    23,   22,   22,   37,   23,   23,   23,  116,   22,   22,
- /*  1500 */    26,   23,  122,   23,   23,   26,   22,   11,   96,   34,
- /*  1510 */   124,   26,   26,   23,   23,   23,   34,   34,   23,   26,
- /*  1520 */    23,   22,   24,   23,   22,  122,   23,   26,   22,   24,
- /*  1530 */    23,   22,   15,   23,   23,   22,  122,  122,   23,    1,
- /*  1540 */   122,  252,  252,  252,  252,  252,  252,  252,  252,  252,
- /*  1550 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
- /*  1560 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
+ /*   840 */    57,   19,   20,  101,   22,  195,  196,   22,   19,   24,
+ /*   850 */   163,   19,    7,    8,  112,   59,   23,  207,   36,   26,
+ /*   860 */    23,  152,   59,   26,   21,   59,  152,   84,   85,   86,
+ /*   870 */    87,   88,   89,   90,   91,   92,   93,   94,  232,  221,
+ /*   880 */    94,   59,  195,  196,   59,   99,  100,  101,  102,  103,
+ /*   890 */   104,  105,   70,   97,  207,   59,   19,   20,  112,   22,
+ /*   900 */    97,   79,  152,   97,   82,  152,  152,   71,  221,   90,
+ /*   910 */    88,   89,   23,   36,   12,   26,  163,   95,   96,   97,
+ /*   920 */    98,   78,   97,  101,  152,   96,  173,  174,   96,   27,
+ /*   930 */   182,   22,   96,   97,   98,  116,   59,  148,  149,  152,
+ /*   940 */   121,  119,  120,  154,   42,  156,  103,   70,  195,  196,
+ /*   950 */    22,   59,  163,  152,  132,  133,  134,  135,  136,   82,
+ /*   960 */   207,  208,  209,   71,   62,   88,   89,   90,   59,  152,
+ /*   970 */   152,   12,   95,   96,   97,   98,   19,   20,  101,   22,
+ /*   980 */    22,  182,  152,  140,  195,  196,   27,   59,   96,   97,
+ /*   990 */    98,   59,  132,   36,  134,   22,  207,   19,   20,   24,
+ /*  1000 */    22,   42,  152,  173,  174,   96,   97,   98,  219,  132,
+ /*  1010 */   133,  134,  135,  136,   36,  152,   59,  187,  132,  152,
+ /*  1020 */   134,   62,  152,  152,   96,   97,   98,   70,   96,   97,
+ /*  1030 */    98,   72,   59,  152,   59,  246,   26,   59,  214,   82,
+ /*  1040 */   152,  192,  152,  173,  174,   88,   89,   79,   70,  152,
+ /*  1050 */   152,   19,   95,   96,   97,   98,  124,  187,  101,   23,
+ /*  1060 */    82,  164,   26,  173,  174,  152,   88,   89,  100,   96,
+ /*  1070 */    97,   98,   97,   95,   96,   97,   98,  187,   46,  101,
+ /*  1080 */   122,  184,  152,  186,  211,  152,  152,  119,  120,  132,
+ /*  1090 */   133,  134,  135,  136,  152,    5,   22,  152,  152,   35,
+ /*  1100 */    10,   11,   12,   13,   14,  152,  152,   17,   98,  235,
+ /*  1110 */   132,  133,  134,  135,  136,   54,   55,   56,   57,   58,
+ /*  1120 */    30,  152,   32,  152,  152,  198,  173,  174,  152,   65,
+ /*  1130 */    40,  152,  152,   59,  124,  152,  236,   73,  199,  107,
+ /*  1140 */   187,  171,  173,  174,  112,   84,   85,   86,   87,   88,
+ /*  1150 */    89,   90,   91,   92,   93,   94,  173,  174,  152,   69,
+ /*  1160 */   152,  211,   54,   55,   56,   57,   76,  152,  150,   79,
+ /*  1170 */    80,   97,  211,  211,  211,  111,   59,  241,  241,  173,
+ /*  1180 */   174,  173,  174,  202,  202,  185,  177,  176,  173,  174,
+ /*  1190 */   176,  201,   84,   85,   86,   87,   88,   89,   90,   91,
+ /*  1200 */    92,   93,   94,  215,  114,   88,   89,  152,  215,  119,
+ /*  1210 */   120,  152,  181,   96,   97,   98,  176,  100,  215,  152,
+ /*  1220 */   229,  152,  163,  152,  107,  199,  109,  155,  173,  174,
+ /*  1230 */   245,  141,  173,  174,   60,  159,  152,  122,  159,  242,
+ /*  1240 */   173,  174,  173,  174,  173,  174,   38,  242,  152,  132,
+ /*  1250 */   159,  134,  152,   22,  195,  196,  152,  173,  174,  222,
+ /*  1260 */    43,  130,  202,  152,   18,  152,  207,  208,  152,  173,
+ /*  1270 */   174,  152,  190,  173,  174,  152,  193,  173,  174,  152,
+ /*  1280 */   193,  193,  152,  159,  173,  174,  173,  174,  152,  173,
+ /*  1290 */   174,  193,  173,  174,   18,  152,  173,  174,  152,  158,
+ /*  1300 */   173,  174,  152,  173,  174,  152,  159,  152,  202,  173,
+ /*  1310 */   174,  152,  190,  152,  222,  152,  173,  174,  152,  173,
+ /*  1320 */   174,  137,  152,  173,  174,  190,  173,  174,  173,  174,
+ /*  1330 */   202,  158,  173,  174,  173,  174,  173,  174,   61,  173,
+ /*  1340 */   174,  152,  237,  173,  174,  152,  159,  152,  238,  152,
+ /*  1350 */   158,  152,   22,  152,  178,  152,  158,  152,  158,  152,
+ /*  1360 */   178,  159,  173,  174,  152,  159,  173,  174,  173,  174,
+ /*  1370 */   173,  174,  173,  174,  173,  174,  173,  174,  173,  174,
+ /*  1380 */   173,  174,  152,   63,  152,  173,  174,  107,  175,  175,
+ /*  1390 */   175,  106,  183,  175,  178,  175,  177,  175,  175,  178,
+ /*  1400 */    94,  107,  231,  173,  174,  173,  174,  183,  231,  125,
+ /*  1410 */   216,  178,  159,  217,   22,  159,  226,  129,  137,  228,
+ /*  1420 */   128,  217,  126,   25,  127,  162,  216,   26,  217,  161,
+ /*  1430 */    13,  153,  153,  206,  205,    6,  251,  202,  204,  203,
+ /*  1440 */   151,  216,  151,  217,  216,  171,  151,  165,  179,  179,
+ /*  1450 */     4,    3,   22,  142,  171,  165,   15,  171,  171,   81,
+ /*  1460 */    16,   23,   23,  120,  171,  131,  165,  111,  123,  171,
+ /*  1470 */   171,  171,   20,  125,   16,    1,  123,  131,   53,   53,
+ /*  1480 */    53,   53,  111,   96,   34,  122,  248,    1,  251,    5,
+ /*  1490 */    22,  107,  140,   26,   74,   41,  122,  107,   67,   67,
+ /*  1500 */    24,   20,   19,  112,  105,   23,   66,   22,   66,   22,
+ /*  1510 */    22,   22,   37,   22,   22,   66,   23,   23,   28,   23,
+ /*  1520 */    23,   26,   24,   23,   22,   24,  122,   23,   23,   96,
+ /*  1530 */    22,  124,   26,   34,   23,   26,   23,   34,   23,   23,
+ /*  1540 */    23,   34,   23,   22,   26,   11,   22,   22,   26,   23,
+ /*  1550 */    23,   22,  116,   23,   22,   15,  122,  122,   23,  122,
+ /*  1560 */     1,  252,  252,  252,  252,  122,  252,  252,  252,  252,
  /*  1570 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1580 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1590 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1600 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1610 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1620 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1630 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1640 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1650 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1660 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
  /*  1670 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
- /*  1680 */   252,  252,  252,  252,
-};
-#define YY_SHIFT_COUNT    (465)
+ /*  1680 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
+ /*  1690 */   252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
+ /*  1700 */   252,  252,  252,  252,  252,  252,  252,  252,  252,
+};
+#define YY_SHIFT_COUNT    (471)
 #define YY_SHIFT_MIN      (0)
-#define YY_SHIFT_MAX      (1538)
+#define YY_SHIFT_MAX      (1559)
 static const unsigned short int yy_shift_ofst[] = {
- /*     0 */    39,  822,  955,  843,  997,  997,  997,  997,    0,    0,
- /*    10 */   104,  630,  997,  997,  997,  997,  997,  997,  997, 1077,
- /*    20 */  1077,  126,  161,  155,   52,  156,  208,  260,  312,  364,
- /*    30 */   416,  468,  523,  578,  630,  630,  630,  630,  630,  630,
- /*    40 */   630,  630,  630,  630,  630,  630,  630,  630,  630,  630,
- /*    50 */   630,  682,  630,  733,  783,  783,  914,  997,  997,  997,
- /*    60 */   997,  997,  997,  997,  997,  997,  997,  997,  997,  997,
- /*    70 */   997,  997,  997,  997,  997,  997,  997,  997,  997,  997,
- /*    80 */   997,  997,  997,  997,  997,  997,  997,  997, 1017,  997,
- /*    90 */   997,  997,  997,  997,  997,  997,  997,  997,  997,  997,
- /*   100 */   997,  997, 1070, 1054, 1054, 1054, 1054, 1054,   40,   25,
- /*   110 */    72,  232,  788,  428,  248,  248,  232,  581,  367,  127,
- /*   120 */   465,  138, 1541, 1541, 1541,  784,  784,  784,  522,  522,
- /*   130 */   887,  887,  893,  406,  408,  232,  232,  232,  232,  232,
- /*   140 */   232,  232,  232,  232,  232,  232,  232,  232,  232,  232,
- /*   150 */   232,  232,  232,  232,  232,  370,  340,  714,  698,  698,
- /*   160 */   465,   89,   89,   89,   89,   89,   89, 1541, 1541, 1541,
- /*   170 */   504,   85,   85,  884,   70,  280,  902,  440,  966,  924,
- /*   180 */   232,  232,  232,  232,  232,  232,  232,  232,  232,  232,
- /*   190 */   232,  232,  232,  232,  232,  232, 1134, 1134, 1134,  232,
- /*   200 */   232,  667,  232,  232,  232,  929,  232,  232,  885,  232,
- /*   210 */   232,  232,  232,  232,  232,  232,  232,  232,  232,  418,
- /*   220 */   678,  981,  981,  981,  981,  766,  271,  911,  510,  429,
- /*   230 */   617,  786,  786,  830,  617,  830,    4,  730,  595,  768,
- /*   240 */   786,  561,  768,  768,  732,  535,   55, 1165, 1105, 1105,
- /*   250 */  1191, 1191, 1105, 1228, 1209, 1130, 1257, 1257, 1257, 1257,
- /*   260 */  1105, 1280, 1130, 1228, 1209, 1209, 1130, 1105, 1280, 1198,
- /*   270 */  1282, 1105, 1105, 1280, 1328, 1105, 1280, 1105, 1280, 1328,
- /*   280 */  1244, 1244, 1244, 1308, 1328, 1244, 1267, 1244, 1308, 1244,
- /*   290 */  1244, 1250, 1273, 1250, 1273, 1250, 1273, 1250, 1273, 1105,
- /*   300 */  1360, 1105, 1260, 1328, 1306, 1306, 1328, 1274, 1276, 1277,
- /*   310 */  1279, 1130, 1379, 1383, 1400, 1400, 1410, 1410, 1410, 1541,
- /*   320 */  1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
- /*   330 */  1541, 1541, 1541, 1541, 1541,   34,  407,  463,  511,  417,
- /*   340 */   479, 1272,  778,  941,  785,  825,  831,  833,  872,  877,
- /*   350 */   756,  793,  900,  804,  919, 1045,  969, 1049,  803,  909,
- /*   360 */  1051,  983, 1059, 1428, 1434, 1416, 1300, 1429, 1362, 1430,
- /*   370 */  1422, 1424, 1330, 1317, 1340, 1329, 1433, 1331, 1438, 1454,
- /*   380 */  1334, 1327, 1406, 1407, 1408, 1409, 1352, 1368, 1431, 1344,
- /*   390 */  1466, 1463, 1447, 1363, 1332, 1404, 1448, 1411, 1399, 1435,
- /*   400 */  1370, 1451, 1459, 1461, 1369, 1377, 1462, 1417, 1464, 1465,
- /*   410 */  1467, 1469, 1419, 1460, 1470, 1423, 1456, 1471, 1472, 1473,
- /*   420 */  1474, 1381, 1476, 1478, 1477, 1479, 1380, 1480, 1481, 1412,
- /*   430 */  1475, 1484, 1386, 1485, 1482, 1486, 1483, 1490, 1485, 1491,
- /*   440 */  1492, 1495, 1493, 1497, 1499, 1496, 1500, 1502, 1498, 1501,
- /*   450 */  1503, 1506, 1505, 1501, 1507, 1509, 1510, 1511, 1513, 1403,
- /*   460 */  1414, 1415, 1418, 1515, 1517, 1538,
-};
-#define YY_REDUCE_COUNT (334)
-#define YY_REDUCE_MIN   (-217)
-#define YY_REDUCE_MAX   (1278)
+ /*     0 */   182, 1090,  822,  822,  306,  957,  957,  957,  957,  210,
+ /*    10 */     0,    0,  104,  630,  957,  957,  957,  957,  957,  957,
+ /*    20 */   957, 1117, 1117,  126,  968,  306,  306,  306,  306,  306,
+ /*    30 */   306,   52,  156,  208,  260,  312,  364,  416,  468,  523,
+ /*    40 */   578,  630,  630,  630,  630,  630,  630,  630,  630,  630,
+ /*    50 */   630,  630,  630,  630,  630,  630,  630,  630,  682,  630,
+ /*    60 */   733,  783,  783,  877,  957,  957,  957,  957,  957,  957,
+ /*    70 */   957,  957,  957,  957,  957,  957,  957,  957,  957,  957,
+ /*    80 */   957,  957,  957,  957,  957,  957,  957,  957,  957,  957,
+ /*    90 */   957,  957,  957,  957,  957,  978,  957,  957,  957,  957,
+ /*   100 */   957,  957,  957,  957,  957,  957,  957,  957,  957, 1061,
+ /*   110 */  1108, 1108, 1108, 1108, 1108,   40,  127,   20,  280,  843,
+ /*   120 */  1032,  144,  144,  280,  310,  310,  310,  310,   59,  191,
+ /*   130 */    69, 1566, 1566, 1566,  786,  786,  786,  522,  836,  522,
+ /*   140 */   959,  959,  892,  155,  358,  280,  280,  280,  280,  280,
+ /*   150 */   280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
+ /*   160 */   280,  280,  280,  280,  280,  280,  371,  388,  645,  645,
+ /*   170 */   531, 1566, 1566, 1566,  504,  189,  189,  909,   63,  176,
+ /*   180 */   928,  440,  932,  973,  280,  280,  280,  280,  280,  314,
+ /*   190 */   280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
+ /*   200 */   280,  280, 1064, 1064, 1064,  280,  280,  280,  280,  667,
+ /*   210 */   280,  280,  280,  825,  280,  280,  902,  280,  280,  280,
+ /*   220 */   280,  280,  280,  280,  280,  383,  676,  325,  975,  975,
+ /*   230 */   975,  975, 1010,  325,  325,  819,  349,  524,  569,  829,
+ /*   240 */   829,  832,  569,  832,  686,   51,  656,  303,  303,  303,
+ /*   250 */   829,  294,  520,  628,  474, 1174, 1115, 1115, 1208, 1208,
+ /*   260 */  1115, 1231, 1217, 1131, 1246, 1246, 1246, 1246, 1115, 1276,
+ /*   270 */  1131, 1231, 1217, 1217, 1131, 1115, 1276, 1184, 1277, 1115,
+ /*   280 */  1276, 1330, 1115, 1276, 1115, 1276, 1330, 1280, 1280, 1280,
+ /*   290 */  1320, 1330, 1280, 1285, 1280, 1320, 1280, 1280, 1330, 1306,
+ /*   300 */  1306, 1330, 1284, 1294, 1284, 1294, 1284, 1294, 1284, 1294,
+ /*   310 */  1115, 1392, 1115, 1281, 1288, 1296, 1292, 1297, 1131, 1398,
+ /*   320 */  1401, 1417, 1417, 1429, 1429, 1429, 1566, 1566, 1566, 1566,
+ /*   330 */  1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
+ /*   340 */  1566, 1566,   34,  357,   38,  462,  514,  484, 1074,  727,
+ /*   350 */   740,  734,  735,  777,  778,  784,  788,  803,  694,  845,
+ /*   360 */   742,  796,  833,  837,  889,  860,  886, 1036,  806,  958,
+ /*   370 */  1446, 1448, 1430, 1311, 1441, 1378, 1444, 1438, 1439, 1343,
+ /*   380 */  1334, 1356, 1345, 1452, 1348, 1458, 1474, 1353, 1346, 1425,
+ /*   390 */  1426, 1427, 1428, 1371, 1387, 1450, 1363, 1486, 1484, 1468,
+ /*   400 */  1384, 1352, 1431, 1467, 1432, 1420, 1454, 1374, 1390, 1476,
+ /*   410 */  1481, 1483, 1391, 1399, 1485, 1440, 1487, 1488, 1482, 1489,
+ /*   420 */  1442, 1490, 1491, 1449, 1475, 1493, 1494, 1496, 1495, 1497,
+ /*   430 */  1492, 1498, 1500, 1502, 1501, 1404, 1504, 1505, 1433, 1499,
+ /*   440 */  1508, 1407, 1506, 1503, 1509, 1507, 1511, 1513, 1515, 1506,
+ /*   450 */  1516, 1517, 1518, 1519, 1521, 1534, 1524, 1525, 1526, 1527,
+ /*   460 */  1529, 1530, 1532, 1522, 1436, 1434, 1435, 1437, 1443, 1535,
+ /*   470 */  1540, 1559,
+};
+#define YY_REDUCE_COUNT (341)
+#define YY_REDUCE_MIN   (-211)
+#define YY_REDUCE_MAX   (1301)
 static const short yy_reduce_ofst[] = {
- /*     0 */  -144, -139, -134, -136, -141,   64,  114,  116, -158, -148,
- /*    10 */  -217,   96,  819,  871,  878,  219,  270,  886,  272, -110,
- /*    20 */   413,  918,  972,  228, -214, -214, -214, -214, -214, -214,
- /*    30 */  -214, -214, -214, -214, -214, -214, -214, -214, -214, -214,
- /*    40 */  -214, -214, -214, -214, -214, -214, -214, -214, -214, -214,
- /*    50 */  -214, -214, -214, -214, -214, -214,   62,  323,  377,  536,
- /*    60 */   539,  834,  948, 1020, 1024, 1031, 1039, 1048, 1050, 1063,
- /*    70 */  1065, 1068, 1074, 1080, 1083, 1088, 1091, 1094, 1097, 1099,
- /*    80 */  1103, 1106, 1111, 1114, 1122, 1126, 1129, 1131, 1137, 1139,
- /*    90 */  1141, 1145, 1149, 1154, 1156, 1164, 1168, 1173, 1180, 1184,
- /*   100 */  1187, 1192, -214, -214, -214, -214, -214, -214, -214, -214,
- /*   110 */  -214,  132,  -45,   97,    8,  164,  379,  175,  255, -214,
- /*   120 */   178, -214, -214, -214, -214, -168, -168, -168,  124,  329,
- /*   130 */   399,  401, -129,  347,  347,  331,  133,  451,  452,  498,
- /*   140 */   500,  502,  503,  505,  487,  506,  488,  490,  507,  543,
- /*   150 */   547, -126,  588,  290,   27,  572,  501,  597,  537,  582,
- /*   160 */   183,  599,  600,  601,  649,  650,  653,  508,  538,  -29,
- /*   170 */  -156, -152, -137,  -79,  135,   74,  130,  242,  338,  378,
- /*   180 */   393,  397,  607,  648,  691,  700,  708,  709,  728,  757,
- /*   190 */   763,  769,  796,  810,  818,  845,  202,  748,  792,  861,
- /*   200 */   862,  815,  866,  903,  905,  850,  931,  932,  896,  937,
- /*   210 */   939,  945,   74,  949,  951,  964,  965,  967,  968,  888,
- /*   220 */   820,  923,  926,  959,  960,  815,  980,  908, 1009,  985,
- /*   230 */   986,  970,  974,  942,  988,  947, 1018, 1011, 1022, 1025,
- /*   240 */   991,  982, 1032, 1038, 1015, 1019, 1064,  984, 1071, 1072,
- /*   250 */   992,  993, 1085, 1061, 1069, 1067, 1093, 1116, 1124, 1128,
- /*   260 */  1133, 1132, 1138, 1086, 1136, 1143, 1146, 1175, 1166, 1108,
- /*   270 */  1113, 1193, 1196, 1201, 1178, 1203, 1205, 1208, 1206, 1190,
- /*   280 */  1195, 1197, 1199, 1194, 1200, 1204, 1207, 1210, 1211, 1212,
- /*   290 */  1213, 1159, 1167, 1169, 1174, 1172, 1176, 1179, 1177, 1222,
- /*   300 */  1170, 1232, 1171, 1221, 1181, 1182, 1223, 1202, 1214, 1216,
- /*   310 */  1215, 1219, 1245, 1249, 1261, 1262, 1266, 1271, 1275, 1183,
- /*   320 */  1185, 1189, 1258, 1253, 1254, 1256, 1259, 1263, 1252, 1255,
- /*   330 */  1268, 1269, 1270, 1278, 1264,
+ /*     0 */  -143,  789,  753, 1059, -137, -146, -144, -141, -136,  687,
+ /*    10 */  -107,  101, -203,  -52,  830,  870,  890,  167,  953,  218,
+ /*    20 */   220,  413,  646,  897,   73,  281,  283,  332,  496,  601,
+ /*    30 */   650, -211, -211, -211, -211, -211, -211, -211, -211, -211,
+ /*    40 */  -211, -211, -211, -211, -211, -211, -211, -211, -211, -211,
+ /*    50 */  -211, -211, -211, -211, -211, -211, -211, -211, -211, -211,
+ /*    60 */  -211, -211, -211,  374,  377,  537,  969,  983, 1006, 1008,
+ /*    70 */  1015, 1055, 1067, 1069, 1071, 1084, 1096, 1100, 1104, 1111,
+ /*    80 */  1113, 1116, 1119, 1123, 1127, 1130, 1136, 1143, 1146, 1150,
+ /*    90 */  1153, 1155, 1159, 1161, 1163, 1166, 1170, 1189, 1193, 1195,
+ /*   100 */  1197, 1199, 1201, 1203, 1205, 1207, 1212, 1230, 1232, -211,
+ /*   110 */  -211, -211, -211, -211, -211, -211, -211, -211,  -30,  427,
+ /*   120 */  -171, -145, -134,   22,  279,  287,  279,  287,   99, -211,
+ /*   130 */  -211, -211, -211, -211, -165, -165, -165,  123,  135,  175,
+ /*   140 */  -150,  396,  337,  291,  291, -147,  185,  391,  446,  444,
+ /*   150 */   452,  500,  501,  502,   27, -152,  295,  438,  490,  503,
+ /*   160 */   495,  506,  -73,  447,  451,  536,  570,  551,  540,  579,
+ /*   170 */    30,  508,  535,   81,   14,   61,  115,  168,  142,  222,
+ /*   180 */   275,  284,  397,  599,  607,  647,  654,  660,  709,  658,
+ /*   190 */   714,  750,  754,  772,  787,  801,  817,  818,  850,  863,
+ /*   200 */   867,  871,  466,  748,  799,  881,  888,  898,  913,  824,
+ /*   210 */   930,  933,  934,  873,  942,  945,  849,  946,  222,  954,
+ /*   220 */   971,  972,  976,  979,  980,  900,  874,  927,  950,  961,
+ /*   230 */   962,  963,  824,  927,  927,  939,  970, 1018,  981,  988,
+ /*   240 */   993,  936,  982,  937, 1009, 1000, 1031, 1011, 1014, 1040,
+ /*   250 */  1003,  991,  990, 1026, 1072,  985, 1076, 1079,  997, 1005,
+ /*   260 */  1091, 1037, 1082, 1060, 1083, 1087, 1088, 1098, 1124, 1141,
+ /*   270 */  1106, 1092, 1122, 1135, 1128, 1147, 1173, 1110, 1105, 1187,
+ /*   280 */  1192, 1176, 1202, 1198, 1206, 1200, 1182, 1213, 1214, 1215,
+ /*   290 */  1209, 1216, 1218, 1219, 1220, 1224, 1222, 1223, 1221, 1171,
+ /*   300 */  1177, 1233, 1196, 1194, 1204, 1210, 1211, 1225, 1226, 1228,
+ /*   310 */  1253, 1190, 1256, 1191, 1227, 1229, 1234, 1236, 1235, 1263,
+ /*   320 */  1268, 1278, 1279, 1289, 1291, 1295, 1185, 1237, 1238, 1282,
+ /*   330 */  1274, 1283, 1286, 1287, 1290, 1269, 1270, 1293, 1298, 1299,
+ /*   340 */  1300, 1301,
 };
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */  1286, 1276, 1276, 1276, 1209, 1209, 1209, 1209, 1133, 1133,
- /*    10 */  1260, 1036, 1005, 1005, 1005, 1005, 1005, 1005, 1208, 1005,
- /*    20 */  1005, 1005, 1005, 1108, 1139, 1005, 1005, 1005, 1005, 1210,
- /*    30 */  1211, 1005, 1005, 1005, 1259, 1261, 1149, 1148, 1147, 1146,
- /*    40 */  1242, 1120, 1144, 1137, 1141, 1210, 1204, 1205, 1203, 1207,
- /*    50 */  1211, 1005, 1140, 1174, 1188, 1173, 1005, 1005, 1005, 1005,
- /*    60 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*    70 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*    80 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*    90 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   100 */  1005, 1005, 1182, 1187, 1194, 1186, 1183, 1176, 1175, 1177,
- /*   110 */  1178, 1005, 1026, 1075, 1005, 1005, 1005, 1276, 1036, 1179,
- /*   120 */  1005, 1180, 1191, 1190, 1189, 1267, 1294, 1293, 1005, 1005,
- /*   130 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   140 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   150 */  1005, 1005, 1005, 1005, 1005, 1036, 1286, 1276, 1032, 1032,
- /*   160 */  1005, 1276, 1276, 1276, 1276, 1276, 1276, 1272, 1108, 1099,
- /*   170 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   180 */  1005, 1264, 1262, 1005, 1224, 1005, 1005, 1005, 1005, 1005,
- /*   190 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   200 */  1005, 1005, 1005, 1005, 1005, 1104, 1005, 1005, 1005, 1005,
- /*   210 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1288, 1005,
- /*   220 */  1237, 1104, 1104, 1104, 1104, 1106, 1088, 1098, 1036, 1012,
- /*   230 */  1143, 1122, 1122, 1327, 1143, 1327, 1050, 1308, 1047, 1133,
- /*   240 */  1122, 1206, 1133, 1133, 1105, 1098, 1005, 1330, 1113, 1113,
- /*   250 */  1329, 1329, 1113, 1154, 1078, 1143, 1084, 1084, 1084, 1084,
- /*   260 */  1113, 1023, 1143, 1154, 1078, 1078, 1143, 1113, 1023, 1241,
- /*   270 */  1324, 1113, 1113, 1023, 1217, 1113, 1023, 1113, 1023, 1217,
- /*   280 */  1076, 1076, 1076, 1065, 1217, 1076, 1050, 1076, 1065, 1076,
- /*   290 */  1076, 1126, 1121, 1126, 1121, 1126, 1121, 1126, 1121, 1113,
- /*   300 */  1212, 1113, 1005, 1217, 1221, 1221, 1217, 1138, 1127, 1136,
- /*   310 */  1134, 1143, 1029, 1068, 1291, 1291, 1287, 1287, 1287, 1335,
- /*   320 */  1335, 1272, 1303, 1036, 1036, 1036, 1036, 1303, 1052, 1052,
- /*   330 */  1036, 1036, 1036, 1036, 1303, 1005, 1005, 1005, 1005, 1005,
- /*   340 */  1005, 1298, 1005, 1226, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   350 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   360 */  1005, 1005, 1159, 1005, 1008, 1269, 1005, 1005, 1268, 1005,
- /*   370 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   380 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1326,
- /*   390 */  1005, 1005, 1005, 1005, 1005, 1005, 1240, 1239, 1005, 1005,
- /*   400 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   410 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
- /*   420 */  1005, 1090, 1005, 1005, 1005, 1312, 1005, 1005, 1005, 1005,
- /*   430 */  1005, 1005, 1005, 1135, 1005, 1128, 1005, 1005, 1317, 1005,
- /*   440 */  1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1278,
- /*   450 */  1005, 1005, 1005, 1277, 1005, 1005, 1005, 1005, 1005, 1161,
- /*   460 */  1005, 1160, 1164, 1005, 1017, 1005,
+ /*     0 */  1297, 1349, 1221, 1014, 1119, 1221, 1221, 1221, 1221, 1014,
+ /*    10 */  1145, 1145, 1272, 1045, 1014, 1014, 1014, 1014, 1014, 1220,
+ /*    20 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*    30 */  1014, 1151, 1014, 1014, 1014, 1014, 1222, 1223, 1014, 1014,
+ /*    40 */  1014, 1271, 1273, 1161, 1160, 1159, 1158, 1254, 1132, 1156,
+ /*    50 */  1149, 1153, 1216, 1217, 1215, 1219, 1222, 1223, 1014, 1152,
+ /*    60 */  1186, 1200, 1185, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*    70 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*    80 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*    90 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   100 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1194,
+ /*   110 */  1199, 1206, 1198, 1195, 1188, 1187, 1189, 1190, 1014, 1035,
+ /*   120 */  1084, 1014, 1014, 1014, 1289, 1288, 1014, 1014, 1045, 1191,
+ /*   130 */  1192, 1203, 1202, 1201, 1279, 1305, 1304, 1014, 1014, 1014,
+ /*   140 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   150 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   160 */  1014, 1014, 1014, 1014, 1014, 1014, 1045, 1297, 1041, 1041,
+ /*   170 */  1014, 1284, 1119, 1110, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   180 */  1014, 1014, 1014, 1014, 1014, 1276, 1274, 1014, 1236, 1014,
+ /*   190 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   200 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   210 */  1014, 1014, 1014, 1115, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   220 */  1014, 1014, 1014, 1014, 1299, 1014, 1249, 1098, 1115, 1115,
+ /*   230 */  1115, 1115, 1117, 1099, 1097, 1109, 1045, 1021, 1155, 1134,
+ /*   240 */  1134, 1338, 1155, 1338, 1059, 1319, 1056, 1145, 1145, 1145,
+ /*   250 */  1134, 1218, 1116, 1109, 1014, 1341, 1124, 1124, 1340, 1340,
+ /*   260 */  1124, 1166, 1087, 1155, 1093, 1093, 1093, 1093, 1124, 1032,
+ /*   270 */  1155, 1166, 1087, 1087, 1155, 1124, 1032, 1253, 1335, 1124,
+ /*   280 */  1032, 1229, 1124, 1032, 1124, 1032, 1229, 1085, 1085, 1085,
+ /*   290 */  1074, 1229, 1085, 1059, 1085, 1074, 1085, 1085, 1229, 1233,
+ /*   300 */  1233, 1229, 1138, 1133, 1138, 1133, 1138, 1133, 1138, 1133,
+ /*   310 */  1124, 1224, 1124, 1014, 1150, 1139, 1148, 1146, 1155, 1038,
+ /*   320 */  1077, 1302, 1302, 1298, 1298, 1298, 1346, 1346, 1284, 1314,
+ /*   330 */  1045, 1045, 1045, 1045, 1314, 1061, 1061, 1045, 1045, 1045,
+ /*   340 */  1045, 1314, 1014, 1014, 1014, 1014, 1014, 1014, 1309, 1014,
+ /*   350 */  1238, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   360 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1171,
+ /*   370 */  1014, 1017, 1281, 1014, 1014, 1280, 1014, 1014, 1014, 1014,
+ /*   380 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   390 */  1014, 1014, 1014, 1014, 1014, 1014, 1337, 1014, 1014, 1014,
+ /*   400 */  1014, 1014, 1014, 1252, 1251, 1014, 1014, 1126, 1014, 1014,
+ /*   410 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   420 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   430 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   440 */  1014, 1014, 1147, 1014, 1140, 1014, 1014, 1014, 1014, 1328,
+ /*   450 */  1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ /*   460 */  1014, 1014, 1014, 1323, 1101, 1173, 1014, 1172, 1176, 1014,
+ /*   470 */  1026, 1014,
 };
 /********** End of lemon-generated parsing tables *****************************/
 
 /* The next table maps tokens (terminal symbols) into fallback tokens.  
 ** If a construct like the following:
 ** 
 **      %fallback ID X Y Z.
 **
@@ -140895,17 +140964,17 @@ static const char *const yyTokenName[] =
   /*  189 */ "defer_subclause_opt",
   /*  190 */ "orconf",
   /*  191 */ "resolvetype",
   /*  192 */ "raisetype",
   /*  193 */ "ifexists",
   /*  194 */ "fullname",
   /*  195 */ "selectnowith",
   /*  196 */ "oneselect",
-  /*  197 */ "with",
+  /*  197 */ "wqlist",
   /*  198 */ "multiselect_op",
   /*  199 */ "distinct",
   /*  200 */ "selcollist",
   /*  201 */ "from",
   /*  202 */ "where_opt",
   /*  203 */ "groupby_opt",
   /*  204 */ "having_opt",
   /*  205 */ "orderby_opt",
@@ -140917,49 +140986,49 @@ static const char *const yyTokenName[] =
   /*  211 */ "as",
   /*  212 */ "seltablist",
   /*  213 */ "stl_prefix",
   /*  214 */ "joinop",
   /*  215 */ "indexed_opt",
   /*  216 */ "on_opt",
   /*  217 */ "using_opt",
   /*  218 */ "idlist",
-  /*  219 */ "setlist",
-  /*  220 */ "insert_cmd",
-  /*  221 */ "idlist_opt",
-  /*  222 */ "likeop",
-  /*  223 */ "between_op",
-  /*  224 */ "in_op",
-  /*  225 */ "paren_exprlist",
-  /*  226 */ "case_operand",
-  /*  227 */ "case_exprlist",
-  /*  228 */ "case_else",
-  /*  229 */ "uniqueflag",
-  /*  230 */ "collate",
-  /*  231 */ "nmnum",
-  /*  232 */ "trigger_decl",
-  /*  233 */ "trigger_cmd_list",
-  /*  234 */ "trigger_time",
-  /*  235 */ "trigger_event",
-  /*  236 */ "foreach_clause",
-  /*  237 */ "when_clause",
-  /*  238 */ "trigger_cmd",
-  /*  239 */ "trnm",
-  /*  240 */ "tridxby",
-  /*  241 */ "database_kw_opt",
-  /*  242 */ "key_opt",
-  /*  243 */ "add_column_fullname",
-  /*  244 */ "kwcolumn_opt",
-  /*  245 */ "create_vtab",
-  /*  246 */ "vtabarglist",
-  /*  247 */ "vtabarg",
-  /*  248 */ "vtabargtoken",
-  /*  249 */ "lp",
-  /*  250 */ "anylist",
-  /*  251 */ "wqlist",
+  /*  219 */ "with",
+  /*  220 */ "setlist",
+  /*  221 */ "insert_cmd",
+  /*  222 */ "idlist_opt",
+  /*  223 */ "likeop",
+  /*  224 */ "between_op",
+  /*  225 */ "in_op",
+  /*  226 */ "paren_exprlist",
+  /*  227 */ "case_operand",
+  /*  228 */ "case_exprlist",
+  /*  229 */ "case_else",
+  /*  230 */ "uniqueflag",
+  /*  231 */ "collate",
+  /*  232 */ "nmnum",
+  /*  233 */ "trigger_decl",
+  /*  234 */ "trigger_cmd_list",
+  /*  235 */ "trigger_time",
+  /*  236 */ "trigger_event",
+  /*  237 */ "foreach_clause",
+  /*  238 */ "when_clause",
+  /*  239 */ "trigger_cmd",
+  /*  240 */ "trnm",
+  /*  241 */ "tridxby",
+  /*  242 */ "database_kw_opt",
+  /*  243 */ "key_opt",
+  /*  244 */ "add_column_fullname",
+  /*  245 */ "kwcolumn_opt",
+  /*  246 */ "create_vtab",
+  /*  247 */ "vtabarglist",
+  /*  248 */ "vtabarg",
+  /*  249 */ "vtabargtoken",
+  /*  250 */ "lp",
+  /*  251 */ "anylist",
 };
 #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
 
 #ifndef NDEBUG
 /* For tracing reduce actions, the names of all rules are required.
 */
 static const char *const yyRuleName[] = {
  /*   0 */ "explain ::= EXPLAIN",
@@ -141037,266 +141106,269 @@ static const char *const yyRuleName[] = 
  /*  72 */ "resolvetype ::= IGNORE",
  /*  73 */ "resolvetype ::= REPLACE",
  /*  74 */ "cmd ::= DROP TABLE ifexists fullname",
  /*  75 */ "ifexists ::= IF EXISTS",
  /*  76 */ "ifexists ::=",
  /*  77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
  /*  78 */ "cmd ::= DROP VIEW ifexists fullname",
  /*  79 */ "cmd ::= select",
- /*  80 */ "select ::= with selectnowith",
- /*  81 */ "selectnowith ::= selectnowith multiselect_op oneselect",
- /*  82 */ "multiselect_op ::= UNION",
- /*  83 */ "multiselect_op ::= UNION ALL",
- /*  84 */ "multiselect_op ::= EXCEPT|INTERSECT",
- /*  85 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
- /*  86 */ "values ::= VALUES LP nexprlist RP",
- /*  87 */ "values ::= values COMMA LP exprlist RP",
- /*  88 */ "distinct ::= DISTINCT",
- /*  89 */ "distinct ::= ALL",
- /*  90 */ "distinct ::=",
- /*  91 */ "sclp ::=",
- /*  92 */ "selcollist ::= sclp scanpt expr scanpt as",
- /*  93 */ "selcollist ::= sclp scanpt STAR",
- /*  94 */ "selcollist ::= sclp scanpt nm DOT STAR",
- /*  95 */ "as ::= AS nm",
- /*  96 */ "as ::=",
- /*  97 */ "from ::=",
- /*  98 */ "from ::= FROM seltablist",
- /*  99 */ "stl_prefix ::= seltablist joinop",
- /* 100 */ "stl_prefix ::=",
- /* 101 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
- /* 102 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
- /* 103 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
- /* 104 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
- /* 105 */ "dbnm ::=",
- /* 106 */ "dbnm ::= DOT nm",
- /* 107 */ "fullname ::= nm dbnm",
- /* 108 */ "joinop ::= COMMA|JOIN",
- /* 109 */ "joinop ::= JOIN_KW JOIN",
- /* 110 */ "joinop ::= JOIN_KW nm JOIN",
- /* 111 */ "joinop ::= JOIN_KW nm nm JOIN",
- /* 112 */ "on_opt ::= ON expr",
- /* 113 */ "on_opt ::=",
- /* 114 */ "indexed_opt ::=",
- /* 115 */ "indexed_opt ::= INDEXED BY nm",
- /* 116 */ "indexed_opt ::= NOT INDEXED",
- /* 117 */ "using_opt ::= USING LP idlist RP",
- /* 118 */ "using_opt ::=",
- /* 119 */ "orderby_opt ::=",
- /* 120 */ "orderby_opt ::= ORDER BY sortlist",
- /* 121 */ "sortlist ::= sortlist COMMA expr sortorder",
- /* 122 */ "sortlist ::= expr sortorder",
- /* 123 */ "sortorder ::= ASC",
- /* 124 */ "sortorder ::= DESC",
- /* 125 */ "sortorder ::=",
- /* 126 */ "groupby_opt ::=",
- /* 127 */ "groupby_opt ::= GROUP BY nexprlist",
- /* 128 */ "having_opt ::=",
- /* 129 */ "having_opt ::= HAVING expr",
- /* 130 */ "limit_opt ::=",
- /* 131 */ "limit_opt ::= LIMIT expr",
- /* 132 */ "limit_opt ::= LIMIT expr OFFSET expr",
- /* 133 */ "limit_opt ::= LIMIT expr COMMA expr",
- /* 134 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
- /* 135 */ "where_opt ::=",
- /* 136 */ "where_opt ::= WHERE expr",
- /* 137 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
- /* 138 */ "setlist ::= setlist COMMA nm EQ expr",
- /* 139 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
- /* 140 */ "setlist ::= nm EQ expr",
- /* 141 */ "setlist ::= LP idlist RP EQ expr",
- /* 142 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
- /* 143 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
- /* 144 */ "insert_cmd ::= INSERT orconf",
- /* 145 */ "insert_cmd ::= REPLACE",
- /* 146 */ "idlist_opt ::=",
- /* 147 */ "idlist_opt ::= LP idlist RP",
- /* 148 */ "idlist ::= idlist COMMA nm",
- /* 149 */ "idlist ::= nm",
- /* 150 */ "expr ::= LP expr RP",
- /* 151 */ "expr ::= ID|INDEXED",
- /* 152 */ "expr ::= JOIN_KW",
- /* 153 */ "expr ::= nm DOT nm",
- /* 154 */ "expr ::= nm DOT nm DOT nm",
- /* 155 */ "term ::= NULL|FLOAT|BLOB",
- /* 156 */ "term ::= STRING",
- /* 157 */ "term ::= INTEGER",
- /* 158 */ "expr ::= VARIABLE",
- /* 159 */ "expr ::= expr COLLATE ID|STRING",
- /* 160 */ "expr ::= CAST LP expr AS typetoken RP",
- /* 161 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
- /* 162 */ "expr ::= ID|INDEXED LP STAR RP",
- /* 163 */ "term ::= CTIME_KW",
- /* 164 */ "expr ::= LP nexprlist COMMA expr RP",
- /* 165 */ "expr ::= expr AND expr",
- /* 166 */ "expr ::= expr OR expr",
- /* 167 */ "expr ::= expr LT|GT|GE|LE expr",
- /* 168 */ "expr ::= expr EQ|NE expr",
- /* 169 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 170 */ "expr ::= expr PLUS|MINUS expr",
- /* 171 */ "expr ::= expr STAR|SLASH|REM expr",
- /* 172 */ "expr ::= expr CONCAT expr",
- /* 173 */ "likeop ::= NOT LIKE_KW|MATCH",
- /* 174 */ "expr ::= expr likeop expr",
- /* 175 */ "expr ::= expr likeop expr ESCAPE expr",
- /* 176 */ "expr ::= expr ISNULL|NOTNULL",
- /* 177 */ "expr ::= expr NOT NULL",
- /* 178 */ "expr ::= expr IS expr",
- /* 179 */ "expr ::= expr IS NOT expr",
- /* 180 */ "expr ::= NOT expr",
- /* 181 */ "expr ::= BITNOT expr",
- /* 182 */ "expr ::= MINUS expr",
- /* 183 */ "expr ::= PLUS expr",
- /* 184 */ "between_op ::= BETWEEN",
- /* 185 */ "between_op ::= NOT BETWEEN",
- /* 186 */ "expr ::= expr between_op expr AND expr",
- /* 187 */ "in_op ::= IN",
- /* 188 */ "in_op ::= NOT IN",
- /* 189 */ "expr ::= expr in_op LP exprlist RP",
- /* 190 */ "expr ::= LP select RP",
- /* 191 */ "expr ::= expr in_op LP select RP",
- /* 192 */ "expr ::= expr in_op nm dbnm paren_exprlist",
- /* 193 */ "expr ::= EXISTS LP select RP",
- /* 194 */ "expr ::= CASE case_operand case_exprlist case_else END",
- /* 195 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
- /* 196 */ "case_exprlist ::= WHEN expr THEN expr",
- /* 197 */ "case_else ::= ELSE expr",
- /* 198 */ "case_else ::=",
- /* 199 */ "case_operand ::= expr",
- /* 200 */ "case_operand ::=",
- /* 201 */ "exprlist ::=",
- /* 202 */ "nexprlist ::= nexprlist COMMA expr",
- /* 203 */ "nexprlist ::= expr",
- /* 204 */ "paren_exprlist ::=",
- /* 205 */ "paren_exprlist ::= LP exprlist RP",
- /* 206 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
- /* 207 */ "uniqueflag ::= UNIQUE",
- /* 208 */ "uniqueflag ::=",
- /* 209 */ "eidlist_opt ::=",
- /* 210 */ "eidlist_opt ::= LP eidlist RP",
- /* 211 */ "eidlist ::= eidlist COMMA nm collate sortorder",
- /* 212 */ "eidlist ::= nm collate sortorder",
- /* 213 */ "collate ::=",
- /* 214 */ "collate ::= COLLATE ID|STRING",
- /* 215 */ "cmd ::= DROP INDEX ifexists fullname",
- /* 216 */ "cmd ::= VACUUM",
- /* 217 */ "cmd ::= VACUUM nm",
- /* 218 */ "cmd ::= PRAGMA nm dbnm",
- /* 219 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
- /* 220 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
- /* 221 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
- /* 222 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
- /* 223 */ "plus_num ::= PLUS INTEGER|FLOAT",
- /* 224 */ "minus_num ::= MINUS INTEGER|FLOAT",
- /* 225 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
- /* 226 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
- /* 227 */ "trigger_time ::= BEFORE|AFTER",
- /* 228 */ "trigger_time ::= INSTEAD OF",
- /* 229 */ "trigger_time ::=",
- /* 230 */ "trigger_event ::= DELETE|INSERT",
- /* 231 */ "trigger_event ::= UPDATE",
- /* 232 */ "trigger_event ::= UPDATE OF idlist",
- /* 233 */ "when_clause ::=",
- /* 234 */ "when_clause ::= WHEN expr",
- /* 235 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
- /* 236 */ "trigger_cmd_list ::= trigger_cmd SEMI",
- /* 237 */ "trnm ::= nm DOT nm",
- /* 238 */ "tridxby ::= INDEXED BY nm",
- /* 239 */ "tridxby ::= NOT INDEXED",
- /* 240 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt",
- /* 241 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select scanpt",
- /* 242 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt",
- /* 243 */ "trigger_cmd ::= scanpt select scanpt",
- /* 244 */ "expr ::= RAISE LP IGNORE RP",
- /* 245 */ "expr ::= RAISE LP raisetype COMMA nm RP",
- /* 246 */ "raisetype ::= ROLLBACK",
- /* 247 */ "raisetype ::= ABORT",
- /* 248 */ "raisetype ::= FAIL",
- /* 249 */ "cmd ::= DROP TRIGGER ifexists fullname",
- /* 250 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
- /* 251 */ "cmd ::= DETACH database_kw_opt expr",
- /* 252 */ "key_opt ::=",
- /* 253 */ "key_opt ::= KEY expr",
- /* 254 */ "cmd ::= REINDEX",
- /* 255 */ "cmd ::= REINDEX nm dbnm",
- /* 256 */ "cmd ::= ANALYZE",
- /* 257 */ "cmd ::= ANALYZE nm dbnm",
- /* 258 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
- /* 259 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
- /* 260 */ "add_column_fullname ::= fullname",
- /* 261 */ "cmd ::= create_vtab",
- /* 262 */ "cmd ::= create_vtab LP vtabarglist RP",
- /* 263 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
- /* 264 */ "vtabarg ::=",
- /* 265 */ "vtabargtoken ::= ANY",
- /* 266 */ "vtabargtoken ::= lp anylist RP",
- /* 267 */ "lp ::= LP",
- /* 268 */ "with ::=",
- /* 269 */ "with ::= WITH wqlist",
- /* 270 */ "with ::= WITH RECURSIVE wqlist",
- /* 271 */ "wqlist ::= nm eidlist_opt AS LP select RP",
- /* 272 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
- /* 273 */ "input ::= cmdlist",
- /* 274 */ "cmdlist ::= cmdlist ecmd",
- /* 275 */ "cmdlist ::= ecmd",
- /* 276 */ "ecmd ::= SEMI",
- /* 277 */ "ecmd ::= explain cmdx SEMI",
- /* 278 */ "explain ::=",
- /* 279 */ "trans_opt ::=",
- /* 280 */ "trans_opt ::= TRANSACTION",
- /* 281 */ "trans_opt ::= TRANSACTION nm",
- /* 282 */ "savepoint_opt ::= SAVEPOINT",
- /* 283 */ "savepoint_opt ::=",
- /* 284 */ "cmd ::= create_table create_table_args",
- /* 285 */ "columnlist ::= columnlist COMMA columnname carglist",
- /* 286 */ "columnlist ::= columnname carglist",
- /* 287 */ "nm ::= ID|INDEXED",
- /* 288 */ "nm ::= STRING",
- /* 289 */ "nm ::= JOIN_KW",
- /* 290 */ "typetoken ::= typename",
- /* 291 */ "typename ::= ID|STRING",
- /* 292 */ "signed ::= plus_num",
- /* 293 */ "signed ::= minus_num",
- /* 294 */ "carglist ::= carglist ccons",
- /* 295 */ "carglist ::=",
- /* 296 */ "ccons ::= NULL onconf",
- /* 297 */ "conslist_opt ::= COMMA conslist",
- /* 298 */ "conslist ::= conslist tconscomma tcons",
- /* 299 */ "conslist ::= tcons",
- /* 300 */ "tconscomma ::=",
- /* 301 */ "defer_subclause_opt ::= defer_subclause",
- /* 302 */ "resolvetype ::= raisetype",
- /* 303 */ "selectnowith ::= oneselect",
- /* 304 */ "oneselect ::= values",
- /* 305 */ "sclp ::= selcollist COMMA",
- /* 306 */ "as ::= ID|STRING",
- /* 307 */ "expr ::= term",
- /* 308 */ "likeop ::= LIKE_KW|MATCH",
- /* 309 */ "exprlist ::= nexprlist",
- /* 310 */ "nmnum ::= plus_num",
- /* 311 */ "nmnum ::= nm",
- /* 312 */ "nmnum ::= ON",
- /* 313 */ "nmnum ::= DELETE",
- /* 314 */ "nmnum ::= DEFAULT",
- /* 315 */ "plus_num ::= INTEGER|FLOAT",
- /* 316 */ "foreach_clause ::=",
- /* 317 */ "foreach_clause ::= FOR EACH ROW",
- /* 318 */ "trnm ::= nm",
- /* 319 */ "tridxby ::=",
- /* 320 */ "database_kw_opt ::= DATABASE",
- /* 321 */ "database_kw_opt ::=",
- /* 322 */ "kwcolumn_opt ::=",
- /* 323 */ "kwcolumn_opt ::= COLUMNKW",
- /* 324 */ "vtabarglist ::= vtabarg",
- /* 325 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
- /* 326 */ "vtabarg ::= vtabarg vtabargtoken",
- /* 327 */ "anylist ::=",
- /* 328 */ "anylist ::= anylist LP anylist RP",
- /* 329 */ "anylist ::= anylist ANY",
+ /*  80 */ "select ::= WITH wqlist selectnowith",
+ /*  81 */ "select ::= WITH RECURSIVE wqlist selectnowith",
+ /*  82 */ "select ::= selectnowith",
+ /*  83 */ "selectnowith ::= selectnowith multiselect_op oneselect",
+ /*  84 */ "multiselect_op ::= UNION",
+ /*  85 */ "multiselect_op ::= UNION ALL",
+ /*  86 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /*  87 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /*  88 */ "values ::= VALUES LP nexprlist RP",
+ /*  89 */ "values ::= values COMMA LP exprlist RP",
+ /*  90 */ "distinct ::= DISTINCT",
+ /*  91 */ "distinct ::= ALL",
+ /*  92 */ "distinct ::=",
+ /*  93 */ "sclp ::=",
+ /*  94 */ "selcollist ::= sclp scanpt expr scanpt as",
+ /*  95 */ "selcollist ::= sclp scanpt STAR",
+ /*  96 */ "selcollist ::= sclp scanpt nm DOT STAR",
+ /*  97 */ "as ::= AS nm",
+ /*  98 */ "as ::=",
+ /*  99 */ "from ::=",
+ /* 100 */ "from ::= FROM seltablist",
+ /* 101 */ "stl_prefix ::= seltablist joinop",
+ /* 102 */ "stl_prefix ::=",
+ /* 103 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
+ /* 104 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
+ /* 105 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
+ /* 106 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
+ /* 107 */ "dbnm ::=",
+ /* 108 */ "dbnm ::= DOT nm",
+ /* 109 */ "fullname ::= nm",
+ /* 110 */ "fullname ::= nm DOT nm",
+ /* 111 */ "joinop ::= COMMA|JOIN",
+ /* 112 */ "joinop ::= JOIN_KW JOIN",
+ /* 113 */ "joinop ::= JOIN_KW nm JOIN",
+ /* 114 */ "joinop ::= JOIN_KW nm nm JOIN",
+ /* 115 */ "on_opt ::= ON expr",
+ /* 116 */ "on_opt ::=",
+ /* 117 */ "indexed_opt ::=",
+ /* 118 */ "indexed_opt ::= INDEXED BY nm",
+ /* 119 */ "indexed_opt ::= NOT INDEXED",
+ /* 120 */ "using_opt ::= USING LP idlist RP",
+ /* 121 */ "using_opt ::=",
+ /* 122 */ "orderby_opt ::=",
+ /* 123 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 124 */ "sortlist ::= sortlist COMMA expr sortorder",
+ /* 125 */ "sortlist ::= expr sortorder",
+ /* 126 */ "sortorder ::= ASC",
+ /* 127 */ "sortorder ::= DESC",
+ /* 128 */ "sortorder ::=",
+ /* 129 */ "groupby_opt ::=",
+ /* 130 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 131 */ "having_opt ::=",
+ /* 132 */ "having_opt ::= HAVING expr",
+ /* 133 */ "limit_opt ::=",
+ /* 134 */ "limit_opt ::= LIMIT expr",
+ /* 135 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 136 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 137 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
+ /* 138 */ "where_opt ::=",
+ /* 139 */ "where_opt ::= WHERE expr",
+ /* 140 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
+ /* 141 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 142 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
+ /* 143 */ "setlist ::= nm EQ expr",
+ /* 144 */ "setlist ::= LP idlist RP EQ expr",
+ /* 145 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
+ /* 146 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
+ /* 147 */ "insert_cmd ::= INSERT orconf",
+ /* 148 */ "insert_cmd ::= REPLACE",
+ /* 149 */ "idlist_opt ::=",
+ /* 150 */ "idlist_opt ::= LP idlist RP",
+ /* 151 */ "idlist ::= idlist COMMA nm",
+ /* 152 */ "idlist ::= nm",
+ /* 153 */ "expr ::= LP expr RP",
+ /* 154 */ "expr ::= ID|INDEXED",
+ /* 155 */ "expr ::= JOIN_KW",
+ /* 156 */ "expr ::= nm DOT nm",
+ /* 157 */ "expr ::= nm DOT nm DOT nm",
+ /* 158 */ "term ::= NULL|FLOAT|BLOB",
+ /* 159 */ "term ::= STRING",
+ /* 160 */ "term ::= INTEGER",
+ /* 161 */ "expr ::= VARIABLE",
+ /* 162 */ "expr ::= expr COLLATE ID|STRING",
+ /* 163 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 164 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
+ /* 165 */ "expr ::= ID|INDEXED LP STAR RP",
+ /* 166 */ "term ::= CTIME_KW",
+ /* 167 */ "expr ::= LP nexprlist COMMA expr RP",
+ /* 168 */ "expr ::= expr AND expr",
+ /* 169 */ "expr ::= expr OR expr",
+ /* 170 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 171 */ "expr ::= expr EQ|NE expr",
+ /* 172 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 173 */ "expr ::= expr PLUS|MINUS expr",
+ /* 174 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 175 */ "expr ::= expr CONCAT expr",
+ /* 176 */ "likeop ::= NOT LIKE_KW|MATCH",
+ /* 177 */ "expr ::= expr likeop expr",
+ /* 178 */ "expr ::= expr likeop expr ESCAPE expr",
+ /* 179 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 180 */ "expr ::= expr NOT NULL",
+ /* 181 */ "expr ::= expr IS expr",
+ /* 182 */ "expr ::= expr IS NOT expr",
+ /* 183 */ "expr ::= NOT expr",
+ /* 184 */ "expr ::= BITNOT expr",
+ /* 185 */ "expr ::= MINUS expr",
+ /* 186 */ "expr ::= PLUS expr",
+ /* 187 */ "between_op ::= BETWEEN",
+ /* 188 */ "between_op ::= NOT BETWEEN",
+ /* 189 */ "expr ::= expr between_op expr AND expr",
+ /* 190 */ "in_op ::= IN",
+ /* 191 */ "in_op ::= NOT IN",
+ /* 192 */ "expr ::= expr in_op LP exprlist RP",
+ /* 193 */ "expr ::= LP select RP",
+ /* 194 */ "expr ::= expr in_op LP select RP",
+ /* 195 */ "expr ::= expr in_op nm dbnm paren_exprlist",
+ /* 196 */ "expr ::= EXISTS LP select RP",
+ /* 197 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 198 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 199 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 200 */ "case_else ::= ELSE expr",
+ /* 201 */ "case_else ::=",
+ /* 202 */ "case_operand ::= expr",
+ /* 203 */ "case_operand ::=",
+ /* 204 */ "exprlist ::=",
+ /* 205 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 206 */ "nexprlist ::= expr",
+ /* 207 */ "paren_exprlist ::=",
+ /* 208 */ "paren_exprlist ::= LP exprlist RP",
+ /* 209 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
+ /* 210 */ "uniqueflag ::= UNIQUE",
+ /* 211 */ "uniqueflag ::=",
+ /* 212 */ "eidlist_opt ::=",
+ /* 213 */ "eidlist_opt ::= LP eidlist RP",
+ /* 214 */ "eidlist ::= eidlist COMMA nm collate sortorder",
+ /* 215 */ "eidlist ::= nm collate sortorder",
+ /* 216 */ "collate ::=",
+ /* 217 */ "collate ::= COLLATE ID|STRING",
+ /* 218 */ "cmd ::= DROP INDEX ifexists fullname",
+ /* 219 */ "cmd ::= VACUUM",
+ /* 220 */ "cmd ::= VACUUM nm",
+ /* 221 */ "cmd ::= PRAGMA nm dbnm",
+ /* 222 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
+ /* 223 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
+ /* 224 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
+ /* 225 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
+ /* 226 */ "plus_num ::= PLUS INTEGER|FLOAT",
+ /* 227 */ "minus_num ::= MINUS INTEGER|FLOAT",
+ /* 228 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
+ /* 229 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
+ /* 230 */ "trigger_time ::= BEFORE|AFTER",
+ /* 231 */ "trigger_time ::= INSTEAD OF",
+ /* 232 */ "trigger_time ::=",
+ /* 233 */ "trigger_event ::= DELETE|INSERT",
+ /* 234 */ "trigger_event ::= UPDATE",
+ /* 235 */ "trigger_event ::= UPDATE OF idlist",
+ /* 236 */ "when_clause ::=",
+ /* 237 */ "when_clause ::= WHEN expr",
+ /* 238 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
+ /* 239 */ "trigger_cmd_list ::= trigger_cmd SEMI",
+ /* 240 */ "trnm ::= nm DOT nm",
+ /* 241 */ "tridxby ::= INDEXED BY nm",
+ /* 242 */ "tridxby ::= NOT INDEXED",
+ /* 243 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt",
+ /* 244 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select scanpt",
+ /* 245 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt",
+ /* 246 */ "trigger_cmd ::= scanpt select scanpt",
+ /* 247 */ "expr ::= RAISE LP IGNORE RP",
+ /* 248 */ "expr ::= RAISE LP raisetype COMMA nm RP",
+ /* 249 */ "raisetype ::= ROLLBACK",
+ /* 250 */ "raisetype ::= ABORT",
+ /* 251 */ "raisetype ::= FAIL",
+ /* 252 */ "cmd ::= DROP TRIGGER ifexists fullname",
+ /* 253 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
+ /* 254 */ "cmd ::= DETACH database_kw_opt expr",
+ /* 255 */ "key_opt ::=",
+ /* 256 */ "key_opt ::= KEY expr",
+ /* 257 */ "cmd ::= REINDEX",
+ /* 258 */ "cmd ::= REINDEX nm dbnm",
+ /* 259 */ "cmd ::= ANALYZE",
+ /* 260 */ "cmd ::= ANALYZE nm dbnm",
+ /* 261 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
+ /* 262 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
+ /* 263 */ "add_column_fullname ::= fullname",
+ /* 264 */ "cmd ::= create_vtab",
+ /* 265 */ "cmd ::= create_vtab LP vtabarglist RP",
+ /* 266 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
+ /* 267 */ "vtabarg ::=",
+ /* 268 */ "vtabargtoken ::= ANY",
+ /* 269 */ "vtabargtoken ::= lp anylist RP",
+ /* 270 */ "lp ::= LP",
+ /* 271 */ "with ::= WITH wqlist",
+ /* 272 */ "with ::= WITH RECURSIVE wqlist",
+ /* 273 */ "wqlist ::= nm eidlist_opt AS LP select RP",
+ /* 274 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
+ /* 275 */ "input ::= cmdlist",
+ /* 276 */ "cmdlist ::= cmdlist ecmd",
+ /* 277 */ "cmdlist ::= ecmd",
+ /* 278 */ "ecmd ::= SEMI",
+ /* 279 */ "ecmd ::= explain cmdx SEMI",
+ /* 280 */ "explain ::=",
+ /* 281 */ "trans_opt ::=",
+ /* 282 */ "trans_opt ::= TRANSACTION",
+ /* 283 */ "trans_opt ::= TRANSACTION nm",
+ /* 284 */ "savepoint_opt ::= SAVEPOINT",
+ /* 285 */ "savepoint_opt ::=",
+ /* 286 */ "cmd ::= create_table create_table_args",
+ /* 287 */ "columnlist ::= columnlist COMMA columnname carglist",
+ /* 288 */ "columnlist ::= columnname carglist",
+ /* 289 */ "nm ::= ID|INDEXED",
+ /* 290 */ "nm ::= STRING",
+ /* 291 */ "nm ::= JOIN_KW",
+ /* 292 */ "typetoken ::= typename",
+ /* 293 */ "typename ::= ID|STRING",
+ /* 294 */ "signed ::= plus_num",
+ /* 295 */ "signed ::= minus_num",
+ /* 296 */ "carglist ::= carglist ccons",
+ /* 297 */ "carglist ::=",
+ /* 298 */ "ccons ::= NULL onconf",
+ /* 299 */ "conslist_opt ::= COMMA conslist",
+ /* 300 */ "conslist ::= conslist tconscomma tcons",
+ /* 301 */ "conslist ::= tcons",
+ /* 302 */ "tconscomma ::=",
+ /* 303 */ "defer_subclause_opt ::= defer_subclause",
+ /* 304 */ "resolvetype ::= raisetype",
+ /* 305 */ "selectnowith ::= oneselect",
+ /* 306 */ "oneselect ::= values",
+ /* 307 */ "sclp ::= selcollist COMMA",
+ /* 308 */ "as ::= ID|STRING",
+ /* 309 */ "expr ::= term",
+ /* 310 */ "likeop ::= LIKE_KW|MATCH",
+ /* 311 */ "exprlist ::= nexprlist",
+ /* 312 */ "nmnum ::= plus_num",
+ /* 313 */ "nmnum ::= nm",
+ /* 314 */ "nmnum ::= ON",
+ /* 315 */ "nmnum ::= DELETE",
+ /* 316 */ "nmnum ::= DEFAULT",
+ /* 317 */ "plus_num ::= INTEGER|FLOAT",
+ /* 318 */ "foreach_clause ::=",
+ /* 319 */ "foreach_clause ::= FOR EACH ROW",
+ /* 320 */ "trnm ::= nm",
+ /* 321 */ "tridxby ::=",
+ /* 322 */ "database_kw_opt ::= DATABASE",
+ /* 323 */ "database_kw_opt ::=",
+ /* 324 */ "kwcolumn_opt ::=",
+ /* 325 */ "kwcolumn_opt ::= COLUMNKW",
+ /* 326 */ "vtabarglist ::= vtabarg",
+ /* 327 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
+ /* 328 */ "vtabarg ::= vtabarg vtabargtoken",
+ /* 329 */ "anylist ::=",
+ /* 330 */ "anylist ::= anylist LP anylist RP",
+ /* 331 */ "anylist ::= anylist ANY",
+ /* 332 */ "with ::=",
 };
 #endif /* NDEBUG */
 
 
 #if YYSTACKDEPTH<=0
 /*
 ** Try to increase the size of the parser stack.  Return the number
 ** of errors.  Return 0 on success.
@@ -141420,68 +141492,67 @@ static void yy_destructor(
 sqlite3SelectDelete(pParse->db, (yypminor->yy387));
 }
       break;
     case 173: /* term */
     case 174: /* expr */
     case 202: /* where_opt */
     case 204: /* having_opt */
     case 216: /* on_opt */
-    case 226: /* case_operand */
-    case 228: /* case_else */
-    case 237: /* when_clause */
-    case 242: /* key_opt */
+    case 227: /* case_operand */
+    case 229: /* case_else */
+    case 238: /* when_clause */
+    case 243: /* key_opt */
 {
 sqlite3ExprDelete(pParse->db, (yypminor->yy314));
 }
       break;
     case 178: /* eidlist_opt */
     case 187: /* sortlist */
     case 188: /* eidlist */
     case 200: /* selcollist */
     case 203: /* groupby_opt */
     case 205: /* orderby_opt */
     case 208: /* nexprlist */
     case 209: /* exprlist */
     case 210: /* sclp */
-    case 219: /* setlist */
-    case 225: /* paren_exprlist */
-    case 227: /* case_exprlist */
+    case 220: /* setlist */
+    case 226: /* paren_exprlist */
+    case 228: /* case_exprlist */
 {
 sqlite3ExprListDelete(pParse->db, (yypminor->yy322));
 }
       break;
     case 194: /* fullname */
     case 201: /* from */
     case 212: /* seltablist */
     case 213: /* stl_prefix */
 {
 sqlite3SrcListDelete(pParse->db, (yypminor->yy259));
 }
       break;
-    case 197: /* with */
-    case 251: /* wqlist */
+    case 197: /* wqlist */
 {
 sqlite3WithDelete(pParse->db, (yypminor->yy451));
 }
       break;
     case 217: /* using_opt */
     case 218: /* idlist */
-    case 221: /* idlist_opt */
+    case 222: /* idlist_opt */
 {
 sqlite3IdListDelete(pParse->db, (yypminor->yy384));
 }
       break;
-    case 233: /* trigger_cmd_list */
-    case 238: /* trigger_cmd */
+    case 234: /* trigger_cmd_list */
+    case 239: /* trigger_cmd */
 {
 sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy203));
 }
       break;
-    case 235: /* trigger_event */
+    case 236: /* trigger_event */
 {
 sqlite3IdListDelete(pParse->db, (yypminor->yy90).b);
 }
       break;
 /********* End destructor definitions *****************************************/
     default:  break;   /* If no destructor action specified: do nothing */
   }
 }
@@ -141850,266 +141921,269 @@ static const struct {
   {  191,   -1 }, /* (72) resolvetype ::= IGNORE */
   {  191,   -1 }, /* (73) resolvetype ::= REPLACE */
   {  149,   -4 }, /* (74) cmd ::= DROP TABLE ifexists fullname */
   {  193,   -2 }, /* (75) ifexists ::= IF EXISTS */
   {  193,    0 }, /* (76) ifexists ::= */
   {  149,   -9 }, /* (77) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
   {  149,   -4 }, /* (78) cmd ::= DROP VIEW ifexists fullname */
   {  149,   -1 }, /* (79) cmd ::= select */
-  {  163,   -2 }, /* (80) select ::= with selectnowith */
-  {  195,   -3 }, /* (81) selectnowith ::= selectnowith multiselect_op oneselect */
-  {  198,   -1 }, /* (82) multiselect_op ::= UNION */
-  {  198,   -2 }, /* (83) multiselect_op ::= UNION ALL */
-  {  198,   -1 }, /* (84) multiselect_op ::= EXCEPT|INTERSECT */
-  {  196,   -9 }, /* (85) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
-  {  207,   -4 }, /* (86) values ::= VALUES LP nexprlist RP */
-  {  207,   -5 }, /* (87) values ::= values COMMA LP exprlist RP */
-  {  199,   -1 }, /* (88) distinct ::= DISTINCT */
-  {  199,   -1 }, /* (89) distinct ::= ALL */
-  {  199,    0 }, /* (90) distinct ::= */
-  {  210,    0 }, /* (91) sclp ::= */
-  {  200,   -5 }, /* (92) selcollist ::= sclp scanpt expr scanpt as */
-  {  200,   -3 }, /* (93) selcollist ::= sclp scanpt STAR */
-  {  200,   -5 }, /* (94) selcollist ::= sclp scanpt nm DOT STAR */
-  {  211,   -2 }, /* (95) as ::= AS nm */
-  {  211,    0 }, /* (96) as ::= */
-  {  201,    0 }, /* (97) from ::= */
-  {  201,   -2 }, /* (98) from ::= FROM seltablist */
-  {  213,   -2 }, /* (99) stl_prefix ::= seltablist joinop */
-  {  213,    0 }, /* (100) stl_prefix ::= */
-  {  212,   -7 }, /* (101) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
-  {  212,   -9 }, /* (102) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
-  {  212,   -7 }, /* (103) seltablist ::= stl_prefix LP select RP as on_opt using_opt */
-  {  212,   -7 }, /* (104) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
-  {  159,    0 }, /* (105) dbnm ::= */
-  {  159,   -2 }, /* (106) dbnm ::= DOT nm */
-  {  194,   -2 }, /* (107) fullname ::= nm dbnm */
-  {  214,   -1 }, /* (108) joinop ::= COMMA|JOIN */
-  {  214,   -2 }, /* (109) joinop ::= JOIN_KW JOIN */
-  {  214,   -3 }, /* (110) joinop ::= JOIN_KW nm JOIN */
-  {  214,   -4 }, /* (111) joinop ::= JOIN_KW nm nm JOIN */
-  {  216,   -2 }, /* (112) on_opt ::= ON expr */
-  {  216,    0 }, /* (113) on_opt ::= */
-  {  215,    0 }, /* (114) indexed_opt ::= */
-  {  215,   -3 }, /* (115) indexed_opt ::= INDEXED BY nm */
-  {  215,   -2 }, /* (116) indexed_opt ::= NOT INDEXED */
-  {  217,   -4 }, /* (117) using_opt ::= USING LP idlist RP */
-  {  217,    0 }, /* (118) using_opt ::= */
-  {  205,    0 }, /* (119) orderby_opt ::= */
-  {  205,   -3 }, /* (120) orderby_opt ::= ORDER BY sortlist */
-  {  187,   -4 }, /* (121) sortlist ::= sortlist COMMA expr sortorder */
-  {  187,   -2 }, /* (122) sortlist ::= expr sortorder */
-  {  176,   -1 }, /* (123) sortorder ::= ASC */
-  {  176,   -1 }, /* (124) sortorder ::= DESC */
-  {  176,    0 }, /* (125) sortorder ::= */
-  {  203,    0 }, /* (126) groupby_opt ::= */
-  {  203,   -3 }, /* (127) groupby_opt ::= GROUP BY nexprlist */
-  {  204,    0 }, /* (128) having_opt ::= */
-  {  204,   -2 }, /* (129) having_opt ::= HAVING expr */
-  {  206,    0 }, /* (130) limit_opt ::= */
-  {  206,   -2 }, /* (131) limit_opt ::= LIMIT expr */
-  {  206,   -4 }, /* (132) limit_opt ::= LIMIT expr OFFSET expr */
-  {  206,   -4 }, /* (133) limit_opt ::= LIMIT expr COMMA expr */
-  {  149,   -6 }, /* (134) cmd ::= with DELETE FROM fullname indexed_opt where_opt */
-  {  202,    0 }, /* (135) where_opt ::= */
-  {  202,   -2 }, /* (136) where_opt ::= WHERE expr */
-  {  149,   -8 }, /* (137) cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
-  {  219,   -5 }, /* (138) setlist ::= setlist COMMA nm EQ expr */
-  {  219,   -7 }, /* (139) setlist ::= setlist COMMA LP idlist RP EQ expr */
-  {  219,   -3 }, /* (140) setlist ::= nm EQ expr */
-  {  219,   -5 }, /* (141) setlist ::= LP idlist RP EQ expr */
-  {  149,   -6 }, /* (142) cmd ::= with insert_cmd INTO fullname idlist_opt select */
-  {  149,   -7 }, /* (143) cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
-  {  220,   -2 }, /* (144) insert_cmd ::= INSERT orconf */
-  {  220,   -1 }, /* (145) insert_cmd ::= REPLACE */
-  {  221,    0 }, /* (146) idlist_opt ::= */
-  {  221,   -3 }, /* (147) idlist_opt ::= LP idlist RP */
-  {  218,   -3 }, /* (148) idlist ::= idlist COMMA nm */
-  {  218,   -1 }, /* (149) idlist ::= nm */
-  {  174,   -3 }, /* (150) expr ::= LP expr RP */
-  {  174,   -1 }, /* (151) expr ::= ID|INDEXED */
-  {  174,   -1 }, /* (152) expr ::= JOIN_KW */
-  {  174,   -3 }, /* (153) expr ::= nm DOT nm */
-  {  174,   -5 }, /* (154) expr ::= nm DOT nm DOT nm */
-  {  173,   -1 }, /* (155) term ::= NULL|FLOAT|BLOB */
-  {  173,   -1 }, /* (156) term ::= STRING */
-  {  173,   -1 }, /* (157) term ::= INTEGER */
-  {  174,   -1 }, /* (158) expr ::= VARIABLE */
-  {  174,   -3 }, /* (159) expr ::= expr COLLATE ID|STRING */
-  {  174,   -6 }, /* (160) expr ::= CAST LP expr AS typetoken RP */
-  {  174,   -5 }, /* (161) expr ::= ID|INDEXED LP distinct exprlist RP */
-  {  174,   -4 }, /* (162) expr ::= ID|INDEXED LP STAR RP */
-  {  173,   -1 }, /* (163) term ::= CTIME_KW */
-  {  174,   -5 }, /* (164) expr ::= LP nexprlist COMMA expr RP */
-  {  174,   -3 }, /* (165) expr ::= expr AND expr */
-  {  174,   -3 }, /* (166) expr ::= expr OR expr */
-  {  174,   -3 }, /* (167) expr ::= expr LT|GT|GE|LE expr */
-  {  174,   -3 }, /* (168) expr ::= expr EQ|NE expr */
-  {  174,   -3 }, /* (169) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
-  {  174,   -3 }, /* (170) expr ::= expr PLUS|MINUS expr */
-  {  174,   -3 }, /* (171) expr ::= expr STAR|SLASH|REM expr */
-  {  174,   -3 }, /* (172) expr ::= expr CONCAT expr */
-  {  222,   -2 }, /* (173) likeop ::= NOT LIKE_KW|MATCH */
-  {  174,   -3 }, /* (174) expr ::= expr likeop expr */
-  {  174,   -5 }, /* (175) expr ::= expr likeop expr ESCAPE expr */
-  {  174,   -2 }, /* (176) expr ::= expr ISNULL|NOTNULL */
-  {  174,   -3 }, /* (177) expr ::= expr NOT NULL */
-  {  174,   -3 }, /* (178) expr ::= expr IS expr */
-  {  174,   -4 }, /* (179) expr ::= expr IS NOT expr */
-  {  174,   -2 }, /* (180) expr ::= NOT expr */
-  {  174,   -2 }, /* (181) expr ::= BITNOT expr */
-  {  174,   -2 }, /* (182) expr ::= MINUS expr */
-  {  174,   -2 }, /* (183) expr ::= PLUS expr */
-  {  223,   -1 }, /* (184) between_op ::= BETWEEN */
-  {  223,   -2 }, /* (185) between_op ::= NOT BETWEEN */
-  {  174,   -5 }, /* (186) expr ::= expr between_op expr AND expr */
-  {  224,   -1 }, /* (187) in_op ::= IN */
-  {  224,   -2 }, /* (188) in_op ::= NOT IN */
-  {  174,   -5 }, /* (189) expr ::= expr in_op LP exprlist RP */
-  {  174,   -3 }, /* (190) expr ::= LP select RP */
-  {  174,   -5 }, /* (191) expr ::= expr in_op LP select RP */
-  {  174,   -5 }, /* (192) expr ::= expr in_op nm dbnm paren_exprlist */
-  {  174,   -4 }, /* (193) expr ::= EXISTS LP select RP */
-  {  174,   -5 }, /* (194) expr ::= CASE case_operand case_exprlist case_else END */
-  {  227,   -5 }, /* (195) case_exprlist ::= case_exprlist WHEN expr THEN expr */
-  {  227,   -4 }, /* (196) case_exprlist ::= WHEN expr THEN expr */
-  {  228,   -2 }, /* (197) case_else ::= ELSE expr */
-  {  228,    0 }, /* (198) case_else ::= */
-  {  226,   -1 }, /* (199) case_operand ::= expr */
-  {  226,    0 }, /* (200) case_operand ::= */
-  {  209,    0 }, /* (201) exprlist ::= */
-  {  208,   -3 }, /* (202) nexprlist ::= nexprlist COMMA expr */
-  {  208,   -1 }, /* (203) nexprlist ::= expr */
-  {  225,    0 }, /* (204) paren_exprlist ::= */
-  {  225,   -3 }, /* (205) paren_exprlist ::= LP exprlist RP */
-  {  149,  -12 }, /* (206) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
-  {  229,   -1 }, /* (207) uniqueflag ::= UNIQUE */
-  {  229,    0 }, /* (208) uniqueflag ::= */
-  {  178,    0 }, /* (209) eidlist_opt ::= */
-  {  178,   -3 }, /* (210) eidlist_opt ::= LP eidlist RP */
-  {  188,   -5 }, /* (211) eidlist ::= eidlist COMMA nm collate sortorder */
-  {  188,   -3 }, /* (212) eidlist ::= nm collate sortorder */
-  {  230,    0 }, /* (213) collate ::= */
-  {  230,   -2 }, /* (214) collate ::= COLLATE ID|STRING */
-  {  149,   -4 }, /* (215) cmd ::= DROP INDEX ifexists fullname */
-  {  149,   -1 }, /* (216) cmd ::= VACUUM */
-  {  149,   -2 }, /* (217) cmd ::= VACUUM nm */
-  {  149,   -3 }, /* (218) cmd ::= PRAGMA nm dbnm */
-  {  149,   -5 }, /* (219) cmd ::= PRAGMA nm dbnm EQ nmnum */
-  {  149,   -6 }, /* (220) cmd ::= PRAGMA nm dbnm LP nmnum RP */
-  {  149,   -5 }, /* (221) cmd ::= PRAGMA nm dbnm EQ minus_num */
-  {  149,   -6 }, /* (222) cmd ::= PRAGMA nm dbnm LP minus_num RP */
-  {  169,   -2 }, /* (223) plus_num ::= PLUS INTEGER|FLOAT */
-  {  170,   -2 }, /* (224) minus_num ::= MINUS INTEGER|FLOAT */
-  {  149,   -5 }, /* (225) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
-  {  232,  -11 }, /* (226) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
-  {  234,   -1 }, /* (227) trigger_time ::= BEFORE|AFTER */
-  {  234,   -2 }, /* (228) trigger_time ::= INSTEAD OF */
-  {  234,    0 }, /* (229) trigger_time ::= */
-  {  235,   -1 }, /* (230) trigger_event ::= DELETE|INSERT */
-  {  235,   -1 }, /* (231) trigger_event ::= UPDATE */
-  {  235,   -3 }, /* (232) trigger_event ::= UPDATE OF idlist */
-  {  237,    0 }, /* (233) when_clause ::= */
-  {  237,   -2 }, /* (234) when_clause ::= WHEN expr */
-  {  233,   -3 }, /* (235) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
-  {  233,   -2 }, /* (236) trigger_cmd_list ::= trigger_cmd SEMI */
-  {  239,   -3 }, /* (237) trnm ::= nm DOT nm */
-  {  240,   -3 }, /* (238) tridxby ::= INDEXED BY nm */
-  {  240,   -2 }, /* (239) tridxby ::= NOT INDEXED */
-  {  238,   -8 }, /* (240) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */
-  {  238,   -7 }, /* (241) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select scanpt */
-  {  238,   -6 }, /* (242) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
-  {  238,   -3 }, /* (243) trigger_cmd ::= scanpt select scanpt */
-  {  174,   -4 }, /* (244) expr ::= RAISE LP IGNORE RP */
-  {  174,   -6 }, /* (245) expr ::= RAISE LP raisetype COMMA nm RP */
-  {  192,   -1 }, /* (246) raisetype ::= ROLLBACK */
-  {  192,   -1 }, /* (247) raisetype ::= ABORT */
-  {  192,   -1 }, /* (248) raisetype ::= FAIL */
-  {  149,   -4 }, /* (249) cmd ::= DROP TRIGGER ifexists fullname */
-  {  149,   -6 }, /* (250) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
-  {  149,   -3 }, /* (251) cmd ::= DETACH database_kw_opt expr */
-  {  242,    0 }, /* (252) key_opt ::= */
-  {  242,   -2 }, /* (253) key_opt ::= KEY expr */
-  {  149,   -1 }, /* (254) cmd ::= REINDEX */
-  {  149,   -3 }, /* (255) cmd ::= REINDEX nm dbnm */
-  {  149,   -1 }, /* (256) cmd ::= ANALYZE */
-  {  149,   -3 }, /* (257) cmd ::= ANALYZE nm dbnm */
-  {  149,   -6 }, /* (258) cmd ::= ALTER TABLE fullname RENAME TO nm */
-  {  149,   -7 }, /* (259) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
-  {  243,   -1 }, /* (260) add_column_fullname ::= fullname */
-  {  149,   -1 }, /* (261) cmd ::= create_vtab */
-  {  149,   -4 }, /* (262) cmd ::= create_vtab LP vtabarglist RP */
-  {  245,   -8 }, /* (263) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
-  {  247,    0 }, /* (264) vtabarg ::= */
-  {  248,   -1 }, /* (265) vtabargtoken ::= ANY */
-  {  248,   -3 }, /* (266) vtabargtoken ::= lp anylist RP */
-  {  249,   -1 }, /* (267) lp ::= LP */
-  {  197,    0 }, /* (268) with ::= */
-  {  197,   -2 }, /* (269) with ::= WITH wqlist */
-  {  197,   -3 }, /* (270) with ::= WITH RECURSIVE wqlist */
-  {  251,   -6 }, /* (271) wqlist ::= nm eidlist_opt AS LP select RP */
-  {  251,   -8 }, /* (272) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
-  {  144,   -1 }, /* (273) input ::= cmdlist */
-  {  145,   -2 }, /* (274) cmdlist ::= cmdlist ecmd */
-  {  145,   -1 }, /* (275) cmdlist ::= ecmd */
-  {  146,   -1 }, /* (276) ecmd ::= SEMI */
-  {  146,   -3 }, /* (277) ecmd ::= explain cmdx SEMI */
-  {  147,    0 }, /* (278) explain ::= */
-  {  151,    0 }, /* (279) trans_opt ::= */
-  {  151,   -1 }, /* (280) trans_opt ::= TRANSACTION */
-  {  151,   -2 }, /* (281) trans_opt ::= TRANSACTION nm */
-  {  153,   -1 }, /* (282) savepoint_opt ::= SAVEPOINT */
-  {  153,    0 }, /* (283) savepoint_opt ::= */
-  {  149,   -2 }, /* (284) cmd ::= create_table create_table_args */
-  {  160,   -4 }, /* (285) columnlist ::= columnlist COMMA columnname carglist */
-  {  160,   -2 }, /* (286) columnlist ::= columnname carglist */
-  {  152,   -1 }, /* (287) nm ::= ID|INDEXED */
-  {  152,   -1 }, /* (288) nm ::= STRING */
-  {  152,   -1 }, /* (289) nm ::= JOIN_KW */
-  {  166,   -1 }, /* (290) typetoken ::= typename */
-  {  167,   -1 }, /* (291) typename ::= ID|STRING */
-  {  168,   -1 }, /* (292) signed ::= plus_num */
-  {  168,   -1 }, /* (293) signed ::= minus_num */
-  {  165,   -2 }, /* (294) carglist ::= carglist ccons */
-  {  165,    0 }, /* (295) carglist ::= */
-  {  172,   -2 }, /* (296) ccons ::= NULL onconf */
-  {  161,   -2 }, /* (297) conslist_opt ::= COMMA conslist */
-  {  184,   -3 }, /* (298) conslist ::= conslist tconscomma tcons */
-  {  184,   -1 }, /* (299) conslist ::= tcons */
-  {  185,    0 }, /* (300) tconscomma ::= */
-  {  189,   -1 }, /* (301) defer_subclause_opt ::= defer_subclause */
-  {  191,   -1 }, /* (302) resolvetype ::= raisetype */
-  {  195,   -1 }, /* (303) selectnowith ::= oneselect */
-  {  196,   -1 }, /* (304) oneselect ::= values */
-  {  210,   -2 }, /* (305) sclp ::= selcollist COMMA */
-  {  211,   -1 }, /* (306) as ::= ID|STRING */
-  {  174,   -1 }, /* (307) expr ::= term */
-  {  222,   -1 }, /* (308) likeop ::= LIKE_KW|MATCH */
-  {  209,   -1 }, /* (309) exprlist ::= nexprlist */
-  {  231,   -1 }, /* (310) nmnum ::= plus_num */
-  {  231,   -1 }, /* (311) nmnum ::= nm */
-  {  231,   -1 }, /* (312) nmnum ::= ON */
-  {  231,   -1 }, /* (313) nmnum ::= DELETE */
-  {  231,   -1 }, /* (314) nmnum ::= DEFAULT */
-  {  169,   -1 }, /* (315) plus_num ::= INTEGER|FLOAT */
-  {  236,    0 }, /* (316) foreach_clause ::= */
-  {  236,   -3 }, /* (317) foreach_clause ::= FOR EACH ROW */
-  {  239,   -1 }, /* (318) trnm ::= nm */
-  {  240,    0 }, /* (319) tridxby ::= */
-  {  241,   -1 }, /* (320) database_kw_opt ::= DATABASE */
-  {  241,    0 }, /* (321) database_kw_opt ::= */
-  {  244,    0 }, /* (322) kwcolumn_opt ::= */
-  {  244,   -1 }, /* (323) kwcolumn_opt ::= COLUMNKW */
-  {  246,   -1 }, /* (324) vtabarglist ::= vtabarg */
-  {  246,   -3 }, /* (325) vtabarglist ::= vtabarglist COMMA vtabarg */
-  {  247,   -2 }, /* (326) vtabarg ::= vtabarg vtabargtoken */
-  {  250,    0 }, /* (327) anylist ::= */
-  {  250,   -4 }, /* (328) anylist ::= anylist LP anylist RP */
-  {  250,   -2 }, /* (329) anylist ::= anylist ANY */
+  {  163,   -3 }, /* (80) select ::= WITH wqlist selectnowith */
+  {  163,   -4 }, /* (81) select ::= WITH RECURSIVE wqlist selectnowith */
+  {  163,   -1 }, /* (82) select ::= selectnowith */
+  {  195,   -3 }, /* (83) selectnowith ::= selectnowith multiselect_op oneselect */
+  {  198,   -1 }, /* (84) multiselect_op ::= UNION */
+  {  198,   -2 }, /* (85) multiselect_op ::= UNION ALL */
+  {  198,   -1 }, /* (86) multiselect_op ::= EXCEPT|INTERSECT */
+  {  196,   -9 }, /* (87) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+  {  207,   -4 }, /* (88) values ::= VALUES LP nexprlist RP */
+  {  207,   -5 }, /* (89) values ::= values COMMA LP exprlist RP */
+  {  199,   -1 }, /* (90) distinct ::= DISTINCT */
+  {  199,   -1 }, /* (91) distinct ::= ALL */
+  {  199,    0 }, /* (92) distinct ::= */
+  {  210,    0 }, /* (93) sclp ::= */
+  {  200,   -5 }, /* (94) selcollist ::= sclp scanpt expr scanpt as */
+  {  200,   -3 }, /* (95) selcollist ::= sclp scanpt STAR */
+  {  200,   -5 }, /* (96) selcollist ::= sclp scanpt nm DOT STAR */
+  {  211,   -2 }, /* (97) as ::= AS nm */
+  {  211,    0 }, /* (98) as ::= */
+  {  201,    0 }, /* (99) from ::= */
+  {  201,   -2 }, /* (100) from ::= FROM seltablist */
+  {  213,   -2 }, /* (101) stl_prefix ::= seltablist joinop */
+  {  213,    0 }, /* (102) stl_prefix ::= */
+  {  212,   -7 }, /* (103) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+  {  212,   -9 }, /* (104) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+  {  212,   -7 }, /* (105) seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+  {  212,   -7 }, /* (106) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+  {  159,    0 }, /* (107) dbnm ::= */
+  {  159,   -2 }, /* (108) dbnm ::= DOT nm */
+  {  194,   -1 }, /* (109) fullname ::= nm */
+  {  194,   -3 }, /* (110) fullname ::= nm DOT nm */
+  {  214,   -1 }, /* (111) joinop ::= COMMA|JOIN */
+  {  214,   -2 }, /* (112) joinop ::= JOIN_KW JOIN */
+  {  214,   -3 }, /* (113) joinop ::= JOIN_KW nm JOIN */
+  {  214,   -4 }, /* (114) joinop ::= JOIN_KW nm nm JOIN */
+  {  216,   -2 }, /* (115) on_opt ::= ON expr */
+  {  216,    0 }, /* (116) on_opt ::= */
+  {  215,    0 }, /* (117) indexed_opt ::= */
+  {  215,   -3 }, /* (118) indexed_opt ::= INDEXED BY nm */
+  {  215,   -2 }, /* (119) indexed_opt ::= NOT INDEXED */
+  {  217,   -4 }, /* (120) using_opt ::= USING LP idlist RP */
+  {  217,    0 }, /* (121) using_opt ::= */
+  {  205,    0 }, /* (122) orderby_opt ::= */
+  {  205,   -3 }, /* (123) orderby_opt ::= ORDER BY sortlist */
+  {  187,   -4 }, /* (124) sortlist ::= sortlist COMMA expr sortorder */
+  {  187,   -2 }, /* (125) sortlist ::= expr sortorder */
+  {  176,   -1 }, /* (126) sortorder ::= ASC */
+  {  176,   -1 }, /* (127) sortorder ::= DESC */
+  {  176,    0 }, /* (128) sortorder ::= */
+  {  203,    0 }, /* (129) groupby_opt ::= */
+  {  203,   -3 }, /* (130) groupby_opt ::= GROUP BY nexprlist */
+  {  204,    0 }, /* (131) having_opt ::= */
+  {  204,   -2 }, /* (132) having_opt ::= HAVING expr */
+  {  206,    0 }, /* (133) limit_opt ::= */
+  {  206,   -2 }, /* (134) limit_opt ::= LIMIT expr */
+  {  206,   -4 }, /* (135) limit_opt ::= LIMIT expr OFFSET expr */
+  {  206,   -4 }, /* (136) limit_opt ::= LIMIT expr COMMA expr */
+  {  149,   -6 }, /* (137) cmd ::= with DELETE FROM fullname indexed_opt where_opt */
+  {  202,    0 }, /* (138) where_opt ::= */
+  {  202,   -2 }, /* (139) where_opt ::= WHERE expr */
+  {  149,   -8 }, /* (140) cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
+  {  220,   -5 }, /* (141) setlist ::= setlist COMMA nm EQ expr */
+  {  220,   -7 }, /* (142) setlist ::= setlist COMMA LP idlist RP EQ expr */
+  {  220,   -3 }, /* (143) setlist ::= nm EQ expr */
+  {  220,   -5 }, /* (144) setlist ::= LP idlist RP EQ expr */
+  {  149,   -6 }, /* (145) cmd ::= with insert_cmd INTO fullname idlist_opt select */
+  {  149,   -7 }, /* (146) cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
+  {  221,   -2 }, /* (147) insert_cmd ::= INSERT orconf */
+  {  221,   -1 }, /* (148) insert_cmd ::= REPLACE */
+  {  222,    0 }, /* (149) idlist_opt ::= */
+  {  222,   -3 }, /* (150) idlist_opt ::= LP idlist RP */
+  {  218,   -3 }, /* (151) idlist ::= idlist COMMA nm */
+  {  218,   -1 }, /* (152) idlist ::= nm */
+  {  174,   -3 }, /* (153) expr ::= LP expr RP */
+  {  174,   -1 }, /* (154) expr ::= ID|INDEXED */
+  {  174,   -1 }, /* (155) expr ::= JOIN_KW */
+  {  174,   -3 }, /* (156) expr ::= nm DOT nm */
+  {  174,   -5 }, /* (157) expr ::= nm DOT nm DOT nm */
+  {  173,   -1 }, /* (158) term ::= NULL|FLOAT|BLOB */
+  {  173,   -1 }, /* (159) term ::= STRING */
+  {  173,   -1 }, /* (160) term ::= INTEGER */
+  {  174,   -1 }, /* (161) expr ::= VARIABLE */
+  {  174,   -3 }, /* (162) expr ::= expr COLLATE ID|STRING */
+  {  174,   -6 }, /* (163) expr ::= CAST LP expr AS typetoken RP */
+  {  174,   -5 }, /* (164) expr ::= ID|INDEXED LP distinct exprlist RP */
+  {  174,   -4 }, /* (165) expr ::= ID|INDEXED LP STAR RP */
+  {  173,   -1 }, /* (166) term ::= CTIME_KW */
+  {  174,   -5 }, /* (167) expr ::= LP nexprlist COMMA expr RP */
+  {  174,   -3 }, /* (168) expr ::= expr AND expr */
+  {  174,   -3 }, /* (169) expr ::= expr OR expr */
+  {  174,   -3 }, /* (170) expr ::= expr LT|GT|GE|LE expr */
+  {  174,   -3 }, /* (171) expr ::= expr EQ|NE expr */
+  {  174,   -3 }, /* (172) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
+  {  174,   -3 }, /* (173) expr ::= expr PLUS|MINUS expr */
+  {  174,   -3 }, /* (174) expr ::= expr STAR|SLASH|REM expr */
+  {  174,   -3 }, /* (175) expr ::= expr CONCAT expr */
+  {  223,   -2 }, /* (176) likeop ::= NOT LIKE_KW|MATCH */
+  {  174,   -3 }, /* (177) expr ::= expr likeop expr */
+  {  174,   -5 }, /* (178) expr ::= expr likeop expr ESCAPE expr */
+  {  174,   -2 }, /* (179) expr ::= expr ISNULL|NOTNULL */
+  {  174,   -3 }, /* (180) expr ::= expr NOT NULL */
+  {  174,   -3 }, /* (181) expr ::= expr IS expr */
+  {  174,   -4 }, /* (182) expr ::= expr IS NOT expr */
+  {  174,   -2 }, /* (183) expr ::= NOT expr */
+  {  174,   -2 }, /* (184) expr ::= BITNOT expr */
+  {  174,   -2 }, /* (185) expr ::= MINUS expr */
+  {  174,   -2 }, /* (186) expr ::= PLUS expr */
+  {  224,   -1 }, /* (187) between_op ::= BETWEEN */
+  {  224,   -2 }, /* (188) between_op ::= NOT BETWEEN */
+  {  174,   -5 }, /* (189) expr ::= expr between_op expr AND expr */
+  {  225,   -1 }, /* (190) in_op ::= IN */
+  {  225,   -2 }, /* (191) in_op ::= NOT IN */
+  {  174,   -5 }, /* (192) expr ::= expr in_op LP exprlist RP */
+  {  174,   -3 }, /* (193) expr ::= LP select RP */
+  {  174,   -5 }, /* (194) expr ::= expr in_op LP select RP */
+  {  174,   -5 }, /* (195) expr ::= expr in_op nm dbnm paren_exprlist */
+  {  174,   -4 }, /* (196) expr ::= EXISTS LP select RP */
+  {  174,   -5 }, /* (197) expr ::= CASE case_operand case_exprlist case_else END */
+  {  228,   -5 }, /* (198) case_exprlist ::= case_exprlist WHEN expr THEN expr */
+  {  228,   -4 }, /* (199) case_exprlist ::= WHEN expr THEN expr */
+  {  229,   -2 }, /* (200) case_else ::= ELSE expr */
+  {  229,    0 }, /* (201) case_else ::= */
+  {  227,   -1 }, /* (202) case_operand ::= expr */
+  {  227,    0 }, /* (203) case_operand ::= */
+  {  209,    0 }, /* (204) exprlist ::= */
+  {  208,   -3 }, /* (205) nexprlist ::= nexprlist COMMA expr */
+  {  208,   -1 }, /* (206) nexprlist ::= expr */
+  {  226,    0 }, /* (207) paren_exprlist ::= */
+  {  226,   -3 }, /* (208) paren_exprlist ::= LP exprlist RP */
+  {  149,  -12 }, /* (209) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+  {  230,   -1 }, /* (210) uniqueflag ::= UNIQUE */
+  {  230,    0 }, /* (211) uniqueflag ::= */
+  {  178,    0 }, /* (212) eidlist_opt ::= */
+  {  178,   -3 }, /* (213) eidlist_opt ::= LP eidlist RP */
+  {  188,   -5 }, /* (214) eidlist ::= eidlist COMMA nm collate sortorder */
+  {  188,   -3 }, /* (215) eidlist ::= nm collate sortorder */
+  {  231,    0 }, /* (216) collate ::= */
+  {  231,   -2 }, /* (217) collate ::= COLLATE ID|STRING */
+  {  149,   -4 }, /* (218) cmd ::= DROP INDEX ifexists fullname */
+  {  149,   -1 }, /* (219) cmd ::= VACUUM */
+  {  149,   -2 }, /* (220) cmd ::= VACUUM nm */
+  {  149,   -3 }, /* (221) cmd ::= PRAGMA nm dbnm */
+  {  149,   -5 }, /* (222) cmd ::= PRAGMA nm dbnm EQ nmnum */
+  {  149,   -6 }, /* (223) cmd ::= PRAGMA nm dbnm LP nmnum RP */
+  {  149,   -5 }, /* (224) cmd ::= PRAGMA nm dbnm EQ minus_num */
+  {  149,   -6 }, /* (225) cmd ::= PRAGMA nm dbnm LP minus_num RP */
+  {  169,   -2 }, /* (226) plus_num ::= PLUS INTEGER|FLOAT */
+  {  170,   -2 }, /* (227) minus_num ::= MINUS INTEGER|FLOAT */
+  {  149,   -5 }, /* (228) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+  {  233,  -11 }, /* (229) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+  {  235,   -1 }, /* (230) trigger_time ::= BEFORE|AFTER */
+  {  235,   -2 }, /* (231) trigger_time ::= INSTEAD OF */
+  {  235,    0 }, /* (232) trigger_time ::= */
+  {  236,   -1 }, /* (233) trigger_event ::= DELETE|INSERT */
+  {  236,   -1 }, /* (234) trigger_event ::= UPDATE */
+  {  236,   -3 }, /* (235) trigger_event ::= UPDATE OF idlist */
+  {  238,    0 }, /* (236) when_clause ::= */
+  {  238,   -2 }, /* (237) when_clause ::= WHEN expr */
+  {  234,   -3 }, /* (238) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+  {  234,   -2 }, /* (239) trigger_cmd_list ::= trigger_cmd SEMI */
+  {  240,   -3 }, /* (240) trnm ::= nm DOT nm */
+  {  241,   -3 }, /* (241) tridxby ::= INDEXED BY nm */
+  {  241,   -2 }, /* (242) tridxby ::= NOT INDEXED */
+  {  239,   -8 }, /* (243) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */
+  {  239,   -7 }, /* (244) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select scanpt */
+  {  239,   -6 }, /* (245) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+  {  239,   -3 }, /* (246) trigger_cmd ::= scanpt select scanpt */
+  {  174,   -4 }, /* (247) expr ::= RAISE LP IGNORE RP */
+  {  174,   -6 }, /* (248) expr ::= RAISE LP raisetype COMMA nm RP */
+  {  192,   -1 }, /* (249) raisetype ::= ROLLBACK */
+  {  192,   -1 }, /* (250) raisetype ::= ABORT */
+  {  192,   -1 }, /* (251) raisetype ::= FAIL */
+  {  149,   -4 }, /* (252) cmd ::= DROP TRIGGER ifexists fullname */
+  {  149,   -6 }, /* (253) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+  {  149,   -3 }, /* (254) cmd ::= DETACH database_kw_opt expr */
+  {  243,    0 }, /* (255) key_opt ::= */
+  {  243,   -2 }, /* (256) key_opt ::= KEY expr */
+  {  149,   -1 }, /* (257) cmd ::= REINDEX */
+  {  149,   -3 }, /* (258) cmd ::= REINDEX nm dbnm */
+  {  149,   -1 }, /* (259) cmd ::= ANALYZE */
+  {  149,   -3 }, /* (260) cmd ::= ANALYZE nm dbnm */
+  {  149,   -6 }, /* (261) cmd ::= ALTER TABLE fullname RENAME TO nm */
+  {  149,   -7 }, /* (262) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+  {  244,   -1 }, /* (263) add_column_fullname ::= fullname */
+  {  149,   -1 }, /* (264) cmd ::= create_vtab */
+  {  149,   -4 }, /* (265) cmd ::= create_vtab LP vtabarglist RP */
+  {  246,   -8 }, /* (266) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+  {  248,    0 }, /* (267) vtabarg ::= */
+  {  249,   -1 }, /* (268) vtabargtoken ::= ANY */
+  {  249,   -3 }, /* (269) vtabargtoken ::= lp anylist RP */
+  {  250,   -1 }, /* (270) lp ::= LP */
+  {  219,   -2 }, /* (271) with ::= WITH wqlist */
+  {  219,   -3 }, /* (272) with ::= WITH RECURSIVE wqlist */
+  {  197,   -6 }, /* (273) wqlist ::= nm eidlist_opt AS LP select RP */
+  {  197,   -8 }, /* (274) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+  {  144,   -1 }, /* (275) input ::= cmdlist */
+  {  145,   -2 }, /* (276) cmdlist ::= cmdlist ecmd */
+  {  145,   -1 }, /* (277) cmdlist ::= ecmd */
+  {  146,   -1 }, /* (278) ecmd ::= SEMI */
+  {  146,   -3 }, /* (279) ecmd ::= explain cmdx SEMI */
+  {  147,    0 }, /* (280) explain ::= */
+  {  151,    0 }, /* (281) trans_opt ::= */
+  {  151,   -1 }, /* (282) trans_opt ::= TRANSACTION */
+  {  151,   -2 }, /* (283) trans_opt ::= TRANSACTION nm */
+  {  153,   -1 }, /* (284) savepoint_opt ::= SAVEPOINT */
+  {  153,    0 }, /* (285) savepoint_opt ::= */
+  {  149,   -2 }, /* (286) cmd ::= create_table create_table_args */
+  {  160,   -4 }, /* (287) columnlist ::= columnlist COMMA columnname carglist */
+  {  160,   -2 }, /* (288) columnlist ::= columnname carglist */
+  {  152,   -1 }, /* (289) nm ::= ID|INDEXED */
+  {  152,   -1 }, /* (290) nm ::= STRING */
+  {  152,   -1 }, /* (291) nm ::= JOIN_KW */
+  {  166,   -1 }, /* (292) typetoken ::= typename */
+  {  167,   -1 }, /* (293) typename ::= ID|STRING */
+  {  168,   -1 }, /* (294) signed ::= plus_num */
+  {  168,   -1 }, /* (295) signed ::= minus_num */
+  {  165,   -2 }, /* (296) carglist ::= carglist ccons */
+  {  165,    0 }, /* (297) carglist ::= */
+  {  172,   -2 }, /* (298) ccons ::= NULL onconf */
+  {  161,   -2 }, /* (299) conslist_opt ::= COMMA conslist */
+  {  184,   -3 }, /* (300) conslist ::= conslist tconscomma tcons */
+  {  184,   -1 }, /* (301) conslist ::= tcons */
+  {  185,    0 }, /* (302) tconscomma ::= */
+  {  189,   -1 }, /* (303) defer_subclause_opt ::= defer_subclause */
+  {  191,   -1 }, /* (304) resolvetype ::= raisetype */
+  {  195,   -1 }, /* (305) selectnowith ::= oneselect */
+  {  196,   -1 }, /* (306) oneselect ::= values */
+  {  210,   -2 }, /* (307) sclp ::= selcollist COMMA */
+  {  211,   -1 }, /* (308) as ::= ID|STRING */
+  {  174,   -1 }, /* (309) expr ::= term */
+  {  223,   -1 }, /* (310) likeop ::= LIKE_KW|MATCH */
+  {  209,   -1 }, /* (311) exprlist ::= nexprlist */
+  {  232,   -1 }, /* (312) nmnum ::= plus_num */
+  {  232,   -1 }, /* (313) nmnum ::= nm */
+  {  232,   -1 }, /* (314) nmnum ::= ON */
+  {  232,   -1 }, /* (315) nmnum ::= DELETE */
+  {  232,   -1 }, /* (316) nmnum ::= DEFAULT */
+  {  169,   -1 }, /* (317) plus_num ::= INTEGER|FLOAT */
+  {  237,    0 }, /* (318) foreach_clause ::= */
+  {  237,   -3 }, /* (319) foreach_clause ::= FOR EACH ROW */
+  {  240,   -1 }, /* (320) trnm ::= nm */
+  {  241,    0 }, /* (321) tridxby ::= */
+  {  242,   -1 }, /* (322) database_kw_opt ::= DATABASE */
+  {  242,    0 }, /* (323) database_kw_opt ::= */
+  {  245,    0 }, /* (324) kwcolumn_opt ::= */
+  {  245,   -1 }, /* (325) kwcolumn_opt ::= COLUMNKW */
+  {  247,   -1 }, /* (326) vtabarglist ::= vtabarg */
+  {  247,   -3 }, /* (327) vtabarglist ::= vtabarglist COMMA vtabarg */
+  {  248,   -2 }, /* (328) vtabarg ::= vtabarg vtabargtoken */
+  {  251,    0 }, /* (329) anylist ::= */
+  {  251,   -4 }, /* (330) anylist ::= anylist LP anylist RP */
+  {  251,   -2 }, /* (331) anylist ::= anylist ANY */
+  {  219,    0 }, /* (332) with ::= */
 };
 
 static void yy_accept(yyParser*);  /* Forward Declaration */
 
 /*
 ** Perform a reduce action and the shift that must immediately
 ** follow the reduce.
 **
@@ -142233,18 +142307,18 @@ static void yy_reduce(
         break;
       case 15: /* ifnotexists ::= */
       case 18: /* temp ::= */ yytestcase(yyruleno==18);
       case 21: /* table_options ::= */ yytestcase(yyruleno==21);
       case 42: /* autoinc ::= */ yytestcase(yyruleno==42);
       case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57);
       case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67);
       case 76: /* ifexists ::= */ yytestcase(yyruleno==76);
-      case 90: /* distinct ::= */ yytestcase(yyruleno==90);
-      case 213: /* collate ::= */ yytestcase(yyruleno==213);
+      case 92: /* distinct ::= */ yytestcase(yyruleno==92);
+      case 216: /* collate ::= */ yytestcase(yyruleno==216);
 {yymsp[1].minor.yy4 = 0;}
         break;
       case 16: /* ifnotexists ::= IF NOT EXISTS */
 {yymsp[-2].minor.yy4 = 1;}
         break;
       case 17: /* temp ::= TEMP */
       case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43);
 {yymsp[0].minor.yy4 = 1;}
@@ -142270,17 +142344,17 @@ static void yy_reduce(
   }
 }
         break;
       case 23: /* columnname ::= nm typetoken */
 {sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
         break;
       case 24: /* typetoken ::= */
       case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60);
-      case 96: /* as ::= */ yytestcase(yyruleno==96);
+      case 98: /* as ::= */ yytestcase(yyruleno==98);
 {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
         break;
       case 25: /* typetoken ::= typename LP signed RP */
 {
   yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z);
 }
         break;
       case 26: /* typetoken ::= typename LP signed COMMA signed RP */
@@ -142381,24 +142455,24 @@ static void yy_reduce(
       case 54: /* refact ::= NO ACTION */
 { yymsp[-1].minor.yy4 = OE_None;     /* EV: R-33326-45252 */}
         break;
       case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
 {yymsp[-2].minor.yy4 = 0;}
         break;
       case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
       case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71);
-      case 144: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==144);
+      case 147: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==147);
 {yymsp[-1].minor.yy4 = yymsp[0].minor.yy4;}
         break;
       case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
       case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75);
-      case 185: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==185);
-      case 188: /* in_op ::= NOT IN */ yytestcase(yyruleno==188);
-      case 214: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==214);
+      case 188: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==188);
+      case 191: /* in_op ::= NOT IN */ yytestcase(yyruleno==191);
+      case 217: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==217);
 {yymsp[-1].minor.yy4 = 1;}
         break;
       case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
 {yymsp[-1].minor.yy4 = 0;}
         break;
       case 61: /* tconscomma ::= COMMA */
 {pParse->constraintName.n = 0;}
         break;
@@ -142424,17 +142498,17 @@ static void yy_reduce(
         break;
       case 69: /* onconf ::= ON CONFLICT resolvetype */
 {yymsp[-2].minor.yy4 = yymsp[0].minor.yy4;}
         break;
       case 72: /* resolvetype ::= IGNORE */
 {yymsp[0].minor.yy4 = OE_Ignore;}
         break;
       case 73: /* resolvetype ::= REPLACE */
-      case 145: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==145);
+      case 148: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==148);
 {yymsp[0].minor.yy4 = OE_Replace;}
         break;
       case 74: /* cmd ::= DROP TABLE ifexists fullname */
 {
   sqlite3DropTable(pParse, yymsp[0].minor.yy259, 0, yymsp[-1].minor.yy4);
 }
         break;
       case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
@@ -142449,29 +142523,50 @@ static void yy_reduce(
         break;
       case 79: /* cmd ::= select */
 {
   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
   sqlite3Select(pParse, yymsp[0].minor.yy387, &dest);
   sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy387);
 }
         break;
-      case 80: /* select ::= with selectnowith */
+      case 80: /* select ::= WITH wqlist selectnowith */
 {
   Select *p = yymsp[0].minor.yy387;
   if( p ){
     p->pWith = yymsp[-1].minor.yy451;
     parserDoubleLinkSelect(pParse, p);
   }else{
     sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy451);
   }
-  yymsp[-1].minor.yy387 = p; /*A-overwrites-W*/
-}
-        break;
-      case 81: /* selectnowith ::= selectnowith multiselect_op oneselect */
+  yymsp[-2].minor.yy387 = p;
+}
+        break;
+      case 81: /* select ::= WITH RECURSIVE wqlist selectnowith */
+{
+  Select *p = yymsp[0].minor.yy387;
+  if( p ){
+    p->pWith = yymsp[-1].minor.yy451;
+    parserDoubleLinkSelect(pParse, p);
+  }else{
+    sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy451);
+  }
+  yymsp[-3].minor.yy387 = p;
+}
+        break;
+      case 82: /* select ::= selectnowith */
+{
+  Select *p = yymsp[0].minor.yy387;
+  if( p ){
+    parserDoubleLinkSelect(pParse, p);
+  }
+  yymsp[0].minor.yy387 = p; /*A-overwrites-X*/
+}
+        break;
+      case 83: /* selectnowith ::= selectnowith multiselect_op oneselect */
 {
   Select *pRhs = yymsp[0].minor.yy387;
   Select *pLhs = yymsp[-2].minor.yy387;
   if( pRhs && pRhs->pPrior ){
     SrcList *pFrom;
     Token x;
     x.n = 0;
     parserDoubleLinkSelect(pParse, pRhs);
@@ -142485,24 +142580,24 @@ static void yy_reduce(
     pRhs->selFlags &= ~SF_MultiValue;
     if( yymsp[-1].minor.yy4!=TK_ALL ) pParse->hasCompound = 1;
   }else{
     sqlite3SelectDelete(pParse->db, pLhs);
   }
   yymsp[-2].minor.yy387 = pRhs;
 }
         break;
-      case 82: /* multiselect_op ::= UNION */
-      case 84: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==84);
+      case 84: /* multiselect_op ::= UNION */
+      case 86: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==86);
 {yymsp[0].minor.yy4 = yymsp[0].major; /*A-overwrites-OP*/}
         break;
-      case 83: /* multiselect_op ::= UNION ALL */
+      case 85: /* multiselect_op ::= UNION ALL */
 {yymsp[-1].minor.yy4 = TK_ALL;}
         break;
-      case 85: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+      case 87: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
 {
 #if SELECTTRACE_ENABLED
   Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/
 #endif
   yymsp[-8].minor.yy387 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy322,yymsp[-5].minor.yy259,yymsp[-4].minor.yy314,yymsp[-3].minor.yy322,yymsp[-2].minor.yy314,yymsp[-1].minor.yy322,yymsp[-7].minor.yy4,yymsp[0].minor.yy314);
 #if SELECTTRACE_ENABLED
   /* Populate the Select.zSelName[] string that is used to help with
   ** query planner debugging, to differentiate between multiple Select
@@ -142523,111 +142618,111 @@ static void yy_reduce(
       while( z[0]==' ' ) z++;
       for(i=0; sqlite3Isalnum(z[i]); i++){}
       sqlite3_snprintf(sizeof(yymsp[-8].minor.yy387->zSelName), yymsp[-8].minor.yy387->zSelName, "%.*s", i, z);
     }
   }
 #endif /* SELECTRACE_ENABLED */
 }
         break;
-      case 86: /* values ::= VALUES LP nexprlist RP */
+      case 88: /* values ::= VALUES LP nexprlist RP */
 {
   yymsp[-3].minor.yy387 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values,0);
 }
         break;
-      case 87: /* values ::= values COMMA LP exprlist RP */
+      case 89: /* values ::= values COMMA LP exprlist RP */
 {
   Select *pRight, *pLeft = yymsp[-4].minor.yy387;
   pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values|SF_MultiValue,0);
   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
   if( pRight ){
     pRight->op = TK_ALL;
     pRight->pPrior = pLeft;
     yymsp[-4].minor.yy387 = pRight;
   }else{
     yymsp[-4].minor.yy387 = pLeft;
   }
 }
         break;
-      case 88: /* distinct ::= DISTINCT */
+      case 90: /* distinct ::= DISTINCT */
 {yymsp[0].minor.yy4 = SF_Distinct;}
         break;
-      case 89: /* distinct ::= ALL */
+      case 91: /* distinct ::= ALL */
 {yymsp[0].minor.yy4 = SF_All;}
         break;
-      case 91: /* sclp ::= */
-      case 119: /* orderby_opt ::= */ yytestcase(yyruleno==119);
-      case 126: /* groupby_opt ::= */ yytestcase(yyruleno==126);
-      case 201: /* exprlist ::= */ yytestcase(yyruleno==201);
-      case 204: /* paren_exprlist ::= */ yytestcase(yyruleno==204);
-      case 209: /* eidlist_opt ::= */ yytestcase(yyruleno==209);
+      case 93: /* sclp ::= */
+      case 122: /* orderby_opt ::= */ yytestcase(yyruleno==122);
+      case 129: /* groupby_opt ::= */ yytestcase(yyruleno==129);
+      case 204: /* exprlist ::= */ yytestcase(yyruleno==204);
+      case 207: /* paren_exprlist ::= */ yytestcase(yyruleno==207);
+      case 212: /* eidlist_opt ::= */ yytestcase(yyruleno==212);
 {yymsp[1].minor.yy322 = 0;}
         break;
-      case 92: /* selcollist ::= sclp scanpt expr scanpt as */
+      case 94: /* selcollist ::= sclp scanpt expr scanpt as */
 {
    yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[-2].minor.yy314);
    if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[0].minor.yy0, 1);
    sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy322,yymsp[-3].minor.yy336,yymsp[-1].minor.yy336);
 }
         break;
-      case 93: /* selcollist ::= sclp scanpt STAR */
+      case 95: /* selcollist ::= sclp scanpt STAR */
 {
   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
   yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy322, p);
 }
         break;
-      case 94: /* selcollist ::= sclp scanpt nm DOT STAR */
+      case 96: /* selcollist ::= sclp scanpt nm DOT STAR */
 {
   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
   yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, pDot);
 }
         break;
-      case 95: /* as ::= AS nm */
-      case 106: /* dbnm ::= DOT nm */ yytestcase(yyruleno==106);
-      case 223: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==223);
-      case 224: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==224);
+      case 97: /* as ::= AS nm */
+      case 108: /* dbnm ::= DOT nm */ yytestcase(yyruleno==108);
+      case 226: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==226);
+      case 227: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==227);
 {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;}
         break;
-      case 97: /* from ::= */
+      case 99: /* from ::= */
 {yymsp[1].minor.yy259 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy259));}
         break;
-      case 98: /* from ::= FROM seltablist */
+      case 100: /* from ::= FROM seltablist */
 {
   yymsp[-1].minor.yy259 = yymsp[0].minor.yy259;
   sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy259);
 }
         break;
-      case 99: /* stl_prefix ::= seltablist joinop */
+      case 101: /* stl_prefix ::= seltablist joinop */
 {
    if( ALWAYS(yymsp[-1].minor.yy259 && yymsp[-1].minor.yy259->nSrc>0) ) yymsp[-1].minor.yy259->a[yymsp[-1].minor.yy259->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy4;
 }
         break;
-      case 100: /* stl_prefix ::= */
+      case 102: /* stl_prefix ::= */
 {yymsp[1].minor.yy259 = 0;}
         break;
-      case 101: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+      case 103: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
 {
   yymsp[-6].minor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy314,yymsp[0].minor.yy384);
   sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy259, &yymsp[-2].minor.yy0);
 }
         break;
-      case 102: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+      case 104: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
 {
   yymsp[-8].minor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy259,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy314,yymsp[0].minor.yy384);
   sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy259, yymsp[-4].minor.yy322);
 }
         break;
-      case 103: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+      case 105: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
 {
     yymsp[-6].minor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy387,yymsp[-1].minor.yy314,yymsp[0].minor.yy384);
   }
         break;
-      case 104: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+      case 106: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
 {
     if( yymsp[-6].minor.yy259==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy314==0 && yymsp[0].minor.yy384==0 ){
       yymsp[-6].minor.yy259 = yymsp[-4].minor.yy259;
     }else if( yymsp[-4].minor.yy259->nSrc==1 ){
       yymsp[-6].minor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy314,yymsp[0].minor.yy384);
       if( yymsp[-6].minor.yy259 ){
         struct SrcList_item *pNew = &yymsp[-6].minor.yy259->a[yymsp[-6].minor.yy259->nSrc-1];
         struct SrcList_item *pOld = yymsp[-4].minor.yy259->a;
@@ -142641,191 +142736,190 @@ static void yy_reduce(
     }else{
       Select *pSubquery;
       sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy259);
       pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy259,0,0,0,0,SF_NestedFrom,0);
       yymsp[-6].minor.yy259 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy259,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy314,yymsp[0].minor.yy384);
     }
   }
         break;
-      case 105: /* dbnm ::= */
-      case 114: /* indexed_opt ::= */ yytestcase(yyruleno==114);
+      case 107: /* dbnm ::= */
+      case 117: /* indexed_opt ::= */ yytestcase(yyruleno==117);
 {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;}
         break;
-      case 107: /* fullname ::= nm dbnm */
-{yymsp[-1].minor.yy259 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
-        break;
-      case 108: /* joinop ::= COMMA|JOIN */
+      case 109: /* fullname ::= nm */
+{yymsp[0].minor.yy259 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/}
+        break;
+      case 110: /* fullname ::= nm DOT nm */
+{yymsp[-2].minor.yy259 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
+        break;
+      case 111: /* joinop ::= COMMA|JOIN */
 { yymsp[0].minor.yy4 = JT_INNER; }
         break;
-      case 109: /* joinop ::= JOIN_KW JOIN */
+      case 112: /* joinop ::= JOIN_KW JOIN */
 {yymsp[-1].minor.yy4 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0);  /*X-overwrites-A*/}
         break;
-      case 110: /* joinop ::= JOIN_KW nm JOIN */
+      case 113: /* joinop ::= JOIN_KW nm JOIN */
 {yymsp[-2].minor.yy4 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
         break;
-      case 111: /* joinop ::= JOIN_KW nm nm JOIN */
+      case 114: /* joinop ::= JOIN_KW nm nm JOIN */
 {yymsp[-3].minor.yy4 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
         break;
-      case 112: /* on_opt ::= ON expr */
-      case 129: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==129);
-      case 136: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==136);
-      case 197: /* case_else ::= ELSE expr */ yytestcase(yyruleno==197);
+      case 115: /* on_opt ::= ON expr */
+      case 132: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==132);
+      case 139: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==139);
+      case 200: /* case_else ::= ELSE expr */ yytestcase(yyruleno==200);
 {yymsp[-1].minor.yy314 = yymsp[0].minor.yy314;}
         break;
-      case 113: /* on_opt ::= */
-      case 128: /* having_opt ::= */ yytestcase(yyruleno==128);
-      case 130: /* limit_opt ::= */ yytestcase(yyruleno==130);
-      case 135: /* where_opt ::= */ yytestcase(yyruleno==135);
-      case 198: /* case_else ::= */ yytestcase(yyruleno==198);
-      case 200: /* case_operand ::= */ yytestcase(yyruleno==200);
+      case 116: /* on_opt ::= */
+      case 131: /* having_opt ::= */ yytestcase(yyruleno==131);
+      case 133: /* limit_opt ::= */ yytestcase(yyruleno==133);
+      case 138: /* where_opt ::= */ yytestcase(yyruleno==138);
+      case 201: /* case_else ::= */ yytestcase(yyruleno==201);
+      case 203: /* case_operand ::= */ yytestcase(yyruleno==203);
 {yymsp[1].minor.yy314 = 0;}
         break;
-      case 115: /* indexed_opt ::= INDEXED BY nm */
+      case 118: /* indexed_opt ::= INDEXED BY nm */
 {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;}
         break;
-      case 116: /* indexed_opt ::= NOT INDEXED */
+      case 119: /* indexed_opt ::= NOT INDEXED */
 {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;}
         break;
-      case 117: /* using_opt ::= USING LP idlist RP */
+      case 120: /* using_opt ::= USING LP idlist RP */
 {yymsp[-3].minor.yy384 = yymsp[-1].minor.yy384;}
         break;
-      case 118: /* using_opt ::= */
-      case 146: /* idlist_opt ::= */ yytestcase(yyruleno==146);
+      case 121: /* using_opt ::= */
+      case 149: /* idlist_opt ::= */ yytestcase(yyruleno==149);
 {yymsp[1].minor.yy384 = 0;}
         break;
-      case 120: /* orderby_opt ::= ORDER BY sortlist */
-      case 127: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==127);
+      case 123: /* orderby_opt ::= ORDER BY sortlist */
+      case 130: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==130);
 {yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;}
         break;
-      case 121: /* sortlist ::= sortlist COMMA expr sortorder */
+      case 124: /* sortlist ::= sortlist COMMA expr sortorder */
 {
   yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322,yymsp[-1].minor.yy314);
   sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy322,yymsp[0].minor.yy4);
 }
         break;
-      case 122: /* sortlist ::= expr sortorder */
+      case 125: /* sortlist ::= expr sortorder */
 {
   yymsp[-1].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy314); /*A-overwrites-Y*/
   sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy322,yymsp[0].minor.yy4);
 }
         break;
-      case 123: /* sortorder ::= ASC */
+      case 126: /* sortorder ::= ASC */
 {yymsp[0].minor.yy4 = SQLITE_SO_ASC;}
         break;
-      case 124: /* sortorder ::= DESC */
+      case 127: /* sortorder ::= DESC */
 {yymsp[0].minor.yy4 = SQLITE_SO_DESC;}
         break;
-      case 125: /* sortorder ::= */
+      case 128: /* sortorder ::= */
 {yymsp[1].minor.yy4 = SQLITE_SO_UNDEFINED;}
         break;
-      case 131: /* limit_opt ::= LIMIT expr */
+      case 134: /* limit_opt ::= LIMIT expr */
 {yymsp[-1].minor.yy314 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy314,0);}
         break;
-      case 132: /* limit_opt ::= LIMIT expr OFFSET expr */
+      case 135: /* limit_opt ::= LIMIT expr OFFSET expr */
 {yymsp[-3].minor.yy314 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy314,yymsp[0].minor.yy314);}
         break;
-      case 133: /* limit_opt ::= LIMIT expr COMMA expr */
+      case 136: /* limit_opt ::= LIMIT expr COMMA expr */
 {yymsp[-3].minor.yy314 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy314,yymsp[-2].minor.yy314);}
         break;
-      case 134: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
+      case 137: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
 {
-  sqlite3WithPush(pParse, yymsp[-5].minor.yy451, 1);
   sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy259, &yymsp[-1].minor.yy0);
   sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy259,yymsp[0].minor.yy314,0,0);
 }
         break;
-      case 137: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
+      case 140: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
 {
-  sqlite3WithPush(pParse, yymsp[-7].minor.yy451, 1);
   sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy259, &yymsp[-3].minor.yy0);
   sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy322,"set list"); 
   sqlite3Update(pParse,yymsp[-4].minor.yy259,yymsp[-1].minor.yy322,yymsp[0].minor.yy314,yymsp[-5].minor.yy4,0,0);
 }
         break;
-      case 138: /* setlist ::= setlist COMMA nm EQ expr */
+      case 141: /* setlist ::= setlist COMMA nm EQ expr */
 {
   yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[0].minor.yy314);
   sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, 1);
 }
         break;
-      case 139: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
+      case 142: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
 {
   yymsp[-6].minor.yy322 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy322, yymsp[-3].minor.yy384, yymsp[0].minor.yy314);
 }
         break;
-      case 140: /* setlist ::= nm EQ expr */
+      case 143: /* setlist ::= nm EQ expr */
 {
   yylhsminor.yy322 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy314);
   sqlite3ExprListSetName(pParse, yylhsminor.yy322, &yymsp[-2].minor.yy0, 1);
 }
   yymsp[-2].minor.yy322 = yylhsminor.yy322;
         break;
-      case 141: /* setlist ::= LP idlist RP EQ expr */
+      case 144: /* setlist ::= LP idlist RP EQ expr */
 {
   yymsp[-4].minor.yy322 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy384, yymsp[0].minor.yy314);
 }
         break;
-      case 142: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
+      case 145: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
 {
-  sqlite3WithPush(pParse, yymsp[-5].minor.yy451, 1);
   sqlite3Insert(pParse, yymsp[-2].minor.yy259, yymsp[0].minor.yy387, yymsp[-1].minor.yy384, yymsp[-4].minor.yy4);
 }
         break;
-      case 143: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
+      case 146: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
 {
-  sqlite3WithPush(pParse, yymsp[-6].minor.yy451, 1);
   sqlite3Insert(pParse, yymsp[-3].minor.yy259, 0, yymsp[-2].minor.yy384, yymsp[-5].minor.yy4);
 }
         break;
-      case 147: /* idlist_opt ::= LP idlist RP */
+      case 150: /* idlist_opt ::= LP idlist RP */
 {yymsp[-2].minor.yy384 = yymsp[-1].minor.yy384;}
         break;
-      case 148: /* idlist ::= idlist COMMA nm */
+      case 151: /* idlist ::= idlist COMMA nm */
 {yymsp[-2].minor.yy384 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy384,&yymsp[0].minor.yy0);}
         break;
-      case 149: /* idlist ::= nm */
+      case 152: /* idlist ::= nm */
 {yymsp[0].minor.yy384 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
         break;
-      case 150: /* expr ::= LP expr RP */
+      case 153: /* expr ::= LP expr RP */
 {yymsp[-2].minor.yy314 = yymsp[-1].minor.yy314;}
         break;
-      case 151: /* expr ::= ID|INDEXED */
-      case 152: /* expr ::= JOIN_KW */ yytestcase(yyruleno==152);
+      case 154: /* expr ::= ID|INDEXED */
+      case 155: /* expr ::= JOIN_KW */ yytestcase(yyruleno==155);
 {yymsp[0].minor.yy314=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
         break;
-      case 153: /* expr ::= nm DOT nm */
+      case 156: /* expr ::= nm DOT nm */
 {
   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
   yylhsminor.yy314 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
 }
   yymsp[-2].minor.yy314 = yylhsminor.yy314;
         break;
-      case 154: /* expr ::= nm DOT nm DOT nm */
+      case 157: /* expr ::= nm DOT nm DOT nm */
 {
   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1);
   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
   yylhsminor.yy314 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
 }
   yymsp[-4].minor.yy314 = yylhsminor.yy314;
         break;
-      case 155: /* term ::= NULL|FLOAT|BLOB */
-      case 156: /* term ::= STRING */ yytestcase(yyruleno==156);
+      case 158: /* term ::= NULL|FLOAT|BLOB */
+      case 159: /* term ::= STRING */ yytestcase(yyruleno==159);
 {yymsp[0].minor.yy314=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/}
         break;
-      case 157: /* term ::= INTEGER */
+      case 160: /* term ::= INTEGER */
 {
   yylhsminor.yy314 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
 }
   yymsp[0].minor.yy314 = yylhsminor.yy314;
         break;
-      case 158: /* expr ::= VARIABLE */
+      case 161: /* expr ::= VARIABLE */
 {
   if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){
     u32 n = yymsp[0].minor.yy0.n;
     yymsp[0].minor.yy314 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0);
     sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy314, n);
   }else{
     /* When doing a nested parse, one can include terms in an expression
     ** that look like this:   #1 #2 ...  These terms refer to registers
@@ -142837,146 +142931,146 @@ static void yy_reduce(
       yymsp[0].minor.yy314 = 0;
     }else{
       yymsp[0].minor.yy314 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
       if( yymsp[0].minor.yy314 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy314->iTable);
     }
   }
 }
         break;
-      case 159: /* expr ::= expr COLLATE ID|STRING */
+      case 162: /* expr ::= expr COLLATE ID|STRING */
 {
   yymsp[-2].minor.yy314 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy314, &yymsp[0].minor.yy0, 1);
 }
         break;
-      case 160: /* expr ::= CAST LP expr AS typetoken RP */
+      case 163: /* expr ::= CAST LP expr AS typetoken RP */
 {
   yymsp[-5].minor.yy314 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
   sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy314, yymsp[-3].minor.yy314, 0);
 }
         break;
-      case 161: /* expr ::= ID|INDEXED LP distinct exprlist RP */
+      case 164: /* expr ::= ID|INDEXED LP distinct exprlist RP */
 {
   if( yymsp[-1].minor.yy322 && yymsp[-1].minor.yy322->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
   }
   yylhsminor.yy314 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0);
   if( yymsp[-2].minor.yy4==SF_Distinct && yylhsminor.yy314 ){
     yylhsminor.yy314->flags |= EP_Distinct;
   }
 }
   yymsp[-4].minor.yy314 = yylhsminor.yy314;
         break;
-      case 162: /* expr ::= ID|INDEXED LP STAR RP */
+      case 165: /* expr ::= ID|INDEXED LP STAR RP */
 {
   yylhsminor.yy314 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
 }
   yymsp[-3].minor.yy314 = yylhsminor.yy314;
         break;
-      case 163: /* term ::= CTIME_KW */
+      case 166: /* term ::= CTIME_KW */
 {
   yylhsminor.yy314 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0);
 }
   yymsp[0].minor.yy314 = yylhsminor.yy314;
         break;
-      case 164: /* expr ::= LP nexprlist COMMA expr RP */
+      case 167: /* expr ::= LP nexprlist COMMA expr RP */
 {
   ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy322, yymsp[-1].minor.yy314);
   yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
   if( yymsp[-4].minor.yy314 ){
     yymsp[-4].minor.yy314->x.pList = pList;
   }else{
     sqlite3ExprListDelete(pParse->db, pList);
   }
 }
         break;
-      case 165: /* expr ::= expr AND expr */
-      case 166: /* expr ::= expr OR expr */ yytestcase(yyruleno==166);
-      case 167: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==167);
-      case 168: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==168);
-      case 169: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==169);
-      case 170: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==170);
-      case 171: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==171);
-      case 172: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==172);
+      case 168: /* expr ::= expr AND expr */
+      case 169: /* expr ::= expr OR expr */ yytestcase(yyruleno==169);
+      case 170: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==170);
+      case 171: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==171);
+      case 172: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==172);
+      case 173: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==173);
+      case 174: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==174);
+      case 175: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==175);
 {yymsp[-2].minor.yy314=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy314,yymsp[0].minor.yy314);}
         break;
-      case 173: /* likeop ::= NOT LIKE_KW|MATCH */
+      case 176: /* likeop ::= NOT LIKE_KW|MATCH */
 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/}
         break;
-      case 174: /* expr ::= expr likeop expr */
+      case 177: /* expr ::= expr likeop expr */
 {
   ExprList *pList;
   int bNot = yymsp[-1].minor.yy0.n & 0x80000000;
   yymsp[-1].minor.yy0.n &= 0x7fffffff;
   pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy314);
   pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy314);
   yymsp[-2].minor.yy314 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0);
   if( bNot ) yymsp[-2].minor.yy314 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy314, 0);
   if( yymsp[-2].minor.yy314 ) yymsp[-2].minor.yy314->flags |= EP_InfixFunc;
 }
         break;
-      case 175: /* expr ::= expr likeop expr ESCAPE expr */
+      case 178: /* expr ::= expr likeop expr ESCAPE expr */
 {
   ExprList *pList;
   int bNot = yymsp[-3].minor.yy0.n & 0x80000000;
   yymsp[-3].minor.yy0.n &= 0x7fffffff;
   pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy314);
   pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy314);
   pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy314);
   yymsp[-4].minor.yy314 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0);
   if( bNot ) yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy314, 0);
   if( yymsp[-4].minor.yy314 ) yymsp[-4].minor.yy314->flags |= EP_InfixFunc;
 }
         break;
-      case 176: /* expr ::= expr ISNULL|NOTNULL */
+      case 179: /* expr ::= expr ISNULL|NOTNULL */
 {yymsp[-1].minor.yy314 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy314,0);}
         break;
-      case 177: /* expr ::= expr NOT NULL */
+      case 180: /* expr ::= expr NOT NULL */
 {yymsp[-2].minor.yy314 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy314,0);}
         break;
-      case 178: /* expr ::= expr IS expr */
+      case 181: /* expr ::= expr IS expr */
 {
   yymsp[-2].minor.yy314 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy314,yymsp[0].minor.yy314);
   binaryToUnaryIfNull(pParse, yymsp[0].minor.yy314, yymsp[-2].minor.yy314, TK_ISNULL);
 }
         break;
-      case 179: /* expr ::= expr IS NOT expr */
+      case 182: /* expr ::= expr IS NOT expr */
 {
   yymsp[-3].minor.yy314 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy314,yymsp[0].minor.yy314);
   binaryToUnaryIfNull(pParse, yymsp[0].minor.yy314, yymsp[-3].minor.yy314, TK_NOTNULL);
 }
         break;
-      case 180: /* expr ::= NOT expr */
-      case 181: /* expr ::= BITNOT expr */ yytestcase(yyruleno==181);
+      case 183: /* expr ::= NOT expr */
+      case 184: /* expr ::= BITNOT expr */ yytestcase(yyruleno==184);
 {yymsp[-1].minor.yy314 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy314, 0);/*A-overwrites-B*/}
         break;
-      case 182: /* expr ::= MINUS expr */
+      case 185: /* expr ::= MINUS expr */
 {yymsp[-1].minor.yy314 = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy314, 0);}
         break;
-      case 183: /* expr ::= PLUS expr */
+      case 186: /* expr ::= PLUS expr */
 {yymsp[-1].minor.yy314 = sqlite3PExpr(pParse, TK_UPLUS, yymsp[0].minor.yy314, 0);}
         break;
-      case 184: /* between_op ::= BETWEEN */
-      case 187: /* in_op ::= IN */ yytestcase(yyruleno==187);
+      case 187: /* between_op ::= BETWEEN */
+      case 190: /* in_op ::= IN */ yytestcase(yyruleno==190);
 {yymsp[0].minor.yy4 = 0;}
         break;
-      case 186: /* expr ::= expr between_op expr AND expr */
+      case 189: /* expr ::= expr between_op expr AND expr */
 {
   ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy314);
   pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy314);
   yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy314, 0);
   if( yymsp[-4].minor.yy314 ){
     yymsp[-4].minor.yy314->x.pList = pList;
   }else{
     sqlite3ExprListDelete(pParse->db, pList);
   } 
   if( yymsp[-3].minor.yy4 ) yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy314, 0);
 }
         break;
-      case 189: /* expr ::= expr in_op LP exprlist RP */
+      case 192: /* expr ::= expr in_op LP exprlist RP */
 {
     if( yymsp[-1].minor.yy322==0 ){
       /* Expressions of the form
       **
       **      expr1 IN ()
       **      expr1 NOT IN ()
       **
       ** simplify to constants 0 (false) and 1 (true), respectively,
@@ -143018,382 +143112,378 @@ static void yy_reduce(
         sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy314);
       }else{
         sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322);
       }
       if( yymsp[-3].minor.yy4 ) yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy314, 0);
     }
   }
         break;
-      case 190: /* expr ::= LP select RP */
+      case 193: /* expr ::= LP select RP */
 {
     yymsp[-2].minor.yy314 = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
     sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy314, yymsp[-1].minor.yy387);
   }
         break;
-      case 191: /* expr ::= expr in_op LP select RP */
+      case 194: /* expr ::= expr in_op LP select RP */
 {
     yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy314, 0);
     sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy314, yymsp[-1].minor.yy387);
     if( yymsp[-3].minor.yy4 ) yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy314, 0);
   }
         break;
-      case 192: /* expr ::= expr in_op nm dbnm paren_exprlist */
+      case 195: /* expr ::= expr in_op nm dbnm paren_exprlist */
 {
     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);
     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
     if( yymsp[0].minor.yy322 )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy322);
     yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy314, 0);
     sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy314, pSelect);
     if( yymsp[-3].minor.yy4 ) yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy314, 0);
   }
         break;
-      case 193: /* expr ::= EXISTS LP select RP */
+      case 196: /* expr ::= EXISTS LP select RP */
 {
     Expr *p;
     p = yymsp[-3].minor.yy314 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
     sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy387);
   }
         break;
-      case 194: /* expr ::= CASE case_operand case_exprlist case_else END */
+      case 197: /* expr ::= CASE case_operand case_exprlist case_else END */
 {
   yymsp[-4].minor.yy314 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy314, 0);
   if( yymsp[-4].minor.yy314 ){
     yymsp[-4].minor.yy314->x.pList = yymsp[-1].minor.yy314 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[-1].minor.yy314) : yymsp[-2].minor.yy322;
     sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy314);
   }else{
     sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy322);
     sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy314);
   }
 }
         break;
-      case 195: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+      case 198: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
 {
   yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy314);
   yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy314);
 }
         break;
-      case 196: /* case_exprlist ::= WHEN expr THEN expr */
+      case 199: /* case_exprlist ::= WHEN expr THEN expr */
 {
   yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy314);
   yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy314);
 }
         break;
-      case 199: /* case_operand ::= expr */
+      case 202: /* case_operand ::= expr */
 {yymsp[0].minor.yy314 = yymsp[0].minor.yy314; /*A-overwrites-X*/}
         break;
-      case 202: /* nexprlist ::= nexprlist COMMA expr */
+      case 205: /* nexprlist ::= nexprlist COMMA expr */
 {yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy314);}
         break;
-      case 203: /* nexprlist ::= expr */
+      case 206: /* nexprlist ::= expr */
 {yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy314); /*A-overwrites-Y*/}
         break;
-      case 205: /* paren_exprlist ::= LP exprlist RP */
-      case 210: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==210);
+      case 208: /* paren_exprlist ::= LP exprlist RP */
+      case 213: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==213);
 {yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;}
         break;
-      case 206: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+      case 209: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
 {
   sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, 
                      sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy4,
                       &yymsp[-11].minor.yy0, yymsp[0].minor.yy314, SQLITE_SO_ASC, yymsp[-8].minor.yy4, SQLITE_IDXTYPE_APPDEF);
 }
         break;
-      case 207: /* uniqueflag ::= UNIQUE */
-      case 247: /* raisetype ::= ABORT */ yytestcase(yyruleno==247);
+      case 210: /* uniqueflag ::= UNIQUE */
+      case 250: /* raisetype ::= ABORT */ yytestcase(yyruleno==250);
 {yymsp[0].minor.yy4 = OE_Abort;}
         break;
-      case 208: /* uniqueflag ::= */
+      case 211: /* uniqueflag ::= */
 {yymsp[1].minor.yy4 = OE_None;}
         break;
-      case 211: /* eidlist ::= eidlist COMMA nm collate sortorder */
+      case 214: /* eidlist ::= eidlist COMMA nm collate sortorder */
 {
   yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy4, yymsp[0].minor.yy4);
 }
         break;
-      case 212: /* eidlist ::= nm collate sortorder */
+      case 215: /* eidlist ::= nm collate sortorder */
 {
   yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy4, yymsp[0].minor.yy4); /*A-overwrites-Y*/
 }
         break;
-      case 215: /* cmd ::= DROP INDEX ifexists fullname */
+      case 218: /* cmd ::= DROP INDEX ifexists fullname */
 {sqlite3DropIndex(pParse, yymsp[0].minor.yy259, yymsp[-1].minor.yy4);}
         break;
-      case 216: /* cmd ::= VACUUM */
+      case 219: /* cmd ::= VACUUM */
 {sqlite3Vacuum(pParse,0);}
         break;
-      case 217: /* cmd ::= VACUUM nm */
+      case 220: /* cmd ::= VACUUM nm */
 {sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);}
         break;
-      case 218: /* cmd ::= PRAGMA nm dbnm */
+      case 221: /* cmd ::= PRAGMA nm dbnm */
 {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
         break;
-      case 219: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
+      case 222: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
 {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
         break;
-      case 220: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
+      case 223: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
 {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
         break;
-      case 221: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
+      case 224: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
 {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
         break;
-      case 222: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
+      case 225: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
 {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);}
         break;
-      case 225: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+      case 228: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
 {
   Token all;
   all.z = yymsp[-3].minor.yy0.z;
   all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n;
   sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy203, &all);
 }
         break;
-      case 226: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+      case 229: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
 {
   sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy4, yymsp[-4].minor.yy90.a, yymsp[-4].minor.yy90.b, yymsp[-2].minor.yy259, yymsp[0].minor.yy314, yymsp[-10].minor.yy4, yymsp[-8].minor.yy4);
   yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/
 }
         break;
-      case 227: /* trigger_time ::= BEFORE|AFTER */
+      case 230: /* trigger_time ::= BEFORE|AFTER */
 { yymsp[0].minor.yy4 = yymsp[0].major; /*A-overwrites-X*/ }
         break;
-      case 228: /* trigger_time ::= INSTEAD OF */
+      case 231: /* trigger_time ::= INSTEAD OF */
 { yymsp[-1].minor.yy4 = TK_INSTEAD;}
         break;
-      case 229: /* trigger_time ::= */
+      case 232: /* trigger_time ::= */
 { yymsp[1].minor.yy4 = TK_BEFORE; }
         break;
-      case 230: /* trigger_event ::= DELETE|INSERT */
-      case 231: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==231);
+      case 233: /* trigger_event ::= DELETE|INSERT */
+      case 234: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==234);
 {yymsp[0].minor.yy90.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy90.b = 0;}
         break;
-      case 232: /* trigger_event ::= UPDATE OF idlist */
+      case 235: /* trigger_event ::= UPDATE OF idlist */
 {yymsp[-2].minor.yy90.a = TK_UPDATE; yymsp[-2].minor.yy90.b = yymsp[0].minor.yy384;}
         break;
-      case 233: /* when_clause ::= */
-      case 252: /* key_opt ::= */ yytestcase(yyruleno==252);
+      case 236: /* when_clause ::= */
+      case 255: /* key_opt ::= */ yytestcase(yyruleno==255);
 { yymsp[1].minor.yy314 = 0; }
         break;
-      case 234: /* when_clause ::= WHEN expr */
-      case 253: /* key_opt ::= KEY expr */ yytestcase(yyruleno==253);
+      case 237: /* when_clause ::= WHEN expr */
+      case 256: /* key_opt ::= KEY expr */ yytestcase(yyruleno==256);
 { yymsp[-1].minor.yy314 = yymsp[0].minor.yy314; }
         break;
-      case 235: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+      case 238: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
 {
   assert( yymsp[-2].minor.yy203!=0 );
   yymsp[-2].minor.yy203->pLast->pNext = yymsp[-1].minor.yy203;
   yymsp[-2].minor.yy203->pLast = yymsp[-1].minor.yy203;
 }
         break;
-      case 236: /* trigger_cmd_list ::= trigger_cmd SEMI */
+      case 239: /* trigger_cmd_list ::= trigger_cmd SEMI */
 { 
   assert( yymsp[-1].minor.yy203!=0 );
   yymsp[-1].minor.yy203->pLast = yymsp[-1].minor.yy203;
 }
         break;
-      case 237: /* trnm ::= nm DOT nm */
+      case 240: /* trnm ::= nm DOT nm */
 {
   yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;
   sqlite3ErrorMsg(pParse, 
         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
         "statements within triggers");
 }
         break;
-      case 238: /* tridxby ::= INDEXED BY nm */
+      case 241: /* tridxby ::= INDEXED BY nm */
 {
   sqlite3ErrorMsg(pParse,
         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
         "within triggers");
 }
         break;
-      case 239: /* tridxby ::= NOT INDEXED */
+      case 242: /* tridxby ::= NOT INDEXED */
 {
   sqlite3ErrorMsg(pParse,
         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
         "within triggers");
 }
         break;
-      case 240: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */
+      case 243: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */
 {yylhsminor.yy203 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy322, yymsp[-1].minor.yy314, yymsp[-6].minor.yy4, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy336);}
   yymsp[-7].minor.yy203 = yylhsminor.yy203;
         break;
-      case 241: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select scanpt */
+      case 244: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select scanpt */
 {yylhsminor.yy203 = sqlite3TriggerInsertStep(pParse->db,&yymsp[-3].minor.yy0,yymsp[-2].minor.yy384,yymsp[-1].minor.yy387,yymsp[-5].minor.yy4,yymsp[-6].minor.yy336,yymsp[0].minor.yy336);/*yylhsminor.yy203-overwrites-yymsp[-5].minor.yy4*/}
   yymsp[-6].minor.yy203 = yylhsminor.yy203;
         break;
-      case 242: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+      case 245: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
 {yylhsminor.yy203 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy314, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy336);}
   yymsp[-5].minor.yy203 = yylhsminor.yy203;
         break;
-      case 243: /* trigger_cmd ::= scanpt select scanpt */
+      case 246: /* trigger_cmd ::= scanpt select scanpt */
 {yylhsminor.yy203 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy387, yymsp[-2].minor.yy336, yymsp[0].minor.yy336); /*yylhsminor.yy203-overwrites-yymsp[-1].minor.yy387*/}
   yymsp[-2].minor.yy203 = yylhsminor.yy203;
         break;
-      case 244: /* expr ::= RAISE LP IGNORE RP */
+      case 247: /* expr ::= RAISE LP IGNORE RP */
 {
   yymsp[-3].minor.yy314 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); 
   if( yymsp[-3].minor.yy314 ){
     yymsp[-3].minor.yy314->affinity = OE_Ignore;
   }
 }
         break;
-      case 245: /* expr ::= RAISE LP raisetype COMMA nm RP */
+      case 248: /* expr ::= RAISE LP raisetype COMMA nm RP */
 {
   yymsp[-5].minor.yy314 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); 
   if( yymsp[-5].minor.yy314 ) {
     yymsp[-5].minor.yy314->affinity = (char)yymsp[-3].minor.yy4;
   }
 }
         break;
-      case 246: /* raisetype ::= ROLLBACK */
+      case 249: /* raisetype ::= ROLLBACK */
 {yymsp[0].minor.yy4 = OE_Rollback;}
         break;
-      case 248: /* raisetype ::= FAIL */
+      case 251: /* raisetype ::= FAIL */
 {yymsp[0].minor.yy4 = OE_Fail;}
         break;
-      case 249: /* cmd ::= DROP TRIGGER ifexists fullname */
+      case 252: /* cmd ::= DROP TRIGGER ifexists fullname */
 {
   sqlite3DropTrigger(pParse,yymsp[0].minor.yy259,yymsp[-1].minor.yy4);
 }
         break;
-      case 250: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+      case 253: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
 {
   sqlite3Attach(pParse, yymsp[-3].minor.yy314, yymsp[-1].minor.yy314, yymsp[0].minor.yy314);
 }
         break;
-      case 251: /* cmd ::= DETACH database_kw_opt expr */
+      case 254: /* cmd ::= DETACH database_kw_opt expr */
 {
   sqlite3Detach(pParse, yymsp[0].minor.yy314);
 }
         break;
-      case 254: /* cmd ::= REINDEX */
+      case 257: /* cmd ::= REINDEX */
 {sqlite3Reindex(pParse, 0, 0);}
         break;
-      case 255: /* cmd ::= REINDEX nm dbnm */
+      case 258: /* cmd ::= REINDEX nm dbnm */
 {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
         break;
-      case 256: /* cmd ::= ANALYZE */
+      case 259: /* cmd ::= ANALYZE */
 {sqlite3Analyze(pParse, 0, 0);}
         break;
-      case 257: /* cmd ::= ANALYZE nm dbnm */
+      case 260: /* cmd ::= ANALYZE nm dbnm */
 {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
         break;
-      case 258: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+      case 261: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
 {
   sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy259,&yymsp[0].minor.yy0);
 }
         break;
-      case 259: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+      case 262: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
 {
   yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n;
   sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0);
 }
         break;
-      case 260: /* add_column_fullname ::= fullname */
+      case 263: /* add_column_fullname ::= fullname */
 {
   disableLookaside(pParse);
   sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy259);
 }
         break;
-      case 261: /* cmd ::= create_vtab */
+      case 264: /* cmd ::= create_vtab */
 {sqlite3VtabFinishParse(pParse,0);}
         break;
-      case 262: /* cmd ::= create_vtab LP vtabarglist RP */
+      case 265: /* cmd ::= create_vtab LP vtabarglist RP */
 {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
         break;
-      case 263: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+      case 266: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
 {
     sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy4);
 }
         break;
-      case 264: /* vtabarg ::= */
+      case 267: /* vtabarg ::= */
 {sqlite3VtabArgInit(pParse);}
         break;
-      case 265: /* vtabargtoken ::= ANY */
-      case 266: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==266);
-      case 267: /* lp ::= LP */ yytestcase(yyruleno==267);
+      case 268: /* vtabargtoken ::= ANY */
+      case 269: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==269);
+      case 270: /* lp ::= LP */ yytestcase(yyruleno==270);
 {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
         break;
-      case 268: /* with ::= */
-{yymsp[1].minor.yy451 = 0;}
-        break;
-      case 269: /* with ::= WITH wqlist */
-{ yymsp[-1].minor.yy451 = yymsp[0].minor.yy451; }
-        break;
-      case 270: /* with ::= WITH RECURSIVE wqlist */
-{ yymsp[-2].minor.yy451 = yymsp[0].minor.yy451; }
-        break;
-      case 271: /* wqlist ::= nm eidlist_opt AS LP select RP */
+      case 271: /* with ::= WITH wqlist */
+      case 272: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==272);
+{ sqlite3WithPush(pParse, yymsp[0].minor.yy451, 1); }
+        break;
+      case 273: /* wqlist ::= nm eidlist_opt AS LP select RP */
 {
   yymsp[-5].minor.yy451 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy387); /*A-overwrites-X*/
 }
         break;
-      case 272: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+      case 274: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
 {
   yymsp[-7].minor.yy451 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy451, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy387);
 }
         break;
       default:
-      /* (273) input ::= cmdlist */ yytestcase(yyruleno==273);
-      /* (274) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==274);
-      /* (275) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=275);
-      /* (276) ecmd ::= SEMI */ yytestcase(yyruleno==276);
-      /* (277) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==277);
-      /* (278) explain ::= */ yytestcase(yyruleno==278);
-      /* (279) trans_opt ::= */ yytestcase(yyruleno==279);
-      /* (280) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==280);
-      /* (281) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==281);
-      /* (282) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==282);
-      /* (283) savepoint_opt ::= */ yytestcase(yyruleno==283);
-      /* (284) cmd ::= create_table create_table_args */ yytestcase(yyruleno==284);
-      /* (285) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==285);
-      /* (286) columnlist ::= columnname carglist */ yytestcase(yyruleno==286);
-      /* (287) nm ::= ID|INDEXED */ yytestcase(yyruleno==287);
-      /* (288) nm ::= STRING */ yytestcase(yyruleno==288);
-      /* (289) nm ::= JOIN_KW */ yytestcase(yyruleno==289);
-      /* (290) typetoken ::= typename */ yytestcase(yyruleno==290);
-      /* (291) typename ::= ID|STRING */ yytestcase(yyruleno==291);
-      /* (292) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=292);
-      /* (293) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=293);
-      /* (294) carglist ::= carglist ccons */ yytestcase(yyruleno==294);
-      /* (295) carglist ::= */ yytestcase(yyruleno==295);
-      /* (296) ccons ::= NULL onconf */ yytestcase(yyruleno==296);
-      /* (297) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==297);
-      /* (298) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==298);
-      /* (299) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=299);
-      /* (300) tconscomma ::= */ yytestcase(yyruleno==300);
-      /* (301) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=301);
-      /* (302) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=302);
-      /* (303) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=303);
-      /* (304) oneselect ::= values */ yytestcase(yyruleno==304);
-      /* (305) sclp ::= selcollist COMMA */ yytestcase(yyruleno==305);
-      /* (306) as ::= ID|STRING */ yytestcase(yyruleno==306);
-      /* (307) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=307);
-      /* (308) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==308);
-      /* (309) exprlist ::= nexprlist */ yytestcase(yyruleno==309);
-      /* (310) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=310);
-      /* (311) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=311);
-      /* (312) nmnum ::= ON */ yytestcase(yyruleno==312);
-      /* (313) nmnum ::= DELETE */ yytestcase(yyruleno==313);
-      /* (314) nmnum ::= DEFAULT */ yytestcase(yyruleno==314);
-      /* (315) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==315);
-      /* (316) foreach_clause ::= */ yytestcase(yyruleno==316);
-      /* (317) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==317);
-      /* (318) trnm ::= nm */ yytestcase(yyruleno==318);
-      /* (319) tridxby ::= */ yytestcase(yyruleno==319);
-      /* (320) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==320);
-      /* (321) database_kw_opt ::= */ yytestcase(yyruleno==321);
-      /* (322) kwcolumn_opt ::= */ yytestcase(yyruleno==322);
-      /* (323) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==323);
-      /* (324) vtabarglist ::= vtabarg */ yytestcase(yyruleno==324);
-      /* (325) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==325);
-      /* (326) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==326);
-      /* (327) anylist ::= */ yytestcase(yyruleno==327);
-      /* (328) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==328);
-      /* (329) anylist ::= anylist ANY */ yytestcase(yyruleno==329);
+      /* (275) input ::= cmdlist */ yytestcase(yyruleno==275);
+      /* (276) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==276);
+      /* (277) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=277);
+      /* (278) ecmd ::= SEMI */ yytestcase(yyruleno==278);
+      /* (279) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==279);
+      /* (280) explain ::= */ yytestcase(yyruleno==280);
+      /* (281) trans_opt ::= */ yytestcase(yyruleno==281);
+      /* (282) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==282);
+      /* (283) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==283);
+      /* (284) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==284);
+      /* (285) savepoint_opt ::= */ yytestcase(yyruleno==285);
+      /* (286) cmd ::= create_table create_table_args */ yytestcase(yyruleno==286);
+      /* (287) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==287);
+      /* (288) columnlist ::= columnname carglist */ yytestcase(yyruleno==288);
+      /* (289) nm ::= ID|INDEXED */ yytestcase(yyruleno==289);
+      /* (290) nm ::= STRING */ yytestcase(yyruleno==290);
+      /* (291) nm ::= JOIN_KW */ yytestcase(yyruleno==291);
+      /* (292) typetoken ::= typename */ yytestcase(yyruleno==292);
+      /* (293) typename ::= ID|STRING */ yytestcase(yyruleno==293);
+      /* (294) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=294);
+      /* (295) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=295);
+      /* (296) carglist ::= carglist ccons */ yytestcase(yyruleno==296);
+      /* (297) carglist ::= */ yytestcase(yyruleno==297);
+      /* (298) ccons ::= NULL onconf */ yytestcase(yyruleno==298);
+      /* (299) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==299);
+      /* (300) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==300);
+      /* (301) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=301);
+      /* (302) tconscomma ::= */ yytestcase(yyruleno==302);
+      /* (303) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=303);
+      /* (304) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=304);
+      /* (305) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=305);
+      /* (306) oneselect ::= values */ yytestcase(yyruleno==306);
+      /* (307) sclp ::= selcollist COMMA */ yytestcase(yyruleno==307);
+      /* (308) as ::= ID|STRING */ yytestcase(yyruleno==308);
+      /* (309) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=309);
+      /* (310) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==310);
+      /* (311) exprlist ::= nexprlist */ yytestcase(yyruleno==311);
+      /* (312) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=312);
+      /* (313) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=313);
+      /* (314) nmnum ::= ON */ yytestcase(yyruleno==314);
+      /* (315) nmnum ::= DELETE */ yytestcase(yyruleno==315);
+      /* (316) nmnum ::= DEFAULT */ yytestcase(yyruleno==316);
+      /* (317) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==317);
+      /* (318) foreach_clause ::= */ yytestcase(yyruleno==318);
+      /* (319) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==319);
+      /* (320) trnm ::= nm */ yytestcase(yyruleno==320);
+      /* (321) tridxby ::= */ yytestcase(yyruleno==321);
+      /* (322) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==322);
+      /* (323) database_kw_opt ::= */ yytestcase(yyruleno==323);
+      /* (324) kwcolumn_opt ::= */ yytestcase(yyruleno==324);
+      /* (325) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==325);
+      /* (326) vtabarglist ::= vtabarg */ yytestcase(yyruleno==326);
+      /* (327) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==327);
+      /* (328) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==328);
+      /* (329) anylist ::= */ yytestcase(yyruleno==329);
+      /* (330) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==330);
+      /* (331) anylist ::= anylist ANY */ yytestcase(yyruleno==331);
+      /* (332) with ::= */ yytestcase(yyruleno==332);
         break;
 /********** End reduce actions ************************************************/
   };
   assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) );
   yygoto = yyRuleInfo[yyruleno].lhs;
   yysize = yyRuleInfo[yyruleno].nrhs;
   yyact = yy_find_reduce_action(yymsp[yysize].stateno,(YYCODETYPE)yygoto);
 
@@ -180437,17 +180527,17 @@ struct SessionBuffer {
 
 /*
 ** An object of this type is used internally as an abstraction for 
 ** input data. Input data may be supplied either as a single large buffer
 ** (e.g. sqlite3changeset_start()) or using a stream function (e.g.
 **  sqlite3changeset_start_strm()).
 */
 struct SessionInput {
-  int bNoDiscard;                 /* If true, discard no data */
+  int bNoDiscard;                 /* If true, do not discard in InputBuffer() */
   int iCurrent;                   /* Offset in aData[] of current change */
   int iNext;                      /* Offset in aData[] of next change */
   u8 *aData;                      /* Pointer to buffer containing changeset */
   int nData;                      /* Number of bytes in aData */
 
   SessionBuffer buf;              /* Current read buffer */
   int (*xInput)(void*, void*, int*);        /* Input stream call (or NULL) */
   void *pIn;                                /* First argument to xInput */
@@ -182962,17 +183052,17 @@ SQLITE_API int sqlite3changeset_start_st
   return sessionChangesetStart(pp, xInput, pIn, 0, 0);
 }
 
 /*
 ** If the SessionInput object passed as the only argument is a streaming
 ** object and the buffer is full, discard some data to free up space.
 */
 static void sessionDiscardData(SessionInput *pIn){
-  if( pIn->bEof && pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){
+  if( pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){
     int nMove = pIn->buf.nBuf - pIn->iNext;
     assert( nMove>=0 );
     if( nMove>0 ){
       memmove(pIn->buf.aBuf, &pIn->buf.aBuf[pIn->iNext], nMove);
     }
     pIn->buf.nBuf -= pIn->iNext;
     pIn->iNext = 0;
     pIn->nData = pIn->buf.nBuf;
@@ -184603,31 +184693,34 @@ static int sessionChangesetApply(
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of fifth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase  /* OUT: Rebase information */
+  void **ppRebase, int *pnRebase, /* OUT: Rebase information */
+  int flags                       /* SESSION_APPLY_XXX flags */
 ){
   int schemaMismatch = 0;
-  int rc;                         /* Return code */
+  int rc = SQLITE_OK;             /* Return code */
   const char *zTab = 0;           /* Name of current table */
   int nTab = 0;                   /* Result of sqlite3Strlen30(zTab) */
   SessionApplyCtx sApply;         /* changeset_apply() context object */
   int bPatchset;
 
   assert( xConflict!=0 );
 
   pIter->in.bNoDiscard = 1;
   memset(&sApply, 0, sizeof(sApply));
   sqlite3_mutex_enter(sqlite3_db_mutex(db));
-  rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
+  if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
+    rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
+  }
   if( rc==SQLITE_OK ){
     rc = sqlite3_exec(db, "PRAGMA defer_foreign_keys = 1", 0, 0, 0);
   }
   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3changeset_next(pIter) ){
     int nCol;
     int op;
     const char *zNew;
     
@@ -184755,21 +184848,23 @@ static int sessionChangesetApply(
       res = xConflict(pCtx, SQLITE_CHANGESET_FOREIGN_KEY, &sIter);
       if( res!=SQLITE_CHANGESET_OMIT ){
         rc = SQLITE_CONSTRAINT;
       }
     }
   }
   sqlite3_exec(db, "PRAGMA defer_foreign_keys = 0", 0, 0, 0);
 
-  if( rc==SQLITE_OK ){
-    rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
-  }else{
-    sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0);
-    sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+  if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
+    if( rc==SQLITE_OK ){
+      rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+    }else{
+      sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0);
+      sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+    }
   }
 
   if( rc==SQLITE_OK && bPatchset==0 && ppRebase && pnRebase ){
     *ppRebase = (void*)sApply.rebase.aBuf;
     *pnRebase = sApply.rebase.nBuf;
     sApply.rebase.aBuf = 0;
   }
   sqlite3_finalize(sApply.pInsert);
@@ -184796,23 +184891,24 @@ SQLITE_API int sqlite3changeset_apply_v2
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase
+  void **ppRebase, int *pnRebase,
+  int flags
 ){
   sqlite3_changeset_iter *pIter;  /* Iterator to skip through changeset */  
   int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset);
   if( rc==SQLITE_OK ){
     rc = sessionChangesetApply(
-        db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase
+        db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
     );
   }
   return rc;
 }
 
 /*
 ** Apply the changeset passed via pChangeset/nChangeset to the main database
 ** attached to handle "db". Invoke the supplied conflict handler callback
@@ -184829,17 +184925,17 @@ SQLITE_API int sqlite3changeset_apply(
   int(*xConflict)(
     void *pCtx,                   /* Copy of fifth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx                      /* First argument passed to xConflict */
 ){
   return sqlite3changeset_apply_v2(
-      db, nChangeset, pChangeset, xFilter, xConflict, pCtx, 0, 0
+      db, nChangeset, pChangeset, xFilter, xConflict, pCtx, 0, 0, 0
   );
 }
 
 /*
 ** Apply the changeset passed via xInput/pIn to the main database
 ** attached to handle "db". Invoke the supplied conflict handler callback
 ** to resolve any conflicts encountered while applying the change.
 */
@@ -184852,23 +184948,24 @@ SQLITE_API int sqlite3changeset_apply_v2
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase
+  void **ppRebase, int *pnRebase,
+  int flags
 ){
   sqlite3_changeset_iter *pIter;  /* Iterator to skip through changeset */  
   int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
   if( rc==SQLITE_OK ){
     rc = sessionChangesetApply(
-        db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase
+        db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
     );
   }
   return rc;
 }
 SQLITE_API int sqlite3changeset_apply_strm(
   sqlite3 *db,                    /* Apply change to "main" db of this handle */
   int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
   void *pIn,                                          /* First arg for xInput */
@@ -184879,17 +184976,17 @@ SQLITE_API int sqlite3changeset_apply_st
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx                      /* First argument passed to xConflict */
 ){
   return sqlite3changeset_apply_v2_strm(
-      db, xInput, pIn, xFilter, xConflict, pCtx, 0, 0
+      db, xInput, pIn, xFilter, xConflict, pCtx, 0, 0, 0
   );
 }
 
 /*
 ** sqlite3_changegroup handle.
 */
 struct sqlite3_changegroup {
   int rc;                         /* Error code */
@@ -203460,16 +203557,22 @@ static int fts5BestIndexMethod(sqlite3_v
                                     FTS5_BI_ROWID_GE, 0, 0, -1},
   };
 
   int aColMap[3];
   aColMap[0] = -1;
   aColMap[1] = nCol;
   aColMap[2] = nCol+1;
 
+  assert( SQLITE_INDEX_CONSTRAINT_EQ<SQLITE_INDEX_CONSTRAINT_MATCH );
+  assert( SQLITE_INDEX_CONSTRAINT_GT<SQLITE_INDEX_CONSTRAINT_MATCH );
+  assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH );
+  assert( SQLITE_INDEX_CONSTRAINT_GE<SQLITE_INDEX_CONSTRAINT_MATCH );
+  assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH );
+
   /* Set idxFlags flags for all WHERE clause terms that will be used. */
   for(i=0; i<pInfo->nConstraint; i++){
     struct sqlite3_index_constraint *p = &pInfo->aConstraint[i];
     int iCol = p->iColumn;
 
     if( (p->op==SQLITE_INDEX_CONSTRAINT_MATCH && iCol>=0 && iCol<=nCol)
      || (p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol==nCol)
     ){
@@ -203478,21 +203581,21 @@ static int fts5BestIndexMethod(sqlite3_v
         idxFlags = (idxFlags & 0xFFFF) | FTS5_BI_MATCH | (iCol << 16);
         aConstraint[0].iConsIndex = i;
       }else{
         /* As there exists an unusable MATCH constraint this is an 
         ** unusable plan. Set a prohibitively high cost. */
         pInfo->estimatedCost = 1e50;
         return SQLITE_OK;
       }
-    }else{
+    }else if( p->op<=SQLITE_INDEX_CONSTRAINT_MATCH ){
       int j;
       for(j=1; j<ArraySize(aConstraint); j++){
         struct Constraint *pC = &aConstraint[j];
-        if( iCol==aColMap[pC->iCol] && p->op & pC->op && p->usable ){
+        if( iCol==aColMap[pC->iCol] && (p->op & pC->op) && p->usable ){
           pC->iConsIndex = i;
           idxFlags |= pC->fts5op;
         }
       }
     }
   }
 
   /* Set idxFlags flags for the ORDER BY clause */
@@ -205554,17 +205657,17 @@ static void fts5Fts5Func(
 */
 static void fts5SourceIdFunc(
   sqlite3_context *pCtx,          /* Function call context */
   int nArg,                       /* Number of args */
   sqlite3_value **apUnused        /* Function arguments */
 ){
   assert( nArg==0 );
   UNUSED_PARAM2(nArg, apUnused);
-  sqlite3_result_text(pCtx, "fts5: 2018-04-02 11:04:16 736b53f57f70b23172c30880186dce7ad9baa3b74e3838cae5847cffb98f5cd2", -1, SQLITE_TRANSIENT);
+  sqlite3_result_text(pCtx, "fts5: 2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b", -1, SQLITE_TRANSIENT);
 }
 
 static int fts5Init(sqlite3 *db){
   static const sqlite3_module fts5Mod = {
     /* iVersion      */ 2,
     /* xCreate       */ fts5CreateMethod,
     /* xConnect      */ fts5ConnectMethod,
     /* xBestIndex    */ fts5BestIndexMethod,
@@ -209824,15 +209927,15 @@ SQLITE_API int sqlite3_stmt_init(
   rc = sqlite3StmtVtabInit(db);
 #endif
   return rc;
 }
 #endif /* SQLITE_CORE */
 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
 
 /************** End of stmt.c ************************************************/
-#if __LINE__!=209832
+#if __LINE__!=209935
 #undef SQLITE_SOURCE_ID
-#define SQLITE_SOURCE_ID      "2018-04-02 11:04:16 736b53f57f70b23172c30880186dce7ad9baa3b74e3838cae5847cffb98falt2"
+#define SQLITE_SOURCE_ID      "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd14alt2"
 #endif
 /* Return the source-id for this library */
 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
 /************************** End of sqlite3.c ******************************/
--- a/db/sqlite3/src/sqlite3.h
+++ b/db/sqlite3/src/sqlite3.h
@@ -118,19 +118,19 @@ extern "C" {
 ** or SHA3-256 hash of the entire source tree.  If the source code has
 ** been edited in any way since it was last checked in, then the last
 ** four hexadecimal digits of the hash may be modified.
 **
 ** See also: [sqlite3_libversion()],
 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 ** [sqlite_version()] and [sqlite_source_id()].
 */
-#define SQLITE_VERSION        "3.23.0"
-#define SQLITE_VERSION_NUMBER 3023000
-#define SQLITE_SOURCE_ID      "2018-04-02 11:04:16 736b53f57f70b23172c30880186dce7ad9baa3b74e3838cae5847cffb98f5cd2"
+#define SQLITE_VERSION        "3.23.1"
+#define SQLITE_VERSION_NUMBER 3023001
+#define SQLITE_SOURCE_ID      "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
 ** KEYWORDS: sqlite3_version sqlite3_sourceid
 **
 ** These interfaces provide the same information as the [SQLITE_VERSION],
 ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
 ** but are associated with the library instead of the header file.  ^(Cautious
@@ -10101,16 +10101,23 @@ SQLITE_API void sqlite3changegroup_delet
 ** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
 ** may set (*ppRebase) to point to a "rebase" that may be used with the 
 ** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase)
 ** is set to the size of the buffer in bytes. It is the responsibility of the
 ** caller to eventually free any such buffer using sqlite3_free(). The buffer
 ** is only allocated and populated if one or more conflicts were encountered
 ** while applying the patchset. See comments surrounding the sqlite3_rebaser
 ** APIs for further details.
+**
+** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter.
+**
+** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b>
+** and therefore subject to change.
 */
 SQLITE_API int sqlite3changeset_apply(
   sqlite3 *db,                    /* Apply change to "main" db of this handle */
   int nChangeset,                 /* Size of changeset in bytes */
   void *pChangeset,               /* Changeset blob */
   int(*xFilter)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     const char *zTab              /* Table name */
@@ -10131,19 +10138,38 @@ SQLITE_API int sqlite3changeset_apply_v2
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase
+  void **ppRebase, int *pnRebase, /* OUT: Rebase data */
+  int flags                       /* Combination of SESSION_APPLY_* flags */
 );
 
+/*
+** CAPI3REF: Flags for sqlite3changeset_apply_v2
+**
+** The following flags may passed via the 9th parameter to
+** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]:
+**
+** <dl>
+** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd>
+**   Usually, the sessions module encloses all operations performed by
+**   a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The
+**   SAVEPOINT is committed if the changeset or patchset is successfully
+**   applied, or rolled back if an error occurs. Specifying this flag
+**   causes the sessions module to omit this savepoint. In this case, if the
+**   caller has an open transaction or savepoint when apply_v2() is called, 
+**   it may revert the partially applied changeset by rolling it back.
+*/
+#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT   0x0001
+
 /* 
 ** CAPI3REF: Constants Passed To The Conflict Handler
 **
 ** Values that may be passed as the second argument to a conflict-handler.
 **
 ** <dl>
 ** <dt>SQLITE_CHANGESET_DATA<dd>
 **   The conflict handler is invoked with CHANGESET_DATA as the second argument
@@ -10394,16 +10420,17 @@ SQLITE_API void sqlite3rebaser_delete(sq
 ** CAPI3REF: Streaming Versions of API functions.
 **
 ** The six streaming API xxx_strm() functions serve similar purposes to the 
 ** corresponding non-streaming API functions:
 **
 ** <table border=1 style="margin-left:8ex;margin-right:8ex">
 **   <tr><th>Streaming function<th>Non-streaming equivalent</th>
 **   <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply] 
+**   <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2] 
 **   <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat] 
 **   <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert] 
 **   <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start] 
 **   <tr><td>sqlite3session_changeset_strm<td>[sqlite3session_changeset] 
 **   <tr><td>sqlite3session_patchset_strm<td>[sqlite3session_patchset] 
 ** </table>
 **
 ** Non-streaming functions that accept changesets (or patchsets) as input
@@ -10503,17 +10530,18 @@ SQLITE_API int sqlite3changeset_apply_v2
     const char *zTab              /* Table name */
   ),
   int(*xConflict)(
     void *pCtx,                   /* Copy of sixth arg to _apply() */
     int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
     sqlite3_changeset_iter *p     /* Handle describing change and conflict */
   ),
   void *pCtx,                     /* First argument passed to xConflict */
-  void **ppRebase, int *pnRebase
+  void **ppRebase, int *pnRebase,
+  int flags
 );
 SQLITE_API int sqlite3changeset_concat_strm(
   int (*xInputA)(void *pIn, void *pData, int *pnData),
   void *pInA,
   int (*xInputB)(void *pIn, void *pData, int *pnData),
   void *pInB,
   int (*xOutput)(void *pOut, const void *pData, int nData),
   void *pOut
--- a/devtools/client/accessibility/accessibility.css
+++ b/devtools/client/accessibility/accessibility.css
@@ -300,16 +300,17 @@ body {
 
 .accessible .tree .objectBox-node .attrName {
   overflow: hidden;
   text-overflow: ellipsis;
 }
 
 .accessible .tree .objectBox-node .open-inspector{
   width: 17px;
+  cursor: pointer;
 }
 
 .accessible .tree .objectBox-object,
 .accessible .tree .objectBox-string,
 .accessible .tree .objectBox-text,
 .accessible .tree .objectBox-table,
 .accessible .tree .objectLink-textNode,
 .accessible .tree .objectLink-event,
--- a/devtools/shared/heapsnapshot/AutoMemMap.h
+++ b/devtools/shared/heapsnapshot/AutoMemMap.h
@@ -40,19 +40,20 @@ class MOZ_RAII AutoMemMap
   PRFileMap*   fileMap;
   void*        addr;
 
   AutoMemMap(const AutoMemMap& aOther) = delete;
   void operator=(const AutoMemMap& aOther) = delete;
 
 public:
   explicit AutoMemMap(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM)
-      : fd(nullptr)
-      , fileMap(nullptr)
-      , addr(nullptr)
+    : fileInfo{}
+    , fd(nullptr)
+    , fileMap(nullptr)
+    , addr(nullptr)
   {
       MOZ_GUARD_OBJECT_NOTIFIER_INIT;
   };
   ~AutoMemMap();
 
   // Initialize this AutoMemMap.
   nsresult init(const char* filePath, int flags = PR_RDONLY, int mode = 0,
                 PRFileMapProtect prot = PR_PROT_READONLY);
--- a/devtools/shared/heapsnapshot/CoreDump.pb.h
+++ b/devtools/shared/heapsnapshot/CoreDump.pb.h
@@ -398,22 +398,28 @@ class StackFrame_Data : public ::google:
   mutable int _cached_size_;
   ::mozilla::devtools::protobuf::StackFrame* parent_;
   ::google::protobuf::uint64 id_;
   ::google::protobuf::uint32 line_;
   ::google::protobuf::uint32 column_;
   bool issystem_;
   bool isselfhosted_;
   union SourceOrRefUnion {
-    SourceOrRefUnion() {}
+    SourceOrRefUnion()
+      : sourceref_{}
+    {
+    }
     ::google::protobuf::internal::ArenaStringPtr source_;
     ::google::protobuf::uint64 sourceref_;
   } SourceOrRef_;
   union FunctionDisplayNameOrRefUnion {
-    FunctionDisplayNameOrRefUnion() {}
+    FunctionDisplayNameOrRefUnion()
+      : functiondisplaynameref_{}
+    {
+    }
     ::google::protobuf::internal::ArenaStringPtr functiondisplayname_;
     ::google::protobuf::uint64 functiondisplaynameref_;
   } FunctionDisplayNameOrRef_;
   ::google::protobuf::uint32 _oneof_case_[2];
 
   friend struct protobuf_CoreDump_2eproto::TableStruct;
 };
 // -------------------------------------------------------------------
@@ -537,17 +543,20 @@ class StackFrame : public ::google::prot
   inline bool has_StackFrameType() const;
   void clear_StackFrameType();
   inline void clear_has_StackFrameType();
 
   ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_;
   ::google::protobuf::internal::HasBits<1> _has_bits_;
   mutable int _cached_size_;
   union StackFrameTypeUnion {
-    StackFrameTypeUnion() {}
+    StackFrameTypeUnion()
+      : data_{ nullptr }
+    {
+    }
     ::mozilla::devtools::protobuf::StackFrame_Data* data_;
     ::google::protobuf::uint64 ref_;
   } StackFrameType_;
   ::google::protobuf::uint32 _oneof_case_[1];
 
   friend struct protobuf_CoreDump_2eproto::TableStruct;
 };
 // -------------------------------------------------------------------
@@ -800,27 +809,36 @@ class Node : public ::google::protobuf::
   ::google::protobuf::internal::HasBits<1> _has_bits_;
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge > edges_;
   ::mozilla::devtools::protobuf::StackFrame* allocationstack_;
   ::google::protobuf::uint64 id_;
   ::google::protobuf::uint64 size_;
   ::google::protobuf::uint32 coarsetype_;
   union TypeNameOrRefUnion {
-    TypeNameOrRefUnion() {}
+    TypeNameOrRefUnion()
+      : typenameref_{}
+    {
+    }
     ::google::protobuf::internal::ArenaStringPtr typename__;
     ::google::protobuf::uint64 typenameref_;
   } TypeNameOrRef_;
   union JSObjectClassNameOrRefUnion {
-    JSObjectClassNameOrRefUnion() {}
+    JSObjectClassNameOrRefUnion()
+      : jsobjectclassnameref_{}
+    {
+    }
     ::google::protobuf::internal::ArenaStringPtr jsobjectclassname_;
     ::google::protobuf::uint64 jsobjectclassnameref_;
   } JSObjectClassNameOrRef_;
   union ScriptFilenameOrRefUnion {
-    ScriptFilenameOrRefUnion() {}
+    ScriptFilenameOrRefUnion()
+      : scriptfilenameref_{}
+    {
+    }
     ::google::protobuf::internal::ArenaStringPtr scriptfilename_;
     ::google::protobuf::uint64 scriptfilenameref_;
   } ScriptFilenameOrRef_;
   ::google::protobuf::uint32 _oneof_case_[3];
 
   friend struct protobuf_CoreDump_2eproto::TableStruct;
 };
 // -------------------------------------------------------------------
@@ -958,17 +976,20 @@ class Edge : public ::google::protobuf::
   void clear_EdgeNameOrRef();
   inline void clear_has_EdgeNameOrRef();
 
   ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_;
   ::google::protobuf::internal::HasBits<1> _has_bits_;
   mutable int _cached_size_;
   ::google::protobuf::uint64 referent_;
   union EdgeNameOrRefUnion {
-    EdgeNameOrRefUnion() {}
+    EdgeNameOrRefUnion()
+      : nameref_{}
+    {
+    }
     ::google::protobuf::internal::ArenaStringPtr name_;
     ::google::protobuf::uint64 nameref_;
   } EdgeNameOrRef_;
   ::google::protobuf::uint32 _oneof_case_[1];
 
   friend struct protobuf_CoreDump_2eproto::TableStruct;
 };
 // ===================================================================
--- a/devtools/shared/heapsnapshot/HeapSnapshot.cpp
+++ b/devtools/shared/heapsnapshot/HeapSnapshot.cpp
@@ -1351,21 +1351,23 @@ class MOZ_STACK_CLASS HeapSnapshotHandle
   CoreDumpWriter&     writer;
   JS::CompartmentSet* compartments;
 
 public:
   // For telemetry.
   uint32_t nodeCount;
   uint32_t edgeCount;
 
-  HeapSnapshotHandler(CoreDumpWriter& writer,
-                      JS::CompartmentSet* compartments)
-    : writer(writer),
-      compartments(compartments)
-  { }
+  HeapSnapshotHandler(CoreDumpWriter& writer, JS::CompartmentSet* compartments)
+    : writer(writer)
+    , compartments(compartments)
+    , nodeCount{}
+    , edgeCount{}
+  {
+  }
 
   // JS::ubi::BreadthFirst handler interface.
 
   class NodeData { };
   typedef JS::ubi::BreadthFirst<HeapSnapshotHandler> Traversal;
   bool operator() (Traversal& traversal,
                    JS::ubi::Node origin,
                    const JS::ubi::Edge& edge,
--- a/devtools/shared/tests/browser/browser_l10n_localizeMarkup.js
+++ b/devtools/shared/tests/browser/browser_l10n_localizeMarkup.js
@@ -13,41 +13,54 @@ add_task(function* () {
   let TOOLBOX_L10N = new LocalizationHelper("devtools/client/locales/toolbox.properties");
   let str1 = STARTUP_L10N.getStr("inspector.label");
   let str2 = STARTUP_L10N.getStr("inspector.accesskey");
   let str3 = TOOLBOX_L10N.getStr("toolbox.defaultTitle");
   ok(str1 && str2 && str3, "If this failed, strings should be updated in the test");
 
   info("Create the test markup");
   let div = document.createElement("div");
-  div.unsafeSetInnerHTML(
-  `<div data-localization-bundle="devtools/client/locales/startup.properties">
-     <div id="d0" data-localization="content=inspector.someInvalidKey"></div>
-     <div id="d1" data-localization="content=inspector.label">Text will disappear</div>
-     <div id="d2" data-localization="content=inspector.label;title=inspector.accesskey">
-     </div>
-     <!-- keep the following data-localization on two separate lines -->
-     <div id="d3" data-localization="content=inspector.label;
-                                     title=inspector.accesskey"></div>
-     <div id="d4" data-localization="aria-label=inspector.label">Some content</div>
-     <div data-localization-bundle="devtools/client/locales/toolbox.properties">
-       <div id="d5" data-localization="content=toolbox.defaultTitle"></div>
-     </div>
-   </div>
-  `);
+  div.setAttribute("data-localization-bundle",
+                   "devtools/client/locales/startup.properties");
+  let div0 = document.createElement("div");
+  div0.setAttribute("id", "d0");
+  div0.setAttribute("data-localization", "content=inspector.someInvalidKey");
+  div.appendChild(div0);
+  let div1 = document.createElement("div");
+  div1.setAttribute("id", "d1");
+  div1.setAttribute("data-localization", "content=inspector.label");
+  div.appendChild(div1);
+  div1.append("Text will disappear");
+  let div2 = document.createElement("div");
+  div2.setAttribute("id", "d2");
+  div2.setAttribute("data-localization",
+                    "content=inspector.label;title=inspector.accesskey");
+  div.appendChild(div2);
+  let div3 = document.createElement("div");
+  div3.setAttribute("id", "d3");
+  div3.setAttribute("data-localization",
+                    "content=inspector.label;title=inspector.accesskey");
+  div.appendChild(div3);
+  let div4 = document.createElement("div");
+  div4.setAttribute("id", "d4");
+  div4.setAttribute("data-localization", "aria-label=inspector.label");
+  div.appendChild(div4);
+  div4.append("Some content");
+  let toolboxDiv = document.createElement("div");
+  toolboxDiv.setAttribute("data-localization-bundle",
+                          "devtools/client/locales/toolbox.properties");
+  div.appendChild(toolboxDiv);
+  let div5 = document.createElement("div");
+  div5.setAttribute("id", "d5");
+  div5.setAttribute("data-localization", "content=toolbox.defaultTitle");
+  toolboxDiv.appendChild(div5);
 
   info("Use localization helper to localize the test markup");
   localizeMarkup(div);
 
-  let div1 = div.querySelector("#d1");
-  let div2 = div.querySelector("#d2");
-  let div3 = div.querySelector("#d3");
-  let div4 = div.querySelector("#d4");
-  let div5 = div.querySelector("#d5");
-
   is(div1.innerHTML, str1, "The content of #d1 is localized");
   is(div2.innerHTML, str1, "The content of #d2 is localized");
   is(div2.getAttribute("title"), str2, "The title of #d2 is localized");
   is(div3.innerHTML, str1, "The content of #d3 is localized");
   is(div3.getAttribute("title"), str2, "The title of #d3 is localized");
   is(div4.innerHTML, "Some content", "The content of #d4 is not replaced");
   is(div4.getAttribute("aria-label"), str1, "The aria-label of #d4 is localized");
   is(div5.innerHTML, str3, "The content of #d5 is localized with another bundle");
--- a/docshell/base/SerializedLoadContext.cpp
+++ b/docshell/base/SerializedLoadContext.cpp
@@ -8,21 +8,27 @@
 #include "nsNetUtil.h"
 #include "nsIChannel.h"
 #include "nsIPrivateBrowsingChannel.h"
 #include "nsIWebSocketChannel.h"
 
 namespace IPC {
 
 SerializedLoadContext::SerializedLoadContext(nsILoadContext* aLoadContext)
+  : mIsContent{ false }
+  , mUseRemoteTabs{ false }
+  , mUseTrackingProtection{ false }
 {
   Init(aLoadContext);
 }
 
 SerializedLoadContext::SerializedLoadContext(nsIChannel* aChannel)
+  : mIsContent{ false }
+  , mUseRemoteTabs{ false }
+  , mUseTrackingProtection{ false }
 {
   if (!aChannel) {
     Init(nullptr);
     return;
   }
 
   nsCOMPtr<nsILoadContext> loadContext;
   NS_QueryNotificationCallbacks(aChannel, loadContext);
@@ -40,16 +46,19 @@ SerializedLoadContext::SerializedLoadCon
         isOverriden) {
       mIsPrivateBitValid = true;
     }
     mOriginAttributes.SyncAttributesWithPrivateBrowsing(isPrivate);
   }
 }
 
 SerializedLoadContext::SerializedLoadContext(nsIWebSocketChannel* aChannel)
+  : mIsContent{ false }
+  , mUseRemoteTabs{ false }
+  , mUseTrackingProtection{ false }
 {
   nsCOMPtr<nsILoadContext> loadContext;
   if (aChannel) {
     NS_QueryNotificationCallbacks(aChannel, loadContext);
   }
   Init(loadContext);
 }
 
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -384,16 +384,19 @@ nsDocShell::nsDocShell()
   , mIsPrintingOrPP(false)
   , mSavingOldViewer(false)
   , mDynamicallyCreated(false)
   , mAffectPrivateSessionLifetime(true)
   , mInvisible(false)
   , mHasLoadedNonBlankURI(false)
   , mBlankTiming(false)
 {
+  this->mHistoryID.m0 = {};
+  this->mHistoryID.m1 = {};
+  this->mHistoryID.m2 = {};
   AssertOriginAttributesMatchPrivateBrowsing();
 
   nsContentUtils::GenerateUUIDInPlace(mHistoryID);
 
   if (gDocShellCount++ == 0) {
     NS_ASSERTION(sURIFixup == nullptr,
                  "Huh, sURIFixup not null in first nsDocShell ctor!");
 
--- a/dom/animation/ComputedTimingFunction.h
+++ b/dom/animation/ComputedTimingFunction.h
@@ -39,16 +39,17 @@ public:
   Frames(uint32_t aFrames)
   {
     MOZ_ASSERT(aFrames > 1, "The number of frames should be 2 or more");
     return ComputedTimingFunction(nsTimingFunction::Type::Frames, aFrames);
   }
 
   ComputedTimingFunction() = default;
   explicit ComputedTimingFunction(const nsTimingFunction& aFunction)
+    : mStepsOrFrames{}
   {
     Init(aFunction);
   }
   void Init(const nsTimingFunction& aFunction);
 
   // BeforeFlag is used in step timing function.
   // https://drafts.csswg.org/css-timing/#before-flag
   enum class BeforeFlag {
@@ -109,17 +110,20 @@ public:
     return aFunction ? aFunction->GetValue(aPortion, aBeforeFlag) : aPortion;
   }
   static int32_t Compare(const Maybe<ComputedTimingFunction>& aLhs,
                          const Maybe<ComputedTimingFunction>& aRhs);
 
 private:
   ComputedTimingFunction(double x1, double y1, double x2, double y2)
     : mType(nsTimingFunction::Type::CubicBezier)
-    , mTimingFunction(x1, y1, x2, y2) { }
+    , mTimingFunction(x1, y1, x2, y2)
+    , mStepsOrFrames{}
+  {
+  }
   ComputedTimingFunction(nsTimingFunction::Type aType, uint32_t aStepsOrFrames)
     : mType(aType)
     , mStepsOrFrames(aStepsOrFrames) { }
 
   nsTimingFunction::Type mType = nsTimingFunction::Type::Linear;
   nsSMILKeySpline mTimingFunction;
   uint32_t mStepsOrFrames;
 };
--- a/dom/asmjscache/AsmJSCache.cpp
+++ b/dom/asmjscache/AsmJSCache.cpp
@@ -436,25 +436,26 @@ public:
   // We need to always declare refcounting because
   // OpenDirectoryListener has pure-virtual refcounting.
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_NSIRUNNABLE
 
   ParentRunnable(const PrincipalInfo& aPrincipalInfo,
                  OpenMode aOpenMode,
                  const WriteParams& aWriteParams)
-  : mOwningEventTarget(GetCurrentThreadEventTarget()),
-    mPrincipalInfo(aPrincipalInfo),
-    mOpenMode(aOpenMode),
-    mWriteParams(aWriteParams),
-    mOperationMayProceed(true),
-    mState(eInitial),
-    mResult(JS::AsmJSCache_InternalError),
-    mActorDestroyed(false),
-    mOpened(false)
+    : mOwningEventTarget(GetCurrentThreadEventTarget())
+    , mPrincipalInfo(aPrincipalInfo)
+    , mOpenMode(aOpenMode)
+    , mWriteParams(aWriteParams)
+    , mOperationMayProceed(true)
+    , mModuleIndex{}
+    , mState(eInitial)
+    , mResult(JS::AsmJSCache_InternalError)
+    , mActorDestroyed(false)
+    , mOpened(false)
   {
     MOZ_ASSERT(XRE_IsParentProcess());
     AssertIsOnOwningThread();
   }
 
 private:
   ~ParentRunnable() override
   {
--- a/dom/base/DOMException.cpp
+++ b/dom/base/DOMException.cpp
@@ -165,22 +165,23 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Ex
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mData)
   NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
   tmp->mThrownJSVal.setNull();
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 Exception::Exception(const nsACString& aMessage,
                      nsresult aResult,
                      const nsACString& aName,
-                     nsIStackFrame *aLocation,
-                     nsISupports *aData)
+                     nsIStackFrame* aLocation,
+                     nsISupports* aData)
   : mMessage(aMessage)
   , mResult(aResult)
   , mName(aName)
   , mData(aData)
+  , mInitialized{ false }
   , mHoldingJSVal(false)
 {
   if (aLocation) {
     mLocation = aLocation;
   } else {
     mLocation = GetCurrentJSStack();
     // it is legal for there to be no active JS stack, if C++ code
     // is operating on a JS-implemented interface pointer without
--- a/dom/base/DOMPrefsInternal.h
+++ b/dom/base/DOMPrefsInternal.h
@@ -28,17 +28,16 @@ DOM_PREF(NotificationEnabled, "dom.webno
 DOM_PREF(NotificationEnabledInServiceWorkers, "dom.webnotifications.serviceworker.enabled")
 DOM_PREF(NotificationRIEnabled, "dom.webnotifications.requireinteraction.enabled")
 DOM_PREF(ServiceWorkersEnabled, "dom.serviceWorkers.enabled")
 DOM_PREF(ServiceWorkersTestingEnabled, "dom.serviceWorkers.testing.enabled")
 DOM_PREF(StorageManagerEnabled, "dom.storageManager.enabled")
 DOM_PREF(PromiseRejectionEventsEnabled, "dom.promise_rejection_events.enabled")
 DOM_PREF(PushEnabled, "dom.push.enabled")
 DOM_PREF(StreamsEnabled, "dom.streams.enabled")
-DOM_PREF(RequestContextEnabled, "dom.requestcontext.enabled")
 DOM_PREF(OffscreenCanvasEnabled, "gfx.offscreencanvas.enabled")
 DOM_PREF(WebkitBlinkDirectoryPickerEnabled, "dom.webkitBlink.dirPicker.enabled")
 DOM_PREF(NetworkInformationEnabled, "dom.netinfo.enabled")
 DOM_PREF(FetchObserverEnabled, "dom.fetchObserver.enabled")
 DOM_PREF(ResistFingerprintingEnabled, "privacy.resistFingerprinting")
 DOM_PREF(EnableAutoDeclineCanvasPrompts, "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts")
 DOM_PREF(DevToolsEnabled, "devtools.enabled")
 DOM_PREF(PerformanceObserverEnabled, "dom.enable_performance_observer")
@@ -47,14 +46,13 @@ DOM_WEBIDL_PREF(ImageBitmapExtensionsEna
 DOM_WEBIDL_PREF(DOMCachesEnabled)
 DOM_WEBIDL_PREF(NotificationEnabledInServiceWorkers)
 DOM_WEBIDL_PREF(NotificationRIEnabled)
 DOM_WEBIDL_PREF(ServiceWorkersEnabled)
 DOM_WEBIDL_PREF(StorageManagerEnabled)
 DOM_WEBIDL_PREF(PromiseRejectionEventsEnabled)
 DOM_WEBIDL_PREF(PushEnabled)
 DOM_WEBIDL_PREF(StreamsEnabled)
-DOM_WEBIDL_PREF(RequestContextEnabled)
 DOM_WEBIDL_PREF(OffscreenCanvasEnabled)
 DOM_WEBIDL_PREF(WebkitBlinkDirectoryPickerEnabled)
 DOM_WEBIDL_PREF(NetworkInformationEnabled)
 DOM_WEBIDL_PREF(FetchObserverEnabled)
 DOM_WEBIDL_PREF(PerformanceObserverEnabled)
--- a/dom/base/EventSource.cpp
+++ b/dom/base/EventSource.cpp
@@ -450,16 +450,17 @@ class InitRunnable final : public Worker
 public:
   InitRunnable(WorkerPrivate* aWorkerPrivate,
                EventSourceImpl* aEventSourceImpl,
                const nsAString& aURL)
     : WorkerMainThreadRunnable(aWorkerPrivate,
                                NS_LITERAL_CSTRING("EventSource :: Init"))
     , mImpl(aEventSourceImpl)
     , mURL(aURL)
+    , mRv{ NS_ERROR_NOT_INITIALIZED }
   {
     MOZ_ASSERT(aWorkerPrivate);
     aWorkerPrivate->AssertIsOnWorkerThread();
   }
 
   bool MainThreadRun() override
   {
     // Get principal from worker's owner document or from worker.
@@ -1923,16 +1924,17 @@ EventSourceImpl::CheckListenerChain()
 }
 ////////////////////////////////////////////////////////////////////////////////
 // EventSource
 ////////////////////////////////////////////////////////////////////////////////
 
 EventSource::EventSource(nsPIDOMWindowInner* aOwnerWindow,
                          bool aWithCredentials)
   : DOMEventTargetHelper(aOwnerWindow)
+  , mReadyState{}
   , mWithCredentials(aWithCredentials)
   , mIsMainThread(true)
   , mKeepingAlive(false)
 {
   mImpl = new EventSourceImpl(this);
 }
 
 EventSource::~EventSource()
--- a/dom/base/Link.cpp
+++ b/dom/base/Link.cpp
@@ -936,19 +936,21 @@ Link::ParseAsValue(const nsAString& aVal
 
 /* static */ nsContentPolicyType
 Link::AsValueToContentPolicy(const nsAttrValue& aValue)
 {
   switch(aValue.GetEnumValue()) {
   case DESTINATION_INVALID:
     return nsIContentPolicy::TYPE_INVALID;
   case DESTINATION_AUDIO:
+    return nsIContentPolicy::TYPE_INTERNAL_AUDIO;
   case DESTINATION_TRACK:
+    return nsIContentPolicy::TYPE_INTERNAL_TRACK;
   case DESTINATION_VIDEO:
-    return nsIContentPolicy::TYPE_MEDIA;
+    return nsIContentPolicy::TYPE_INTERNAL_VIDEO;
   case DESTINATION_FONT:
     return nsIContentPolicy::TYPE_FONT;
   case DESTINATION_IMAGE:
     return nsIContentPolicy::TYPE_IMAGE;
   case DESTINATION_SCRIPT:
     return nsIContentPolicy::TYPE_SCRIPT;
   case DESTINATION_STYLE:
     return nsIContentPolicy::TYPE_STYLESHEET;
--- a/dom/base/NodeIterator.h
+++ b/dom/base/NodeIterator.h
@@ -67,32 +67,39 @@ public:
     void Detach();
 
     bool WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
 
 private:
     virtual ~NodeIterator();
 
     struct NodePointer {
-        NodePointer() : mNode(nullptr) {}
-        NodePointer(nsINode *aNode, bool aBeforeNode);
+      NodePointer()
+        : mNode(nullptr)
+        , mBeforeNode{ false }
+      {
+      }
+      NodePointer(nsINode* aNode, bool aBeforeNode);
 
-        typedef bool (NodePointer::*MoveToMethodType)(nsINode*);
-        bool MoveToNext(nsINode *aRoot);
-        bool MoveToPrevious(nsINode *aRoot);
+      typedef bool (NodePointer::*MoveToMethodType)(nsINode*);
+      bool MoveToNext(nsINode* aRoot);
+      bool MoveToPrevious(nsINode* aRoot);
 
-        bool MoveForward(nsINode *aRoot, nsINode *aNode);
-        void MoveBackward(nsINode *aParent, nsINode *aNode);
-
-        void AdjustAfterRemoval(nsINode *aRoot, nsINode *aContainer, nsIContent *aChild, nsIContent *aPreviousSibling);
+      bool MoveForward(nsINode* aRoot, nsINode* aNode);
+      void MoveBackward(nsINode* aParent, nsINode* aNode);
 
-        void Clear() { mNode = nullptr; }
+      void AdjustAfterRemoval(nsINode* aRoot,
+                              nsINode* aContainer,
+                              nsIContent* aChild,
+                              nsIContent* aPreviousSibling);
 
-        nsINode *mNode;
-        bool mBeforeNode;
+      void Clear() { mNode = nullptr; }
+
+      nsINode* mNode;
+      bool mBeforeNode;
     };
 
     // Have to return a strong ref, because the act of testing the node can
     // remove it from the DOM so we're holding the only ref to it.
     already_AddRefed<nsINode>
     NextOrPrevNode(NodePointer::MoveToMethodType aMove, ErrorResult& aResult);
 
     NodePointer mPointer;
--- a/dom/base/TextInputProcessor.cpp
+++ b/dom/base/TextInputProcessor.cpp
@@ -33,16 +33,17 @@ class TextInputProcessorNotification fin
   typedef IMENotification::SelectionChangeData SelectionChangeData;
   typedef IMENotification::SelectionChangeDataBase SelectionChangeDataBase;
   typedef IMENotification::TextChangeData TextChangeData;
   typedef IMENotification::TextChangeDataBase TextChangeDataBase;
 
 public:
   explicit TextInputProcessorNotification(const char* aType)
     : mType(aType)
+    , mTextChangeData{}
   {
   }
 
   explicit TextInputProcessorNotification(
              const TextChangeDataBase& aTextChangeData)
     : mType("notify-text-change")
     , mTextChangeData(aTextChangeData)
   {
@@ -273,17 +274,20 @@ protected:
 private:
   nsAutoCString mType;
   union
   {
     TextChangeDataBase mTextChangeData;
     SelectionChangeDataBase mSelectionChangeData;
   };
 
-  TextInputProcessorNotification() { }
+  TextInputProcessorNotification()
+    : mTextChangeData{}
+  {
+  }
 };
 
 NS_IMPL_ISUPPORTS(TextInputProcessorNotification,
                   nsITextInputProcessorNotification)
 
 /******************************************************************************
  * TextInputProcessor
  ******************************************************************************/
--- a/dom/base/nsContentList.h
+++ b/dom/base/nsContentList.h
@@ -577,22 +577,28 @@ public:
   enum ContentListType {
     eNodeList,
     eHTMLCollection
   };
   ContentListType mType;
 #endif
 
 protected:
-  nsCacheableFuncStringContentList(nsINode* aRootNode,
-                                   nsContentListMatchFunc aFunc,
-                                   nsContentListDestroyFunc aDestroyFunc,
-                                   nsFuncStringContentListDataAllocator aDataAllocator,
-                                   const nsAString& aString) :
-    nsContentList(aRootNode, aFunc, aDestroyFunc, nullptr),
+  nsCacheableFuncStringContentList(
+    nsINode* aRootNode,
+    nsContentListMatchFunc aFunc,
+    nsContentListDestroyFunc aDestroyFunc,
+    nsFuncStringContentListDataAllocator aDataAllocator,
+    const nsAString& aString)
+    : nsContentList(aRootNode, aFunc, aDestroyFunc, nullptr)
+    ,
+#ifdef DEBUG
+    mType{ static_cast<ContentListType>(0) }
+    ,
+#endif
     mString(aString)
   {
     mData = (*aDataAllocator)(aRootNode, &mString);
     MOZ_ASSERT(mData);
   }
 
   virtual void RemoveFromCaches() override {
     RemoveFromFuncStringHashtable();
--- a/dom/base/nsContentPermissionHelper.cpp
+++ b/dom/base/nsContentPermissionHelper.cpp
@@ -577,16 +577,17 @@ nsContentPermissionRequestProxy::nsConte
   }
 
   if (mOnChangeCallback) {
     mOnChangeCallback->NotifyVisibility(aIsVisible);
   }
 }
 
 nsContentPermissionRequestProxy::nsContentPermissionRequestProxy()
+  : mParent{ nullptr }
 {
 }
 
 nsContentPermissionRequestProxy::~nsContentPermissionRequestProxy()
 {
 }
 
 nsresult
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -12689,16 +12689,18 @@ ArrayContainsTable(const nsTArray<nsCStr
 }
 
 namespace {
 
 // An object to store all preferences we need for flash blocking feature.
 struct PrefStore
 {
   PrefStore()
+    : mFlashBlockEnabled{ false }
+    , mPluginsHttpOnly{ false }
   {
     Preferences::AddBoolVarCache(&mFlashBlockEnabled,
                                  "plugins.flashBlock.enabled");
     Preferences::AddBoolVarCache(&mPluginsHttpOnly,
                                  "plugins.http_https_only");
 
     // We only need to register string-typed preferences.
     Preferences::RegisterCallback(UpdateStringPrefs, "urlclassifier.flashAllowTable", this);
--- a/dom/base/nsDocumentEncoder.cpp
+++ b/dom/base/nsDocumentEncoder.cpp
@@ -203,16 +203,17 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
 NS_INTERFACE_MAP_END
 
 NS_IMPL_CYCLE_COLLECTION(nsDocumentEncoder,
                          mDocument, mSelection, mRange, mNode, mSerializer,
                          mCommonParent)
 
 nsDocumentEncoder::nsDocumentEncoder()
   : mEncoding(nullptr)
+  , mIsCopying{ false }
   , mCachedBuffer(nullptr)
 {
   Initialize();
   mMimeType.AssignLiteral("text/plain");
 }
 
 void nsDocumentEncoder::Initialize(bool aClearCachedSerializer)
 {
--- a/dom/base/nsFrameLoader.cpp
+++ b/dom/base/nsFrameLoader.cpp
@@ -159,18 +159,20 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
       // We want to end up with a pointer that can then be reinterpret_cast
       // from nsISupports* to nsFrameLoader* and end up with |this|.
       foundInterface = reinterpret_cast<nsISupports*>(this);
   } else
   NS_INTERFACE_MAP_ENTRY(nsIMutationObserver)
   NS_INTERFACE_MAP_ENTRY(nsISupports)
 NS_INTERFACE_MAP_END
 
-nsFrameLoader::nsFrameLoader(Element* aOwner, nsPIDOMWindowOuter* aOpener,
-                             bool aNetworkCreated, int32_t aJSPluginID)
+nsFrameLoader::nsFrameLoader(Element* aOwner,
+                             nsPIDOMWindowOuter* aOpener,
+                             bool aNetworkCreated,
+                             int32_t aJSPluginID)
   : mOwnerContent(aOwner)
   , mDetachedSubdocFrame(nullptr)
   , mOpener(aOpener)
   , mRemoteBrowser(nullptr)
   , mChildID(0)
   , mJSPluginID(aJSPluginID)
   , mBrowserChangingProcessBlockers(nullptr)
   , mDepthTooGreat(false)
@@ -182,16 +184,17 @@ nsFrameLoader::nsFrameLoader(Element* aO
   , mHideCalled(false)
   , mNetworkCreated(aNetworkCreated)
   , mLoadingOriginalSrc(false)
   , mRemoteBrowserShown(false)
   , mRemoteFrame(false)
   , mClipSubdocument(true)
   , mClampScrollPosition(true)
   , mObservingOwnerContent(false)
+  , mFreshProcess{ false }
 {
   mRemoteFrame = ShouldUseRemoteProcess();
   MOZ_ASSERT(!mRemoteFrame || !aOpener,
              "Cannot pass aOpener for a remote frame!");
 }
 
 nsFrameLoader::~nsFrameLoader()
 {
--- a/dom/base/nsGlobalWindowOuter.cpp
+++ b/dom/base/nsGlobalWindowOuter.cpp
@@ -7663,16 +7663,17 @@ nsGlobalWindowOuter::AbstractMainThreadF
   if (GetDocGroup()) {
     return GetDocGroup()->AbstractMainThreadFor(aCategory);
   }
   return DispatcherTrait::AbstractMainThreadFor(aCategory);
 }
 
 nsGlobalWindowOuter::TemporarilyDisableDialogs::TemporarilyDisableDialogs(
   nsGlobalWindowOuter* aWindow MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL)
+  : mSavedDialogsEnabled{ false }
 {
   MOZ_GUARD_OBJECT_NOTIFIER_INIT;
 
   MOZ_ASSERT(aWindow);
   nsGlobalWindowOuter* topWindowOuter = aWindow->GetScriptableTopInternal();
   if (!topWindowOuter) {
     NS_ERROR("nsGlobalWindowOuter::TemporarilyDisableDialogs used without a top "
              "window?");
--- a/dom/base/nsJSEnvironment.cpp
+++ b/dom/base/nsJSEnvironment.cpp
@@ -599,16 +599,18 @@ DumpString(const nsAString &str)
 #endif
 
 #define JS_OPTIONS_DOT_STR "javascript.options."
 
 nsJSContext::nsJSContext(bool aGCOnDestruction,
                          nsIScriptGlobalObject* aGlobalObject)
   : mWindowProxy(nullptr)
   , mGCOnDestruction(aGCOnDestruction)
+  , mModalStateTime{}
+  , mModalStateDepth{}
   , mGlobalObjectRef(aGlobalObject)
 {
   EnsureStatics();
 
   mIsInitialized = false;
   mProcessingScriptTag = false;
   HoldJSObjects(this);
 }
--- a/dom/base/nsPlainTextSerializer.cpp
+++ b/dom/base/nsPlainTextSerializer.cpp
@@ -76,17 +76,20 @@ nsresult
 NS_NewPlainTextSerializer(nsIContentSerializer** aSerializer)
 {
   RefPtr<nsPlainTextSerializer> it = new nsPlainTextSerializer();
   it.forget(aSerializer);
   return NS_OK;
 }
 
 nsPlainTextSerializer::nsPlainTextSerializer()
-  : kSpace(NS_LITERAL_STRING(" ")) // Init of "constant"
+  : mFlags{}
+  , mFloatingLines{}
+  , mLineBreakDue{ false }
+  , kSpace(NS_LITERAL_STRING(" ")) // Init of "constant"
 {
 
   mOutputString = nullptr;
   mHeadLevel = 0;
   mAtFirstColumn = true;
   mIndent = 0;
   mCiteQuoteLevel = 0;
   mStructs = true;       // will be read from prefs later
--- a/dom/base/nsQueryContentEventResult.cpp
+++ b/dom/base/nsQueryContentEventResult.cpp
@@ -48,17 +48,20 @@ NS_INTERFACE_MAP_BEGIN(nsQueryContentEve
   NS_INTERFACE_MAP_ENTRY(nsIQueryContentEventResult)
 NS_INTERFACE_MAP_END
 
 NS_IMPL_ADDREF(nsQueryContentEventResult)
 NS_IMPL_RELEASE(nsQueryContentEventResult)
 
 nsQueryContentEventResult::nsQueryContentEventResult()
   : mEventMessage(eVoidEvent)
+  , mOffset{}
+  , mTentativeCaretOffset{}
   , mSucceeded(false)
+  , mReversed{ false }
 {
 }
 
 nsQueryContentEventResult::~nsQueryContentEventResult()
 {
 }
 
 NS_IMETHODIMP
--- a/dom/base/nsSyncLoadService.cpp
+++ b/dom/base/nsSyncLoadService.cpp
@@ -35,31 +35,36 @@ using mozilla::net::ReferrerPolicy;
  */
 
 class nsSyncLoader : public nsIStreamListener,
                      public nsIChannelEventSink,
                      public nsIInterfaceRequestor,
                      public nsSupportsWeakReference
 {
 public:
-    nsSyncLoader() : mLoading(false) {}
+  nsSyncLoader()
+    : mLoading(false)
+    , mAsyncLoadStatus{ NS_ERROR_NOT_INITIALIZED }
+  {
+  }
 
-    NS_DECL_ISUPPORTS
+  NS_DECL_ISUPPORTS
 
-    nsresult LoadDocument(nsIChannel* aChannel,
-                          bool aChannelIsSync, bool aForceToXML,
-                          ReferrerPolicy aReferrerPolicy,
-                          nsIDOMDocument** aResult);
+  nsresult LoadDocument(nsIChannel* aChannel,
+                        bool aChannelIsSync,
+                        bool aForceToXML,
+                        ReferrerPolicy aReferrerPolicy,
+                        nsIDOMDocument** aResult);
 
-    NS_FORWARD_NSISTREAMLISTENER(mListener->)
-    NS_DECL_NSIREQUESTOBSERVER
+  NS_FORWARD_NSISTREAMLISTENER(mListener->)
+  NS_DECL_NSIREQUESTOBSERVER
 
-    NS_DECL_NSICHANNELEVENTSINK
+  NS_DECL_NSICHANNELEVENTSINK
 
-    NS_DECL_NSIINTERFACEREQUESTOR
+  NS_DECL_NSIINTERFACEREQUESTOR
 
 private:
     virtual ~nsSyncLoader();
 
     nsresult PushAsyncStream(nsIStreamListener* aListener);
     nsresult PushSyncStream(nsIStreamListener* aListener);
 
     nsCOMPtr<nsIChannel> mChannel;
--- a/dom/base/nsXHTMLContentSerializer.cpp
+++ b/dom/base/nsXHTMLContentSerializer.cpp
@@ -44,16 +44,21 @@ NS_NewXHTMLContentSerializer(nsIContentS
 {
   RefPtr<nsXHTMLContentSerializer> it = new nsXHTMLContentSerializer();
   it.forget(aSerializer);
   return NS_OK;
 }
 
 nsXHTMLContentSerializer::nsXHTMLContentSerializer()
   : mIsHTMLSerializer(false)
+  , mDoHeader{ false }
+  , mIsCopying{ false }
+  , mDisableEntityEncoding{}
+  , mRewriteEncodingDeclaration{ false }
+  , mIsFirstChildOfOL{ false }
 {
 }
 
 nsXHTMLContentSerializer::~nsXHTMLContentSerializer()
 {
   NS_ASSERTION(mOLStateStack.IsEmpty(), "Expected OL State stack to be empty");
 }
 
--- a/dom/base/nsXMLContentSerializer.cpp
+++ b/dom/base/nsXMLContentSerializer.cpp
@@ -52,26 +52,33 @@ nsresult
 NS_NewXMLContentSerializer(nsIContentSerializer** aSerializer)
 {
   RefPtr<nsXMLContentSerializer> it = new nsXMLContentSerializer();
   it.forget(aSerializer);
   return NS_OK;
 }
 
 nsXMLContentSerializer::nsXMLContentSerializer()
-  : mPrefixIndex(0),
-    mColPos(0),
-    mIndentOverflow(0),
-    mIsIndentationAddedOnCurrentLine(false),
-    mInAttribute(false),
-    mAddNewlineForRootNode(false),
-    mAddSpace(false),
-    mMayIgnoreLineBreakSequence(false),
-    mBodyOnly(false),
-    mInBody(0)
+  : mPrefixIndex(0)
+  , mFlags{}
+  , mColPos(0)
+  , mDoFormat{ false }
+  , mDoRaw{ false }
+  , mDoWrap{ false }
+  , mAllowLineBreaking{ false }
+  , mMaxColumn{}
+  , mIndentOverflow(0)
+  , mIsIndentationAddedOnCurrentLine(false)
+  , mInAttribute(false)
+  , mAddNewlineForRootNode(false)
+  , mAddSpace(false)
+  , mMayIgnoreLineBreakSequence(false)
+  , mBodyOnly(false)
+  , mInBody(0)
+  , mPreLevel{}
 {
 }
 
 nsXMLContentSerializer::~nsXMLContentSerializer()
 {
 }
 
 NS_IMPL_ISUPPORTS(nsXMLContentSerializer, nsIContentSerializer)
--- a/dom/base/nsXMLNameSpaceMap.h
+++ b/dom/base/nsXMLNameSpaceMap.h
@@ -10,17 +10,20 @@
 #include "nsString.h"
 #include "nsTArray.h"
 #include "nsCOMPtr.h"
 #include "nsAtom.h"
 
 struct nsNameSpaceEntry
 {
   explicit nsNameSpaceEntry(nsAtom* aPrefix)
-    : prefix(aPrefix) {}
+    : prefix(aPrefix)
+    , nameSpaceID{}
+  {
+  }
 
   RefPtr<nsAtom> prefix;
   MOZ_INIT_OUTSIDE_CTOR int32_t nameSpaceID;
 };
 
 /**
  * nsXMLNameSpaceMap contains a set of prefixes which are mapped onto
  * namespaces.  It allows the set to be searched by prefix or by namespace ID.
--- a/dom/bindings/BindingDeclarations.h
+++ b/dom/bindings/BindingDeclarations.h
@@ -382,20 +382,25 @@ private:
   const nsAString* mStr;
 };
 
 template<class T>
 class NonNull
 {
 public:
   NonNull()
+    : ptr
+  {
+    nullptr
+  }
 #ifdef DEBUG
-    : inited(false)
+  , inited(false)
 #endif
-  {}
+  {
+  }
 
   // This is no worse than get() in terms of const handling.
   operator T&() const {
     MOZ_ASSERT(inited);
     MOZ_ASSERT(ptr, "NonNull<T> was set to null");
     return *ptr;
   }
 
--- a/dom/bindings/BindingUtils.cpp
+++ b/dom/bindings/BindingUtils.cpp
@@ -167,17 +167,21 @@ ThrowNoSetterArg(JSContext* aCx, prototy
 }
 
 } // namespace dom
 
 namespace binding_danger {
 
 template<typename CleanupPolicy>
 struct TErrorResult<CleanupPolicy>::Message {
-  Message() { MOZ_COUNT_CTOR(TErrorResult::Message); }
+  Message()
+    : mErrorNumber{ dom::Err_Limit }
+  {
+    MOZ_COUNT_CTOR(TErrorResult::Message);
+  }
   ~Message() { MOZ_COUNT_DTOR(TErrorResult::Message); }
 
   nsTArray<nsString> mArgs;
   dom::ErrNum mErrorNumber;
 
   bool HasCorrectNumberOfArguments()
   {
     return GetErrorArgCount(mErrorNumber) == mArgs.Length();
--- a/dom/bindings/ErrorResult.h
+++ b/dom/bindings/ErrorResult.h
@@ -118,16 +118,20 @@ namespace binding_danger {
  * reported or suppressed, and whether to then go ahead and suppress the
  * exception.
  */
 template<typename CleanupPolicy>
 class TErrorResult {
 public:
   TErrorResult()
     : mResult(NS_OK)
+    , mMessage
+  {
+    nullptr
+  }
 #ifdef DEBUG
     , mMightHaveUnreportedJSException(false)
     , mUnionState(HasNothing)
 #endif
   {
   }
 
   ~TErrorResult() {
--- a/dom/bindings/FakeString.h
+++ b/dom/bindings/FakeString.h
@@ -13,19 +13,21 @@
 
 namespace mozilla {
 namespace dom {
 namespace binding_detail {
 // A struct that has the same layout as an nsString but much faster
 // constructor and destructor behavior. FakeString uses inline storage
 // for small strings and a nsStringBuffer for longer strings.
 struct FakeString {
-  FakeString() :
-    mDataFlags(nsString::DataFlags::TERMINATED),
-    mClassFlags(nsString::ClassFlags(0))
+  FakeString()
+    : mData{ nullptr }
+    , mLength{}
+    , mDataFlags(nsString::DataFlags::TERMINATED)
+    , mClassFlags(nsString::ClassFlags(0))
   {
   }
 
   ~FakeString() {
     if (mDataFlags & nsString::DataFlags::REFCOUNTED) {
       nsStringBuffer::FromData(mData)->Release();
     }
   }
--- a/dom/bindings/TypedArray.h
+++ b/dom/bindings/TypedArray.h
@@ -216,16 +216,17 @@ struct ArrayBufferView_base
 {
 private:
   typedef TypedArray_base<uint8_t, UnwrapArray, GetLengthAndDataAndSharedness>
           Base;
 
 public:
   ArrayBufferView_base()
     : Base()
+    , mType{ static_cast<js::Scalar::Type>(0) }
   {
   }
 
   ArrayBufferView_base(ArrayBufferView_base&& aOther)
     : Base(Move(aOther)),
       mType(aOther.mType)
   {
     aOther.mType = js::Scalar::MaxTypedArrayViewType;
--- a/dom/cache/SavedTypes.h
+++ b/dom/cache/SavedTypes.h
@@ -17,26 +17,42 @@
 #include "nsIOutputStream.h"
 
 namespace mozilla {
 namespace dom {
 namespace cache {
 
 struct SavedRequest
 {
-  SavedRequest() : mHasBodyId(false) { mValue.body() = void_t(); }
+  SavedRequest()
+    : mHasBodyId(false)
+    , mCacheId{}
+  {
+    this->mBodyId.m0 = {};
+    this->mBodyId.m1 = {};
+    this->mBodyId.m2 = {};
+    mValue.body() = void_t();
+  }
   CacheRequest mValue;
   bool mHasBodyId;
   nsID mBodyId;
   CacheId mCacheId;
 };
 
 struct SavedResponse
 {
-  SavedResponse() : mHasBodyId(false) { mValue.body() = void_t(); }
+  SavedResponse()
+    : mHasBodyId(false)
+    , mCacheId{}
+  {
+    this->mBodyId.m0 = {};
+    this->mBodyId.m1 = {};
+    this->mBodyId.m2 = {};
+    mValue.body() = void_t();
+  }
   CacheResponse mValue;
   bool mHasBodyId;
   nsID mBodyId;
   CacheId mCacheId;
 };
 
 } // namespace cache
 } // namespace dom
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -3981,16 +3981,22 @@ CanvasRenderingContext2D::GetHitRegionRe
  * Used for nsBidiPresUtils::ProcessText
  */
 struct MOZ_STACK_CLASS CanvasBidiProcessor : public nsBidiPresUtils::BidiProcessor
 {
   typedef CanvasRenderingContext2D::Style Style;
 
   CanvasBidiProcessor()
     : nsBidiPresUtils::BidiProcessor()
+    , mCtx{ nullptr }
+    , mFontgrp{ nullptr }
+    , mAppUnitsPerDevPixel{}
+    , mOp{ static_cast<CanvasRenderingContext2D::TextDrawOperation>(0) }
+    , mTextRunFlags{ static_cast<gfx::ShapedTextFlags>(0) }
+    , mDoMeasureBoundingBox{ false }
   {
     if (Preferences::GetBool(GFX_MISSING_FONTS_NOTIFY_PREF)) {
       mMissingFonts = new gfxMissingFontRecorder();
     }
   }
 
   ~CanvasBidiProcessor()
   {
--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -104,81 +104,139 @@ WebGLContextOptions::WebGLContextOptions
     , failIfMajorPerformanceCaveat(false)
 {
     // Set default alpha state based on preference.
     if (gfxPrefs::WebGLDefaultNoAlpha())
         alpha = false;
 }
 
 WebGLContext::WebGLContext()
-    : WebGLContextUnchecked(nullptr)
-    , mMaxPerfWarnings(gfxPrefs::WebGLMaxPerfWarnings())
-    , mNumPerfWarnings(0)
-    , mMaxAcceptableFBStatusInvals(gfxPrefs::WebGLMaxAcceptableFBStatusInvals())
-    , mDataAllocGLCallCount(0)
-    , mBypassShaderValidation(false)
-    , mEmptyTFO(0)
-    , mContextLossHandler(this)
-    , mNeedsFakeNoAlpha(false)
-    , mNeedsFakeNoDepth(false)
-    , mNeedsFakeNoStencil(false)
-    , mAllowFBInvalidation(gfxPrefs::WebGLFBInvalidation())
-    , mMsaaSamples(gfxPrefs::WebGLMsaaSamples())
+  : WebGLContextUnchecked(nullptr)
+  , mMaxPerfWarnings(gfxPrefs::WebGLMaxPerfWarnings())
+  , mNumPerfWarnings(0)
+  , mMaxAcceptableFBStatusInvals(gfxPrefs::WebGLMaxAcceptableFBStatusInvals())
+  , mDepthTestEnabled{ '\0' }
+  , mGenerateMipmapHint{}
+  , mDataAllocGLCallCount(0)
+  , mPrimRestartTypeBytes{}
+  , mActiveTexture{}
+  , mDefaultFB_DrawBuffer0{}
+  , mDefaultFB_ReadBuffer{}
+  , mBypassShaderValidation(false)
+  , mGLMaxTextureUnits{}
+  , mGLMaxVertexAttribs{}
+  , mGLMaxFragmentUniformVectors{}
+  , mGLMaxVertexUniformVectors{}
+  , mGLMaxVaryingVectors{}
+  , mGLMaxTransformFeedbackSeparateAttribs{}
+  , mGLMaxUniformBufferBindings{}
+  , mGLMaxVertexTextureImageUnits{}
+  , mGLMaxFragmentTextureImageUnits{}
+  , mGLMaxCombinedTextureImageUnits{}
+  , mGLMaxColorAttachments{}
+  , mGLMaxDrawBuffers{}
+  , mGLMaxTextureSize{}
+  , mGLMaxCubeMapTextureSize{}
+  , mGLMax3DTextureSize{}
+  , mGLMaxArrayTextureLayers{}
+  , mGLMaxRenderbufferSize{}
+  , mPixelStore_UnpackImageHeight{}
+  , mPixelStore_UnpackSkipImages{}
+  , mPixelStore_UnpackRowLength{}
+  , mPixelStore_UnpackSkipRows{}
+  , mPixelStore_UnpackSkipPixels{}
+  , mPixelStore_UnpackAlignment{}
+  , mPixelStore_PackRowLength{}
+  , mPixelStore_PackSkipRows{}
+  , mPixelStore_PackSkipPixels{}
+  , mPixelStore_PackAlignment{}
+  , mPixelStore_ColorspaceConversion{}
+  , mPixelStore_FlipY{ false }
+  , mPixelStore_PremultiplyAlpha{ false }
+  , mPixelStore_RequireFastPath{ false }
+  , mEmptyTFO(0)
+  , mFakeVertexAttrib0BufferObject{}
+  , mFakeVertexAttrib0BufferObjectSize{}
+  , mFakeVertexAttrib0DataDefined{ false }
+  , mStencilRefFront{}
+  , mStencilRefBack{}
+  , mStencilValueMaskFront{}
+  , mStencilValueMaskBack{}
+  , mStencilWriteMaskFront{}
+  , mStencilWriteMaskBack{}
+  , mColorWriteMask{ '\0' }
+  , mDepthWriteMask{ '\0' }
+  , mStencilClearValue{}
+  , mDepthClearValue{ 0.0 }
+  , mLineWidth{ 0.0 }
+  , mContextLossHandler(this)
+  , mNeedsFakeNoAlpha(false)
+  , mNeedsFakeNoDepth(false)
+  , mNeedsFakeNoStencil(false)
+  , mNeedsFakeNoStencil_UserFBs{ false }
+  , mDriverColorMask{ '\0' }
+  , mDriverDepthTest{ false }
+  , mDriverStencilTest{ false }
+  , mNeedsIndexValidation{ false }
+  , mAllowFBInvalidation(gfxPrefs::WebGLFBInvalidation())
+  , mMsaaSamples(gfxPrefs::WebGLMsaaSamples())
+  , mDefaultFB_IsInvalid{ false }
 {
-    mGeneration = 0;
-    mInvalidated = false;
-    mCapturedFrameInvalidated = false;
-    mShouldPresent = true;
-    mResetLayer = true;
-    mOptionsFrozen = false;
-    mDisableExtensions = false;
-    mIsMesa = false;
-    mEmitContextLostErrorOnce = false;
-    mWebGLError = 0;
-    mUnderlyingGLError = 0;
-
-    mContextLostErrorSet = false;
-
-    mViewportX = 0;
-    mViewportY = 0;
-    mViewportWidth = 0;
-    mViewportHeight = 0;
-
-    mDitherEnabled = 1;
-    mRasterizerDiscardEnabled = 0; // OpenGL ES 3.0 spec p244
-    mScissorTestEnabled = 0;
-    mStencilTestEnabled = 0;
-
-    if (NS_IsMainThread()) {
-        // XXX mtseng: bug 709490, not thread safe
-        WebGLMemoryTracker::AddWebGLContext(this);
-    }
-
-    mAllowContextRestore = true;
-    mLastLossWasSimulated = false;
-    mContextStatus = ContextNotLost;
-    mLoseContextOnMemoryPressure = false;
-    mCanLoseContextInForeground = true;
-    mRestoreWhenVisible = false;
-
-    mAlreadyGeneratedWarnings = 0;
-    mAlreadyWarnedAboutFakeVertexAttrib0 = false;
-    mAlreadyWarnedAboutViewportLargerThanDest = false;
-
-    mMaxWarnings = gfxPrefs::WebGLMaxWarningsPerContext();
-    if (mMaxWarnings < -1) {
-        GenerateWarning("webgl.max-warnings-per-context size is too large (seems like a negative value wrapped)");
-        mMaxWarnings = 0;
-    }
-
-    mLastUseIndex = 0;
-
-    mDisableFragHighP = false;
-
-    mDrawCallsSinceLastFlush = 0;
+  mGeneration = 0;
+  mInvalidated = false;
+  mCapturedFrameInvalidated = false;
+  mShouldPresent = true;
+  mResetLayer = true;
+  mOptionsFrozen = false;
+  mDisableExtensions = false;
+  mIsMesa = false;
+  mEmitContextLostErrorOnce = false;
+  mWebGLError = 0;
+  mUnderlyingGLError = 0;
+
+  mContextLostErrorSet = false;
+
+  mViewportX = 0;
+  mViewportY = 0;
+  mViewportWidth = 0;
+  mViewportHeight = 0;
+
+  mDitherEnabled = 1;
+  mRasterizerDiscardEnabled = 0; // OpenGL ES 3.0 spec p244
+  mScissorTestEnabled = 0;
+  mStencilTestEnabled = 0;
+
+  if (NS_IsMainThread()) {
+    // XXX mtseng: bug 709490, not thread safe
+    WebGLMemoryTracker::AddWebGLContext(this);
+  }
+
+  mAllowContextRestore = true;
+  mLastLossWasSimulated = false;
+  mContextStatus = ContextNotLost;
+  mLoseContextOnMemoryPressure = false;
+  mCanLoseContextInForeground = true;
+  mRestoreWhenVisible = false;
+
+  mAlreadyGeneratedWarnings = 0;
+  mAlreadyWarnedAboutFakeVertexAttrib0 = false;
+  mAlreadyWarnedAboutViewportLargerThanDest = false;
+
+  mMaxWarnings = gfxPrefs::WebGLMaxWarningsPerContext();
+  if (mMaxWarnings < -1) {
+    GenerateWarning("webgl.max-warnings-per-context size is too large (seems "
+                    "like a negative value wrapped)");
+    mMaxWarnings = 0;
+  }
+
+  mLastUseIndex = 0;
+
+  mDisableFragHighP = false;
+
+  mDrawCallsSinceLastFlush = 0;
 }
 
 WebGLContext::~WebGLContext()
 {
     RemovePostRefreshObserver();
 
     DestroyResourcesAndContext();
     if (NS_IsMainThread()) {
--- a/dom/canvas/WebGLStrongTypes.h
+++ b/dom/canvas/WebGLStrongTypes.h
@@ -117,19 +117,17 @@ private:
                        "GLenum values should be sorted in ascending order");
         }
         alreadyChecked = true;
 #endif
     }
 
 public:
     StrongGLenum()
-#ifdef DEBUG
         : mValue(NonexistantGLenum)
-#endif
     {
         AssertOnceThatEnumValuesAreSorted();
     }
 
     MOZ_IMPLICIT StrongGLenum(GLenum value)
         : mValue(value)
     {
         AssertOnceThatEnumValuesAreSorted();
--- a/dom/canvas/WebGLTexture.cpp
+++ b/dom/canvas/WebGLTexture.cpp
@@ -120,31 +120,32 @@ WebGLTexture::ImageInfo::SetIsDataInitia
 ////////////////////////////////////////
 
 JSObject*
 WebGLTexture::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) {
     return dom::WebGLTextureBinding::Wrap(cx, this, givenProto);
 }
 
 WebGLTexture::WebGLTexture(WebGLContext* webgl, GLuint tex)
-    : WebGLRefCountedObject(webgl)
-    , mGLName(tex)
-    , mTarget(LOCAL_GL_NONE)
-    , mFaceCount(0)
-    , mMinFilter(LOCAL_GL_NEAREST_MIPMAP_LINEAR)
-    , mMagFilter(LOCAL_GL_LINEAR)
-    , mWrapS(LOCAL_GL_REPEAT)
-    , mWrapT(LOCAL_GL_REPEAT)
-    , mImmutable(false)
-    , mImmutableLevelCount(0)
-    , mBaseMipmapLevel(0)
-    , mMaxMipmapLevel(1000)
-    , mTexCompareMode(LOCAL_GL_NONE)
-    , mIsResolved(false)
-    , mResolved_Swizzle(nullptr)
+  : WebGLRefCountedObject(webgl)
+  , mGLName(tex)
+  , mTarget(LOCAL_GL_NONE)
+  , mFaceCount(0)
+  , mMinFilter(LOCAL_GL_NEAREST_MIPMAP_LINEAR)
+  , mMagFilter(LOCAL_GL_LINEAR)
+  , mWrapS(LOCAL_GL_REPEAT)
+  , mWrapT(LOCAL_GL_REPEAT)
+  , mImmutable(false)
+  , mImmutableLevelCount(0)
+  , mBaseMipmapLevel(0)
+  , mMaxMipmapLevel(1000)
+  , mTexCompareMode(LOCAL_GL_NONE)
+  , mIsResolved(false)
+  , mResolved_FakeBlack{ FakeBlackType::None }
+  , mResolved_Swizzle(nullptr)
 {
     mContext->mTextures.insertBack(this);
 }
 
 void
 WebGLTexture::Delete()
 {
     const char funcName[] = "WebGLTexture::Delete";
--- a/dom/canvas/WebGLTransformFeedback.cpp
+++ b/dom/canvas/WebGLTransformFeedback.cpp
@@ -8,23 +8,26 @@
 #include "GLContext.h"
 #include "mozilla/dom/WebGL2RenderingContextBinding.h"
 #include "WebGL2Context.h"
 #include "WebGLProgram.h"
 
 namespace mozilla {
 
 WebGLTransformFeedback::WebGLTransformFeedback(WebGLContext* webgl, GLuint tf)
-    : WebGLRefCountedObject(webgl)
-    , mGLName(tf)
-    , mIndexedBindings(webgl->mGLMaxTransformFeedbackSeparateAttribs)
-    , mIsPaused(false)
-    , mIsActive(false)
+  : WebGLRefCountedObject(webgl)
+  , mGLName(tf)
+  , mIndexedBindings(webgl->mGLMaxTransformFeedbackSeparateAttribs)
+  , mIsPaused(false)
+  , mIsActive(false)
+  , mActive_PrimMode{}
+  , mActive_VertPosition{}
+  , mActive_VertCapacity{}
 {
-    mContext->mTransformFeedbacks.insertBack(this);
+  mContext->mTransformFeedbacks.insertBack(this);
 }
 
 WebGLTransformFeedback::~WebGLTransformFeedback()
 {
     DeleteOnce();
 }
 
 void
--- a/dom/canvas/WebGLVertexAttribData.h
+++ b/dom/canvas/WebGLVertexAttribData.h
@@ -46,20 +46,29 @@ public:
     GETTER(Stride)
     GETTER(ExplicitStride)
     GETTER(ByteOffset)
 
 #undef GETTER
 
     // note that these initial values are what GL initializes vertex attribs to
     WebGLVertexAttribData()
-        : mDivisor(0)
-        , mEnabled(false)
+      : mDivisor(0)
+      , mEnabled(false)
+      , mIntegerFunc{ false }
+      , mType{}
+      , mBaseType{}
+      , mSize{ '\0' }
+      , mBytesPerVertex{ '\0' }
+      , mNormalized{ false }
+      , mStride{}
+      , mExplicitStride{}
+      , mByteOffset{}
     {
-        VertexAttribPointer(false, nullptr, 4, LOCAL_GL_FLOAT, false, 0, 0);
+      VertexAttribPointer(false, nullptr, 4, LOCAL_GL_FLOAT, false, 0, 0);
     }
 
     void VertexAttribPointer(bool integerFunc, WebGLBuffer* buf, uint8_t size,
                              GLenum type, bool normalized, uint32_t stride,
                              uint64_t byteOffset);
 
     void DoVertexAttribPointer(gl::GLContext* gl, GLuint index) const;
 };
--- a/dom/commandhandler/nsCommandParams.h
+++ b/dom/commandhandler/nsCommandParams.h
@@ -37,16 +37,17 @@ protected:
       nsCString* mCString;
     } mData;
 
     nsCOMPtr<nsISupports> mISupports;
 
     HashEntry(uint8_t aType, const char* aEntryName)
       : mEntryName(aEntryName)
       , mEntryType(aType)
+      , mData{}
     {
       Reset(mEntryType);
     }
 
     HashEntry(const HashEntry& aRHS)
       : mEntryType(aRHS.mEntryType)
     {
       Reset(mEntryType);
--- a/dom/crypto/WebCryptoTask.cpp
+++ b/dom/crypto/WebCryptoTask.cpp
@@ -515,28 +515,38 @@ protected:
   CryptoBuffer mData;
   bool mDataIsSet;
 };
 
 class AesTask : public ReturnArrayBufferViewTask,
                 public DeferredData
 {
 public:
-  AesTask(JSContext* aCx, const ObjectOrString& aAlgorithm,
-          CryptoKey& aKey, bool aEncrypt)
-    : mSymKey(aKey.GetSymKey())
+  AesTask(JSContext* aCx,
+          const ObjectOrString& aAlgorithm,
+          CryptoKey& aKey,
+          bool aEncrypt)
+    : mMechanism{}
+    , mSymKey(aKey.GetSymKey())
+    , mTagLength{ '\0' }
+    , mCounterLength{ '\0' }
     , mEncrypt(aEncrypt)
   {
     Init(aCx, aAlgorithm, aKey, aEncrypt);
   }
 
-  AesTask(JSContext* aCx, const ObjectOrString& aAlgorithm,
-          CryptoKey& aKey, const CryptoOperationData& aData,
+  AesTask(JSContext* aCx,
+          const ObjectOrString& aAlgorithm,
+          CryptoKey& aKey,
+          const CryptoOperationData& aData,
           bool aEncrypt)
-    : mSymKey(aKey.GetSymKey())
+    : mMechanism{}
+    , mSymKey(aKey.GetSymKey())
+    , mTagLength{ '\0' }
+    , mCounterLength{ '\0' }
     , mEncrypt(aEncrypt)
   {
     Init(aCx, aAlgorithm, aKey, aEncrypt);
     SetData(aData);
   }
 
   void Init(JSContext* aCx, const ObjectOrString& aAlgorithm,
             CryptoKey& aKey, bool aEncrypt)
@@ -1677,28 +1687,35 @@ public:
 
 private:
   nsString mHashName;
 };
 
 class ImportRsaKeyTask : public ImportKeyTask
 {
 public:
-  ImportRsaKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx,
-      const nsAString& aFormat,
-      const ObjectOrString& aAlgorithm, bool aExtractable,
-      const Sequence<nsString>& aKeyUsages)
+  ImportRsaKeyTask(nsIGlobalObject* aGlobal,
+                   JSContext* aCx,
+                   const nsAString& aFormat,
+                   const ObjectOrString& aAlgorithm,
+                   bool aExtractable,
+                   const Sequence<nsString>& aKeyUsages)
+    : mModulusLength{}
   {
     Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages);
   }
 
-  ImportRsaKeyTask(nsIGlobalObject* aGlobal, JSContext* aCx,
-      const nsAString& aFormat, JS::Handle<JSObject*> aKeyData,
-      const ObjectOrString& aAlgorithm, bool aExtractable,
-      const Sequence<nsString>& aKeyUsages)
+  ImportRsaKeyTask(nsIGlobalObject* aGlobal,
+                   JSContext* aCx,
+                   const nsAString& aFormat,
+                   JS::Handle<JSObject*> aKeyData,
+                   const ObjectOrString& aAlgorithm,
+                   bool aExtractable,
+                   const Sequence<nsString>& aKeyUsages)
+    : mModulusLength{}
   {
     Init(aGlobal, aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages);
     if (NS_FAILED(mEarlyRv)) {
       return;
     }
 
     SetKeyData(aCx, aKeyData);
     NS_ENSURE_SUCCESS_VOID(mEarlyRv);
@@ -2355,19 +2372,25 @@ private:
 
   virtual void Cleanup() override
   {
     mKey = nullptr;
   }
 };
 
 GenerateAsymmetricKeyTask::GenerateAsymmetricKeyTask(
-    nsIGlobalObject* aGlobal, JSContext* aCx, const ObjectOrString& aAlgorithm,
-    bool aExtractable, const Sequence<nsString>& aKeyUsages)
+  nsIGlobalObject* aGlobal,
+  JSContext* aCx,
+  const ObjectOrString& aAlgorithm,
+  bool aExtractable,
+  const Sequence<nsString>& aKeyUsages)
   : mKeyPair(new CryptoKeyPair())
+  , mMechanism{}
+  , mRsaParams{}
+  , mDhParams{}
 {
   mArena = UniquePLArenaPool(PORT_NewArena(DER_DEFAULT_CHUNKSIZE));
   if (!mArena) {
     mEarlyRv = NS_ERROR_DOM_UNKNOWN_ERR;
     return;
   }
 
   // Create an empty key pair and set easy attributes
@@ -2596,25 +2619,33 @@ GenerateAsymmetricKeyTask::Cleanup()
 {
   mKeyPair = nullptr;
 }
 
 class DeriveHkdfBitsTask : public ReturnArrayBufferViewTask
 {
 public:
   DeriveHkdfBitsTask(JSContext* aCx,
-      const ObjectOrString& aAlgorithm, CryptoKey& aKey, uint32_t aLength)
+                     const ObjectOrString& aAlgorithm,
+                     CryptoKey& aKey,
+                     uint32_t aLength)
     : mSymKey(aKey.GetSymKey())
+    , mMechanism{}
   {
     Init(aCx, aAlgorithm, aKey, aLength);
   }
 
-  DeriveHkdfBitsTask(JSContext* aCx, const ObjectOrString& aAlgorithm,
-                      CryptoKey& aKey, const ObjectOrString& aTargetAlgorithm)
-    : mSymKey(aKey.GetSymKey())
+  DeriveHkdfBitsTask(JSContext* aCx,
+                     const ObjectOrString& aAlgorithm,
+                     CryptoKey& aKey,
+                     const ObjectOrString& aTargetAlgorithm)
+    : mLengthInBits{}
+    , mLengthInBytes{}
+    , mSymKey(aKey.GetSymKey())
+    , mMechanism{}
   {
     size_t length;
     mEarlyRv = GetKeyLengthForAlgorithm(aCx, aTargetAlgorithm, length);
 
     if (NS_SUCCEEDED(mEarlyRv)) {
       Init(aCx, aAlgorithm, aKey, length);
     }
   }
@@ -2746,25 +2777,33 @@ private:
     return NS_OK;
   }
 };
 
 class DerivePbkdfBitsTask : public ReturnArrayBufferViewTask
 {
 public:
   DerivePbkdfBitsTask(JSContext* aCx,
-      const ObjectOrString& aAlgorithm, CryptoKey& aKey, uint32_t aLength)
+                      const ObjectOrString& aAlgorithm,
+                      CryptoKey& aKey,
+                      uint32_t aLength)
     : mSymKey(aKey.GetSymKey())
+    , mHashOidTag{ SEC_OID_UNKNOWN }
   {
     Init(aCx, aAlgorithm, aKey, aLength);
   }
 
-  DerivePbkdfBitsTask(JSContext* aCx, const ObjectOrString& aAlgorithm,
-                      CryptoKey& aKey, const ObjectOrString& aTargetAlgorithm)
-    : mSymKey(aKey.GetSymKey())
+  DerivePbkdfBitsTask(JSContext* aCx,
+                      const ObjectOrString& aAlgorithm,
+                      CryptoKey& aKey,
+                      const ObjectOrString& aTargetAlgorithm)
+    : mLength{}
+    , mIterations{}
+    , mSymKey(aKey.GetSymKey())
+    , mHashOidTag{ SEC_OID_UNKNOWN }
   {
     size_t length;
     mEarlyRv = GetKeyLengthForAlgorithm(aCx, aTargetAlgorithm, length);
 
     if (NS_SUCCEEDED(mEarlyRv)) {
       Init(aCx, aAlgorithm, aKey, length);
     }
   }
--- a/dom/events/DataTransfer.cpp
+++ b/dom/events/DataTransfer.cpp
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 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 "mozilla/ArrayUtils.h"
 #include "mozilla/BasicEvents.h"
+#include "mozilla/CheckedInt.h"
 
 #include "DataTransfer.h"
 
 #include "nsIDOMDocument.h"
 #include "nsISupportsPrimitives.h"
 #include "nsIScriptSecurityManager.h"
 #include "mozilla/dom/DOMStringList.h"
 #include "nsArray.h"
@@ -1465,21 +1466,24 @@ DataTransfer::FillInExternalCustomTypes(
 {
   char* chrs;
   uint32_t len = 0;
   nsresult rv = aData->GetAsStringWithSize(&len, &chrs);
   if (NS_FAILED(rv)) {
     return;
   }
 
-  nsAutoCString str;
-  str.Adopt(chrs, len);
+  CheckedInt<int32_t> checkedLen(len);
+  if (!checkedLen.isValid()) {
+    return;
+  }
 
   nsCOMPtr<nsIInputStream> stringStream;
-  NS_NewCStringInputStream(getter_AddRefs(stringStream), str);
+  NS_NewByteInputStream(getter_AddRefs(stringStream), chrs, checkedLen.value(),
+                        NS_ASSIGNMENT_ADOPT);
 
   nsCOMPtr<nsIObjectInputStream> stream =
     NS_NewObjectInputStream(stringStream);
 
   uint32_t type;
   do {
     rv = stream->Read32(&type);
     NS_ENSURE_SUCCESS_VOID(rv);
--- a/dom/events/EventListenerManager.cpp
+++ b/dom/events/EventListenerManager.cpp
@@ -1438,34 +1438,33 @@ EventListenerManager::RemoveEventListene
     const auto& options = aOptions.GetAsEventListenerOptions();
     flags.mCapture = options.mCapture;
     flags.mInSystemGroup = options.mMozSystemGroup;
   }
   RemoveEventListenerByType(Move(aListenerHolder), aType, flags);
 }
 
 void
-EventListenerManager::AddListenerForAllEvents(nsIDOMEventListener* aDOMListener,
+EventListenerManager::AddListenerForAllEvents(EventListener* aDOMListener,
                                               bool aUseCapture,
                                               bool aWantsUntrusted,
                                               bool aSystemEventGroup)
 {
   EventListenerFlags flags;
   flags.mCapture = aUseCapture;
   flags.mAllowUntrustedEvents = aWantsUntrusted;
   flags.mInSystemGroup = aSystemEventGroup;
   AddEventListenerInternal(EventListenerHolder(aDOMListener), eAllEvents,
                            nullptr, EmptyString(), flags, false, true);
 }
 
 void
-EventListenerManager::RemoveListenerForAllEvents(
-                        nsIDOMEventListener* aDOMListener,
-                        bool aUseCapture,
-                        bool aSystemEventGroup)
+EventListenerManager::RemoveListenerForAllEvents(EventListener* aDOMListener,
+                                                 bool aUseCapture,
+                                                 bool aSystemEventGroup)
 {
   EventListenerFlags flags;
   flags.mCapture = aUseCapture;
   flags.mInSystemGroup = aSystemEventGroup;
   RemoveEventListenerInternal(EventListenerHolder(aDOMListener), eAllEvents,
                               nullptr, EmptyString(), flags, true);
 }
 
--- a/dom/events/EventListenerManager.h
+++ b/dom/events/EventListenerManager.h
@@ -292,40 +292,52 @@ public:
   }
   void RemoveEventListener(const nsAString& aType,
                            dom::EventListener* aListener,
                            const dom::EventListenerOptionsOrBoolean& aOptions)
   {
     RemoveEventListener(aType, EventListenerHolder(aListener), aOptions);
   }
 
-  void AddListenerForAllEvents(nsIDOMEventListener* aListener,
+  void AddListenerForAllEvents(dom::EventListener* aListener,
                                bool aUseCapture,
                                bool aWantsUntrusted,
                                bool aSystemEventGroup);
-  void RemoveListenerForAllEvents(nsIDOMEventListener* aListener,
+  void RemoveListenerForAllEvents(dom::EventListener* aListener,
                                   bool aUseCapture,
                                   bool aSystemEventGroup);
 
   /**
   * Sets events listeners of all types.
   * @param an event listener
   */
-  void AddEventListenerByType(nsIDOMEventListener *aListener,
+  void AddEventListenerByType(nsIDOMEventListener* aListener,
+                              const nsAString& type,
+                              const EventListenerFlags& aFlags)
+  {
+    AddEventListenerByType(EventListenerHolder(aListener), type, aFlags);
+  }
+  void AddEventListenerByType(dom::EventListener* aListener,
                               const nsAString& type,
                               const EventListenerFlags& aFlags)
   {
     AddEventListenerByType(EventListenerHolder(aListener), type, aFlags);
   }
   void AddEventListenerByType(EventListenerHolder aListener,
                               const nsAString& type,
                               const EventListenerFlags& aFlags,
                               const dom::Optional<bool>& aPassive =
                                 dom::Optional<bool>());
-  void RemoveEventListenerByType(nsIDOMEventListener *aListener,
+  void RemoveEventListenerByType(nsIDOMEventListener* aListener,
+                                 const nsAString& type,
+                                 const EventListenerFlags& aFlags)
+  {
+    RemoveEventListenerByType(EventListenerHolder(aListener), type, aFlags);
+  }
+  void RemoveEventListenerByType(dom::EventListener* aListener,
                                  const nsAString& type,
                                  const EventListenerFlags& aFlags)
   {
     RemoveEventListenerByType(EventListenerHolder(aListener), type, aFlags);
   }
   void RemoveEventListenerByType(EventListenerHolder aListener,
                                  const nsAString& type,
                                  const EventListenerFlags& aFlags);
--- a/dom/events/EventListenerService.cpp
+++ b/dom/events/EventListenerService.cpp
@@ -5,16 +5,18 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "EventListenerService.h"
 #include "mozilla/BasicEvents.h"
 #include "mozilla/EventDispatcher.h"
 #include "mozilla/EventListenerManager.h"
 #include "mozilla/JSEventHandler.h"
 #include "mozilla/Maybe.h"
+#include "mozilla/dom/EventListenerBinding.h"
+#include "mozilla/dom/ScriptSettings.h"
 #include "nsArrayUtils.h"
 #include "nsCOMArray.h"
 #include "nsIXPConnect.h"
 #include "nsJSUtils.h"
 #include "nsMemory.h"
 #include "nsServiceManagerUtils.h"
 #include "nsArray.h"
 #include "nsThreadUtils.h"
@@ -265,94 +267,129 @@ EventListenerService::HasListenersFor(ns
   nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(aEventTarget);
   NS_ENSURE_TRUE(eventTarget, NS_ERROR_NO_INTERFACE);
 
   EventListenerManager* elm = eventTarget->GetExistingListenerManager();
   *aRetVal = elm && elm->HasListenersFor(aType);
   return NS_OK;
 }
 
+static already_AddRefed<EventListener>
+ToEventListener(JSContext* aCx, JS::Handle<JS::Value> aValue)
+{
+  if (NS_WARN_IF(!aValue.isObject())) {
+    return nullptr;
+  }
+
+  JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
+  RefPtr<EventListener> listener =
+    new EventListener(aCx, obj, GetIncumbentGlobal());
+  return listener.forget();
+}
+
 NS_IMETHODIMP
 EventListenerService::AddSystemEventListener(nsIDOMEventTarget *aTarget,
                                              const nsAString& aType,
-                                             nsIDOMEventListener* aListener,
-                                             bool aUseCapture)
+                                             JS::Handle<JS::Value> aListener,
+                                             bool aUseCapture,
+                                             JSContext* aCx)
 {
   NS_PRECONDITION(aTarget, "Missing target");
-  NS_PRECONDITION(aListener, "Missing listener");
 
   nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(aTarget);
   NS_ENSURE_TRUE(eventTarget, NS_ERROR_NO_INTERFACE);
 
+  RefPtr<EventListener> listener = ToEventListener(aCx, aListener);
+  if (!listener) {
+    return NS_ERROR_UNEXPECTED;
+  }
+
   EventListenerManager* manager = eventTarget->GetOrCreateListenerManager();
   NS_ENSURE_STATE(manager);
 
   EventListenerFlags flags =
     aUseCapture ? TrustedEventsAtSystemGroupCapture() :
                   TrustedEventsAtSystemGroupBubble();
-  manager->AddEventListenerByType(aListener, aType, flags);
+  manager->AddEventListenerByType(listener, aType, flags);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 EventListenerService::RemoveSystemEventListener(nsIDOMEventTarget *aTarget,
                                                 const nsAString& aType,
-                                                nsIDOMEventListener* aListener,
-                                                bool aUseCapture)
+                                                JS::Handle<JS::Value> aListener,
+                                                bool aUseCapture,
+                                                JSContext* aCx)
 {
   NS_PRECONDITION(aTarget, "Missing target");
-  NS_PRECONDITION(aListener, "Missing listener");
 
   nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(aTarget);
   NS_ENSURE_TRUE(eventTarget, NS_ERROR_NO_INTERFACE);
 
+  RefPtr<EventListener> listener = ToEventListener(aCx, aListener);
+  if (!listener) {
+    return NS_ERROR_UNEXPECTED;
+  }
+
   EventListenerManager* manager = eventTarget->GetExistingListenerManager();
   if (manager) {
     EventListenerFlags flags =
       aUseCapture ? TrustedEventsAtSystemGroupCapture() :
                     TrustedEventsAtSystemGroupBubble();
-    manager->RemoveEventListenerByType(aListener, aType, flags);
+    manager->RemoveEventListenerByType(listener, aType, flags);
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 EventListenerService::AddListenerForAllEvents(nsIDOMEventTarget* aTarget,
-                                              nsIDOMEventListener* aListener,
+                                              JS::Handle<JS::Value> aListener,
                                               bool aUseCapture,
                                               bool aWantsUntrusted,
-                                              bool aSystemEventGroup)
+                                              bool aSystemEventGroup,
+                                              JSContext* aCx)
 {
-  NS_ENSURE_STATE(aTarget && aListener);
+  NS_ENSURE_STATE(aTarget);
 
   nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(aTarget);
   NS_ENSURE_TRUE(eventTarget, NS_ERROR_NO_INTERFACE);
 
+  RefPtr<EventListener> listener = ToEventListener(aCx, aListener);
+  if (!listener) {
+    return NS_ERROR_UNEXPECTED;
+  }
+
   EventListenerManager* manager = eventTarget->GetOrCreateListenerManager();
   NS_ENSURE_STATE(manager);
-  manager->AddListenerForAllEvents(aListener, aUseCapture, aWantsUntrusted,
-                               aSystemEventGroup);
+  manager->AddListenerForAllEvents(listener, aUseCapture, aWantsUntrusted,
+                                   aSystemEventGroup);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 EventListenerService::RemoveListenerForAllEvents(nsIDOMEventTarget* aTarget,
-                                                 nsIDOMEventListener* aListener,
+                                                 JS::Handle<JS::Value> aListener,
                                                  bool aUseCapture,
-                                                 bool aSystemEventGroup)
+                                                 bool aSystemEventGroup,
+                                                 JSContext* aCx)
 {
-  NS_ENSURE_STATE(aTarget && aListener);
+  NS_ENSURE_STATE(aTarget);
 
   nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(aTarget);
   NS_ENSURE_TRUE(eventTarget, NS_ERROR_NO_INTERFACE);
 
+  RefPtr<EventListener> listener = ToEventListener(aCx, aListener);
+  if (!listener) {
+    return NS_ERROR_UNEXPECTED;
+  }
+
   EventListenerManager* manager = eventTarget->GetExistingListenerManager();
   if (manager) {
-    manager->RemoveListenerForAllEvents(aListener, aUseCapture, aSystemEventGroup);
+    manager->RemoveListenerForAllEvents(listener, aUseCapture, aSystemEventGroup);
   }
   return NS_OK;
 }
 
 NS_IMETHODIMP
 EventListenerService::AddListenerChangeListener(nsIListenerChangeListener* aListener)
 {
   if (!mChangeListeners.Contains(aListener)) {
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -286,18 +286,20 @@ EventStateManager::WheelPrefs*
 bool EventStateManager::WheelPrefs::sWheelEventsEnabledOnPlugins = true;
 EventStateManager::DeltaAccumulator*
   EventStateManager::DeltaAccumulator::sInstance = nullptr;
 
 EventStateManager::EventStateManager()
   : mLockCursor(0)
   , mLastFrameConsumedSetCursor(false)
   , mCurrentTarget(nullptr)
-    // init d&d gesture state machine variables
-  , mGestureDownPoint(0,0)
+  // init d&d gesture state machine variables
+  , mGestureDownPoint(0, 0)
+  , mGestureModifiers{}
+  , mGestureDownButtons{}
   , mPresContext(nullptr)
   , mLClickCount(0)
   , mMClickCount(0)
   , mRClickCount(0)
   , mInTouchDrag(false)
   , m_haveShutdown(false)
 {
   if (sESMInstanceCount == 0) {
--- a/dom/events/IMEContentObserver.cpp
+++ b/dom/events/IMEContentObserver.cpp
@@ -194,16 +194,17 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
 NS_INTERFACE_MAP_END
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(IMEContentObserver)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(IMEContentObserver)
 
 IMEContentObserver::IMEContentObserver()
   : mESM(nullptr)
   , mIMENotificationRequests(nullptr)
+  , mPreAttrChangeLength{}
   , mSuppressNotifications(0)
   , mPreCharacterDataChangeLength(-1)
   , mSendingNotification(NOTIFY_IME_OF_NOTHING)
   , mIsObserving(false)
   , mIMEHasFocus(false)
   , mNeedsToNotifyIMEOfFocusSet(false)
   , mNeedsToNotifyIMEOfTextChange(false)
   , mNeedsToNotifyIMEOfSelectionChange(false)
--- a/dom/events/TextComposition.h
+++ b/dom/events/TextComposition.h
@@ -572,16 +572,17 @@ private:
     RefPtr<TextComposition> mTextComposition;
     nsCOMPtr<nsINode> mEventTarget;
     nsString mData;
     EventMessage mEventMessage;
     bool mIsSynthesizedEvent;
 
     CompositionEventDispatcher()
       : Runnable("TextComposition::CompositionEventDispatcher")
+      , mEventMessage{ eVoidEvent }
       , mIsSynthesizedEvent(false){};
   };
 
   /**
    * DispatchCompositionEventRunnable() dispatches a composition event to the
    * content.  Be aware, if you use this method, nsPresShellEventCB isn't used.
    * That means that nsIFrame::HandleEvent() is never called.
    * WARNING: The instance which is managed by IMEStateManager may be
--- a/dom/events/XULCommandEvent.cpp
+++ b/dom/events/XULCommandEvent.cpp
@@ -8,19 +8,20 @@
 #include "prtime.h"
 
 namespace mozilla {
 namespace dom {
 
 XULCommandEvent::XULCommandEvent(EventTarget* aOwner,
                                  nsPresContext* aPresContext,
                                  WidgetInputEvent* aEvent)
-  : UIEvent(aOwner, aPresContext,
-            aEvent ? aEvent :
-                     new WidgetInputEvent(false, eVoidEvent, nullptr))
+  : UIEvent(aOwner,
+            aPresContext,
+            aEvent ? aEvent : new WidgetInputEvent(false, eVoidEvent, nullptr))
+  , mInputSource{}
 {
   if (aEvent) {
     mEventIsInternal = false;
   }
   else {
     mEventIsInternal = true;
     mEvent->mTime = PR_Now();
   }
--- a/dom/events/nsIEventListenerService.idl
+++ b/dom/events/nsIEventListenerService.idl
@@ -1,16 +1,15 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* 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 "nsISupports.idl"
 
-interface nsIDOMEventListener;
 interface nsIDOMEventTarget;
 interface nsIArray;
 
 /**
  * Contains an event target along with a count of event listener changes
  * affecting accessibility.
  */
 [scriptable, uuid(07222b02-da12-4cf4-b2f7-761da007a8d8)]
@@ -89,36 +88,40 @@ interface nsIEventListenerService : nsIS
    * Returns true if a event target has any listener for the given type.
    */
   boolean hasListenersFor(in nsIDOMEventTarget aEventTarget,
                           in DOMString aType);
 
   /**
    * Add a system-group eventlistener to a event target.
    */
+  [implicit_jscontext]
   void addSystemEventListener(in nsIDOMEventTarget target,
                               in DOMString type,
-                              in nsIDOMEventListener listener,
+                              in jsval listener,
                               in boolean useCapture);
 
   /**
    * Remove a system-group eventlistener from a event target.
    */
+  [implicit_jscontext]
   void removeSystemEventListener(in nsIDOMEventTarget target,
                                  in DOMString type,
-                                 in nsIDOMEventListener listener,
+                                 in jsval listener,
                                  in boolean useCapture);
 
+  [implicit_jscontext]
   void addListenerForAllEvents(in nsIDOMEventTarget target,
-                               in nsIDOMEventListener listener,
+                               in jsval listener,
                                [optional] in boolean aUseCapture,
                                [optional] in boolean aWantsUntrusted,
                                [optional] in boolean aSystemEventGroup);
 
+  [implicit_jscontext]
   void removeListenerForAllEvents(in nsIDOMEventTarget target,
-                                  in nsIDOMEventListener listener,
+                                  in jsval listener,
                                   [optional] in boolean aUseCapture,
                                   [optional] in boolean aSystemEventGroup);
 
   void addListenerChangeListener(in nsIListenerChangeListener aListener);
   void removeListenerChangeListener(in nsIListenerChangeListener aListener);
 };
 
--- a/dom/events/test/test_bug448602.html
+++ b/dom/events/test/test_bug448602.html
@@ -180,17 +180,17 @@ function testAllListener() {
   var clickListenerCalled = false;
   var allListenerCalled = false;
   function clickListener() {
     clickListenerCalled = true;
     ok(allListenerCalled, "Should have called '*' listener before normal listener!");
   }
   function allListener2() {
     allListenerCalled = true;
-    notok(clickListenerCalled, "Shouldn't have called click listener before '*' listener!");
+    ok(!clickListenerCalled, "Shouldn't have called click listener before '*' listener!");
   }
   root.onclick = null; // Remove the listener added in earlier tests.
   root.addEventListener("click", clickListener);
   els.addListenerForAllEvents(root, allListener2, false, true);
   l3.dispatchEvent(new MouseEvent("click", { bubbles: true }));
   root.removeEventListener("click", clickListener);
   els.removeListenerForAllEvents(root, allListener2, false);
   ok(allListenerCalled, "Should have called '*' listener");
--- a/dom/fetch/BodyExtractor.cpp
+++ b/dom/fetch/BodyExtractor.cpp
@@ -135,22 +135,23 @@ BodyExtractor<const nsAString>::GetAsStr
                                             nsACString& aContentTypeWithCharset,
                                             nsACString& aCharset) const
 {
   nsCString encoded;
   if (!CopyUTF16toUTF8(*mBody, encoded, fallible)) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
 
-  nsresult rv = NS_NewCStringInputStream(aResult, encoded);
+  uint32_t encodedLength = encoded.Length();
+  nsresult rv = NS_NewCStringInputStream(aResult, Move(encoded));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  *aContentLength = encoded.Length();
+  *aContentLength = encodedLength;
   aContentTypeWithCharset.AssignLiteral("text/plain;charset=UTF-8");
   aCharset.AssignLiteral("UTF-8");
   return NS_OK;
 }
 
 template<> nsresult
 BodyExtractor<nsIInputStream>::GetAsStream(nsIInputStream** aResult,
                                            uint64_t* aContentLength,
--- a/dom/fetch/FetchDriver.cpp
+++ b/dom/fetch/FetchDriver.cpp
@@ -334,26 +334,30 @@ FetchDriver::FetchDriver(InternalRequest
                          bool aIsTrackingFetch)
   : mPrincipal(aPrincipal)
   , mLoadGroup(aLoadGroup)
   , mRequest(aRequest)
   , mMainThreadEventTarget(aMainThreadEventTarget)
   , mPerformanceStorage(aPerformanceStorage)
   , mNeedToObserveOnDataAvailable(false)
   , mIsTrackingFetch(aIsTrackingFetch)
+  , mOnStopRequestCalled
+{
+  false
+}
 #ifdef DEBUG
   , mResponseAvailableCalled(false)
   , mFetchCalled(false)
 #endif
-{
-  AssertIsOnMainThread();
+  {
+    AssertIsOnMainThread();
 
-  MOZ_ASSERT(aRequest);
-  MOZ_ASSERT(aPrincipal);
-  MOZ_ASSERT(aMainThreadEventTarget);
+    MOZ_ASSERT(aRequest);
+    MOZ_ASSERT(aPrincipal);
+    MOZ_ASSERT(aMainThreadEventTarget);
 }
 
 FetchDriver::~FetchDriver()
 {
   AssertIsOnMainThread();
 
   // We assert this since even on failures, we should call
   // FailWithNetworkError().
--- a/dom/fetch/InternalRequest.cpp
+++ b/dom/fetch/InternalRequest.cpp
@@ -119,31 +119,32 @@ InternalRequest::InternalRequest(const n
                                  RequestRedirect aRequestRedirect,
                                  RequestCredentials aRequestCredentials,
                                  const nsAString& aReferrer,
                                  ReferrerPolicy aReferrerPolicy,
                                  nsContentPolicyType aContentPolicyType,
                                  const nsAString& aIntegrity)
   : mMethod(aMethod)
   , mHeaders(aHeaders)
+  , mBodyLength{}
   , mContentPolicyType(aContentPolicyType)
   , mReferrer(aReferrer)
   , mReferrerPolicy(aReferrerPolicy)
   , mEnvironmentReferrerPolicy(net::RP_Unset)
   , mMode(aMode)
   , mCredentialsMode(aRequestCredentials)
   , mResponseTainting(LoadTainting::Basic)
   , mCacheMode(aCacheMode)
   , mRedirectMode(aRequestRedirect)
   , mIntegrity(aIntegrity)
   , mMozErrors(false)
   , mAuthenticationFlag(false)
   , mForceOriginHeader(false)
   , mPreserveContentCodings(false)
-    // FIXME See the above comment in the default constructor.
+  // FIXME See the above comment in the default constructor.
   , mSameOriginDataURL(true)
   , mSkipServiceWorker(false)
   , mSynchronous(false)
   , mUnsafeRequest(false)
   , mUseURLCredentials(false)
 {
   MOZ_ASSERT(!aURL.IsEmpty());
   AddURL(aURL, aFragment);
@@ -177,25 +178,37 @@ InternalRequest::InternalRequest(const I
   , mContentPolicyTypeOverridden(aOther.mContentPolicyTypeOverridden)
 {
   // NOTE: does not copy body stream... use the fallible Clone() for that
 }
 
 InternalRequest::InternalRequest(const IPCInternalRequest& aIPCRequest)
   : mMethod(aIPCRequest.method())
   , mURLList(aIPCRequest.urls())
-  , mHeaders(new InternalHeaders(aIPCRequest.headers(),
-                                 aIPCRequest.headersGuard()))
+  , mHeaders(
+      new InternalHeaders(aIPCRequest.headers(), aIPCRequest.headersGuard()))
+  , mBodyLength{}
   , mContentPolicyType(aIPCRequest.contentPolicyType())
   , mReferrer(aIPCRequest.referrer())
   , mReferrerPolicy(aIPCRequest.referrerPolicy())
+  , mEnvironmentReferrerPolicy{ RP_Unset }
   , mMode(aIPCRequest.mode())
   , mCredentialsMode(aIPCRequest.credentials())
-  , mCacheMode(aIPCRequest.requestCache())
+  , /* FIXME: initialize mResponseTainting */ mCacheMode(
+    aIPCRequest.requestCache())
   , mRedirectMode(aIPCRequest.requestRedirect())
+  , mMozErrors{ false }
+  , mAuthenticationFlag{ false }
+  , mForceOriginHeader{ false }
+  , mPreserveContentCodings{ false }
+  , mSameOriginDataURL{ false }
+  , mSkipServiceWorker{ false }
+  , mSynchronous{ false }
+  , mUnsafeRequest{ false }
+  , mUseURLCredentials{ false }
 {
   MOZ_ASSERT(!mURLList.IsEmpty());
 }
 
 InternalRequest::~InternalRequest()
 {
 }
 
@@ -226,126 +239,131 @@ InternalRequest::SetContentPolicyType(ns
 
 void
 InternalRequest::OverrideContentPolicyType(nsContentPolicyType aContentPolicyType)
 {
   SetContentPolicyType(aContentPolicyType);
   mContentPolicyTypeOverridden = true;
 }
 
-/* static */
-RequestContext
-InternalRequest::MapContentPolicyTypeToRequestContext(nsContentPolicyType aContentPolicyType)
+/* static */ RequestDestination
+InternalRequest::MapContentPolicyTypeToRequestDestination(nsContentPolicyType aContentPolicyType)
 {
-  RequestContext context = RequestContext::Internal;
+  RequestDestination destination = RequestDestination::_empty;
   switch (aContentPolicyType) {
   case nsIContentPolicy::TYPE_OTHER:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_SCRIPT:
   case nsIContentPolicy::TYPE_INTERNAL_SCRIPT_PRELOAD:
   case nsIContentPolicy::TYPE_INTERNAL_SERVICE_WORKER:
   case nsIContentPolicy::TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS:
-    context = RequestContext::Script;
+  case nsIContentPolicy::TYPE_SCRIPT:
+    destination = RequestDestination::Script;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_WORKER:
-    context = RequestContext::Worker;
+    destination = RequestDestination::Worker;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER:
-    context = RequestContext::Sharedworker;
+    destination = RequestDestination::Sharedworker;
     break;
+  case nsIContentPolicy::TYPE_IMAGESET:
   case nsIContentPolicy::TYPE_INTERNAL_IMAGE:
   case nsIContentPolicy::TYPE_INTERNAL_IMAGE_PRELOAD:
   case nsIContentPolicy::TYPE_INTERNAL_IMAGE_FAVICON:
-    context = RequestContext::Image;
+  case nsIContentPolicy::TYPE_IMAGE:
+    destination = RequestDestination::Image;
     break;
+  case nsIContentPolicy::TYPE_STYLESHEET:
   case nsIContentPolicy::TYPE_INTERNAL_STYLESHEET:
   case nsIContentPolicy::TYPE_INTERNAL_STYLESHEET_PRELOAD:
-    context = RequestContext::Style;
+    destination = RequestDestination::Style;
     break;
+  case nsIContentPolicy::TYPE_OBJECT:
   case nsIContentPolicy::TYPE_INTERNAL_OBJECT:
-    context = RequestContext::Object;
+    destination = RequestDestination::Object;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_EMBED:
-    context = RequestContext::Embed;
+    destination = RequestDestination::Embed;
     break;
   case nsIContentPolicy::TYPE_DOCUMENT:
-    context = RequestContext::Internal;
-    break;
+  case nsIContentPolicy::TYPE_SUBDOCUMENT:
   case nsIContentPolicy::TYPE_INTERNAL_IFRAME:
-    context = RequestContext::Iframe;
+    destination = RequestDestination::Document;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_FRAME:
-    context = RequestContext::Frame;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_REFRESH:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_XBL:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_PING:
-    context = RequestContext::Ping;
+    destination = RequestDestination::_empty;
     break;
+  case nsIContentPolicy::TYPE_XMLHTTPREQUEST:
   case nsIContentPolicy::TYPE_INTERNAL_XMLHTTPREQUEST:
-    context = RequestContext::Xmlhttprequest;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_EVENTSOURCE:
-    context = RequestContext::Eventsource;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_OBJECT_SUBREQUEST:
-    context = RequestContext::Plugin;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_DTD:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_FONT:
-    context = RequestContext::Font;
+    destination = RequestDestination::Font;
+    break;
+  case nsIContentPolicy::TYPE_MEDIA:
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_AUDIO:
-    context = RequestContext::Audio;
+    destination = RequestDestination::Audio;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_VIDEO:
-    context = RequestContext::Video;
+    destination = RequestDestination::Video;
     break;
   case nsIContentPolicy::TYPE_INTERNAL_TRACK:
-    context = RequestContext::Track;
+    destination = RequestDestination::Track;
     break;
   case nsIContentPolicy::TYPE_WEBSOCKET:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_CSP_REPORT:
-    context = RequestContext::Cspreport;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_XSLT:
-    context = RequestContext::Xslt;
+    destination = RequestDestination::Xslt;
     break;
   case nsIContentPolicy::TYPE_BEACON:
-    context = RequestContext::Beacon;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_FETCH:
-    context = RequestContext::Fetch;
-    break;
-  case nsIContentPolicy::TYPE_IMAGESET:
-    context = RequestContext::Imageset;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_WEB_MANIFEST:
-    context = RequestContext::Manifest;
+    destination = RequestDestination::Manifest;
     break;
   case nsIContentPolicy::TYPE_SAVEAS_DOWNLOAD:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   case nsIContentPolicy::TYPE_SPECULATIVE:
-    context = RequestContext::Internal;
+    destination = RequestDestination::_empty;
     break;
   default:
     MOZ_ASSERT(false, "Unhandled nsContentPolicyType value");
     break;
   }
-  return context;
+
+  return destination;
 }
 
 // static
 bool
 InternalRequest::IsNavigationContentPolicy(nsContentPolicyType aContentPolicyType)
 {
   // https://fetch.spec.whatwg.org/#navigation-request-context
   //
@@ -371,17 +389,17 @@ bool
 InternalRequest::IsWorkerContentPolicy(nsContentPolicyType aContentPolicyType)
 {
   // https://fetch.spec.whatwg.org/#worker-request-context
   //
   // A worker request context is one of "serviceworker", "sharedworker", and
   // "worker".
   //
   // Note, service workers are not included here because currently there is
-  // no way to generate a Request with a "serviceworker" RequestContext.
+  // no way to generate a Request with a "serviceworker" RequestDestination.
   // ServiceWorker scripts cannot be intercepted.
   return aContentPolicyType == nsIContentPolicy::TYPE_INTERNAL_WORKER ||
          aContentPolicyType == nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER;
 }
 
 bool
 InternalRequest::IsNavigationRequest() const
 {
--- a/dom/fetch/InternalRequest.h
+++ b/dom/fetch/InternalRequest.h
@@ -26,66 +26,46 @@ namespace mozilla {
 
 namespace ipc {
 class PrincipalInfo;
 } // namespace ipc
 
 namespace dom {
 
 /*
- * The mapping of RequestContext and nsContentPolicyType is currently as the
+ * The mapping of RequestDestination and nsContentPolicyType is currently as the
  * following.  Note that this mapping is not perfect yet (see the TODO comments
  * below for examples).
  *
- * RequestContext    | nsContentPolicyType
+ * RequestDestination| nsContentPolicyType
  * ------------------+--------------------
  * audio             | TYPE_INTERNAL_AUDIO
- * beacon            | TYPE_BEACON
- * cspreport         | TYPE_CSP_REPORT
- * download          |
+ * audioworklet      | TODO
+ * document          | TYPE_DOCUMENT, TYPE_INTERNAL_IFRAME, TYPE_SUBDOCUMENT
  * embed             | TYPE_INTERNAL_EMBED
- * eventsource       |
- * favicon           |
- * fetch             | TYPE_FETCH
  * font              | TYPE_FONT
- * form              |
- * frame             | TYPE_INTERNAL_FRAME
- * hyperlink         |
- * iframe            | TYPE_INTERNAL_IFRAME
- * image             | TYPE_INTERNAL_IMAGE, TYPE_INTERNAL_IMAGE_PRELOAD, TYPE_INTERNAL_IMAGE_FAVICON
- * imageset          | TYPE_IMAGESET
- * import            | Not supported by Gecko
- * internal          | TYPE_DOCUMENT, TYPE_XBL, TYPE_OTHER, TYPE_SAVEAS_DOWNLOAD
- * location          |
+ * image             | TYPE_INTERNAL_IMAGE, TYPE_INTERNAL_IMAGE_PRELOAD,
+ *                   | TYPE_IMAGE, TYPE_INTERNAL_IMAGE_FAVICON, TYPE_IMAGESET
  * manifest          | TYPE_WEB_MANIFEST
- * object            | TYPE_INTERNAL_OBJECT
- * ping              | TYPE_PING
- * plugin            | TYPE_OBJECT_SUBREQUEST
- * prefetch          |
- * script            | TYPE_INTERNAL_SCRIPT, TYPE_INTERNAL_SCRIPT_PRELOAD
+ * object            | TYPE_INTERNAL_OBJECT, TYPE_OBJECT
+ * "paintworklet"    | TODO
+ * report"           | TODO
+ * script            | TYPE_INTERNAL_SCRIPT, TYPE_INTERNAL_SCRIPT_PRELOAD, TYPE_SCRIPT
+ *                   | TYPE_INTERNAL_SERVICE_WORKER, TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS
  * sharedworker      | TYPE_INTERNAL_SHARED_WORKER
- * subresource       | Not supported by Gecko
- * style             | TYPE_INTERNAL_STYLESHEET, TYPE_INTERNAL_STYLESHEET_PRELOAD
+ * serviceworker     | The spec lists this as a valid value for the enum,however it
+ *                   | is impossible to observe a request with this destination value.
+ * style             | TYPE_INTERNAL_STYLESHEET, TYPE_INTERNAL_STYLESHEET_PRELOAD,
+ *                   | TYPE_STYLESHEET
  * track             | TYPE_INTERNAL_TRACK
  * video             | TYPE_INTERNAL_VIDEO
  * worker            | TYPE_INTERNAL_WORKER
- * xmlhttprequest    | TYPE_INTERNAL_XMLHTTPREQUEST
- * eventsource       | TYPE_INTERNAL_EVENTSOURCE
  * xslt              | TYPE_XSLT
+ * _empty            | Default for everything else.
  *
- * TODO: Figure out if TYPE_REFRESH maps to anything useful
- * TODO: Figure out if TYPE_DTD maps to anything useful
- * TODO: Figure out if TYPE_WEBSOCKET maps to anything useful
- * TODO: Add a content type for prefetch
- * TODO: Use the content type for manifest when it becomes available
- * TODO: Add a content type for location
- * TODO: Add a content type for hyperlink
- * TODO: Add a content type for form
- * TODO: Add a content type for favicon
- * TODO: Add a content type for download
  */
 
 class Request;
 class IPCInternalRequest;
 
 #define kFETCH_CLIENT_REFERRER_STR "about:client"
 class InternalRequest final
 {
@@ -427,20 +407,20 @@ public:
     return mContentPolicyType;
   }
   void
   SetContentPolicyType(nsContentPolicyType aContentPolicyType);
 
   void
   OverrideContentPolicyType(nsContentPolicyType aContentPolicyType);
 
-  RequestContext
-  Context() const
+  RequestDestination
+  Destination() const
   {
-    return MapContentPolicyTypeToRequestContext(mContentPolicyType);
+    return MapContentPolicyTypeToRequestDestination(mContentPolicyType);
   }
 
   bool
   UnsafeRequest() const
   {
     return mUnsafeRequest;
   }
 
@@ -565,18 +545,25 @@ public:
   }
 
 private:
   // Does not copy mBodyStream.  Use fallible Clone() for complete copy.
   explicit InternalRequest(const InternalRequest& aOther);
 
   ~InternalRequest();
 
-  static RequestContext
-  MapContentPolicyTypeToRequestContext(nsContentPolicyType aContentPolicyType);
+  // Map the content policy type to the associated fetch destination, as defined
+  // by the spec at https://fetch.spec.whatwg.org/#concept-request-destination.
+  // Note that while the HTML spec for the "Link" element and its "as" attribute
+  // (https://html.spec.whatwg.org/#attr-link-as) reuse fetch's definition of
+  // destination, and the Link class has an internal Link::AsDestination enum type,
+  // the latter is only a support type to map the string values via
+  // Link::ParseAsValue and Link::AsValueToContentPolicy to our canonical nsContentPolicyType.
+  static RequestDestination
+  MapContentPolicyTypeToRequestDestination(nsContentPolicyType aContentPolicyType);
 
   static bool
   IsNavigationContentPolicy(nsContentPolicyType aContentPolicyType);
 
   static bool
   IsWorkerContentPolicy(nsContentPolicyType aContentPolicyType);
 
   nsCString mMethod;
--- a/dom/fetch/Request.h
+++ b/dom/fetch/Request.h
@@ -86,20 +86,20 @@ public:
   }
 
   bool
   MozErrors() const
   {
     return mRequest->MozErrors();
   }
 
-  RequestContext
-  Context() const
+  RequestDestination
+  Destination() const
   {
-    return mRequest->Context();
+    return mRequest->Destination();
   }
 
   void
   OverrideContentPolicyType(nsContentPolicyType aContentPolicyType)
   {
     mRequest->OverrideContentPolicyType(aContentPolicyType);
   }
 
--- a/dom/file/FileReaderSync.cpp
+++ b/dom/file/FileReaderSync.cpp
@@ -495,15 +495,15 @@ FileReaderSync::ConvertAsyncToSyncStream
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   if (read != aStreamSize) {
     return NS_ERROR_FAILURE;
   }
 
-  rv = NS_NewCStringInputStream(aSyncStream, buffer);
+  rv = NS_NewCStringInputStream(aSyncStream, Move(buffer));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   return NS_OK;
 }
--- a/dom/filesystem/FileSystemTaskBase.h
+++ b/dom/filesystem/FileSystemTaskBase.h
@@ -183,17 +183,19 @@ private:
 
 // This class is the 'alter ego' of FileSystemTaskChildBase in the PBackground
 // world.
 class FileSystemTaskParentBase : public Runnable
 {
 public:
   FileSystemTaskParentBase()
     : Runnable("FileSystemTaskParentBase")
-  {}
+    , mErrorValue{ NS_ERROR_NOT_INITIALIZED }
+  {
+  }
 
   /*
    * Start the task. This must be called from the PBackground thread only.
    */
   void
   Start();
 
   /*
--- a/dom/filesystem/GetFilesHelper.h
+++ b/dom/filesystem/GetFilesHelper.h
@@ -154,17 +154,21 @@ protected:
 };
 
 class GetFilesHelperChild final : public GetFilesHelper
 {
 public:
   GetFilesHelperChild(nsIGlobalObject* aGlobal, bool aRecursiveFlag)
     : GetFilesHelper(aGlobal, aRecursiveFlag)
     , mPendingOperation(false)
-  {}
+  {
+    this->mUUID.m0 = {};
+    this->mUUID.m1 = {};
+    this->mUUID.m2 = {};
+  }
 
   virtual void
   Work(ErrorResult& aRv) override;
 
   virtual void
   Cancel() override;
 
   bool
--- a/dom/gamepad/GamepadHapticActuator.h
+++ b/dom/gamepad/GamepadHapticActuator.h
@@ -18,17 +18,20 @@ class Promise;
 
 class GamepadHapticActuator : public nsISupports,
                               public nsWrapperCache
 {
 public:
   GamepadHapticActuator(nsISupports* aParent, uint32_t aGamepadId,
                         uint32_t aIndex);
   explicit GamepadHapticActuator(nsISupports* aParent)
-    : mParent(aParent), mType(GamepadHapticActuatorType::Vibration)
+    : mParent(aParent)
+    , mGamepadId{}
+    , mType(GamepadHapticActuatorType::Vibration)
+    , mIndex{}
   {
   }
 
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(GamepadHapticActuator)
 
   nsISupports* GetParentObject() const;
 
--- a/dom/grid/GridLine.cpp
+++ b/dom/grid/GridLine.cpp
@@ -15,22 +15,23 @@ namespace dom {
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(GridLine, mParent)
 NS_IMPL_CYCLE_COLLECTING_ADDREF(GridLine)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(GridLine)
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(GridLine)
   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
   NS_INTERFACE_MAP_ENTRY(nsISupports)
 NS_INTERFACE_MAP_END
 
-GridLine::GridLine(GridLines *aParent)
+GridLine::GridLine(GridLines* aParent)
   : mParent(aParent)
   , mStart(0.0)
   , mBreadth(0.0)
   , mType(GridDeclaration::Implicit)
   , mNumber(0)
+  , mNegativeNumber{}
 {
   MOZ_ASSERT(aParent, "Should never be instantiated with a null GridLines");
 }
 
 GridLine::~GridLine()
 {
 }
 
--- a/dom/html/HTMLFormSubmission.cpp
+++ b/dom/html/HTMLFormSubmission.cpp
@@ -297,36 +297,33 @@ FSURLEncoded::GetEncodedSubmission(nsIUR
       }
 
       path += NS_LITERAL_CSTRING("&force-plain-text=Y&body=") + escapedBody;
 
       return NS_MutateURI(aURI)
                .SetPathQueryRef(path)
                .Finalize(aOutURI);
     } else {
-
+      uint32_t queryStringLength = mQueryString.Length();
       nsCOMPtr<nsIInputStream> dataStream;
-      // XXX We *really* need to either get the string to disown its data (and
-      // not destroy it), or make a string input stream that owns the CString
-      // that is passed to it.  Right now this operation does a copy.
-      rv = NS_NewCStringInputStream(getter_AddRefs(dataStream), mQueryString);
+      rv = NS_NewCStringInputStream(getter_AddRefs(dataStream), Move(mQueryString));
       NS_ENSURE_SUCCESS(rv, rv);
+      mQueryString.Truncate();
 
       nsCOMPtr<nsIMIMEInputStream> mimeStream(
         do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv));
       NS_ENSURE_SUCCESS(rv, rv);
 
       mimeStream->AddHeader("Content-Type",
                             "application/x-www-form-urlencoded");
       mimeStream->SetData(dataStream);
 
-      *aPostDataStream = mimeStream;
-      NS_ADDREF(*aPostDataStream);
+      mimeStream.forget(aPostDataStream);
 
-      *aPostDataStreamLength = mQueryString.Length();
+      *aPostDataStreamLength = queryStringLength;
     }
 
   } else {
     // Get the full query string
     bool schemeIsJavaScript;
     rv = aURI->SchemeIs("javascript", &schemeIsJavaScript);
     NS_ENSURE_SUCCESS(rv, rv);
     if (schemeIsJavaScript) {
@@ -777,32 +774,33 @@ FSTextPlain::GetEncodedSubmission(nsIURI
     // values which contains '=' or newlines are potentially ambigiously
     // encoded, but that how text/plain is specced.
     nsCString cbody;
     EncodeVal(mBody, cbody, false);
     cbody.Adopt(nsLinebreakConverter::
                 ConvertLineBreaks(cbody.get(),
                                   nsLinebreakConverter::eLinebreakAny,
                                   nsLinebreakConverter::eLinebreakNet));
+    uint32_t bodyLength = cbody.Length();
     nsCOMPtr<nsIInputStream> bodyStream;
-    rv = NS_NewCStringInputStream(getter_AddRefs(bodyStream), cbody);
+    rv = NS_NewCStringInputStream(getter_AddRefs(bodyStream), Move(cbody));
     if (!bodyStream) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
 
     // Create mime stream with headers and such
     nsCOMPtr<nsIMIMEInputStream> mimeStream
         = do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv);
     NS_ENSURE_SUCCESS(rv, rv);
 
     mimeStream->AddHeader("Content-Type", "text/plain");
     mimeStream->SetData(bodyStream);
     CallQueryInterface(mimeStream, aPostDataStream);
 
-    *aPostDataStreamLength = cbody.Length();
+    *aPostDataStreamLength = bodyLength;
   }
 
   return rv;
 }
 
 } // anonymous namespace
 
 // --------------------------------------------------------------------------
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -5228,36 +5228,40 @@ void HTMLMediaElement::EndSrcMediaStream
     }
     ms.mTrackPorts.Clear();
   }
 
   mSrcStream = nullptr;
 }
 
 static already_AddRefed<AudioTrack>
-CreateAudioTrack(AudioStreamTrack* aStreamTrack)
+CreateAudioTrack(AudioStreamTrack* aStreamTrack,
+                 nsIGlobalObject* aOwnerGlobal)
 {
   nsAutoString id;
   nsAutoString label;
   aStreamTrack->GetId(id);
   aStreamTrack->GetLabel(label, CallerType::System);
 
-  return MediaTrackList::CreateAudioTrack(id, NS_LITERAL_STRING("main"),
+  return MediaTrackList::CreateAudioTrack(aOwnerGlobal,
+                                          id, NS_LITERAL_STRING("main"),
                                           label, EmptyString(), true);
 }
 
 static already_AddRefed<VideoTrack>
-CreateVideoTrack(VideoStreamTrack* aStreamTrack)
+CreateVideoTrack(VideoStreamTrack* aStreamTrack,
+                 nsIGlobalObject* aOwnerGlobal)
 {
   nsAutoString id;
   nsAutoString label;
   aStreamTrack->GetId(id);
   aStreamTrack->GetLabel(label, CallerType::System);
 
-  return MediaTrackList::CreateVideoTrack(id, NS_LITERAL_STRING("main"),
+  return MediaTrackList::CreateVideoTrack(aOwnerGlobal,
+                                          id, NS_LITERAL_STRING("main"),
                                           label, EmptyString(),
                                           aStreamTrack);
 }
 
 void
 HTMLMediaElement::NotifyMediaStreamTrackAdded(const RefPtr<MediaStreamTrack>& aTrack)
 {
   MOZ_ASSERT(aTrack);
@@ -5271,24 +5275,26 @@ HTMLMediaElement::NotifyMediaStreamTrack
   aTrack->GetId(id);
 
   LOG(LogLevel::Debug, ("%p, Adding %sTrack with id %s",
                         this, aTrack->AsAudioStreamTrack() ? "Audio" : "Video",
                         NS_ConvertUTF16toUTF8(id).get()));
 #endif
 
   if (AudioStreamTrack* t = aTrack->AsAudioStreamTrack()) {
-    RefPtr<AudioTrack> audioTrack = CreateAudioTrack(t);
+    RefPtr<AudioTrack> audioTrack =
+      CreateAudioTrack(t, AudioTracks()->GetOwnerGlobal());
     AudioTracks()->AddTrack(audioTrack);
   } else if (VideoStreamTrack* t = aTrack->AsVideoStreamTrack()) {
     // TODO: Fix this per the spec on bug 1273443.
     if (!IsVideo()) {
       return;
     }
-    RefPtr<VideoTrack> videoTrack = CreateVideoTrack(t);
+    RefPtr<VideoTrack> videoTrack =
+      CreateVideoTrack(t, VideoTracks()->GetOwnerGlobal());
     VideoTracks()->AddTrack(videoTrack);
     // New MediaStreamTrack added, set the new added video track as selected
     // video track when there is no selected track.
     if (VideoTracks()->SelectedIndex() == -1) {
       MOZ_ASSERT(!mSelectedVideoStreamTrack);
       videoTrack->SetEnabledInternal(true, MediaTrack::FIRE_NO_EVENTS);
     }
   }
@@ -7685,27 +7691,30 @@ HTMLMediaElement::ConstructMediaTracks(c
     return;
   }
 
   mMediaTracksConstructed = true;
 
   AudioTrackList* audioList = AudioTracks();
   if (audioList && aInfo->HasAudio()) {
     const TrackInfo& info = aInfo->mAudio;
-    RefPtr<AudioTrack> track = MediaTrackList::CreateAudioTrack(
-    info.mId, info.mKind, info.mLabel, info.mLanguage, info.mEnabled);
+    RefPtr<AudioTrack> track =
+      MediaTrackList::CreateAudioTrack(audioList->GetOwnerGlobal(), info.mId,
+                                       info.mKind, info.mLabel, info.mLanguage,
+                                       info.mEnabled);
 
     audioList->AddTrack(track);
   }
 
   VideoTrackList* videoList = VideoTracks();
   if (videoList && aInfo->HasVideo()) {
     const TrackInfo& info = aInfo->mVideo;
-    RefPtr<VideoTrack> track = MediaTrackList::CreateVideoTrack(
-    info.mId, info.mKind, info.mLabel, info.mLanguage);
+    RefPtr<VideoTrack> track =
+      MediaTrackList::CreateVideoTrack(videoList->GetOwnerGlobal(), info.mId,
+                                       info.mKind, info.mLabel, info.mLanguage);
 
     videoList->AddTrack(track);
     track->SetEnabledInternal(info.mEnabled, MediaTrack::FIRE_NO_EVENTS);
   }
 }
 
 void
 HTMLMediaElement::RemoveMediaTracks()
--- a/dom/indexedDB/IDBObjectStore.cpp
+++ b/dom/indexedDB/IDBObjectStore.cpp
@@ -460,17 +460,17 @@ private:
 
     nsCString compiled;
     compiled.SetLength(compiledSize);
 
     mModule->compiledSerialize(
       reinterpret_cast<uint8_t*>(compiled.BeginWriting()), compiledSize);
 
     MOZ_ALWAYS_SUCCEEDS(NS_NewCStringInputStream(getter_AddRefs(mStream),
-                                                 compiled));
+                                                 Move(compiled)));
 
     mModule = nullptr;
 
     CallCallback();
   }
 };
 
 NS_IMPL_ISUPPORTS(WasmCompiledModuleStream,
--- a/dom/ipc/ContentBridgeParent.cpp
+++ b/dom/ipc/ContentBridgeParent.cpp
@@ -18,17 +18,18 @@ using namespace mozilla::jsipc;
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_ISUPPORTS(ContentBridgeParent,
                   nsIContentParent,
                   nsIObserver)
 
 ContentBridgeParent::ContentBridgeParent()
-  : mIsForJSPlugin(false)
+  : mIsForBrowser{ false }
+  , mIsForJSPlugin(false)
 {}
 
 ContentBridgeParent::~ContentBridgeParent()
 {
 }
 
 void
 ContentBridgeParent::ActorDestroy(ActorDestroyReason aWhy)
--- a/dom/ipc/FilePickerParent.h
+++ b/dom/ipc/FilePickerParent.h
@@ -17,35 +17,37 @@
 class nsIFile;
 
 namespace mozilla {
 namespace dom {
 
 class FilePickerParent : public PFilePickerParent
 {
  public:
-  FilePickerParent(const nsString& aTitle,
-                   const int16_t& aMode)
-  : mTitle(aTitle)
-  , mMode(aMode)
-  {}
+   FilePickerParent(const nsString& aTitle, const int16_t& aMode)
+     : mTitle(aTitle)
+     , mMode(aMode)
+     , mResult{}
+   {
+   }
 
-  virtual ~FilePickerParent();
+   virtual ~FilePickerParent();
 
-  void Done(int16_t aResult);
+   void Done(int16_t aResult);
 
-  struct BlobImplOrString
-  {
-    RefPtr<BlobImpl> mBlobImpl;
-    nsString mDirectoryPath;
+   struct BlobImplOrString
+   {
+     RefPtr<BlobImpl> mBlobImpl;
+     nsString mDirectoryPath;
 
-    enum {
-      eBlobImpl,
-      eDirectoryPath
-    } mType;
+     enum
+     {
+       eBlobImpl,
+       eDirectoryPath
+     } mType;
   };
 
   void SendFilesOrDirectories(const nsTArray<BlobImplOrString>& aData);
 
   virtual mozilla::ipc::IPCResult RecvOpen(const int16_t& aSelectedType,
                                            const bool& aAddToRecentDocs,
                                            const nsString& aDefaultFile,
                                            const nsString& aDefaultExtension,
--- a/dom/ipc/ProcessHangMonitor.cpp
+++ b/dom/ipc/ProcessHangMonitor.cpp
@@ -299,26 +299,27 @@ private:
 
 bool HangMonitorParent::sShouldForcePaint = true;
 
 } // namespace
 
 /* HangMonitorChild implementation */
 
 HangMonitorChild::HangMonitorChild(ProcessHangMonitor* aMonitor)
- : mHangMonitor(aMonitor),
-   mMonitor("HangMonitorChild lock"),
-   mSentReport(false),
-   mTerminateScript(false),
-   mTerminateGlobal(false),
-   mStartDebugger(false),
-   mFinishedStartingDebugger(false),
-   mForcePaint(false),
-   mShutdownDone(false),
-   mIPCOpen(true)
+  : mHangMonitor(aMonitor)
+  , mMonitor("HangMonitorChild lock")
+  , mSentReport(false)
+  , mTerminateScript(false)
+  , mTerminateGlobal(false)
+  , mStartDebugger(false)
+  , mFinishedStartingDebugger(false)
+  , mForcePaint(false)
+  , mForcePaintEpoch{}
+  , mShutdownDone(false)
+  , mIPCOpen(true)
 {
   MOZ_RELEASE_ASSERT(NS_IsMainThread());
   mContext = danger::GetJSContext();
   mForcePaintMonitor =
     MakeUnique<mozilla::BackgroundHangMonitor>("Gecko_Child_ForcePaint",
                                                128, /* ms timeout for microhangs */
                                                1024, /* ms timeout for permahangs */
                                                BackgroundHangMonitor::THREAD_PRIVATE);
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -400,18 +400,19 @@ TabChild::TabChild(nsIContentChild* aMan
                    uint32_t aChromeFlags)
   : TabContext(aContext)
   , mTabGroup(aTabGroup)
   , mRemoteFrame(nullptr)
   , mManager(aManager)
   , mChromeFlags(aChromeFlags)
   , mMaxTouchPoints(0)
   , mActiveSuppressDisplayport(0)
-  , mLayersId{0}
+  , mLayersId{ 0 }
   , mBeforeUnloadListeners(0)
+  , mLastBackgroundColor{}
   , mDidFakeShow(false)
   , mNotified(false)
   , mTriedBrowserInit(false)
   , mOrientation(eScreenOrientation_PortraitPrimary)
   , mIgnoreKeyPressEvent(false)
   , mHasValidInnerSize(false)
   , mDestroyed(false)
   , mUniqueId(aTabId)
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -158,16 +158,18 @@ TabParent::TabParent(nsIContentParent* a
   , mMarkedDestroying(false)
   , mIsDestroyed(false)
   , mChromeFlags(aChromeFlags)
   , mDragValid(false)
   , mInitedByParent(false)
   , mTabId(aTabId)
   , mCreatingWindow(false)
   , mCursor(eCursorInvalid)
+  , mCustomCursorHotspotX{}
+  , mCustomCursorHotspotY{}
   , mTabSetsCursor(false)
   , mHasContentOpener(false)
 #ifdef DEBUG
   , mActiveSupressDisplayportCount(0)
 #endif
   , mLayerTreeEpoch(1)
   , mPreserveLayers(false)
   , mRenderLayers(true)
--- a/dom/media/AudioSegment.h
+++ b/dom/media/AudioSegment.h
@@ -176,30 +176,37 @@ struct AudioChunk {
     mDuration = aEnd - aStart;
   }
   StreamTime GetDuration() const { return mDuration; }
   bool CanCombineWithFollowing(const AudioChunk& aOther) const
   {
     if (aOther.mBuffer != mBuffer) {
       return false;
     }
-    if (mBuffer) {
-      NS_ASSERTION(aOther.mBufferFormat == mBufferFormat,
-                   "Wrong metadata about buffer");
-      NS_ASSERTION(aOther.mChannelData.Length() == mChannelData.Length(),
-                   "Mismatched channel count");
-      if (mDuration > INT32_MAX) {
+    if (!mBuffer) {
+      return true;
+    }
+    if (aOther.mVolume != mVolume) {
+      return false;
+    }
+    if (aOther.mPrincipalHandle != mPrincipalHandle) {
+      return false;
+    }
+    NS_ASSERTION(aOther.mBufferFormat == mBufferFormat,
+                 "Wrong metadata about buffer");
+    NS_ASSERTION(aOther.mChannelData.Length() == mChannelData.Length(),
+                 "Mismatched channel count");
+    if (mDuration > INT32_MAX) {
+      return false;
+    }
+    for (uint32_t channel = 0; channel < mChannelData.Length(); ++channel) {
+      if (aOther.mChannelData[channel] != AddAudioSampleOffset(mChannelData[channel],
+          mBufferFormat, int32_t(mDuration))) {
         return false;
       }
-      for (uint32_t channel = 0; channel < mChannelData.Length(); ++channel) {
-        if (aOther.mChannelData[channel] != AddAudioSampleOffset(mChannelData[channel],
-            mBufferFormat, int32_t(mDuration))) {
-          return false;
-        }
-      }
     }
     return true;
   }
   bool IsNull() const {
     return mBuffer == nullptr;
   }
   void SetNull(StreamTime aDuration)
   {
--- a/dom/media/AudioTrack.cpp
+++ b/dom/media/AudioTrack.cpp
@@ -7,22 +7,23 @@
 #include "mozilla/dom/AudioTrack.h"
 #include "mozilla/dom/AudioTrackBinding.h"
 #include "mozilla/dom/AudioTrackList.h"
 #include "mozilla/dom/HTMLMediaElement.h"
 
 namespace mozilla {
 namespace dom {
 
-AudioTrack::AudioTrack(const nsAString& aId,
+AudioTrack::AudioTrack(nsIGlobalObject* aOwnerGlobal,
+                       const nsAString& aId,
                        const nsAString& aKind,
                        const nsAString& aLabel,
                        const nsAString& aLanguage,
                        bool aEnabled)
-  : MediaTrack(aId, aKind, aLabel, aLanguage)
+  : MediaTrack(aOwnerGlobal, aId, aKind, aLabel, aLanguage)
   , mEnabled(aEnabled)
 {
 }
 
 JSObject*
 AudioTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return AudioTrackBinding::Wrap(aCx, this, aGivenProto);
--- a/dom/media/AudioTrack.h
+++ b/dom/media/AudioTrack.h
@@ -10,17 +10,18 @@
 #include "MediaTrack.h"
 
 namespace mozilla {
 namespace dom {
 
 class AudioTrack : public MediaTrack
 {
 public:
-  AudioTrack(const nsAString& aId,
+  AudioTrack(nsIGlobalObject* aOwnerGlobal,
+             const nsAString& aId,
              const nsAString& aKind,
              const nsAString& aLabel,
              const nsAString& aLanguage,
              bool aEnabled);
 
   JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
 
   AudioTrack* AsAudioTrack() override
--- a/dom/media/BufferReader.h
+++ b/dom/media/BufferReader.h
@@ -14,17 +14,22 @@
 
 namespace mozilla {
 
 extern mozilla::LazyLogModule gMP4MetadataLog;
 
 class MOZ_RAII BufferReader
 {
 public:
-  BufferReader() : mPtr(nullptr), mRemaining(0) {}
+  BufferReader()
+    : mPtr(nullptr)
+    , mRemaining(0)
+    , mLength{}
+  {
+  }
   BufferReader(const uint8_t* aData, size_t aSize)
     : mPtr(aData), mRemaining(aSize), mLength(aSize)
   {
   }
   template<size_t S>
   explicit BufferReader(const AutoTArray<uint8_t, S>& aData)
     : mPtr(aData.Elements()), mRemaining(aData.Length()), mLength(aData.Length())
   {
--- a/dom/media/DOMMediaStream.cpp
+++ b/dom/media/DOMMediaStream.cpp
@@ -417,22 +417,29 @@ NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMAu
 NS_IMPL_ADDREF_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
 NS_IMPL_RELEASE_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMAudioNodeMediaStream)
 NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream)
 
 DOMMediaStream::DOMMediaStream(nsPIDOMWindowInner* aWindow,
                                MediaStreamTrackSourceGetter* aTrackSourceGetter)
-  : mLogicalStreamStartTime(0), mWindow(aWindow),
-    mInputStream(nullptr), mOwnedStream(nullptr), mPlaybackStream(nullptr),
-    mTracksPendingRemoval(0), mTrackSourceGetter(aTrackSourceGetter),
-    mPlaybackTrackListener(MakeAndAddRef<PlaybackTrackListener>(this)),
-    mTracksCreated(false), mNotifiedOfMediaStreamGraphShutdown(false),
-    mActive(false), mSetInactiveOnFinish(false)
+  : mLogicalStreamStartTime(0)
+  , mWindow(aWindow)
+  , mInputStream(nullptr)
+  , mOwnedStream(nullptr)
+  , mPlaybackStream(nullptr)
+  , mTracksPendingRemoval(0)
+  , mTrackSourceGetter(aTrackSourceGetter)
+  , mPlaybackTrackListener(MakeAndAddRef<PlaybackTrackListener>(this))
+  , mTracksCreated(false)
+  , mNotifiedOfMediaStreamGraphShutdown(false)
+  , mActive(false)
+  , mSetInactiveOnFinish(false)
+  , mCORSMode{ CORS_NONE }
 {
   nsresult rv;
   nsCOMPtr<nsIUUIDGenerator> uuidgen =
     do_GetService("@mozilla.org/uuid-generator;1", &rv);
 
   if (NS_SUCCEEDED(rv) && uuidgen) {
     nsID uuid;
     memset(&uuid, 0, sizeof(uuid));
--- a/dom/media/GetUserMediaRequest.cpp
+++ b/dom/media/GetUserMediaRequest.cpp
@@ -23,22 +23,25 @@ GetUserMediaRequest::GetUserMediaRequest
   , mOuterWindowID(aInnerWindow->GetOuterWindow()->WindowID())
   , mCallID(aCallID)
   , mConstraints(new MediaStreamConstraints(aConstraints))
   , mIsSecure(aIsSecure)
   , mIsHandlingUserInput(aIsHandlingUserInput)
 {
 }
 
-GetUserMediaRequest::GetUserMediaRequest(
-    nsPIDOMWindowInner* aInnerWindow,
-    const nsAString& aRawId,
-    const nsAString& aMediaSource)
-  : mRawID(aRawId)
+GetUserMediaRequest::GetUserMediaRequest(nsPIDOMWindowInner* aInnerWindow,
+                                         const nsAString& aRawId,
+                                         const nsAString& aMediaSource)
+  : mInnerWindowID{}
+  , mOuterWindowID{}
+  , mRawID(aRawId)
   , mMediaSource(aMediaSource)
+  , mIsSecure{ false }
+  , mIsHandlingUserInput{ false }
 {
   if (aInnerWindow && aInnerWindow->GetOuterWindow()) {
     mOuterWindowID = aInnerWindow->GetOuterWindow()->WindowID();
   }
 }
 
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(GetUserMediaRequest)
 NS_IMPL_CYCLE_COLLECTING_ADDREF(GetUserMediaRequest)
--- a/dom/media/MediaCache.cpp
+++ b/dom/media/MediaCache.cpp
@@ -515,16 +515,17 @@ MediaCacheStream::MediaCacheStream(Chann
   : mMediaCache(nullptr)
   , mClient(aClient)
   , mIsTransportSeekable(false)
   , mCacheSuspended(false)
   , mChannelEnded(false)
   , mStreamOffset(0)
   , mPlaybackBytesPerSecond(10000)
   , mPinCount(0)
+  , mNotifyDataEndedStatus{ NS_ERROR_NOT_INITIALIZED }
   , mMetadataInPartialBlockBuffer(false)
   , mIsPrivateBrowsing(aIsPrivateBrowsing)
 {
 }
 
 size_t MediaCacheStream::SizeOfExcludingThis(
                                 MallocSizeOf aMallocSizeOf) const
 {
--- a/dom/media/MediaCache.h
+++ b/dom/media/MediaCache.h
@@ -404,17 +404,22 @@ private:
 #else
     void Verify() {}
 #endif
 
     size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
 
   private:
     struct Entry : public nsUint32HashKey {
-      explicit Entry(KeyTypePointer aKey) : nsUint32HashKey(aKey) { }
+      explicit Entry(KeyTypePointer aKey)
+        : nsUint32HashKey(aKey)
+        , mNextBlock{}
+        , mPrevBlock{}
+      {
+      }
       Entry(const Entry& toCopy) : nsUint32HashKey(&toCopy.GetKey()),
         mNextBlock(toCopy.mNextBlock), mPrevBlock(toCopy.mPrevBlock) {}
 
       int32_t mNextBlock;
       int32_t mPrevBlock;
     };
     nsTHashtable<Entry> mEntries;
 
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -815,17 +815,21 @@ private:
  *   COMPLETED if the new playback position is the end of the media resource.
  *   NextFrameSeekingState if completing a NextFrameSeekingFromDormantState.
  *   DECODING otherwise.
  */
 class MediaDecoderStateMachine::SeekingState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
-  explicit SeekingState(Master* aPtr) : StateObject(aPtr) { }
+  explicit SeekingState(Master* aPtr)
+    : StateObject(aPtr)
+    , mVisibility{ static_cast<EventVisibility>(0) }
+  {
+  }
 
   RefPtr<MediaDecoder::SeekPromise> Enter(SeekJob&& aSeekJob,
                                           EventVisibility aVisibility)
   {
     mSeekJob = Move(aSeekJob);
     mVisibility = aVisibility;
 
     // Suppressed visibility comes from two cases: (1) leaving dormant state,
--- a/dom/media/MediaRecorder.cpp
+++ b/dom/media/MediaRecorder.cpp
@@ -1251,29 +1251,35 @@ MediaRecorder::~MediaRecorder()
   UnRegisterActivityObserver();
 }
 
 MediaRecorder::MediaRecorder(DOMMediaStream& aSourceMediaStream,
                              nsPIDOMWindowInner* aOwnerWindow)
   : DOMEventTargetHelper(aOwnerWindow)
   , mAudioNodeOutput(0)
   , mState(RecordingState::Inactive)
+  , mAudioBitsPerSecond{}
+  , mVideoBitsPerSecond{}
+  , mBitsPerSecond{}
 {
   MOZ_ASSERT(aOwnerWindow);
   mDOMStream = &aSourceMediaStream;
 
   RegisterActivityObserver();
 }
 
 MediaRecorder::MediaRecorder(AudioNode& aSrcAudioNode,
                              uint32_t aSrcOutput,
                              nsPIDOMWindowInner* aOwnerWindow)
   : DOMEventTargetHelper(aOwnerWindow)
   , mAudioNodeOutput(aSrcOutput)
   , mState(RecordingState::Inactive)
+  , mAudioBitsPerSecond{}
+  , mVideoBitsPerSecond{}
+  , mBitsPerSecond{}
 {
   MOZ_ASSERT(aOwnerWindow);
 
   mAudioNode = &aSrcAudioNode;
 
   RegisterActivityObserver();
 }
 
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -3576,16 +3576,17 @@ ProcessedMediaStream::DestroyImpl()
   // MediaStreamGraphImpl::RemoveStreamGraphThread() will also call
   // SetStreamOrderDirty(), for other reasons.
 }
 
 MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
                                            TrackRate aSampleRate,
                                            AbstractThread* aMainThread)
   : MediaStreamGraph(aSampleRate)
+  , mFirstCycleBreaker{}
   , mPortCount(0)
   , mInputWanted(false)
   , mInputDeviceID(-1)
   , mOutputWanted(true)
   , mOutputDeviceID(-1)
   , mNeedAnotherIteration(false)
   , mGraphDriverAsleep(false)
   , mMonitor("MediaStreamGraphImpl")
--- a/dom/media/MediaTrack.cpp
+++ b/dom/media/MediaTrack.cpp
@@ -7,21 +7,22 @@
 #include "MediaTrack.h"
 #include "AudioTrack.h"
 #include "MediaTrackList.h"
 #include "VideoTrack.h"
 
 namespace mozilla {
 namespace dom {
 
-MediaTrack::MediaTrack(const nsAString& aId,
+MediaTrack::MediaTrack(nsIGlobalObject* aOwnerGlobal,
+                       const nsAString& aId,
                        const nsAString& aKind,
                        const nsAString& aLabel,
                        const nsAString& aLanguage)
-  : DOMEventTargetHelper()
+  : DOMEventTargetHelper(aOwnerGlobal)
   , mId(aId)
   , mKind(aKind)
   , mLabel(aLabel)
   , mLanguage(aLanguage)
 {
 }
 
 MediaTrack::~MediaTrack()
@@ -36,16 +37,10 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 void
 MediaTrack::SetTrackList(MediaTrackList* aList)
 {
   mList = aList;
 }
 
-void
-MediaTrack::Init(nsPIDOMWindowInner* aOwnerWindow)
-{
-  BindToOwner(aOwnerWindow);
-}
-
 } // namespace dom
 } // namespace mozilla
--- a/dom/media/MediaTrack.h
+++ b/dom/media/MediaTrack.h
@@ -28,17 +28,18 @@ class AudioTrack;
  * from its corresponding track list.
  *
  * Although AudioTrack and VideoTrack are not EventTargets, TextTrack is, and
  * TextTrack inherits from MediaTrack as well (or is going to).
  */
 class MediaTrack : public DOMEventTargetHelper
 {
 public:
-  MediaTrack(const nsAString& aId,
+  MediaTrack(nsIGlobalObject* aOwnerGlobal,
+             const nsAString& aId,
              const nsAString& aKind,
              const nsAString& aLabel,
              const nsAString& aLanguage);
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaTrack, DOMEventTargetHelper)
 
   enum {
@@ -84,17 +85,16 @@ public:
   }
 
   friend class MediaTrackList;
 
 protected:
   virtual ~MediaTrack();
 
   void SetTrackList(MediaTrackList* aList);
-  void Init(nsPIDOMWindowInner* aOwnerWindow);
 
   RefPtr<MediaTrackList> mList;
   nsString mId;
   nsString mKind;
   nsString mLabel;
   nsString mLanguage;
 };
 
--- a/dom/media/MediaTrackList.cpp
+++ b/dom/media/MediaTrackList.cpp
@@ -63,18 +63,19 @@ MediaTrackList::GetTrackById(const nsASt
     }
   }
   return nullptr;
 }
 
 void
 MediaTrackList::AddTrack(MediaTrack* aTrack)
 {
+  MOZ_ASSERT(aTrack->GetOwnerGlobal() == GetOwnerGlobal(),
+             "Where is this track from?");
   mTracks.AppendElement(aTrack);
-  aTrack->Init(GetOwner());
   aTrack->SetTrackList(this);
   CreateAndDispatchTrackEventRunner(aTrack, NS_LITERAL_STRING("addtrack"));
 
   if ((!aTrack->AsAudioTrack() || !aTrack->AsAudioTrack()->Enabled()) &&
       (!aTrack->AsVideoTrack() || !aTrack->AsVideoTrack()->Selected())) {
     // Track not enabled, no need to notify media element.
     return;
   }
@@ -98,35 +99,39 @@ MediaTrackList::RemoveTracks()
 {
   while (!mTracks.IsEmpty()) {
     RefPtr<MediaTrack> track = mTracks.LastElement();
     RemoveTrack(track);
   }
 }
 
 already_AddRefed<AudioTrack>
-MediaTrackList::CreateAudioTrack(const nsAString& aId,
+MediaTrackList::CreateAudioTrack(nsIGlobalObject* aOwnerGlobal,
+                                 const nsAString& aId,
                                  const nsAString& aKind,
                                  const nsAString& aLabel,
                                  const nsAString& aLanguage,
                                  bool aEnabled)
 {
-  RefPtr<AudioTrack> track = new AudioTrack(aId, aKind, aLabel, aLanguage,
-                                              aEnabled);
+  RefPtr<AudioTrack> track = new AudioTrack(aOwnerGlobal,
+                                            aId, aKind, aLabel, aLanguage,
+                                            aEnabled);
   return track.forget();
 }
 
 already_AddRefed<VideoTrack>
-MediaTrackList::CreateVideoTrack(const nsAString& aId,
+MediaTrackList::CreateVideoTrack(nsIGlobalObject* aOwnerGlobal,
+                                 const nsAString& aId,
                                  const nsAString& aKind,
                                  const nsAString& aLabel,
                                  const nsAString& aLanguage,
                                  VideoStreamTrack* aVideoTrack)
 {
-  RefPtr<VideoTrack> track = new VideoTrack(aId, aKind, aLabel, aLanguage, aVideoTrack);
+  RefPtr<VideoTrack> track = new VideoTrack(aOwnerGlobal, aId, aKind, aLabel,
+                                            aLanguage, aVideoTrack);
   return track.forget();
 }
 
 void
 MediaTrackList::EmptyTracks()
 {
   for (uint32_t i = 0; i < mTracks.Length(); ++i) {
     mTracks[i]->SetEnabledInternal(false, MediaTrack::FIRE_NO_EVENTS);
--- a/dom/media/MediaTrackList.h
+++ b/dom/media/MediaTrackList.h
@@ -39,35 +39,38 @@ public:
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaTrackList, DOMEventTargetHelper)
 
   using DOMEventTargetHelper::DispatchTrustedEvent;
 
   // The return value is non-null, assert an error if aIndex is out of bound
   // for array mTracks.
   MediaTrack* operator[](uint32_t aIndex);
 
+  // The track must be from the same Window as this MediaTrackList.
   void AddTrack(MediaTrack* aTrack);
 
   // In remove track case, the VideoTrackList::mSelectedIndex should be updated
   // due to mTracks changed. No need to take care this in add track case.
   virtual void RemoveTrack(const RefPtr<MediaTrack>& aTrack);
 
   void RemoveTracks();
 
   static already_AddRefed<AudioTrack>
-  CreateAudioTrack(const nsAString& aId,
+  CreateAudioTrack(nsIGlobalObject* aOwnerGlobal,
+                   const nsAString& aId,
                    const nsAString& aKind,
                    const nsAString& aLabel,
                    const nsAString& aLanguage,
                    bool aEnabled);
 
   // For the case of src of HTMLMediaElement is non-MediaStream, leave the
   // aVideoTrack as default(nullptr).
   static already_AddRefed<VideoTrack>
-  CreateVideoTrack(const nsAString& aId,
+  CreateVideoTrack(nsIGlobalObject* aOwnerGlobal,
+                   const nsAString& aId,
                    const nsAString& aKind,
                    const nsAString& aLabel,
                    const nsAString& aLanguage,
                    VideoStreamTrack* aVideoTrack = nullptr);
 
   virtual void EmptyTracks();
 
   void CreateAndDispatchChangeEvent();
--- a/dom/media/StreamTracks.h
+++ b/dom/media/StreamTracks.h
@@ -244,18 +244,23 @@ public:
   Track* FindTrack(TrackID aID) const;
 
   class MOZ_STACK_CLASS TrackIter final
   {
   public:
     /**
      * Iterate through the tracks of aBuffer in order of ID.
      */
-    explicit TrackIter(const StreamTracks& aBuffer) :
-      mBuffer(&aBuffer.mTracks), mIndex(0), mMatchType(false) {}
+    explicit TrackIter(const StreamTracks& aBuffer)
+      : mBuffer(&aBuffer.mTracks)
+      , mIndex(0)
+      , mType{ static_cast<MediaSegment::Type>(0) }
+      , mMatchType(false)
+    {
+    }
     /**
      * Iterate through the tracks of aBuffer with type aType, in order of ID.
      */
     TrackIter(const StreamTracks& aBuffer, MediaSegment::Type aType) :
       mBuffer(&aBuffer.mTracks), mIndex(0), mType(aType), mMatchType(true) { FindMatch(); }
     bool IsEnded() const { return mIndex >= mBuffer->Length(); }
     void Next()
     {
--- a/dom/media/VideoTrack.cpp
+++ b/dom/media/VideoTrack.cpp
@@ -8,22 +8,23 @@
 #include "mozilla/dom/VideoStreamTrack.h"
 #include "mozilla/dom/VideoTrack.h"
 #include "mozilla/dom/VideoTrackBinding.h"
 #include "mozilla/dom/VideoTrackList.h"
 
 namespace mozilla {
 namespace dom {
 
-VideoTrack::VideoTrack(const nsAString& aId,
+VideoTrack::VideoTrack(nsIGlobalObject* aOwnerGlobal,
+                       const nsAString& aId,
                        const nsAString& aKind,
                        const nsAString& aLabel,
                        const nsAString& aLanguage,
                        VideoStreamTrack* aStreamTarck)
-  : MediaTrack(aId, aKind, aLabel, aLanguage)
+  : MediaTrack(aOwnerGlobal, aId, aKind, aLabel, aLanguage)
   , mSelected(false)
   , mVideoStreamTrack(aStreamTarck)
 {
 }
 
 VideoTrack::~VideoTrack()
 {
 }
--- a/dom/media/VideoTrack.h
+++ b/dom/media/VideoTrack.h
@@ -13,17 +13,18 @@ namespace mozilla {
 namespace dom {
 
 class VideoTrackList;
 class VideoStreamTrack;
 
 class VideoTrack : public MediaTrack
 {
 public:
-  VideoTrack(const nsAString& aId,
+  VideoTrack(nsIGlobalObject* aOwnerGlobal,
+             const nsAString& aId,
              const nsAString& aKind,
              const nsAString& aLabel,
              const nsAString& aLanguage,
              VideoStreamTrack* aStreamTarck = nullptr);
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VideoTrack, MediaTrack)
 
--- a/dom/media/VideoUtils.h
+++ b/dom/media/VideoUtils.h
@@ -481,16 +481,19 @@ public:
     DereferencedType operator*()
     {
       return Substring(mStart, mEnd);
     }
   private:
     friend class StringListRange;
     Iterator(const CharType* aRangeStart, uint32_t aLength)
       : mRangeEnd(aRangeStart + aLength)
+      , mStart{ nullptr }
+      , mEnd{ nullptr }
+      , mComma{ nullptr }
     {
       SearchItemAt(aRangeStart);
     }
     void SearchItemAt(Pointer start)
     {
       // First, skip leading whitespace.
       for (Pointer p = start; ; ++p) {
         if (p >= mRangeEnd) {
--- a/dom/media/eme/MediaKeyMessageEvent.cpp
+++ b/dom/media/eme/MediaKeyMessageEvent.cpp
@@ -35,16 +35,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_IN
   mozilla::DropJSObjects(this);
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeyMessageEvent)
 NS_INTERFACE_MAP_END_INHERITING(Event)
 
 MediaKeyMessageEvent::MediaKeyMessageEvent(EventTarget* aOwner)
   : Event(aOwner, nullptr, nullptr)
+  , mMessageType{ static_cast<MediaKeyMessageType>(0) }
 {
   mozilla::HoldJSObjects(this);
 }
 
 MediaKeyMessageEvent::~MediaKeyMessageEvent()
 {
   mMessage = nullptr;
   mozilla::DropJSObjects(this);
--- a/dom/media/encoder/TrackEncoder.h
+++ b/dom/media/encoder/TrackEncoder.h
@@ -218,17 +218,19 @@ protected:
 class AudioTrackEncoder : public TrackEncoder
 {
 public:
   explicit AudioTrackEncoder(TrackRate aTrackRate)
     : TrackEncoder(aTrackRate)
     , mChannels(0)
     , mSamplingRate(0)
     , mAudioBitrate(0)
-  {}
+    , mDirectConnected{ false }
+  {
+  }
 
   /**
    * Suspends encoding from mCurrentTime, i.e., all audio data until the next
    * Resume() will be dropped.
    */
   void Suspend(TimeStamp aTime) override;
 
   /**
--- a/dom/media/gmp/GMPContentParent.cpp
+++ b/dom/media/gmp/GMPContentParent.cpp
@@ -29,16 +29,17 @@ extern LogModule* GetGMPLog();
 #undef __CLASS__
 #endif
 #define __CLASS__ "GMPContentParent"
 
 namespace gmp {
 
 GMPContentParent::GMPContentParent(GMPParent* aParent)
   : mParent(aParent)
+  , mPluginId{}
 {
   if (mParent) {
     SetDisplayName(mParent->GetDisplayName());
     SetPluginId(mParent->GetPluginId());
   }
 }
 
 GMPContentParent::~GMPContentParent()
--- a/dom/media/gmp/GMPTimerParent.h
+++ b/dom/media/gmp/GMPTimerParent.h
@@ -30,17 +30,19 @@ protected:
   void ActorDestroy(ActorDestroyReason aWhy) override;
 
 private:
   ~GMPTimerParent() {}
 
   static void GMPTimerExpired(nsITimer *aTimer, void *aClosure);
 
   struct Context {
-    Context() {
+    Context()
+      : mId{}
+    {
       MOZ_COUNT_CTOR(Context);
     }
     ~Context() {
       MOZ_COUNT_DTOR(Context);
     }
     nsCOMPtr<nsITimer> mTimer;
     RefPtr<GMPTimerParent> mParent; // Note: live timers keep the GMPTimerParent alive.
     uint32_t mId;
--- a/dom/media/ipc/RemoteVideoDecoder.cpp
+++ b/dom/media/ipc/RemoteVideoDecoder.cpp
@@ -19,16 +19,18 @@ namespace dom {
 using base::Thread;
 using namespace ipc;
 using namespace layers;
 using namespace gfx;
 
 RemoteVideoDecoder::RemoteVideoDecoder()
   : mActor(new VideoDecoderChild())
   , mDescription("RemoteVideoDecoder")
+  , mIsHardwareAccelerated{ false }
+  , mConversion{ MediaDataDecoder::ConversionRequired::kNeedNone }
 {
 }
 
 RemoteVideoDecoder::~RemoteVideoDecoder()
 {
   // We're about to be destroyed and drop our ref to
   // VideoDecoderChild. Make sure we put a ref into the
   // task queue for the VideoDecoderChild thread to keep
--- a/dom/media/mp4/Box.cpp
+++ b/dom/media/mp4/Box.cpp
@@ -118,16 +118,18 @@ Box::Box(BoxContext* aContext, uint64_t 
     return;
   }
 
   mRange = boxRange;
 }
 
 Box::Box()
   : mContext(nullptr)
+  , mBodyOffset{}
+  , mChildOffset{}
   , mParent(nullptr)
 {}
 
 Box
 Box::Next() const
 {
   MOZ_ASSERT(IsAvailable());
   return Box(mContext, mRange.mEnd, mParent);
--- a/dom/media/mp4/MP4Demuxer.cpp
+++ b/dom/media/mp4/MP4Demuxer.cpp
@@ -123,16 +123,17 @@ AccumulateSPSTelemetry(const MediaByteBu
   }
 
   return true;
 }
 
 MP4Demuxer::MP4Demuxer(MediaResource* aResource)
   : mResource(aResource)
   , mStream(new ResourceStream(aResource))
+  , mIsSeekable{ false }
 {
   DDLINKCHILD("resource", aResource);
   DDLINKCHILD("stream", mStream.get());
 }
 
 RefPtr<MP4Demuxer::InitPromise>
 MP4Demuxer::Init()
 {
--- a/dom/media/mp4/MP4Metadata.cpp
+++ b/dom/media/mp4/MP4Metadata.cpp
@@ -22,16 +22,17 @@
 
 using mozilla::media::TimeUnit;
 
 namespace mozilla {
 LazyLogModule gMP4MetadataLog("MP4Metadata");
 
 IndiceWrapper::IndiceWrapper(Mp4parseByteData& aIndice)
 {
+  this->mIndice.data = { nullptr };
   mIndice.length = aIndice.length;
   mIndice.indices = aIndice.indices;
 }
 
 size_t
 IndiceWrapper::Length() const
 {
   return mIndice.length;
--- a/dom/media/mp4/MoofParser.cpp
+++ b/dom/media/mp4/MoofParser.cpp
@@ -682,16 +682,17 @@ Moof::ParseTrun(Box& aBox, Tfhd& aTfhd, 
   mMaxRoundingError += roundTime;
 
   *aDecodeTime = decodeTime;
 
   return Ok();
 }
 
 Tkhd::Tkhd(Box& aBox)
+  : mTrackId{}
 {
   mValid = Parse(aBox).isOk();
   if (!mValid) {
     LOG(Tkhd, "Parse failed");
   }
 }
 
 Result<Ok, nsresult>
@@ -722,16 +723,20 @@ Tkhd::Parse(Box& aBox)
     MOZ_TRY_VAR(reserved, reader->ReadU32());
     NS_ASSERTION(!reserved, "reserved should be 0");
     MOZ_TRY_VAR(mDuration, reader->ReadU64());
   }
   return Ok();
 }
 
 Mvhd::Mvhd(Box& aBox)
+  : mCreationTime{}
+  , mModificationTime{}
+  , mTimescale{}
+  , mDuration{}
 {
   mValid = Parse(aBox).isOk();
   if (!mValid) {
     LOG(Mvhd, "Parse failed");
   }
 }
 
 Result<Ok, nsresult>
@@ -764,16 +769,22 @@ Mvhd::Parse(Box& aBox)
 }
 
 Mdhd::Mdhd(Box& aBox)
   : Mvhd(aBox)
 {
 }
 
 Trex::Trex(Box& aBox)
+  : mFlags{}
+  , mTrackId{}
+  , mDefaultSampleDescriptionIndex{}
+  , mDefaultSampleDuration{}
+  , mDefaultSampleSize{}
+  , mDefaultSampleFlags{}
 {
   mValid = Parse(aBox).isOk();
   if (!mValid) {
     LOG(Trex, "Parse failed");
   }
 }
 
 Result<Ok, nsresult>
@@ -788,16 +799,17 @@ Trex::Parse(Box& aBox)
   MOZ_TRY_VAR(mDefaultSampleSize, reader->ReadU32());
   MOZ_TRY_VAR(mDefaultSampleFlags, reader->ReadU32());
 
   return Ok();
 }
 
 Tfhd::Tfhd(Box& aBox, Trex& aTrex)
   : Trex(aTrex)
+  , mBaseDataOffset{}
 {
   mValid = Parse(aBox).isOk();
   if (!mValid) {
     LOG(Tfhd, "Parse failed");
   }
 }
 
 Result<Ok, nsresult>
@@ -827,16 +839,17 @@ Tfhd::Parse(Box& aBox)
   if (mFlags & 0x20) {
     MOZ_TRY_VAR(mDefaultSampleFlags, reader->ReadU32());
   }
 
   return Ok();
 }
 
 Tfdt::Tfdt(Box& aBox)
+  : mBaseMediaDecodeTime{}
 {
   mValid = Parse(aBox).isOk();
   if (!mValid) {
     LOG(Tfdt, "Parse failed");
   }
 }
 
 Result<Ok, nsresult>
@@ -995,16 +1008,17 @@ Saio::Parse(Box& aBox)
       MOZ_TRY_VAR(offset, reader->ReadU64());
       MOZ_ALWAYS_TRUE(mOffsets.AppendElement(offset, fallible));
     }
   }
   return Ok();
 }
 
 Sbgp::Sbgp(Box& aBox)
+  : mGroupingTypeParam{}
 {
   mValid = Parse(aBox).isOk();
   if (!mValid) {
     LOG(Sbgp, "Parse failed");
   }
 }
 
 Result<Ok, nsresult>
--- a/dom/media/ogg/OggWriter.cpp
+++ b/dom/media/ogg/OggWriter.cpp
@@ -6,18 +6,38 @@
 #include "prtime.h"
 #include "GeckoProfiler.h"
 
 #undef LOG
 #define LOG(args, ...)
 
 namespace mozilla {
 
-OggWriter::OggWriter() : ContainerWriter()
+OggWriter::OggWriter()
+  : ContainerWriter()
+  , mOggPage{}
+  , mPacket{}
 {
+  this->mOggStreamState.body_data = { nullptr };
+  this->mOggStreamState.body_storage = {};
+  this->mOggStreamState.body_fill = {};
+  this->mOggStreamState.body_returned = {};
+  this->mOggStreamState.lacing_vals = { nullptr };
+  this->mOggStreamState.granule_vals = { nullptr };
+  this->mOggStreamState.lacing_storage = {};
+  this->mOggStreamState.lacing_fill = {};
+  this->mOggStreamState.lacing_packet = {};
+  this->mOggStreamState.lacing_returned = {};
+  this->mOggStreamState.header_fill = {};
+  this->mOggStreamState.e_o_s = {};
+  this->mOggStreamState.b_o_s = {};
+  this->mOggStreamState.serialno = {};
+  this->mOggStreamState.pageno = {};
+  this->mOggStreamState.packetno = {};
+  this->mOggStreamState.granulepos = {};
   if (NS_FAILED(Init())) {
     LOG("ERROR! Fail to initialize the OggWriter.");
   }
 }
 
 OggWriter::~OggWriter()
 {
   if (mInitialized) {
--- a/dom/media/ogg/OpusParser.cpp
+++ b/dom/media/ogg/OpusParser.cpp
@@ -15,30 +15,35 @@ extern "C" {
 #include "opus/opus_multistream.h"
 }
 
 namespace mozilla {
 
 extern LazyLogModule gMediaDecoderLog;
 #define OPUS_LOG(type, msg) MOZ_LOG(gMediaDecoderLog, type, msg)
 
-OpusParser::OpusParser():
-  mRate(0),
-  mNominalRate(0),
-  mChannels(0),
-  mPreSkip(0),
+OpusParser::OpusParser()
+  : mRate(0)
+  , mNominalRate(0)
+  , mChannels(0)
+  , mPreSkip(0)
+  ,
 #ifdef MOZ_SAMPLE_TYPE_FLOAT32
-  mGain(1.0f),
+  mGain(1.0f)
+  ,
 #else
-  mGain_Q16(65536),
+  mGain_Q16(65536)
+  ,
 #endif
-  mChannelMapping(0),
-  mStreams(0),
-  mCoupledStreams(0)
-{ }
+  mChannelMapping(0)
+  , mStreams(0)
+  , mCoupledStreams(0)
+  , mPrevPacketGranulepos{}
+{
+}
 
 bool OpusParser::DecodeHeader(unsigned char* aData, size_t aLength)
 {
     if (aLength < 19 || memcmp(aData, "OpusHead", 8)) {
       OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: unrecognized header"));
       return false;
     }
 
--- a/dom/media/platforms/agnostic/TheoraDecoder.cpp
+++ b/dom/media/platforms/agnostic/TheoraDecoder.cpp
@@ -42,16 +42,18 @@ ogg_packet InitTheoraPacket(const unsign
   packet.packetno = aPacketNo;
   return packet;
 }
 
 TheoraDecoder::TheoraDecoder(const CreateDecoderParams& aParams)
   : mImageAllocator(aParams.mKnowsCompositor)
   , mImageContainer(aParams.mImageContainer)
   , mTaskQueue(aParams.mTaskQueue)
+  , mTheoraInfo{}
+  , mTheoraComment{}
   , mTheoraSetupInfo(nullptr)
   , mTheoraDecoderContext(nullptr)
   , mPacketCount(0)
   , mInfo(aParams.VideoConfig())
 {
   MOZ_COUNT_CTOR(TheoraDecoder);
 }
 
--- a/dom/media/platforms/apple/AppleATDecoder.cpp
+++ b/dom/media/platforms/apple/AppleATDecoder.cpp
@@ -17,22 +17,22 @@
 
 #define LOG(...) DDMOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, __VA_ARGS__)
 #define LOGEX(_this, ...)                                                      \
   DDMOZ_LOGEX(_this, sPDMLog, mozilla::LogLevel::Debug, __VA_ARGS__)
 #define FourCC2Str(n) ((char[5]){(char)(n >> 24), (char)(n >> 16), (char)(n >> 8), (char)(n), 0})
 
 namespace mozilla {
 
-AppleATDecoder::AppleATDecoder(const AudioInfo& aConfig,
-                               TaskQueue* aTaskQueue)
+AppleATDecoder::AppleATDecoder(const AudioInfo& aConfig, TaskQueue* aTaskQueue)
   : mConfig(aConfig)
   , mFileStreamError(false)
   , mTaskQueue(aTaskQueue)
   , mConverter(nullptr)
+  , mOutputFormat{}
   , mStream(nullptr)
   , mParsedFramesForAACMagicCookie(0)
   , mErrored(false)
 {
   MOZ_COUNT_CTOR(AppleATDecoder);
   LOG("Creating Apple AudioToolbox decoder");
   LOG("Audio Decoder configuration: %s %d Hz %d channels %d bits per channel",
       mConfig.mMimeType.get(),
--- a/dom/media/systemservices/CamerasChild.cpp
+++ b/dom/media/systemservices/CamerasChild.cpp
@@ -703,21 +703,25 @@ CamerasChild::ActorDestroy(ActorDestroyR
   MonitorAutoLock monitor(mReplyMonitor);
   mIPCIsAlive = false;
   // Hopefully prevent us from getting stuck
   // on replies that'll never come.
   monitor.NotifyAll();
 }
 
 CamerasChild::CamerasChild()
-  : mCallbackMutex("mozilla::cameras::CamerasChild::mCallbackMutex"),
-    mIPCIsAlive(true),
-    mRequestMutex("mozilla::cameras::CamerasChild::mRequestMutex"),
-    mReplyMonitor("mozilla::cameras::CamerasChild::mReplyMonitor"),
-    mZero(0)
+  : mCallbackMutex("mozilla::cameras::CamerasChild::mCallbackMutex")
+  , mIPCIsAlive(true)
+  , mRequestMutex("mozilla::cameras::CamerasChild::mRequestMutex")
+  , mReplyMonitor("mozilla::cameras::CamerasChild::mReplyMonitor")
+  , mReceivedReply{ false }
+  , mReplySuccess{ false }
+  , mZero(0)
+  , mReplyInteger{}
+  , mReplyScary{ false }
 {
   LOG(("CamerasChild: %p", this));
 
   MOZ_COUNT_CTOR(CamerasChild);
 }
 
 CamerasChild::~CamerasChild()
 {
--- a/dom/media/systemservices/CamerasParent.cpp
+++ b/dom/media/systemservices/CamerasParent.cpp
@@ -128,16 +128,17 @@ public:
                        uint32_t aStreamId,
                        const webrtc::VideoFrame& aFrame,
                        const VideoFrameProperties& aProperties)
     : Runnable("camera::DeliverFrameRunnable")
     , mParent(aParent)
     , mCapEngine(aEngine)
     , mStreamId(aStreamId)
     , mProperties(aProperties)
+    , mResult{}
   {
     // No ShmemBuffer (of the right size) was available, so make an
     // extra buffer here.  We have no idea when we are going to run and
     // it will be potentially long after the webrtc frame callback has
     // returned, so the copy needs to be no later than here.
     // We will need to copy this back into a Shmem later on so we prefer
     // using ShmemBuffers to avoid the extra copy.
     mAlternateBuffer.reset(new unsigned char[aProperties.bufferSize()]);
@@ -150,17 +151,18 @@ public:
                        uint32_t aStreamId,
                        ShmemBuffer aBuffer,
                        VideoFrameProperties& aProperties)
     : Runnable("camera::DeliverFrameRunnable")
     , mParent(aParent)
     , mCapEngine(aEngine)
     , mStreamId(aStreamId)
     , mBuffer(Move(aBuffer))
-    , mProperties(aProperties){};
+    , mProperties(aProperties)
+    , mResult{} {};
 
   NS_IMETHOD Run() override {
     if (mParent->IsShuttingDown()) {
       // Communication channel is being torn down
       mResult = 0;
       return NS_OK;
     }
     if (!mParent->DeliverFrameOverIPC(mCapEngine, mStreamId, Move(mBuffer),
--- a/dom/media/systemservices/MediaSystemResourceManagerChild.cpp
+++ b/dom/media/systemservices/MediaSystemResourceManagerChild.cpp
@@ -7,16 +7,17 @@
 
 #include "MediaSystemResourceManagerChild.h"
 
 namespace mozilla {
 namespace media {
 
 MediaSystemResourceManagerChild::MediaSystemResourceManagerChild()
   : mDestroyed(false)
+  , mManager{ nullptr }
 {
 }
 
 MediaSystemResourceManagerChild::~MediaSystemResourceManagerChild()
 {
 }
 
 mozilla::ipc::IPCResult
--- a/dom/media/systemservices/VideoEngine.cpp
+++ b/dom/media/systemservices/VideoEngine.cpp
@@ -224,18 +224,19 @@ bool VideoEngine::WithEntry(const int32_
 
 int32_t
 VideoEngine::GenerateId() {
   // XXX Something better than this (a map perhaps, or a simple boolean TArray, given
   // the number in-use is O(1) normally!)
   return mId = sId++;
 }
 
-VideoEngine::VideoEngine(UniquePtr<const webrtc::Config>&& aConfig):
-  mCaptureDevInfo(aConfig->Get<webrtc::CaptureDeviceInfo>()),
-  mDeviceInfo(nullptr),
-  mConfig(std::move(aConfig))
+VideoEngine::VideoEngine(UniquePtr<const webrtc::Config>&& aConfig)
+  : mId{}
+  , mCaptureDevInfo(aConfig->Get<webrtc::CaptureDeviceInfo>())
+  , mDeviceInfo(nullptr)
+  , mConfig(std::move(aConfig))
 {
   LOG((__PRETTY_FUNCTION__));
 }
 
 }
 }
--- a/dom/media/systemservices/VideoEngine.h
+++ b/dom/media/systemservices/VideoEngine.h
@@ -27,17 +27,18 @@ class VideoEngine
 private:
   virtual ~VideoEngine (){};
   // Base cache expiration period
   // Note because cameras use HW plug event detection, this
   // only applies to screen based modes.
   static const int64_t kCacheExpiryPeriodMs = 2000;
 
 public:
-  VideoEngine (){};
+  VideoEngine()
+    : mId{} {};
   NS_INLINE_DECL_REFCOUNTING(VideoEngine)
 
   static already_AddRefed<VideoEngine> Create(UniquePtr<const webrtc::Config>&& aConfig);
 #if defined(ANDROID)
   static int SetAndroidObjects(JavaVM* javaVM);
 #endif
   void CreateVideoCapture(int32_t& id, const char* deviceUniqueIdUTF8);
 
--- a/dom/media/wave/WaveDemuxer.cpp
+++ b/dom/media/wave/WaveDemuxer.cpp
@@ -73,20 +73,22 @@ WAVDemuxer::IsSeekable() const
 // WAVTrackDemuxer
 
 WAVTrackDemuxer::WAVTrackDemuxer(MediaResource* aSource)
   : mSource(aSource)
   , mOffset(0)
   , mFirstChunkOffset(0)
   , mNumParsedChunks(0)
   , mChunkIndex(0)
+  , mDataLength{}
   , mTotalChunkLen(0)
   , mSamplesPerChunk(0)
   , mSamplesPerSecond(0)
   , mChannels(0)
+  , mSampleFormat{}
 {
   DDLINKCHILD("source", aSource);
   Reset();
 }
 
 bool
 WAVTrackDemuxer::Init()
 {
--- a/dom/media/webaudio/AudioBufferSourceNode.cpp
+++ b/dom/media/webaudio/AudioBufferSourceNode.cpp
@@ -37,31 +37,38 @@ NS_IMPL_RELEASE_INHERITED(AudioBufferSou
  * Nothing is played until a non-null buffer has been set (via
  * AudioNodeStream::SetBuffer) and a non-zero mBufferEnd has been set (via
  * AudioNodeStream::SetInt32Parameter).
  */
 class AudioBufferSourceNodeEngine final : public AudioNodeEngine
 {
 public:
   AudioBufferSourceNodeEngine(AudioNode* aNode,
-                              AudioDestinationNode* aDestination) :
-    AudioNodeEngine(aNode),
-    mStart(0.0), mBeginProcessing(0),
-    mStop(STREAM_TIME_MAX),
-    mResampler(nullptr), mRemainingResamplerTail(0),
-    mBufferEnd(0),
-    mLoopStart(0), mLoopEnd(0),
-    mBufferPosition(0), mBufferSampleRate(0),
+                              AudioDestinationNode* aDestination)
+    : AudioNodeEngine(aNode)
+    , mStart(0.0)
+    , mBeginProcessing(0)
+    , mStop(STREAM_TIME_MAX)
+    , mResampler(nullptr)
+    , mRemainingResamplerTail(0)
+    , mBufferEnd(0)
+    , mLoopStart(0)
+    , mLoopEnd(0)
+    , mBufferPosition(0)
+    , mBufferSampleRate(0)
+    ,
     // mResamplerOutRate is initialized in UpdateResampler().
-    mChannels(0),
-    mDopplerShift(1.0f),
-    mDestination(aDestination->Stream()),
-    mPlaybackRateTimeline(1.0f),
-    mDetuneTimeline(0.0f),
-    mLoop(false)
+    mResamplerOutRate{}
+    , mChannels(0)
+    , mDopplerShift(1.0f)
+    , mDestination(aDestination->Stream())
+    , mSource{ nullptr }
+    , mPlaybackRateTimeline(1.0f)
+    , mDetuneTimeline(0.0f)
+    , mLoop(false)
   {}
 
   ~AudioBufferSourceNodeEngine()
   {
     if (mResampler) {
       speex_resampler_destroy(mResampler);
     }
   }
@@ -619,16 +626,18 @@ public:
 AudioBufferSourceNode::AudioBufferSourceNode(AudioContext* aContext)
   : AudioScheduledSourceNode(aContext,
                              2,
                              ChannelCountMode::Max,
                              ChannelInterpretation::Speakers)
   , mLoopStart(0.0)
   , mLoopEnd(0.0)
   // mOffset and mDuration are initialized in Start().
+  , mOffset{ 0.0 }
+  , mDuration{ 0.0 }
   , mPlaybackRate(new AudioParam(this, PLAYBACKRATE, "playbackRate", 1.0f))
   , mDetune(new AudioParam(this, DETUNE, "detune", 0.0f))
   , mLoop(false)
   , mStartCalled(false)
 {
   AudioBufferSourceNodeEngine* engine = new AudioBufferSourceNodeEngine(this, aContext->Destination());
   mStream = AudioNodeStream::Create(aContext, engine,
                                     AudioNodeStream::NEED_MAIN_THREAD_FINISHED,
--- a/dom/media/webaudio/AudioEventTimeline.cpp
+++ b/dom/media/webaudio/AudioEventTimeline.cpp
@@ -73,16 +73,17 @@ AudioTimelineEvent::AudioTimelineEvent(T
     SetCurveParams(aCurve, aCurveLength);
   } else {
     mValue = aValue;
   }
 }
 
 AudioTimelineEvent::AudioTimelineEvent(MediaStream* aStream)
   : mType(Stream)
+  , mValue{ 0.0 }
   , mCurve(nullptr)
   , mStream(aStream)
   , mTimeConstant(0.0)
   , mDuration(0.0)
 #ifdef DEBUG
   , mTimeIsInTicks(false)
 #endif
   , mTime(0.0)
--- a/dom/media/webaudio/AudioProcessingEvent.cpp
+++ b/dom/media/webaudio/AudioProcessingEvent.cpp
@@ -22,16 +22,17 @@ NS_IMPL_ADDREF_INHERITED(AudioProcessing
 NS_IMPL_RELEASE_INHERITED(AudioProcessingEvent, Event)
 
 AudioProcessingEvent::AudioProcessingEvent(ScriptProcessorNode* aOwner,
                                            nsPresContext* aPresContext,
                                            WidgetEvent* aEvent)
   : Event(aOwner, aPresContext, aEvent)
   , mPlaybackTime(0.0)
   , mNode(aOwner)
+  , mNumberOfInputChannels{}
 {
 }
 
 AudioProcessingEvent::~AudioProcessingEvent()
 {
 }
 
 JSObject*
--- a/dom/media/webaudio/DelayBuffer.h
+++ b/dom/media/webaudio/DelayBuffer.h
@@ -20,16 +20,19 @@ class DelayBuffer final
 
 public:
   explicit DelayBuffer(double aMaxDelayTicks)
     : mCurrentDelay(-1.0)
     // Round the maximum delay up to the next tick.
     , mMaxDelayTicks(ceil(aMaxDelayTicks))
     , mCurrentChunk(0)
     // mLastReadChunk is initialized in EnsureBuffer
+    , mLastReadChunk
+  {
+  }
 #ifdef DEBUG
     , mHaveWrittenBlock(false)
 #endif
   {
     // The 180 second limit in AudioContext::CreateDelay() and the
     // 1 << MEDIA_TIME_FRAC_BITS limit on sample rate provide a limit on the
     // maximum delay.
     MOZ_ASSERT(aMaxDelayTicks <=
--- a/dom/media/webaudio/blink/HRTFPanner.cpp
+++ b/dom/media/webaudio/blink/HRTFPanner.cpp
@@ -37,30 +37,33 @@ namespace WebCore {
 
 // The value of 2 milliseconds is larger than the largest delay which exists in any HRTFKernel from the default HRTFDatabase (0.0136 seconds).
 // We ASSERT the delay values used in process() with this value.
 const double MaxDelayTimeSeconds = 0.002;
 
 const int UninitializedAzimuth = -1;
 const unsigned RenderingQuantum = WEBAUDIO_BLOCK_SIZE;
 
-HRTFPanner::HRTFPanner(float sampleRate, already_AddRefed<HRTFDatabaseLoader> databaseLoader)
-    : m_databaseLoader(databaseLoader)
-    , m_sampleRate(sampleRate)
-    , m_crossfadeSelection(CrossfadeSelection1)
-    , m_azimuthIndex1(UninitializedAzimuth)
-    , m_azimuthIndex2(UninitializedAzimuth)
-    // m_elevation1 and m_elevation2 are initialized in pan()
-    , m_crossfadeX(0)
-    , m_crossfadeIncr(0)
-    , m_convolverL1(HRTFElevation::fftSizeForSampleRate(sampleRate))
-    , m_convolverR1(m_convolverL1.fftSize())
-    , m_convolverL2(m_convolverL1.fftSize())
-    , m_convolverR2(m_convolverL1.fftSize())
-    , m_delayLine(MaxDelayTimeSeconds * sampleRate)
+HRTFPanner::HRTFPanner(float sampleRate,
+                       already_AddRefed<HRTFDatabaseLoader> databaseLoader)
+  : m_databaseLoader(databaseLoader)
+  , m_sampleRate(sampleRate)
+  , m_crossfadeSelection(CrossfadeSelection1)
+  , m_azimuthIndex1(UninitializedAzimuth)
+  , m_elevation1{ 0.0 }
+  , m_azimuthIndex2(UninitializedAzimuth)
+  // m_elevation1 and m_elevation2 are initialized in pan()
+  , m_elevation2{ 0.0 }
+  , m_crossfadeX(0)
+  , m_crossfadeIncr(0)
+  , m_convolverL1(HRTFElevation::fftSizeForSampleRate(sampleRate))
+  , m_convolverR1(m_convolverL1.fftSize())
+  , m_convolverL2(m_convolverL1.fftSize())
+  , m_convolverR2(m_convolverL1.fftSize())
+  , m_delayLine(MaxDelayTimeSeconds * sampleRate)
 {
     MOZ_ASSERT(m_databaseLoader);
     MOZ_COUNT_CTOR(HRTFPanner);
 }
 
 HRTFPanner::~HRTFPanner()
 {
     MOZ_COUNT_DTOR(HRTFPanner);
--- a/dom/media/webaudio/blink/PeriodicWave.cpp
+++ b/dom/media/webaudio/blink/PeriodicWave.cpp
@@ -103,22 +103,25 @@ already_AddRefed<PeriodicWave>
 PeriodicWave::createTriangle(float sampleRate)
 {
     RefPtr<PeriodicWave> periodicWave =
         new PeriodicWave(sampleRate, MinPeriodicWaveSize, false);
     periodicWave->generateBasicWaveform(OscillatorType::Triangle);
     return periodicWave.forget();
 }
 
-PeriodicWave::PeriodicWave(float sampleRate, size_t numberOfComponents, bool disableNormalization)
-    : m_sampleRate(sampleRate)
-    , m_centsPerRange(CentsPerRange)
-    , m_maxPartialsInBandLimitedTable(0)
-    , m_normalizationScale(1.0f)
-    , m_disableNormalization(disableNormalization)
+PeriodicWave::PeriodicWave(float sampleRate,
+                           size_t numberOfComponents,
+                           bool disableNormalization)
+  : m_sampleRate(sampleRate)
+  , m_centsPerRange(CentsPerRange)
+  , m_numberOfComponents{}
+  , m_maxPartialsInBandLimitedTable(0)
+  , m_normalizationScale(1.0f)
+  , m_disableNormalization(disableNormalization)
 {
     float nyquist = 0.5 * m_sampleRate;
 
     if (numberOfComponents <= MinPeriodicWaveSize) {
         m_periodicWaveSize = MinPeriodicWaveSize;
     } else {
         unsigned npow2 = powf(2.0f, floorf(logf(numberOfComponents - 1.0)/logf(2.0f) + 1.0f));
         m_periodicWaveSize = std::min(MaxPeriodicWaveSize, npow2);
--- a/dom/media/webaudio/test/mochitest.ini
+++ b/dom/media/webaudio/test/mochitest.ini
@@ -106,16 +106,17 @@ tags=capturestream
 [test_bug1113634.html]
 [test_bug1118372.html]
 [test_bug1027864.html]
 [test_bug1056032.html]
 skip-if = toolkit == 'android' # bug 1056706
 [test_bug1255618.html]
 [test_bug1267579.html]
 [test_bug1355798.html]
+[test_bug1447273.html]
 [test_channelMergerNode.html]
 [test_channelMergerNodeWithVolume.html]
 [test_channelSplitterNode.html]
 [test_channelSplitterNodeWithVolume.html]
 skip-if = (android_version == '18' && debug) # bug 1158417
 [test_convolverNode.html]
 [test_convolverNode_mono_mono.html]
 [test_convolverNodeChannelCount.html]
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1447273.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test bug 1447273 - GainNode with a stereo input and changing volume</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="webaudio.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+/**
+ * Sets up a stereo BufferSource and plumbs it through different gain node
+ * configurations. A control gain path with no changes to gain is used along
+ * with 2 other paths which should increase their gain. The result should be
+ * that audio travelling along the increased gain paths is louder than the
+ * control path.
+ */
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout(
+  "This test uses a live audio context and uses a setTimeout to schedule a " +
+  "change to the graph.");
+addLoadEvent(function() {
+  let context = new AudioContext();
+
+  let numChannels = 2;
+  let sampleRate = context.sampleRate;
+  // 60 seconds to mitigate timing issues on slow test machines
+  let recordingLength = 60;
+  let bufferLength = sampleRate * recordingLength;
+  let gainExplicitlyIncreased = false;
+  let sourceFinished = false;
+
+  // Create source buffer
+  let sourceBuffer = context.createBuffer(numChannels, bufferLength, sampleRate);
+  for (let i = 0; i < bufferLength; ++i) {
+    sourceBuffer.getChannelData(0)[i] = 1;
+    sourceBuffer.getChannelData(1)[i] = 1;
+  }
+  let source = context.createBufferSource();
+  source.buffer = sourceBuffer;
+
+  let gainNoChange = context.createGain();
+  let gainExplicitAssignment = context.createGain();
+  let gainSetValueAtTime = context.createGain();
+
+  // All gain nodes start of with the same gain
+  gainNoChange.gain.value = 0.25;
+  gainExplicitAssignment.gain.value = 0.25;
+  gainSetValueAtTime.gain.value = 0.25;
+
+  // Connect source to gain nodes:
+  // source--> gainNoChange
+  //       |-> gainExplicitAssignment
+  //       \-> gainSetValueAtTime
+  source.connect(gainNoChange);
+  source.connect(gainExplicitAssignment);
+  source.connect(gainSetValueAtTime);
+
+  // Create intermediate media streams (required to repro bug 1447273)
+  let destNoChange = context.createMediaStreamDestination();
+  let destExplicitAssignement = context.createMediaStreamDestination();
+  let destSetValueAtTime = context.createMediaStreamDestination();
+
+  let sourceNoChange = context.createMediaStreamSource(destNoChange.stream);
+  let sourceExplicitAssignement = context.createMediaStreamSource(destExplicitAssignement.stream);
+  let sourceSetValueAtTime = context.createMediaStreamSource(destSetValueAtTime.stream);
+
+  // Connect gain nodes to our intermediate streams:
+  // source--> gainNoChange           -> destNoChange            -> sourceNoChange
+  //       |-> gainExplicitAssignment -> destExplicitAssignement -> sourceExplicitAssignement
+  //       \-> gainSetValueAtTime     -> destSetValueAtTime      -> sourceSetValueAtTime
+  gainNoChange.connect(destNoChange);
+  gainExplicitAssignment.connect(destExplicitAssignement);
+  gainSetValueAtTime.connect(destSetValueAtTime);
+
+  // Create analysers for each path
+  let analyserNoChange = context.createAnalyser();
+  let analyserExplicitAssignment = context.createAnalyser();
+  let analyserSetValueAtTime = context.createAnalyser();
+
+  // Connect our intermediate media streams to analysers:
+  // source--> gainNoChange           -> destNoChange            -> sourceNoChange            -> analyserNoChange
+  //       |-> gainExplicitAssignment -> destExplicitAssignement -> sourceExplicitAssignement -> analyserExplicitAssignment
+  //       \-> gainSetValueAtTime     -> destSetValueAtTime      -> sourceSetValueAtTime      -> analyserSetValueAtTime
+  sourceNoChange.connect(analyserNoChange);
+  sourceExplicitAssignement.connect(analyserExplicitAssignment);
+  sourceSetValueAtTime.connect(analyserSetValueAtTime);
+
+  // Two seconds in, increase gain for setValueAt path
+  gainSetValueAtTime.gain.setValueAtTime(0.5, 2);
+
+  // Maximum values seen at each analyser node, will be updated by
+  // checkAnalysersForMaxValues() during test.
+  let maxNoGainChange = 0;
+  let maxExplicitAssignment = 0;
+  let maxSetValueAtTime = 0;
+
+  // Poll analysers and check for max values
+  function checkAnalysersForMaxValues() {
+    let findMaxValue =
+      (array) => array.reduce((a, b) => Math.max(Math.abs(a), Math.abs(b)));
+
+    let dataArray = new Float32Array(analyserNoChange.fftSize);
+    analyserNoChange.getFloatTimeDomainData(dataArray);
+    maxNoGainChange = Math.max(maxNoGainChange, findMaxValue(dataArray));
+
+    analyserExplicitAssignment.getFloatTimeDomainData(dataArray);
+    maxExplicitAssignment = Math.max(maxExplicitAssignment, findMaxValue(dataArray));
+
+    analyserSetValueAtTime.getFloatTimeDomainData(dataArray);
+    maxSetValueAtTime = Math.max(maxSetValueAtTime, findMaxValue(dataArray));
+
+    // End test if we've met our conditions
+    // Add a small amount to initial gain to make sure we're not getting
+    // passes due to rounding errors.
+    let epsilon = 0.01;
+    if (maxExplicitAssignment > (maxNoGainChange + epsilon) &&
+        maxSetValueAtTime > (maxNoGainChange + epsilon)) {
+      source.stop();
+    }
+  }
+
+  source.onended = () => {
+    sourceFinished = true;
+    info(`maxNoGainChange: ${maxNoGainChange}`);
+    info(`maxExplicitAssignment: ${maxExplicitAssignment}`);
+    info(`maxSetValueAtTime: ${maxSetValueAtTime}`);
+    ok(gainExplicitlyIncreased,
+       "Gain should be explicitly assinged during test!");
+    // Add a small amount to initial gain to make sure we're not getting
+    // passes due to rounding errors.
+    let epsilon = 0.01;
+    ok(maxExplicitAssignment > (maxNoGainChange + epsilon),
+       "Volume should increase due to explicit assignment to gain.value");
+    ok(maxSetValueAtTime > (maxNoGainChange + epsilon),
+       "Volume should increase due to setValueAtTime on gain.value");
+    SimpleTest.finish();
+  };
+
+  // Start the graph
+  source.start(0);
+
+  // We'll use this callback to check our analysers for gain
+  function animationFrameCb() {
+    if (sourceFinished) {
+      return;
+    }
+    requestAnimationFrame(animationFrameCb);
+    checkAnalysersForMaxValues();
+  }
+
+  // Using timers is gross, but as of writing there doesn't appear to be a
+  // nicer way to perform gain.value = 0.5 on our node. When/if we support
+  // suspend(time) on offline contexts we could potentially use that instead.
+
+  // Roughly 2 seconds through our source buffer (setTimeout flakiness) increase
+  // our gain on gainExplicitAssignment path.
+  window.setTimeout(() => {
+    gainExplicitAssignment.gain.value = 0.5;
+    // Make debugging flaky timeouts in test easier
+    info("Gain explicitly set!")
+    gainExplicitlyIncreased = true;
+    // Start checking analysers, we do this only after changing volume to avoid
+    // possible starvation of this timeout from requestAnimationFrame calls.
+    animationFrameCb();
+  }, 2000);
+});
+
+</script>
+</pre>
+</body>
+</html>
--- a/dom/media/webm/EbmlComposer.cpp
+++ b/dom/media/webm/EbmlComposer.cpp
@@ -220,13 +220,15 @@ EbmlComposer::ExtractBuffer(nsTArray<nsT
 EbmlComposer::EbmlComposer()
   : mFlushState(FLUSH_NONE)
   , mClusterHeaderIndex(0)
   , mClusterLengthLoc(0)
   , mCodecDelay(0)
   , mClusterTimecode(0)
   , mWidth(0)
   , mHeight(0)
+  , mDisplayWidth{}
+  , mDisplayHeight{}
   , mSampleFreq(0)
   , mChannels(0)
 {}
 
 } // namespace mozilla
--- a/dom/media/webm/NesteggPacketHolder.h
+++ b/dom/media/webm/NesteggPacketHolder.h
@@ -19,17 +19,20 @@ namespace mozilla {
 class NesteggPacketHolder {
 public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NesteggPacketHolder)
   NesteggPacketHolder()
     : mPacket(nullptr)
     , mOffset(-1)
     , mTimestamp(-1)
     , mDuration(-1)
-    , mIsKeyframe(false) {}
+    , mTrack{}
+    , mIsKeyframe(false)
+  {
+  }
 
   bool Init(nestegg_packet* aPacket, int64_t aOffset, unsigned aTrack, bool aIsKeyframe)
   {
     uint64_t timestamp_ns;
     if (nestegg_packet_tstamp(aPacket, &timestamp_ns) == -1) {
       return false;
     }
 
--- a/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.mm
+++ b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.mm
@@ -104,17 +104,17 @@ NS_INTERFACE_MAP_END
 NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechTaskCallback)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechTaskCallback)
 
 SpeechTaskCallback::SpeechTaskCallback(nsISpeechTask* aTask,
                                        NSSpeechSynthesizer* aSynth,
                                        const nsTArray<size_t>& aOffsets)
   : mTask(aTask)
   , mSpeechSynthesizer(aSynth)
-  , mOffsets(aOffsets)
+  , mCurrentIndex{}, mOffsets(aOffsets)
 {
   mDelegate = [[SpeechDelegate alloc] initWithCallback:this];
   [mSpeechSynthesizer setDelegate:mDelegate];
   mStartingTime = TimeStamp::Now();
 }
 
 SpeechTaskCallback::~SpeechTaskCallback()
 {
--- a/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp
+++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp
@@ -155,18 +155,20 @@ SpeechSynthesisRequestChild::RecvOnMark(
                                         const uint32_t& aCharIndex)
 {
   mTask->DispatchMarkImpl(aName, aElapsedTime, aCharIndex);
   return IPC_OK();
 }
 
 // SpeechTaskChild
 
-SpeechTaskChild::SpeechTaskChild(SpeechSynthesisUtterance* aUtterance, bool aIsChrome)
+SpeechTaskChild::SpeechTaskChild(SpeechSynthesisUtterance* aUtterance,
+                                 bool aIsChrome)
   : nsSpeechTask(aUtterance, aIsChrome)
+  , mActor{ nullptr }
 {
 }
 
 NS_IMETHODIMP
 SpeechTaskChild::Setup(nsISpeechTaskCallback* aCallback)
 {
   MOZ_CRASH("Should never be called from child");
 }
--- a/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h
+++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h
@@ -75,17 +75,20 @@ protected:
   mozilla::ipc::IPCResult Recv__delete__() override;
 };
 
 class SpeechTaskParent : public nsSpeechTask
 {
   friend class SpeechSynthesisRequestParent;
 public:
   SpeechTaskParent(float aVolume, const nsAString& aUtterance, bool aIsChrome)
-    : nsSpeechTask(aVolume, aUtterance, aIsChrome) {}
+    : nsSpeechTask(aVolume, aUtterance, aIsChrome)
+    , mActor{ nullptr }
+  {
+  }
 
   nsresult DispatchStartImpl(const nsAString& aUri) override;
 
   nsresult DispatchEndImpl(float aElapsedTime, uint32_t aCharIndex) override;
 
   nsresult DispatchPauseImpl(float aElapsedTime, uint32_t aCharIndex) override;
 
   nsresult DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex) override;
--- a/dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp
+++ b/dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp
@@ -106,24 +106,31 @@ public:
 
 class GlobalQueueItem final
 {
 private:
   // Private destructor, to discourage deletion outside of Release():
   ~GlobalQueueItem() {}
 
 public:
-  GlobalQueueItem(VoiceData* aVoice, nsSpeechTask* aTask, const nsAString& aText,
-                  const float& aVolume, const float& aRate, const float& aPitch)
+  GlobalQueueItem(VoiceData* aVoice,
+                  nsSpeechTask* aTask,
+                  const nsAString& aText,
+                  const float& aVolume,
+                  const float& aRate,
+                  const float& aPitch)
     : mVoice(aVoice)
     , mTask(aTask)
     , mText(aText)
     , mVolume(aVolume)
     , mRate(aRate)
-    , mPitch(aPitch) {}
+    , mPitch(aPitch)
+    , mIsLocal{ false }
+  {
+  }
 
   NS_INLINE_DECL_REFCOUNTING(GlobalQueueItem)
 
   RefPtr<VoiceData> mVoice;
 
   RefPtr<nsSpeechTask> mTask;
 
   nsString mText;
--- a/dom/messagechannel/MessagePort.cpp
+++ b/dom/messagechannel/MessagePort.cpp
@@ -196,16 +196,17 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 NS_IMPL_ADDREF_INHERITED(MessagePort, DOMEventTargetHelper)
 NS_IMPL_RELEASE_INHERITED(MessagePort, DOMEventTargetHelper)
 
 MessagePort::MessagePort(nsIGlobalObject* aGlobal)
   : DOMEventTargetHelper(aGlobal)
   , mInnerID(0)
+  , mState{ static_cast<State>(0) }
   , mMessageQueueEnabled(false)
   , mIsKeptAlive(false)
   , mHasBeenTransferredOrClosed(false)
 {
   MOZ_ASSERT(aGlobal);
 
   mIdentifier = new MessagePortIdentifier();
   mIdentifier->neutered() = true;
--- a/dom/payments/PaymentActionResponse.cpp
+++ b/dom/payments/PaymentActionResponse.cpp
@@ -148,16 +148,17 @@ PaymentActionResponse::GetType(uint32_t*
 
 /* PaymentCanMakeActionResponse */
 
 NS_IMPL_ISUPPORTS_INHERITED(PaymentCanMakeActionResponse,
                             PaymentActionResponse,
                             nsIPaymentCanMakeActionResponse)
 
 PaymentCanMakeActionResponse::PaymentCanMakeActionResponse()
+  : mResult{ false }
 {
   mType = nsIPaymentActionResponse::CANMAKE_ACTION;
 }
 
 NS_IMETHODIMP
 PaymentCanMakeActionResponse::GetResult(bool* aResult)
 {
   NS_ENSURE_ARG_POINTER(aResult);
@@ -175,16 +176,17 @@ PaymentCanMakeActionResponse::Init(const
 
 /* PaymentShowActionResponse */
 
 NS_IMPL_ISUPPORTS_INHERITED(PaymentShowActionResponse,
                             PaymentActionResponse,
                             nsIPaymentShowActionResponse)
 
 PaymentShowActionResponse::PaymentShowActionResponse()
+  : mAcceptStatus{}
 {
   mType = nsIPaymentActionResponse::SHOW_ACTION;
 }
 
 NS_IMETHODIMP
 PaymentShowActionResponse::GetAcceptStatus(uint32_t* aAcceptStatus)
 {
   NS_ENSURE_ARG_POINTER(aAcceptStatus);
@@ -286,16 +288,17 @@ PaymentShowActionResponse::Init(const ns
 
 /* PaymentAbortActionResponse */
 
 NS_IMPL_ISUPPORTS_INHERITED(PaymentAbortActionResponse,
                             PaymentActionResponse,
                             nsIPaymentAbortActionResponse)
 
 PaymentAbortActionResponse::PaymentAbortActionResponse()
+  : mAbortStatus{}
 {
   mType = nsIPaymentActionResponse::ABORT_ACTION;
 }
 
 NS_IMETHODIMP
 PaymentAbortActionResponse::GetAbortStatus(uint32_t* aAbortStatus)
 {
   NS_ENSURE_ARG_POINTER(aAbortStatus);
@@ -322,16 +325,17 @@ PaymentAbortActionResponse::IsSucceeded(
 
 /* PaymentCompleteActionResponse */
 
 NS_IMPL_ISUPPORTS_INHERITED(PaymentCompleteActionResponse,
                             PaymentActionResponse,
                             nsIPaymentCompleteActionResponse)
 
 PaymentCompleteActionResponse::PaymentCompleteActionResponse()
+  : mCompleteStatus{}
 {
   mType = nsIPaymentActionResponse::COMPLETE_ACTION;
 }
 
 nsresult
 PaymentCompleteActionResponse::Init(const nsAString& aRequestId,
                                     const uint32_t aCompleteStatus)
 {
--- a/dom/performance/Performance.cpp
+++ b/dom/performance/Performance.cpp
@@ -70,24 +70,26 @@ Performance::CreateForWorker(WorkerPriva
   RefPtr<Performance> performance = new PerformanceWorker(aWorkerPrivate);
   performance->mSystemPrincipal = aWorkerPrivate->UsesSystemPrincipal();
   return performance.forget();
 }
 
 Performance::Performance()
   : mResourceTimingBufferSize(kDefaultResourceTimingBufferSize)
   , mPendingNotificationObserversTask(false)
+  , mSystemPrincipal{ false }
 {
   MOZ_ASSERT(!NS_IsMainThread());
 }
 
 Performance::Performance(nsPIDOMWindowInner* aWindow)
   : DOMEventTargetHelper(aWindow)
   , mResourceTimingBufferSize(kDefaultResourceTimingBufferSize)
   , mPendingNotificationObserversTask(false)
+  , mSystemPrincipal{ false }
 {
   MOZ_ASSERT(NS_IsMainThread());
 }
 
 Performance::~Performance()
 {}
 
 DOMHighResTimeStamp
--- a/dom/plugins/base/nsPluginHost.cpp
+++ b/dom/plugins/base/nsPluginHost.cpp
@@ -1653,19 +1653,24 @@ nsPluginHost::ClearSiteData(nsIPluginTag
 
 #define GetSitesClosure_CID {0x4c9268ac, 0x2fd1, 0x4f2a, {0x9a, 0x10, 0x7a, 0x09, 0xf1, 0xb7, 0x60, 0x3a}}
 
 // Closure to contain the data needed to handle the callback from NPP_GetSitesWithData
 class GetSitesClosure : public nsIGetSitesWithDataCallback {
 public:
   NS_DECL_ISUPPORTS
   GetSitesClosure(const nsACString& domain, nsPluginHost* host)
-  : domain(domain), host(host), keepWaiting(true)
+    : domain(domain)
+    , host(host)
+    , result{ false }
+    , keepWaiting(true)
+    , retVal{ NS_ERROR_NOT_INITIALIZED }
   {
   }
+
   NS_IMETHOD SitesWithData(InfallibleTArray<nsCString>& sites) override {
     retVal = HandleGetSites(sites);
     keepWaiting = false;
     return NS_OK;
   }
 
   nsresult HandleGetSites(InfallibleTArray<nsCString>& sites) {
     // If there's no data, we're done.
--- a/dom/plugins/base/nsPluginInstanceOwner.cpp
+++ b/dom/plugins/base/nsPluginInstanceOwner.cpp
@@ -252,16 +252,17 @@ nsPluginInstanceOwner::GetCurrentImageSi
   if (mInstance) {
     mInstance->GetImageSize(&size);
   }
   return size;
 }
 
 nsPluginInstanceOwner::nsPluginInstanceOwner()
   : mPluginWindow(nullptr)
+  , mLastEventloopNestingLevel{}
 {
   // create nsPluginNativeWindow object, it is derived from NPWindow
   // struct and allows to manipulate native window procedure
   nsCOMPtr<nsIPluginHost> pluginHostCOM = do_GetService(MOZ_PLUGIN_HOST_CONTRACTID);
   mPluginHost = static_cast<nsPluginHost*>(pluginHostCOM.get());
   if (mPluginHost)
     mPluginHost->NewPluginNativeWindow(&mPluginWindow);
 
--- a/dom/plugins/base/nsPluginManifestLineReader.h
+++ b/dom/plugins/base/nsPluginManifestLineReader.h
@@ -15,17 +15,21 @@
 #define PLUGIN_REGISTRY_FIELD_DELIMITER ':'
 #endif
 
 #define PLUGIN_REGISTRY_END_OF_LINE_MARKER '$'
 
 class nsPluginManifestLineReader
 {
   public:
-    nsPluginManifestLineReader() {mBase = mCur = mNext = mLimit = 0;}
+    nsPluginManifestLineReader()
+      : mLength{}
+    {
+      mBase = mCur = mNext = mLimit = 0;
+    }
     ~nsPluginManifestLineReader() { if (mBase) delete[] mBase; mBase=0;}
 
     char* Init(uint32_t flen)
     {
       mBase = mCur = mNext = new char[flen + 1];
       if (mBase) {
         mLimit = mBase + flen;
         *mLimit = 0;
--- a/dom/plugins/base/nsPluginStreamListenerPeer.cpp
+++ b/dom/plugins/base/nsPluginStreamListenerPeer.cpp
@@ -40,16 +40,17 @@ NS_IMPL_ISUPPORTS(nsPluginStreamListener
                   nsIStreamListener,
                   nsIRequestObserver,
                   nsIHttpHeaderVisitor,
                   nsISupportsWeakReference,
                   nsIInterfaceRequestor,
                   nsIChannelEventSink)
 
 nsPluginStreamListenerPeer::nsPluginStreamListenerPeer()
+  : mLength{}
 {
   mStreamType = NP_NORMAL;
   mStartBinding = false;
   mRequestFailed = false;
 
   mPendingRequests = 0;
   mHaveFiredOnStartRequest = false;
 
--- a/dom/plugins/base/nsPluginTags.cpp
+++ b/dom/plugins/base/nsPluginTags.cpp
@@ -298,29 +298,35 @@ nsPluginTag::nsPluginTag(uint32_t aId,
                          nsTArray<nsCString> aMimeDescriptions,
                          nsTArray<nsCString> aExtensions,
                          bool aIsFlashPlugin,
                          bool aSupportsAsyncRender,
                          int64_t aLastModifiedTime,
                          bool aFromExtension,
                          int32_t aSandboxLevel,
                          uint32_t aBlocklistState)
-  : nsIInternalPluginTag(aName, aDescription, aFileName, aVersion, aMimeTypes,
-                         aMimeDescriptions, aExtensions),
-    mId(aId),
-    mContentProcessRunningCount(0),
-    mLibrary(nullptr),
-    mIsFlashPlugin(aIsFlashPlugin),
-    mSupportsAsyncRender(aSupportsAsyncRender),
-    mLastModifiedTime(aLastModifiedTime),
-    mSandboxLevel(aSandboxLevel),
-    mIsSandboxLoggingEnabled(false),
-    mNiceFileName(),
-    mIsFromExtension(aFromExtension),
-    mBlocklistState(aBlocklistState)
+  : nsIInternalPluginTag(aName,
+                         aDescription,
+                         aFileName,
+                         aVersion,
+                         aMimeTypes,
+                         aMimeDescriptions,
+                         aExtensions)
+  , mId(aId)
+  , mContentProcessRunningCount(0)
+  , mHadLocalInstance{ false }
+  , mLibrary(nullptr)
+  , mIsFlashPlugin(aIsFlashPlugin)
+  , mSupportsAsyncRender(aSupportsAsyncRender)
+  , mLastModifiedTime(aLastModifiedTime)
+  , mSandboxLevel(aSandboxLevel)
+  , mIsSandboxLoggingEnabled(false)
+  , mNiceFileName()
+  , mIsFromExtension(aFromExtension)
+  , mBlocklistState(aBlocklistState)
 {
 }
 
 nsPluginTag::~nsPluginTag()
 {
   NS_ASSERTION(!mNext, "Risk of exhausting the stack space, bug 486349");
 }
 
--- a/dom/plugins/base/nsPluginsDirDarwin.cpp
+++ b/dom/plugins/base/nsPluginsDirDarwin.cpp
@@ -262,18 +262,19 @@ static void ParsePlistPluginInfo(nsPlugi
       CFTypeRef description = ::CFDictionaryGetValue(static_cast<CFDictionaryRef>(mimeDict), CFSTR("WebP