diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3ff7b3939ba4e36c5aee5b117dccd367e753f852..b43481de4de6536c224ab3712080d92ab4c435a3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -58,9 +58,8 @@ variables:
 
 .win_build:
   stage: build
-  image: r.alchemyviewer.org/alchemy/infrastructure/windows-build-image:latest
   tags:
-    - docker
+    - autobuild
     - windows
   cache:
     key:
@@ -72,6 +71,8 @@ variables:
       - .cache/pip
     when: 'always'
   before_script:
+    - python -m venv .venv
+    - .\.venv\Scripts\Activate.ps1
     - pip install --upgrade llbase autobuild certifi sentry-cli cmake
   script:
     - autobuild configure -c Release -- -DUSE_LTO="${ENABLE_LTO}" -DHAVOK_TPV="${USE_HAVOK}" -DLL_TESTS="${ENABLE_TESTS}" -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE
diff --git a/autobuild.xml b/autobuild.xml
index a00d228b2d996807e9cd263f86da6a1c6a394d31..93e49aa5f16cf8a317f453f48016631a7d4d62b1 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -598,11 +598,11 @@
               <key>creds</key>
               <string>gitlab</string>
               <key>hash</key>
-              <string>129e77c5352c096e798ee5fb071388cee3211512af62ac178fc6918d7862209da67a945434b98e0dd8a9ddc507227cf9e7d08023bc08123fbcfc0a96fb9b621d</string>
+              <string>fa5d856b9608b15d9ec89bb1869c382e92235cc4099475acf7a54b7a759493cf188098e77997d4de845f55d4f9bdaba2443d3030646acb10f690bfc895a9ba49</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.18.2172/fmodstudio-2.02.18-darwin64-2172.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.19.2199/fmodstudio-2.02.19-darwin64-2199.tar.zst</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -614,11 +614,11 @@
               <key>creds</key>
               <string>gitlab</string>
               <key>hash</key>
-              <string>86bd7557845f296cf46e6ea3150279dc4bac68b398d7e9de856604be98ae3c0444a6f55744c8c8e5ac05c4f1a81cc3be185b323bf1e8efa592293a2a73918fc9</string>
+              <string>9e75cd818a2d476222c9d0445fe57ff1036cfd0d860c29e22c5f69aaf529adf0afccdeea271f8bd0fa4df8ec8a0c46f5a683e762418b6bc571453908f7c7315f</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.18.2172/fmodstudio-2.02.18-linux64-2172.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.19.2199/fmodstudio-2.02.19-linux64-2199.tar.zst</string>
             </map>
             <key>name</key>
             <string>linux64</string>
@@ -630,11 +630,11 @@
               <key>creds</key>
               <string>gitlab</string>
               <key>hash</key>
-              <string>99b7b1116c75f399f5edc453015977675967146b75ee487d7c490287ed89963c4cc1440bc5d0a1b0c76b7b5869da88050036eab103e0a4d5e18391586ff4b80a</string>
+              <string>863ce55621614cb05bc8c1dc0ea313553c6dcb85c8ae9aee67dd04cb3910e78412e7fbefc18ed1281fa726af87d7b7a2b87023784405049fbd27a7dbd8909880</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.18.2172/fmodstudio-2.02.18-windows64-2172.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.19.2199/fmodstudio-2.02.19-windows64-2199.tar.zst</string>
             </map>
             <key>name</key>
             <string>windows64</string>
@@ -647,7 +647,7 @@
         <key>copyright</key>
         <string>FMOD Studio, Copyright (c) Firelight Technologies Pty Ltd.</string>
         <key>version</key>
-        <string>2.02.18</string>
+        <string>2.02.19</string>
         <key>name</key>
         <string>fmodstudio</string>
         <key>description</key>
diff --git a/indra/deps/CMakeLists.txt b/indra/deps/CMakeLists.txt
index 36160496d2e887198bc05093e1fb18797a2c809c..d22384424cf503852153140298e08cf08cd9deb9 100644
--- a/indra/deps/CMakeLists.txt
+++ b/indra/deps/CMakeLists.txt
@@ -25,7 +25,7 @@ add_library(deps
 FetchContent_Declare(
   meshoptimizer
   GIT_REPOSITORY https://git.alchemyviewer.org/alchemy/mirrors/meshoptimizer.git
-  GIT_TAG        v0.19
+  GIT_TAG        v0.20
   GIT_SHALLOW TRUE
   GIT_PROGRESS TRUE
   )
diff --git a/indra/llcommon/llsdjson.cpp b/indra/llcommon/llsdjson.cpp
index 391b8376363932b823b9e4e86915a3a439cc0cec..42a08d9392f651f0676320685ffc6b06ca104dd8 100644
--- a/indra/llcommon/llsdjson.cpp
+++ b/indra/llcommon/llsdjson.cpp
@@ -68,7 +68,7 @@ LLSD LlsdFromJson(const nlohmann::json &val)
         break;
     case nlohmann::json::value_t::object:
         result = LLSD::emptyMap();
-        for (auto it = val.cbegin(); it != val.cend(); ++it)
+        for (auto it = val.cbegin(), end = val.cend(); it != end; ++it)
         {
             result[it.key()] = LlsdFromJson(it.value());
         }
diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp
index 8c226fe2fb46907a330abd85b0692ffe2000a671..330936444fb18d19d38aa8f03f4e2c57221b4380 100644
--- a/indra/llcommon/llsdutil.cpp
+++ b/indra/llcommon/llsdutil.cpp
@@ -834,7 +834,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs, int bits)
     case LLSD::TypeMap:
     {
         // Build a set of all rhs keys.
-        std::set<LLSD::String> rhskeys;
+        boost::unordered_set<LLSD::String> rhskeys;
         for (LLSD::map_const_iterator rmi(rhs.beginMap()), rmend(rhs.endMap());
              rmi != rmend; ++rmi)
         {
@@ -989,8 +989,8 @@ LLSD llsd_clone(LLSD value, LLSD filter)
 
     case LLSD::TypeBinary:
     {
-        LLSD::Binary bin(value.asBinary().begin(), value.asBinary().end());
-        clone = LLSD::Binary(std::move(bin));
+        const auto& bin = value.asBinary();
+        clone = LLSD::Binary(bin.begin(), bin.end());
         break;
     }
     default:
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index 4eceb82ea79f999108bbae3e9b1705ed76aa0bac..aadd008b2bedaf8645e872d74ce11e0e6ce1a4d5 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -97,11 +97,7 @@ class LL_COMMON_API LLUUID
 	 */
 	LL_FORCE_INLINE __m128i load_unaligned_si128(const U8* p) const
 	{
-#if defined(__SSE3__)
-		return _mm_lddqu_si128(reinterpret_cast<const __m128i*>(p));
-#else
 		return _mm_loadu_si128(reinterpret_cast<const __m128i*>(p));
-#endif
 	}
 
 	BOOL isNull() const // Faster than comparing to LLUUID::null.
diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp
index 55a9ad273dbad4376c9beb094701d1ef07794f07..93e33c2e1e0bc3ef2351eaa50fdb89f5b48eba95 100644
--- a/indra/llinventory/llsettingsbase.cpp
+++ b/indra/llinventory/llsettingsbase.cpp
@@ -174,12 +174,15 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
 
     const auto& other_map = other.map();
     const auto& settings_map = settings.map();
+    const auto skipEnd = skip.end();
+    const auto settingsEnd = settings_map.end();
+
     for (const auto& llsd_pair : settings_map)
     {
         const std::string& key_name = llsd_pair.first;
         const LLSD& value = llsd_pair.second;
 
-        if (skip.contains(key_name))
+        if (skip.find(key_name) != skipEnd)
             continue;
 
         LLSD other_value;
@@ -232,10 +235,10 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
     {
         const std::string& key_name = llsd_pair.first;
 
-        if (skip.contains(key_name))
+        if (skip.find(key_name) != skipEnd)
             continue;
 
-        if (settings_map.contains(key_name))
+        if (settings_map.find(key_name) != settingsEnd)
             continue;
 
         parammapping_t::const_iterator def_iter = defaults.find(key_name);
@@ -257,10 +260,10 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
     for (const auto& llsd_pair : other.map())
     {
         // TODO: Should I blend this in instead?
-        if (!skip.contains(llsd_pair.first))
+        if (skip.find(llsd_pair.first) == skipEnd)
             continue;
 
-        if (!settings_map.contains(llsd_pair.first))
+        if (settings_map.find(llsd_pair.first) == settingsEnd)
             continue;
     
         newSettings[llsd_pair.first] = llsd_pair.second;
diff --git a/indra/llprimitive/llmaterialid.h b/indra/llprimitive/llmaterialid.h
index fb26112a4daeab528b0fe638b61e979a9af23a7c..cd327973f8b96a9832dddd6657147e5b01ee07a7 100644
--- a/indra/llprimitive/llmaterialid.h
+++ b/indra/llprimitive/llmaterialid.h
@@ -52,11 +52,7 @@ class LLMaterialID
  */
 	LL_FORCE_INLINE __m128i load_unaligned_si128(const U8* p) const
 	{
-#if defined(__SSE3__)
-		return _mm_lddqu_si128(reinterpret_cast<const __m128i*>(p));
-#else
 		return _mm_loadu_si128(reinterpret_cast<const __m128i*>(p));
-#endif
 	}
 
 	bool operator==(const LLMaterialID& rhs) const
diff --git a/indra/newview/installers/windows/install_template.iss b/indra/newview/installers/windows/install_template.iss
index 5e5b601fd956308427135b3e9a2f2b53b0270b14..754194fafd55efae293f7fedb904a8d42e742756 100644
--- a/indra/newview/installers/windows/install_template.iss
+++ b/indra/newview/installers/windows/install_template.iss
@@ -15,7 +15,7 @@
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
 ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
-AppId={{564993A0-36C3-4C9C-83FA-336EAB720367}
+AppId={#MyAppNameShort}
 AppName={#MyAppName}
 AppVersion={#MyAppVersion}
 AppVerName={#MyAppName} {#MyAppVersion} 
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
index 872f3814f7bb8dd3ce4946236f982757280bea4e..10e5ba2d1ffb8dd3a258d58c89635ddf925601f7 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -1423,7 +1423,7 @@ void LLInventoryGallery::onFocusReceived()
         LLInventoryGalleryItem* focus_item = NULL;
         for (const LLUUID& id : mSelectedItemIDs)
         {
-            if (mItemMap[id])
+            if (mItemMap[id] && !mItemMap[id]->isHidden())
             {
                 focus_item = mItemMap[id];
                 focus_item->setSelected(true);
diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index 06767f3b1ba7389c260805cbcebd336c010ad092..90cf7f1a390d470015d75ae64bfd971ba0ed8517 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -691,12 +691,8 @@ void LLMaterialMgr::processGetQueue()
 			return;
 		}
 
-		LLSD::Binary materialBinary;
-		materialBinary.resize(materialSize);
-		memcpy(materialBinary.data(), materialString.data(), materialSize);
-
 		LLSD postData = LLSD::emptyMap();
-		postData[MATERIALS_CAP_ZIP_FIELD] = materialBinary;
+		postData[MATERIALS_CAP_ZIP_FIELD] = LLSD::Binary(materialString.begin(), materialString.end());
 
         LLCore::HttpHandler::ptr_t handler = std::make_shared<LLMaterialHttpHandler>("POST",
 				boost::bind(&LLMaterialMgr::onGetResponse, this, _1, _2, region_id)
@@ -979,12 +975,8 @@ void LLMaterialMgr::processPutQueue()
 
 		if (materialSize > 0)
 		{
-			LLSD::Binary materialBinary;
-			materialBinary.resize(materialSize);
-			memcpy(materialBinary.data(), materialString.data(), materialSize);
-
 			LLSD putData = LLSD::emptyMap();
-			putData[MATERIALS_CAP_ZIP_FIELD] = materialBinary;
+			putData[MATERIALS_CAP_ZIP_FIELD] = LLSD::Binary(materialString.begin(), materialString.end());
 
 			LL_DEBUGS("Materials") << "put for " << itRequest->second.size() << " faces to region " << itRequest->first->getName() << LL_ENDL;