diff --git a/DEPS b/DEPS
index d0aa46e..23ce4fcc 100644
--- a/DEPS
+++ b/DEPS
@@ -282,15 +282,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '5f7e572995b1be230ef49d6c082e27d9a6b55592',
+  'skia_revision': '7736fbaf84f06057637538449a2a62f442fff378',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'f28d354da1d29c02d3e1bbdd25bc6a0bd7a9b430',
+  'v8_revision': 'fd29d37630914966ff447d57b897f32e5ebea8c6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '1a847d4a6e6afcfd77f02325b1071c0f6b2c6f60',
+  'angle_revision': '9c376a02deade716a29d2a2c85393c28ed0ac578',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -333,7 +333,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '9127c68f593d9509bc289518bf907c311425e694',
+  'freetype_revision': '8fe50c2adca74a4eca1501c831251283b4cc6d9b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -353,7 +353,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '86fe6c71d698699d600b945e4fd00533fc557474',
+  'catapult_revision': '3611b9c58ddd42ca418e057eb3ea4f44e7941b47',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -369,7 +369,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'cb217e0534b47df3dae269d522763acda882a493',
+  'devtools_frontend_revision': 'b2bb3df6c93f8102cccb1eb86f5823c435c4d15a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -409,7 +409,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'f494fd72057e685ef06687d4a1d8b0f8776753c4',
+  'dawn_revision': 'a3a0b3299b6c0c6c54c2e3637fc80791f1fb379a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -769,7 +769,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '7ed549f1204c166608faf327f145bffaddb2f682',
+    'dbdb19ed5e143ef6a2831b3fb50404253ad9a3f1',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -868,7 +868,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'pK_Dv-oRMQY_driQ838EdYME-nua7rkDGBIiuVK3ANoC',
+          'version': 'Ig2CwUlwBkICPY7DwtdWBMAibAVoWN9VzwMgn9wk9m8C',
         },
       ],
       'dep_type': 'cipd',
@@ -879,7 +879,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'qlIqnaF50wmO_NDGzs4QOnpDKK-i0dzXe5BSSQnAigIC',
+          'version': 'K9ZAgnmyEE30USYe2SK2xnBIvSuJvRPlMw7O_wiHiHgC',
         },
       ],
       'dep_type': 'cipd',
@@ -890,7 +890,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'CxVQJy6cSGKToMBrSGgAX0aiP9uwukz-ZFLWXRHQRMoC',
+          'version': 'x36-iYLaXE4ONPSClrrwGk7wNaDDl0ldymeNbblC7SkC',
         },
       ],
       'dep_type': 'cipd',
@@ -958,7 +958,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'c8XCgnDa6lP6C1IcJKADz2cE9moc4Ohv4JGKUaWotKYC',
+          'version': 'XXY63ZMXsEh9Q723ZYgW4JxYtzVhxNIoUxUwwjMSeBAC',
       },
     ],
     'condition': 'checkout_android',
@@ -1161,7 +1161,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '99047eed72ba284c25761dbe376ef95284c5cb6a',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '2c7eceb1ede89381dc1a3957888d5b7c7a25d4c2',
       'condition': 'checkout_chromeos',
   },
 
@@ -1199,7 +1199,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '638c52b317508afa51b144d177d5f737c871b0a2',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'ceda81a139d3c0f7e768e2c393575c99f03df20f',
     'condition': 'checkout_src_internal',
   },
 
@@ -1703,7 +1703,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': '_FuL1VmaJnETpwNIaiuiSLxVNzzt0qXGmsfAck4CPCkC',
+              'version': 'l_fNXfqk0MnMDwxEr_PymvAgsB3cvsXGv80UVJYawgMC',
           },
       ],
       'condition': 'checkout_android',
@@ -1848,7 +1848,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0d1ecc682f0ad9fbee323bbff72c0d2249728fe6',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9dfb531f382d61f7e647b82373818034e3e79ad8',
+    Var('webrtc_git') + '/src.git' + '@' + 'edb9cf3de081106e3327a65c32fd0b3bb3c04998',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1938,7 +1938,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': Var('chrome_git') + '/chrome/src-internal.git@896e5d4a368ade8355bda18be82ab8dff4b5b9c0',
+    'url': Var('chrome_git') + '/chrome/src-internal.git@97d0780bd20fabcc1fea568fcdab9bfbea2c1301',
     'condition': 'checkout_src_internal',
   },
 
@@ -1968,7 +1968,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'yRGDYcuSNcPK4Namo1SN0RvgfJf0ETDE7KxTqGN6xxYC',
+        'version': '7dysgYmbs7PhMBV6qzOHQ4YdiEgpCsJ1xRAdVoQfxWwC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2001,7 +2001,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'F4LQWOHvrkLWzBrUu73BiRUx7ex4H3ScwfwTW-92hbEC',
+        'version': 'MjbAzRlQTJ6Yr-yngqeW7xFRUO80Gvas4hKho1ojnj4C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2837,7 +2837,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations',
-              'version': 'version:2@1.9.cr1',
+              'version': 'version:2@1.10.1.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -2925,7 +2925,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations',
-              'version': 'version:2@2.14.0.cr1',
+              'version': 'version:2@2.18.0.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3134,7 +3134,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/com_google_guava_guava',
-              'version': 'version:2@31.0.1-jre.cr1',
+              'version': 'version:2@31.1-jre.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3405,11 +3405,11 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on': {
+  'src/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on': {
       'packages': [
           {
-              'package': 'chromium/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on',
-              'version': 'version:2@1.68.cr1',
+              'package': 'chromium/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on',
+              'version': 'version:2@1.72.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3640,7 +3640,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm',
-              'version': 'version:2@9.2.cr1',
+              'version': 'version:2@9.5.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3651,7 +3651,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis',
-              'version': 'version:2@9.2.cr1',
+              'version': 'version:2@9.5.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3662,7 +3662,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons',
-              'version': 'version:2@9.2.cr1',
+              'version': 'version:2@9.5.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3673,7 +3673,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree',
-              'version': 'version:2@9.2.cr1',
+              'version': 'version:2@9.5.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3684,7 +3684,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_util',
-              'version': 'version:2@9.2.cr1',
+              'version': 'version:2@9.5.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3706,7 +3706,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_annotations',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3717,7 +3717,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_junit',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3728,7 +3728,18 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_nativeruntime',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
+          },
+      ],
+      'condition': 'checkout_android',
+      'dep_type': 'cipd',
+  },
+
+  'src/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat': {
+      'packages': [
+          {
+              'package': 'chromium/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat',
+              'version': 'version:2@1.0.1.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3739,7 +3750,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_pluginapi',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3750,7 +3761,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3761,7 +3772,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_resources',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3772,7 +3783,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_robolectric',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3783,7 +3794,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_sandbox',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3794,7 +3805,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadowapi',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3805,7 +3816,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_framework',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3816,7 +3827,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3827,7 +3838,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_utils',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
@@ -3838,7 +3849,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_robolectric_utils_reflector',
-              'version': 'version:2@4.8.1.cr1',
+              'version': 'version:2@4.10.2.cr1',
           },
       ],
       'condition': 'checkout_android',
diff --git a/android_webview/browser/enterprise_authentication_app_link_policy_handler.cc b/android_webview/browser/enterprise_authentication_app_link_policy_handler.cc
index 9a1061d..dd5bf6b 100644
--- a/android_webview/browser/enterprise_authentication_app_link_policy_handler.cc
+++ b/android_webview/browser/enterprise_authentication_app_link_policy_handler.cc
@@ -43,7 +43,7 @@
 
   std::vector<std::string> invalid_policies;
   for (const auto& entry : value->GetList()) {
-    const std::string* url = entry.FindStringKey("url");
+    const std::string* url = entry.GetDict().FindString("url");
     if (!url) {
       invalid_policies.push_back(
           "Invalid policy: Required key 'url' does not exists");
@@ -70,7 +70,7 @@
 
   base::Value::List filtered_values;
   for (const auto& entry : value->GetList()) {
-    const std::string* url = entry.FindStringKey("url");
+    const std::string* url = entry.GetDict().FindString("url");
     if (ValidatePolicyEntry(url))
       filtered_values.Append(*url);
   }
diff --git a/android_webview/browser/metrics/aw_metrics_service_client.cc b/android_webview/browser/metrics/aw_metrics_service_client.cc
index f3ce60e4..ab1473a 100644
--- a/android_webview/browser/metrics/aw_metrics_service_client.cc
+++ b/android_webview/browser/metrics/aw_metrics_service_client.cc
@@ -176,8 +176,8 @@
 
   PrefService* local_state = pref_service();
   DCHECK(local_state);
-  local_state->Set(prefs::kMetricsAppPackageNameLoggingRule,
-                   record.value().ToDictionary());
+  local_state->SetDict(prefs::kMetricsAppPackageNameLoggingRule,
+                       record.value().ToDictionary());
   cached_package_name_record_ = record;
   package_name_record_status_ =
       AppPackageNameLoggingRuleStatus::kNewVersionLoaded;
@@ -196,7 +196,7 @@
   PrefService* local_state = pref_service();
   DCHECK(local_state);
   cached_package_name_record_ = AppPackageNameLoggingRule::FromDictionary(
-      local_state->GetValue(prefs::kMetricsAppPackageNameLoggingRule));
+      local_state->GetDict(prefs::kMetricsAppPackageNameLoggingRule));
   if (cached_package_name_record_.has_value()) {
     package_name_record_status_ =
         AppPackageNameLoggingRuleStatus::kNotLoadedUseCache;
diff --git a/android_webview/browser/metrics/aw_metrics_service_client_unittest.cc b/android_webview/browser/metrics/aw_metrics_service_client_unittest.cc
index 9b8ce34..0a309ba 100644
--- a/android_webview/browser/metrics/aw_metrics_service_client_unittest.cc
+++ b/android_webview/browser/metrics/aw_metrics_service_client_unittest.cc
@@ -123,8 +123,8 @@
   base::TimeDelta expiry_time = base::Days(1);
   AppPackageNameLoggingRule expected_record(
       base::Version(kTestAllowlistVersion), base::Time::Now() + expiry_time);
-  prefs->Set(prefs::kMetricsAppPackageNameLoggingRule,
-             expected_record.ToDictionary());
+  prefs->SetDict(prefs::kMetricsAppPackageNameLoggingRule,
+                 expected_record.ToDictionary());
 
   absl::optional<AppPackageNameLoggingRule> cached_record =
       client->GetCachedAppPackageNameLoggingRule();
@@ -278,7 +278,8 @@
   base::TimeDelta expiry_time = base::Days(1);
   AppPackageNameLoggingRule record(base::Version(kTestAllowlistVersion),
                                    base::Time::Now() + expiry_time);
-  prefs->Set(prefs::kMetricsAppPackageNameLoggingRule, record.ToDictionary());
+  prefs->SetDict(prefs::kMetricsAppPackageNameLoggingRule,
+                 record.ToDictionary());
   client->SetAppPackageNameLoggingRule(record);
 
   EXPECT_TRUE(client->ShouldRecordPackageName());
diff --git a/android_webview/common/metrics/app_package_name_logging_rule.cc b/android_webview/common/metrics/app_package_name_logging_rule.cc
index 448d72c26..c4f2c1b1 100644
--- a/android_webview/common/metrics/app_package_name_logging_rule.cc
+++ b/android_webview/common/metrics/app_package_name_logging_rule.cc
@@ -48,8 +48,8 @@
 
 // static
 absl::optional<AppPackageNameLoggingRule>
-AppPackageNameLoggingRule::FromDictionary(const base::Value& dict) {
-  const std::string* version_string = dict.FindStringKey(kVersionKey);
+AppPackageNameLoggingRule::FromDictionary(const base::Value::Dict& dict) {
+  const std::string* version_string = dict.FindString(kVersionKey);
   if (!version_string) {
     return absl::optional<AppPackageNameLoggingRule>();
   }
@@ -58,7 +58,7 @@
     return absl::optional<AppPackageNameLoggingRule>();
   }
 
-  const base::Value* expiry_date_value = dict.GetDict().Find(kExpiryDateKey);
+  const base::Value* expiry_date_value = dict.Find(kExpiryDateKey);
   if (!expiry_date_value) {
     return AppPackageNameLoggingRule(version, base::Time::Min());
   }
@@ -71,12 +71,12 @@
   return AppPackageNameLoggingRule(version, expiry_date.value());
 }
 
-base::Value AppPackageNameLoggingRule::ToDictionary() {
-  base::Value dict(base::Value::Type::DICT);
+base::Value::Dict AppPackageNameLoggingRule::ToDictionary() {
+  base::Value::Dict dict;
 
-  dict.SetStringKey(kVersionKey, version_.GetString());
+  dict.Set(kVersionKey, version_.GetString());
   if (!expiry_date_.is_min()) {
-    dict.SetKey(kExpiryDateKey, base::TimeToValue(expiry_date_));
+    dict.Set(kExpiryDateKey, base::TimeToValue(expiry_date_));
   }
   return dict;
 }
diff --git a/android_webview/common/metrics/app_package_name_logging_rule.h b/android_webview/common/metrics/app_package_name_logging_rule.h
index ed4f097..900e7fe 100644
--- a/android_webview/common/metrics/app_package_name_logging_rule.h
+++ b/android_webview/common/metrics/app_package_name_logging_rule.h
@@ -37,12 +37,12 @@
   // If it has the same version and expiry_date as `record`.
   bool IsSameAs(const AppPackageNameLoggingRule& record) const;
 
-  base::Value ToDictionary();
+  base::Value::Dict ToDictionary();
 
   // Creates a valid AppPackageNameLoggingRule from a dictionary, or null if
   // the dictionary have invalid values.
   static absl::optional<AppPackageNameLoggingRule> FromDictionary(
-      const base::Value& dict);
+      const base::Value::Dict& dict);
 
  private:
   base::Version version_;
diff --git a/android_webview/common/metrics/app_package_name_logging_rule_unittests.cc b/android_webview/common/metrics/app_package_name_logging_rule_unittests.cc
index e8d7bbe0..7886dbf 100644
--- a/android_webview/common/metrics/app_package_name_logging_rule_unittests.cc
+++ b/android_webview/common/metrics/app_package_name_logging_rule_unittests.cc
@@ -50,8 +50,7 @@
 
   {
     absl::optional<AppPackageNameLoggingRule> record =
-        AppPackageNameLoggingRule::FromDictionary(
-            base::Value(base::Value::Type::DICT));
+        AppPackageNameLoggingRule::FromDictionary(base::Value::Dict());
     EXPECT_FALSE(record.has_value());
   }
 }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java b/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java
index 1ab663aa..331f725 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java
@@ -8,13 +8,11 @@
 import org.chromium.base.PackageUtils;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Java accessor for base/feature_list.h state.
  */
 @JNINamespace("android_webview")
-@MainDex
 public final class AwFeatureList {
     // Do not instantiate this class.
     private AwFeatureList() {}
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 87576b0..75e70ad 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -291,6 +291,10 @@
     "autotest_private_api_utils.cc",
     "bluetooth_devices_observer.cc",
     "bluetooth_devices_observer.h",
+    "booting/booting_animation_controller.cc",
+    "booting/booting_animation_controller.h",
+    "booting/booting_animation_view.cc",
+    "booting/booting_animation_view.h",
     "bubble/bubble_constants.h",
     "bubble/bubble_utils.cc",
     "bubble/bubble_utils.h",
@@ -3606,6 +3610,7 @@
     "//chromeos/ash/components/login/auth",
     "//chromeos/ash/components/login/auth:test_support",
     "//chromeos/ash/components/login/login_state",
+    "//chromeos/ash/components/login/login_state:test_support",
     "//chromeos/ash/components/network:test_support",
     "//chromeos/ash/components/phonehub:test_support",
     "//chromeos/ash/components/settings",
diff --git a/ash/accelerators/accelerator_commands.cc b/ash/accelerators/accelerator_commands.cc
index b348620ba..e94da33 100644
--- a/ash/accelerators/accelerator_commands.cc
+++ b/ash/accelerators/accelerator_commands.cc
@@ -509,7 +509,8 @@
 }
 
 bool CanScreenshot(bool take_screenshot) {
-  // |TAKE_SCREENSHOT| is allowed when user session is blocked.
+  // |AcceleratorAction::kTakeScreenshot| is allowed when user session is
+  // blocked.
   return take_screenshot ||
          !Shell::Get()->session_controller()->IsUserSessionBlocked();
 }
@@ -629,9 +630,9 @@
 }
 
 void ActivateDeskAtIndex(AcceleratorAction action) {
-  DCHECK_GE(action, DESKS_ACTIVATE_0);
-  DCHECK_LE(action, DESKS_ACTIVATE_7);
-  const size_t target_index = action - DESKS_ACTIVATE_0;
+  DCHECK_GE(action, AcceleratorAction::kDesksActivate0);
+  DCHECK_LE(action, AcceleratorAction::kDesksActivate7);
+  const size_t target_index = action - AcceleratorAction::kDesksActivate0;
   auto* desks_controller = DesksController::Get();
   // Only 1 desk animation can occur at a time so ignore this action if there's
   // an ongoing desk animation.
@@ -1635,7 +1636,7 @@
   Shell* shell = Shell::Get();
   const bool in_tablet = shell->tablet_mode_controller()->InTabletMode();
   const bool in_overview = shell->overview_controller()->InOverviewSession();
-  if (action == WINDOW_CYCLE_SNAP_LEFT) {
+  if (action == AcceleratorAction::kWindowCycleSnapLeft) {
     if (in_tablet) {
       RecordWindowSnapAcceleratorAction(
           WindowSnapAcceleratorAction::kCycleLeftSnapInTablet);
@@ -1659,8 +1660,9 @@
     }
   }
   const WindowSnapWMEvent event(
-      action == WINDOW_CYCLE_SNAP_LEFT ? WM_EVENT_CYCLE_SNAP_PRIMARY
-                                       : WM_EVENT_CYCLE_SNAP_SECONDARY,
+      action == AcceleratorAction::kWindowCycleSnapLeft
+          ? WM_EVENT_CYCLE_SNAP_PRIMARY
+          : WM_EVENT_CYCLE_SNAP_SECONDARY,
       WindowSnapActionSource::kKeyboardShortcutToSnap);
   aura::Window* window = GetTargetWindow();
   DCHECK(window);
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 8870c80..1d218b2 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -52,13 +52,20 @@
 using ::chromeos::WindowStateType;
 using input_method::InputMethodManager;
 
-static_assert(DESKS_ACTIVATE_0 == DESKS_ACTIVATE_1 - 1 &&
-                  DESKS_ACTIVATE_1 == DESKS_ACTIVATE_2 - 1 &&
-                  DESKS_ACTIVATE_2 == DESKS_ACTIVATE_3 - 1 &&
-                  DESKS_ACTIVATE_3 == DESKS_ACTIVATE_4 - 1 &&
-                  DESKS_ACTIVATE_4 == DESKS_ACTIVATE_5 - 1 &&
-                  DESKS_ACTIVATE_5 == DESKS_ACTIVATE_6 - 1 &&
-                  DESKS_ACTIVATE_6 == DESKS_ACTIVATE_7 - 1,
+static_assert(AcceleratorAction::kDesksActivate0 ==
+                      AcceleratorAction::kDesksActivate1 - 1 &&
+                  AcceleratorAction::kDesksActivate1 ==
+                      AcceleratorAction::kDesksActivate2 - 1 &&
+                  AcceleratorAction::kDesksActivate2 ==
+                      AcceleratorAction::kDesksActivate3 - 1 &&
+                  AcceleratorAction::kDesksActivate3 ==
+                      AcceleratorAction::kDesksActivate4 - 1 &&
+                  AcceleratorAction::kDesksActivate4 ==
+                      AcceleratorAction::kDesksActivate5 - 1 &&
+                  AcceleratorAction::kDesksActivate5 ==
+                      AcceleratorAction::kDesksActivate6 - 1 &&
+                  AcceleratorAction::kDesksActivate6 ==
+                      AcceleratorAction::kDesksActivate7 - 1,
               "DESKS_ACTIVATE* actions must be consecutive");
 
 ui::Accelerator CreateAccelerator(ui::KeyboardCode keycode,
@@ -596,208 +603,209 @@
   // false should be returned to give the web contents a chance at handling the
   // accelerator.
   switch (action) {
-    case CYCLE_BACKWARD_MRU:
-    case CYCLE_FORWARD_MRU:
+    case AcceleratorAction::kCycleBackwardMru:
+    case AcceleratorAction::kCycleForwardMru:
       return accelerators::CanCycleMru();
-    case CYCLE_SAME_APP_WINDOWS_BACKWARD:
-    case CYCLE_SAME_APP_WINDOWS_FORWARD:
+    case AcceleratorAction::kCycleSameAppWindowsBackward:
+    case AcceleratorAction::kCycleSameAppWindowsForward:
       return accelerators::CanCycleSameAppWindows();
-    case DESKS_ACTIVATE_DESK_LEFT:
-    case DESKS_ACTIVATE_DESK_RIGHT:
-    case DESKS_MOVE_ACTIVE_ITEM_LEFT:
-    case DESKS_MOVE_ACTIVE_ITEM_RIGHT:
-    case DESKS_NEW_DESK:
-    case DESKS_REMOVE_CURRENT_DESK:
-    case DESKS_ACTIVATE_0:
-    case DESKS_ACTIVATE_1:
-    case DESKS_ACTIVATE_2:
-    case DESKS_ACTIVATE_3:
-    case DESKS_ACTIVATE_4:
-    case DESKS_ACTIVATE_5:
-    case DESKS_ACTIVATE_6:
-    case DESKS_ACTIVATE_7:
-    case DESKS_TOGGLE_ASSIGN_TO_ALL_DESKS:
+    case AcceleratorAction::kDesksActivateDeskLeft:
+    case AcceleratorAction::kDesksActivateDeskRight:
+    case AcceleratorAction::kDesksMoveActiveItemLeft:
+    case AcceleratorAction::kDesksMoveActiveItemRight:
+    case AcceleratorAction::kDesksNewDesk:
+    case AcceleratorAction::kDesksRemoveCurrentDesk:
+    case AcceleratorAction::kDesksActivate0:
+    case AcceleratorAction::kDesksActivate1:
+    case AcceleratorAction::kDesksActivate2:
+    case AcceleratorAction::kDesksActivate3:
+    case AcceleratorAction::kDesksActivate4:
+    case AcceleratorAction::kDesksActivate5:
+    case AcceleratorAction::kDesksActivate6:
+    case AcceleratorAction::kDesksActivate7:
+    case AcceleratorAction::kDesksToggleAssignToAllDesks:
       return true;
-    case DEBUG_KEYBOARD_BACKLIGHT_TOGGLE:
-    case DEBUG_MICROPHONE_MUTE_TOGGLE:
-    case DEBUG_PRINT_LAYER_HIERARCHY:
-    case DEBUG_PRINT_VIEW_HIERARCHY:
-    case DEBUG_PRINT_WINDOW_HIERARCHY:
-    case DEBUG_SHOW_TOAST:
-    case DEBUG_SYSTEM_UI_STYLE_VIEWER:
-    case DEBUG_TOGGLE_DARK_MODE:
-    case DEBUG_TOGGLE_DYNAMIC_COLOR:
-    case DEBUG_TOGGLE_GLANCEABLES:
-    case DEBUG_TOGGLE_POWER_BUTTON_MENU:
-    case DEBUG_TOGGLE_SHOW_DEBUG_BORDERS:
-    case DEBUG_TOGGLE_SHOW_FPS_COUNTER:
-    case DEBUG_TOGGLE_SHOW_PAINT_RECTS:
-    case DEBUG_TOGGLE_TOUCH_PAD:
-    case DEBUG_TOGGLE_TOUCH_SCREEN:
-    case DEBUG_TOGGLE_TABLET_MODE:
-    case DEBUG_TOGGLE_WALLPAPER_MODE:
-    case DEBUG_TRIGGER_CRASH:
-    case DEBUG_TOGGLE_HUD_DISPLAY:
+    case AcceleratorAction::kDebugKeyboardBacklightToggle:
+    case AcceleratorAction::kDebugMicrophoneMuteToggle:
+    case AcceleratorAction::kDebugPrintLayerHierarchy:
+    case AcceleratorAction::kDebugPrintViewHierarchy:
+    case AcceleratorAction::kDebugPrintWindowHierarchy:
+    case AcceleratorAction::kDebugShowToast:
+    case AcceleratorAction::kDebugSystemUiStyleViewer:
+    case AcceleratorAction::kDebugToggleDarkMode:
+    case AcceleratorAction::kDebugToggleDynamicColor:
+    case AcceleratorAction::kDebugToggleGlanceables:
+    case AcceleratorAction::kDebugTogglePowerButtonMenu:
+    case AcceleratorAction::kDebugToggleShowDebugBorders:
+    case AcceleratorAction::kDebugToggleShowFpsCounter:
+    case AcceleratorAction::kDebugToggleShowPaintRects:
+    case AcceleratorAction::kDebugToggleTouchPad:
+    case AcceleratorAction::kDebugToggleTouchScreen:
+    case AcceleratorAction::kDebugToggleTabletMode:
+    case AcceleratorAction::kDebugToggleWallpaperMode:
+    case AcceleratorAction::kDebugTriggerCrash:
+    case AcceleratorAction::kDebugToggleHudDisplay:
       return debug::DebugAcceleratorsEnabled();
-    case DEV_ADD_REMOVE_DISPLAY:
-    case DEV_TOGGLE_APP_LIST:
-    case DEV_TOGGLE_UNIFIED_DESKTOP:
+    case AcceleratorAction::kDevAddRemoveDisplay:
+    case AcceleratorAction::kDevToggleAppList:
+    case AcceleratorAction::kDevToggleUnifiedDesktop:
       return debug::DeveloperAcceleratorsEnabled();
-    case DISABLE_CAPS_LOCK:
+    case AcceleratorAction::kDisableCapsLock:
       return CanHandleDisableCapsLock(previous_accelerator);
-    case LOCK_SCREEN:
+    case AcceleratorAction::kLockScreen:
       return accelerators::CanLock();
-    case MAGNIFIER_ZOOM_IN:
-    case MAGNIFIER_ZOOM_OUT:
+    case AcceleratorAction::kMagnifierZoomIn:
+    case AcceleratorAction::kMagnifierZoomOut:
       return accelerators::CanPerformMagnifierZoom();
-    case MICROPHONE_MUTE_TOGGLE:
+    case AcceleratorAction::kMicrophoneMuteToggle:
       return true;
-    case MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS:
+    case AcceleratorAction::kMoveActiveWindowBetweenDisplays:
       return accelerators::CanMoveActiveWindowBetweenDisplays();
-    case NEW_INCOGNITO_WINDOW:
+    case AcceleratorAction::kNewIncognitoWindow:
       return accelerators::CanCreateNewIncognitoWindow();
-    case PASTE_CLIPBOARD_HISTORY_PLAIN_TEXT:
+    case AcceleratorAction::kPasteClipboardHistoryPlainText:
       return true;
-    case PRIVACY_SCREEN_TOGGLE:
+    case AcceleratorAction::kPrivacyScreenToggle:
       return accelerators::CanTogglePrivacyScreen();
-    case ROTATE_SCREEN:
+    case AcceleratorAction::kRotateScreen:
       return true;
-    case SCALE_UI_DOWN:
-    case SCALE_UI_RESET:
-    case SCALE_UI_UP:
+    case AcceleratorAction::kScaleUiDown:
+    case AcceleratorAction::kScaleUiReset:
+    case AcceleratorAction::kScaleUiUp:
       return true;
-    case SHOW_STYLUS_TOOLS:
+    case AcceleratorAction::kShowStylusTools:
       return accelerators::CanShowStylusTools();
-    case START_ASSISTANT:
+    case AcceleratorAction::kStartAssistant:
       return true;
-    case SWAP_PRIMARY_DISPLAY:
+    case AcceleratorAction::kSwapPrimaryDisplay:
       return accelerators::CanSwapPrimaryDisplay();
-    case SWITCH_IME:
+    case AcceleratorAction::kSwitchIme:
       return CanHandleSwitchIme(accelerator);
-    case SWITCH_TO_NEXT_IME:
+    case AcceleratorAction::kSwitchToNextIme:
       return accelerators::CanCycleInputMethod();
-    case SWITCH_TO_LAST_USED_IME:
+    case AcceleratorAction::kSwitchToLastUsedIme:
       return accelerators::CanCycleInputMethod();
-    case SWITCH_TO_PREVIOUS_USER:
-    case SWITCH_TO_NEXT_USER:
+    case AcceleratorAction::kSwitchToPreviousUser:
+    case AcceleratorAction::kSwitchToNextUser:
       return accelerators::CanCycleUser();
-    case TOGGLE_APP_LIST:
+    case AcceleratorAction::kToggleAppList:
       return CanHandleToggleAppList(
           accelerator, previous_accelerator,
           accelerator_history_->currently_pressed_keys());
-    case TOGGLE_CALENDAR:
+    case AcceleratorAction::kToggleCalendar:
       return true;
-    case TOGGLE_CAPS_LOCK:
+    case AcceleratorAction::kToggleCapsLock:
       return CanHandleToggleCapsLock(
           accelerator, previous_accelerator,
           accelerator_history_->currently_pressed_keys());
-    case TOGGLE_CLIPBOARD_HISTORY:
+    case AcceleratorAction::kToggleClipboardHistory:
       return true;
-    case TOGGLE_DICTATION:
+    case AcceleratorAction::kToggleDictation:
       return accelerators::CanToggleDictation();
-    case TOGGLE_DOCKED_MAGNIFIER:
+    case AcceleratorAction::kToggleDockedMagnifier:
       return true;
-    case TOGGLE_FLOATING:
+    case AcceleratorAction::kToggleFloating:
       return accelerators::CanToggleFloatingWindow();
-    case TOGGLE_FULLSCREEN_MAGNIFIER:
+    case AcceleratorAction::kToggleFullscreenMagnifier:
       return true;
-    case TOGGLE_GAME_DASHBOARD:
+    case AcceleratorAction::kToggleGameDashboard:
       return accelerators::CanToggleGameDashboard();
-    case TOGGLE_MESSAGE_CENTER_BUBBLE:
+    case AcceleratorAction::kToggleMessageCenterBubble:
       return true;
-    case TOGGLE_MIRROR_MODE:
+    case AcceleratorAction::kToggleMirrorMode:
       return true;
-    case TOGGLE_OVERVIEW:
+    case AcceleratorAction::kToggleOverview:
       return accelerators::CanToggleOverview();
-    case TOGGLE_SNAP_GROUP_WINDOWS_MINIMIZE_AND_RESTORE:
+    case AcceleratorAction::kToggleSnapGroupWindowsMinimizeAndRestore:
       return accelerators::CanMinimizeSnapGroupWindows();
-    case TOGGLE_MULTITASK_MENU:
+    case AcceleratorAction::kToggleMultitaskMenu:
       return accelerators::CanToggleMultitaskMenu();
-    case TOUCH_HUD_CLEAR:
-    case TOUCH_HUD_MODE_CHANGE:
+    case AcceleratorAction::kTouchHudClear:
+    case AcceleratorAction::kTouchHudModeChange:
       return accelerators::CanActivateTouchHud();
-    case UNPIN:
+    case AcceleratorAction::kUnpin:
       return accelerators::CanUnpinWindow();
-    case WINDOW_CYCLE_SNAP_LEFT:
-    case WINDOW_CYCLE_SNAP_RIGHT:
+    case AcceleratorAction::kWindowCycleSnapLeft:
+    case AcceleratorAction::kWindowCycleSnapRight:
       return accelerators::CanWindowSnap();
-    case FOCUS_PIP:
+    case AcceleratorAction::kFocusPip:
       return accelerators::CanFindPipWidget();
-    case FOCUS_CAMERA_PREVIEW:
+    case AcceleratorAction::kFocusCameraPreview:
       return accelerators::CanFocusCameraPreview();
-    case MINIMIZE_TOP_WINDOW_ON_BACK:
+    case AcceleratorAction::kMinimizeTopWindowOnBack:
       return accelerators::CanMinimizeTopWindowOnBack();
-    case TAKE_PARTIAL_SCREENSHOT:
-    case TAKE_SCREENSHOT:
-    case TAKE_WINDOW_SCREENSHOT:
-      return accelerators::CanScreenshot(action == TAKE_SCREENSHOT);
-    case TOGGLE_PROJECTOR_MARKER:
+    case AcceleratorAction::kTakePartialScreenshot:
+    case AcceleratorAction::kTakeScreenshot:
+    case AcceleratorAction::kTakeWindowScreenshot:
+      return accelerators::CanScreenshot(action ==
+                                         AcceleratorAction::kTakeScreenshot);
+    case AcceleratorAction::kToggleProjectorMarker:
       return accelerators::CanToggleProjectorMarker();
-    case TOGGLE_RESIZE_LOCK_MENU:
+    case AcceleratorAction::kToggleResizeLockMenu:
       return accelerators::CanToggleResizeLockMenu();
-    case DEBUG_TUCK_FLOATED_WINDOW_LEFT:
-    case DEBUG_TUCK_FLOATED_WINDOW_RIGHT:
+    case AcceleratorAction::kDebugTuckFloatedWindowLeft:
+    case AcceleratorAction::kDebugTuckFloatedWindowRight:
       return debug::CanTuckFloatedWindow();
-    case DEBUG_TOGGLE_VIDEO_CONFERENCE_CAMERA_TRAY_ICON:
+    case AcceleratorAction::kDebugToggleVideoConferenceCameraTrayIcon:
       return true;
 
     // The following are always enabled.
-    case BRIGHTNESS_DOWN:
-    case BRIGHTNESS_UP:
-    case EXIT:
-    case FOCUS_NEXT_PANE:
-    case FOCUS_PREVIOUS_PANE:
-    case FOCUS_SHELF:
-    case KEYBOARD_BACKLIGHT_TOGGLE:
-    case KEYBOARD_BRIGHTNESS_DOWN:
-    case KEYBOARD_BRIGHTNESS_UP:
-    case LAUNCH_APP_0:
-    case LAUNCH_APP_1:
-    case LAUNCH_APP_2:
-    case LAUNCH_APP_3:
-    case LAUNCH_APP_4:
-    case LAUNCH_APP_5:
-    case LAUNCH_APP_6:
-    case LAUNCH_APP_7:
-    case LAUNCH_LAST_APP:
-    case LOCK_PRESSED:
-    case LOCK_RELEASED:
-    case MEDIA_FAST_FORWARD:
-    case MEDIA_NEXT_TRACK:
-    case MEDIA_PAUSE:
-    case MEDIA_PLAY:
-    case MEDIA_PLAY_PAUSE:
-    case MEDIA_PREV_TRACK:
-    case MEDIA_REWIND:
-    case MEDIA_STOP:
-    case NEW_TAB:
-    case NEW_WINDOW:
-    case OPEN_CALCULATOR:
-    case OPEN_CROSH:
-    case OPEN_DIAGNOSTICS:
-    case OPEN_FEEDBACK_PAGE:
-    case OPEN_FILE_MANAGER:
-    case OPEN_GET_HELP:
-    case POWER_PRESSED:
-    case POWER_RELEASED:
-    case PRINT_UI_HIERARCHIES:
-    case RESTORE_TAB:
-    case ROTATE_WINDOW:
-    case SHOW_EMOJI_PICKER:
-    case TOGGLE_IME_MENU_BUBBLE:
-    case SHOW_SHORTCUT_VIEWER:
-    case SHOW_TASK_MANAGER:
-    case SUSPEND:
-    case TOGGLE_FULLSCREEN:
-    case TOGGLE_HIGH_CONTRAST:
-    case TOGGLE_MAXIMIZED:
-    case TOGGLE_SPOKEN_FEEDBACK:
-    case TOGGLE_SYSTEM_TRAY_BUBBLE:
-    case TOGGLE_WIFI:
-    case VOLUME_DOWN:
-    case VOLUME_MUTE:
-    case VOLUME_UP:
-    case WINDOW_MINIMIZE:
+    case AcceleratorAction::kBrightnessDown:
+    case AcceleratorAction::kBrightnessUp:
+    case AcceleratorAction::kExit:
+    case AcceleratorAction::kFocusNextPane:
+    case AcceleratorAction::kFocusPreviousPane:
+    case AcceleratorAction::kFocusShelf:
+    case AcceleratorAction::kKeyboardBacklightToggle:
+    case AcceleratorAction::kKeyboardBrightnessDown:
+    case AcceleratorAction::kKeyboardBrightnessUp:
+    case AcceleratorAction::kLaunchApp0:
+    case AcceleratorAction::kLaunchApp1:
+    case AcceleratorAction::kLaunchApp2:
+    case AcceleratorAction::kLaunchApp3:
+    case AcceleratorAction::kLaunchApp4:
+    case AcceleratorAction::kLaunchApp5:
+    case AcceleratorAction::kLaunchApp6:
+    case AcceleratorAction::kLaunchApp7:
+    case AcceleratorAction::kLaunchLastApp:
+    case AcceleratorAction::kLockPressed:
+    case AcceleratorAction::kLockReleased:
+    case AcceleratorAction::kMediaFastForward:
+    case AcceleratorAction::kMediaNextTrack:
+    case AcceleratorAction::kMediaPause:
+    case AcceleratorAction::kMediaPlay:
+    case AcceleratorAction::kMediaPlayPause:
+    case AcceleratorAction::kMediaPrevTrack:
+    case AcceleratorAction::kMediaRewind:
+    case AcceleratorAction::kMediaStop:
+    case AcceleratorAction::kNewTab:
+    case AcceleratorAction::kNewWindow:
+    case AcceleratorAction::kOpenCalculator:
+    case AcceleratorAction::kOpenCrosh:
+    case AcceleratorAction::kOpenDiagnostics:
+    case AcceleratorAction::kOpenFeedbackPage:
+    case AcceleratorAction::kOpenFileManager:
+    case AcceleratorAction::kOpenGetHelp:
+    case AcceleratorAction::kPowerPressed:
+    case AcceleratorAction::kPowerReleased:
+    case AcceleratorAction::kPrintUiHierarchies:
+    case AcceleratorAction::kRestoreTab:
+    case AcceleratorAction::kRotateWindow:
+    case AcceleratorAction::kShowEmojiPicker:
+    case AcceleratorAction::kToggleImeMenuBubble:
+    case AcceleratorAction::kShowShortcutViewer:
+    case AcceleratorAction::kShowTaskManager:
+    case AcceleratorAction::kSuspend:
+    case AcceleratorAction::kToggleFullscreen:
+    case AcceleratorAction::kToggleHighContrast:
+    case AcceleratorAction::kToggleMaximized:
+    case AcceleratorAction::kToggleSpokenFeedback:
+    case AcceleratorAction::kToggleSystemTrayBubble:
+    case AcceleratorAction::kToggleWifi:
+    case AcceleratorAction::kVolumeDown:
+    case AcceleratorAction::kVolumeMute:
+    case AcceleratorAction::kVolumeUp:
+    case AcceleratorAction::kWindowMinimize:
       return true;
   }
 }
@@ -810,535 +818,538 @@
   if (restriction != RESTRICTION_NONE)
     return;
 
-  if ((action == VOLUME_DOWN || action == VOLUME_UP) &&
+  if ((action == AcceleratorAction::kVolumeDown ||
+       action == AcceleratorAction::kVolumeUp) &&
       Shell::Get()->tablet_mode_controller()->InTabletMode()) {
     if (tablet_volume_controller_.ShouldSwapSideVolumeButtons(
             accelerator.source_device_id()))
-      action = action == VOLUME_DOWN ? VOLUME_UP : VOLUME_DOWN;
+      action = action == AcceleratorAction::kVolumeDown
+                   ? AcceleratorAction::kVolumeUp
+                   : AcceleratorAction::kVolumeDown;
 
-    tablet_volume_controller_.StartTabletModeVolumeAdjustTimer(action ==
-                                                               VOLUME_UP);
+    tablet_volume_controller_.StartTabletModeVolumeAdjustTimer(
+        action == AcceleratorAction::kVolumeUp);
   }
 
   // If your accelerator invokes more than one line of code, please either
   // implement it in your module's controller code or pull it into a HandleFoo()
   // function above.
   switch (action) {
-    case BRIGHTNESS_DOWN: {
+    case AcceleratorAction::kBrightnessDown: {
       base::RecordAction(UserMetricsAction("Accel_BrightnessDown_F6"));
       accelerators::BrightnessDown();
       break;
     }
-    case BRIGHTNESS_UP: {
+    case AcceleratorAction::kBrightnessUp: {
       base::RecordAction(UserMetricsAction("Accel_BrightnessUp_F7"));
       accelerators::BrightnessUp();
       break;
     }
-    case CYCLE_BACKWARD_MRU:
+    case AcceleratorAction::kCycleBackwardMru:
       RecordCycleBackwardMru(accelerator);
       accelerators::CycleBackwardMru(/*same_app_only=*/false);
       break;
-    case CYCLE_FORWARD_MRU:
+    case AcceleratorAction::kCycleForwardMru:
       RecordCycleForwardMru(accelerator);
       accelerators::CycleForwardMru(/*same_app_only=*/false);
       break;
-    case CYCLE_SAME_APP_WINDOWS_BACKWARD:
+    case AcceleratorAction::kCycleSameAppWindowsBackward:
       // TODO(b/250699271): Add metrics
       accelerators::CycleBackwardMru(/*same_app_only=*/true);
       break;
-    case CYCLE_SAME_APP_WINDOWS_FORWARD:
+    case AcceleratorAction::kCycleSameAppWindowsForward:
       // TODO(b/250699271): Add metrics
       accelerators::CycleForwardMru(/*same_app_only=*/true);
       break;
-    case DESKS_ACTIVATE_DESK_LEFT:
+    case AcceleratorAction::kDesksActivateDeskLeft:
       // UMA metrics are recorded in the function.
       accelerators::ActivateDesk(/*activate_left=*/true);
       break;
-    case DESKS_ACTIVATE_DESK_RIGHT:
+    case AcceleratorAction::kDesksActivateDeskRight:
       // UMA metrics are recorded in the function.
       accelerators::ActivateDesk(/*activate_left=*/false);
       break;
-    case DESKS_MOVE_ACTIVE_ITEM_LEFT:
+    case AcceleratorAction::kDesksMoveActiveItemLeft:
       // UMA metrics are recorded in the function.
       accelerators::MoveActiveItem(/*going_left=*/true);
       break;
-    case DESKS_MOVE_ACTIVE_ITEM_RIGHT:
+    case AcceleratorAction::kDesksMoveActiveItemRight:
       // UMA metrics are recorded in the function.
       accelerators::MoveActiveItem(/*going_left=*/false);
       break;
-    case DESKS_NEW_DESK:
+    case AcceleratorAction::kDesksNewDesk:
       // UMA metrics are recorded in the function.
       accelerators::NewDesk();
       break;
-    case DESKS_REMOVE_CURRENT_DESK:
+    case AcceleratorAction::kDesksRemoveCurrentDesk:
       // UMA metrics are recorded in the function.
       accelerators::RemoveCurrentDesk();
       break;
-    case DESKS_ACTIVATE_0:
-    case DESKS_ACTIVATE_1:
-    case DESKS_ACTIVATE_2:
-    case DESKS_ACTIVATE_3:
-    case DESKS_ACTIVATE_4:
-    case DESKS_ACTIVATE_5:
-    case DESKS_ACTIVATE_6:
-    case DESKS_ACTIVATE_7:
+    case AcceleratorAction::kDesksActivate0:
+    case AcceleratorAction::kDesksActivate1:
+    case AcceleratorAction::kDesksActivate2:
+    case AcceleratorAction::kDesksActivate3:
+    case AcceleratorAction::kDesksActivate4:
+    case AcceleratorAction::kDesksActivate5:
+    case AcceleratorAction::kDesksActivate6:
+    case AcceleratorAction::kDesksActivate7:
       accelerators::ActivateDeskAtIndex(action);
       break;
-    case DESKS_TOGGLE_ASSIGN_TO_ALL_DESKS:
+    case AcceleratorAction::kDesksToggleAssignToAllDesks:
       accelerators::ToggleAssignToAllDesk();
       break;
-    case DEBUG_KEYBOARD_BACKLIGHT_TOGGLE:
-    case DEBUG_MICROPHONE_MUTE_TOGGLE:
-    case DEBUG_PRINT_LAYER_HIERARCHY:
-    case DEBUG_PRINT_VIEW_HIERARCHY:
-    case DEBUG_PRINT_WINDOW_HIERARCHY:
-    case DEBUG_SHOW_TOAST:
-    case DEBUG_TOGGLE_DARK_MODE:
-    case DEBUG_TOGGLE_DYNAMIC_COLOR:
-    case DEBUG_TOGGLE_GLANCEABLES:
-    case DEBUG_TOGGLE_POWER_BUTTON_MENU:
-    case DEBUG_TOGGLE_VIDEO_CONFERENCE_CAMERA_TRAY_ICON:
-    case DEBUG_SYSTEM_UI_STYLE_VIEWER:
+    case AcceleratorAction::kDebugKeyboardBacklightToggle:
+    case AcceleratorAction::kDebugMicrophoneMuteToggle:
+    case AcceleratorAction::kDebugPrintLayerHierarchy:
+    case AcceleratorAction::kDebugPrintViewHierarchy:
+    case AcceleratorAction::kDebugPrintWindowHierarchy:
+    case AcceleratorAction::kDebugShowToast:
+    case AcceleratorAction::kDebugToggleDarkMode:
+    case AcceleratorAction::kDebugToggleDynamicColor:
+    case AcceleratorAction::kDebugToggleGlanceables:
+    case AcceleratorAction::kDebugTogglePowerButtonMenu:
+    case AcceleratorAction::kDebugToggleVideoConferenceCameraTrayIcon:
+    case AcceleratorAction::kDebugSystemUiStyleViewer:
       debug::PerformDebugActionIfEnabled(action);
       break;
-    case DEBUG_TOGGLE_SHOW_DEBUG_BORDERS:
+    case AcceleratorAction::kDebugToggleShowDebugBorders:
       debug::ToggleShowDebugBorders();
       break;
-    case DEBUG_TOGGLE_SHOW_FPS_COUNTER:
+    case AcceleratorAction::kDebugToggleShowFpsCounter:
       debug::ToggleShowFpsCounter();
       break;
-    case DEBUG_TOGGLE_SHOW_PAINT_RECTS:
+    case AcceleratorAction::kDebugToggleShowPaintRects:
       debug::ToggleShowPaintRects();
       break;
-    case DEBUG_TOGGLE_TOUCH_PAD:
-    case DEBUG_TOGGLE_TOUCH_SCREEN:
-    case DEBUG_TOGGLE_TABLET_MODE:
-    case DEBUG_TOGGLE_WALLPAPER_MODE:
-    case DEBUG_TRIGGER_CRASH:
-    case DEBUG_TOGGLE_HUD_DISPLAY:
+    case AcceleratorAction::kDebugToggleTouchPad:
+    case AcceleratorAction::kDebugToggleTouchScreen:
+    case AcceleratorAction::kDebugToggleTabletMode:
+    case AcceleratorAction::kDebugToggleWallpaperMode:
+    case AcceleratorAction::kDebugTriggerCrash:
+    case AcceleratorAction::kDebugToggleHudDisplay:
       debug::PerformDebugActionIfEnabled(action);
       break;
-    case DEV_ADD_REMOVE_DISPLAY:
+    case AcceleratorAction::kDevAddRemoveDisplay:
       Shell::Get()->display_manager()->AddRemoveDisplay();
       break;
-    case DEV_TOGGLE_APP_LIST:
+    case AcceleratorAction::kDevToggleAppList:
       RecordToggleAppList(accelerator);
       accelerators::ToggleAppList(AppListShowSource::kSearchKey,
                                   base::TimeTicks());
       break;
-    case DEV_TOGGLE_UNIFIED_DESKTOP:
+    case AcceleratorAction::kDevToggleUnifiedDesktop:
       accelerators::ToggleUnifiedDesktop();
       break;
-    case DISABLE_CAPS_LOCK:
+    case AcceleratorAction::kDisableCapsLock:
       base::RecordAction(base::UserMetricsAction("Accel_Disable_Caps_Lock"));
       accelerators::DisableCapsLock();
       break;
-    case EXIT:
+    case AcceleratorAction::kExit:
       // UMA metrics are recorded in the handler.
       exit_warning_handler_.HandleAccelerator();
       break;
-    case FOCUS_NEXT_PANE:
+    case AcceleratorAction::kFocusNextPane:
       base::RecordAction(UserMetricsAction("Accel_Focus_Next_Pane"));
       accelerators::RotatePaneFocus(FocusCycler::FORWARD);
       break;
-    case FOCUS_PREVIOUS_PANE:
+    case AcceleratorAction::kFocusPreviousPane:
       base::RecordAction(UserMetricsAction("Accel_Focus_Previous_Pane"));
       accelerators::RotatePaneFocus(FocusCycler::BACKWARD);
       break;
-    case FOCUS_SHELF:
+    case AcceleratorAction::kFocusShelf:
       base::RecordAction(UserMetricsAction("Accel_Focus_Shelf"));
       accelerators::FocusShelf();
       break;
-    case FOCUS_CAMERA_PREVIEW:
+    case AcceleratorAction::kFocusCameraPreview:
       accelerators::FocusCameraPreview();
       break;
-    case FOCUS_PIP:
+    case AcceleratorAction::kFocusPip:
       base::RecordAction(base::UserMetricsAction("Accel_Focus_Pip"));
       accelerators::FocusPip();
       break;
-    case KEYBOARD_BACKLIGHT_TOGGLE:
+    case AcceleratorAction::kKeyboardBacklightToggle:
       if (ash::features::IsKeyboardBacklightToggleEnabled()) {
         base::RecordAction(base::UserMetricsAction("Accel_Keyboard_Backlight"));
         accelerators::ToggleKeyboardBacklight();
       }
       break;
-    case KEYBOARD_BRIGHTNESS_DOWN: {
+    case AcceleratorAction::kKeyboardBrightnessDown: {
       base::RecordAction(UserMetricsAction("Accel_KeyboardBrightnessDown_F6"));
       accelerators::KeyboardBrightnessDown();
       break;
     }
-    case KEYBOARD_BRIGHTNESS_UP: {
+    case AcceleratorAction::kKeyboardBrightnessUp: {
       base::RecordAction(UserMetricsAction("Accel_KeyboardBrightnessUp_F7"));
       accelerators::KeyboardBrightnessUp();
       break;
     }
-    case LAUNCH_APP_0:
+    case AcceleratorAction::kLaunchApp0:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(0);
       break;
-    case LAUNCH_APP_1:
+    case AcceleratorAction::kLaunchApp1:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(1);
       break;
-    case LAUNCH_APP_2:
+    case AcceleratorAction::kLaunchApp2:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(2);
       break;
-    case LAUNCH_APP_3:
+    case AcceleratorAction::kLaunchApp3:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(3);
       break;
-    case LAUNCH_APP_4:
+    case AcceleratorAction::kLaunchApp4:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(4);
       break;
-    case LAUNCH_APP_5:
+    case AcceleratorAction::kLaunchApp5:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(5);
       break;
-    case LAUNCH_APP_6:
+    case AcceleratorAction::kLaunchApp6:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(6);
       break;
-    case LAUNCH_APP_7:
+    case AcceleratorAction::kLaunchApp7:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_App"));
       accelerators::LaunchAppN(7);
       break;
-    case LAUNCH_LAST_APP:
+    case AcceleratorAction::kLaunchLastApp:
       base::RecordAction(base::UserMetricsAction("Accel_Launch_Last_App"));
       accelerators::LaunchLastApp();
       break;
-    case LOCK_PRESSED:
-    case LOCK_RELEASED:
-      accelerators::LockPressed(action == LOCK_PRESSED);
+    case AcceleratorAction::kLockPressed:
+    case AcceleratorAction::kLockReleased:
+      accelerators::LockPressed(action == AcceleratorAction::kLockPressed);
       break;
-    case LOCK_SCREEN:
+    case AcceleratorAction::kLockScreen:
       base::RecordAction(base::UserMetricsAction("Accel_LockScreen_L"));
       accelerators::LockScreen();
       break;
-    case MAGNIFIER_ZOOM_IN:
+    case AcceleratorAction::kMagnifierZoomIn:
       accelerators::ActiveMagnifierZoom(1);
       break;
-    case MAGNIFIER_ZOOM_OUT:
+    case AcceleratorAction::kMagnifierZoomOut:
       accelerators::ActiveMagnifierZoom(-1);
       break;
-    case MEDIA_FAST_FORWARD:
+    case AcceleratorAction::kMediaFastForward:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Fast_Forward"));
       accelerators::MediaFastForward();
       break;
-    case MEDIA_NEXT_TRACK:
+    case AcceleratorAction::kMediaNextTrack:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Next_Track"));
       accelerators::MediaNextTrack();
       break;
-    case MEDIA_PAUSE:
+    case AcceleratorAction::kMediaPause:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Pause"));
       accelerators::MediaPause();
       break;
-    case MEDIA_PLAY:
+    case AcceleratorAction::kMediaPlay:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Play"));
       accelerators::MediaPlay();
       break;
-    case MEDIA_PLAY_PAUSE:
+    case AcceleratorAction::kMediaPlayPause:
       base::RecordAction(base::UserMetricsAction("Accel_Media_PlayPause"));
       accelerators::MediaPlayPause();
       break;
-    case MEDIA_PREV_TRACK:
+    case AcceleratorAction::kMediaPrevTrack:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Prev_Track"));
       accelerators::MediaPrevTrack();
       break;
-    case MEDIA_REWIND:
+    case AcceleratorAction::kMediaRewind:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Rewind"));
       accelerators::MediaRewind();
       break;
-    case MEDIA_STOP:
+    case AcceleratorAction::kMediaStop:
       base::RecordAction(base::UserMetricsAction("Accel_Media_Stop"));
       accelerators::MediaStop();
       break;
-    case MICROPHONE_MUTE_TOGGLE:
+    case AcceleratorAction::kMicrophoneMuteToggle:
       base::RecordAction(base::UserMetricsAction("Accel_Microphone_Mute"));
       accelerators::MicrophoneMuteToggle();
       break;
-    case MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS:
+    case AcceleratorAction::kMoveActiveWindowBetweenDisplays:
       accelerators::MoveActiveWindowBetweenDisplays();
       break;
-    case NEW_INCOGNITO_WINDOW:
+    case AcceleratorAction::kNewIncognitoWindow:
       base::RecordAction(base::UserMetricsAction("Accel_New_Incognito_Window"));
       accelerators::NewIncognitoWindow();
       break;
-    case NEW_TAB:
+    case AcceleratorAction::kNewTab:
       RecordNewTab(accelerator);
       accelerators::NewTab();
       break;
-    case NEW_WINDOW:
+    case AcceleratorAction::kNewWindow:
       base::RecordAction(base::UserMetricsAction("Accel_New_Window"));
       accelerators::NewWindow();
       break;
-    case OPEN_CALCULATOR:
+    case AcceleratorAction::kOpenCalculator:
       base::RecordAction(base::UserMetricsAction("Accel_Open_Calculator"));
       accelerators::OpenCalculator();
       break;
-    case OPEN_CROSH:
+    case AcceleratorAction::kOpenCrosh:
       base::RecordAction(base::UserMetricsAction("Accel_Open_Crosh"));
       accelerators::OpenCrosh();
       break;
-    case OPEN_DIAGNOSTICS:
+    case AcceleratorAction::kOpenDiagnostics:
       base::RecordAction(base::UserMetricsAction("Accel_Open_Diagnostics"));
       accelerators::OpenDiagnostics();
       break;
-    case OPEN_FEEDBACK_PAGE:
+    case AcceleratorAction::kOpenFeedbackPage:
       base::RecordAction(base::UserMetricsAction("Accel_Open_Feedback_Page"));
       accelerators::OpenFeedbackPage();
       break;
-    case OPEN_FILE_MANAGER:
+    case AcceleratorAction::kOpenFileManager:
       base::RecordAction(base::UserMetricsAction("Accel_Open_File_Manager"));
       accelerators::OpenFileManager();
       break;
-    case OPEN_GET_HELP:
+    case AcceleratorAction::kOpenGetHelp:
       accelerators::OpenHelp();
       break;
-    case PASTE_CLIPBOARD_HISTORY_PLAIN_TEXT:
+    case AcceleratorAction::kPasteClipboardHistoryPlainText:
       accelerators::ToggleClipboardHistory(/*is_plain_text_paste=*/true);
       break;
-    case POWER_PRESSED:
-    case POWER_RELEASED:
+    case AcceleratorAction::kPowerPressed:
+    case AcceleratorAction::kPowerReleased:
       if (!base::SysInfo::IsRunningOnChromeOS()) {
         // There is no powerd, the Chrome OS power manager, in linux desktop,
         // so call the PowerButtonController here.
-        accelerators::PowerPressed(action == POWER_PRESSED);
+        accelerators::PowerPressed(action == AcceleratorAction::kPowerPressed);
       }
       // We don't do anything with these at present on the device,
       // (power button events are reported to us from powerm via
       // D-BUS), but we consume them to prevent them from getting
       // passed to apps -- see http://crbug.com/146609.
       break;
-    case PRINT_UI_HIERARCHIES:
+    case AcceleratorAction::kPrintUiHierarchies:
       debug::PrintUIHierarchies();
       break;
-    case PRIVACY_SCREEN_TOGGLE:
+    case AcceleratorAction::kPrivacyScreenToggle:
       base::RecordAction(UserMetricsAction("Accel_Toggle_Privacy_Screen"));
       accelerators::TogglePrivacyScreen();
       break;
-    case ROTATE_SCREEN:
+    case AcceleratorAction::kRotateScreen:
       accelerators::RotateScreen();
       break;
-    case RESTORE_TAB:
+    case AcceleratorAction::kRestoreTab:
       base::RecordAction(base::UserMetricsAction("Accel_Restore_Tab"));
       accelerators::RestoreTab();
       break;
-    case ROTATE_WINDOW:
+    case AcceleratorAction::kRotateWindow:
       base::RecordAction(UserMetricsAction("Accel_Rotate_Active_Window"));
       accelerators::RotateActiveWindow();
       break;
-    case SCALE_UI_DOWN:
+    case AcceleratorAction::kScaleUiDown:
       accelerators::ZoomDisplay(false /* down */);
       break;
-    case SCALE_UI_RESET:
+    case AcceleratorAction::kScaleUiReset:
       accelerators::ResetDisplayZoom();
       break;
-    case SCALE_UI_UP:
+    case AcceleratorAction::kScaleUiUp:
       accelerators::ZoomDisplay(true /* up */);
       break;
-    case SHOW_EMOJI_PICKER:
+    case AcceleratorAction::kShowEmojiPicker:
       base::RecordAction(UserMetricsAction("Accel_Show_Emoji_Picker"));
       accelerators::ShowEmojiPicker();
       break;
-    case TOGGLE_IME_MENU_BUBBLE:
+    case AcceleratorAction::kToggleImeMenuBubble:
       base::RecordAction(UserMetricsAction("Accel_Show_Ime_Menu_Bubble"));
       accelerators::ToggleImeMenuBubble();
       break;
-    case TOGGLE_PROJECTOR_MARKER:
+    case AcceleratorAction::kToggleProjectorMarker:
       accelerators::ToggleProjectorMarker();
       break;
-    case SHOW_SHORTCUT_VIEWER:
+    case AcceleratorAction::kShowShortcutViewer:
       if (features::ShouldOnlyShowNewShortcutApp()) {
         accelerators::ShowShortcutCustomizationApp();
       } else {
         accelerators::ShowKeyboardShortcutViewer();
       }
       break;
-    case SHOW_STYLUS_TOOLS:
+    case AcceleratorAction::kShowStylusTools:
       base::RecordAction(UserMetricsAction("Accel_Show_Stylus_Tools"));
       accelerators::ShowStylusTools();
       break;
-    case SHOW_TASK_MANAGER:
+    case AcceleratorAction::kShowTaskManager:
       base::RecordAction(UserMetricsAction("Accel_Show_Task_Manager"));
       accelerators::ShowTaskManager();
       break;
-    case START_ASSISTANT:
+    case AcceleratorAction::kStartAssistant:
       // TODO(longbowei): Move this to CanToggleAssistant().
       if (ShouldToggleAssistant(accelerator)) {
         RecordToggleAssistant(accelerator);
         accelerators::ToggleAssistant();
       }
       break;
-    case SUSPEND:
+    case AcceleratorAction::kSuspend:
       base::RecordAction(UserMetricsAction("Accel_Suspend"));
       accelerators::Suspend();
       break;
-    case SWAP_PRIMARY_DISPLAY:
+    case AcceleratorAction::kSwapPrimaryDisplay:
       base::RecordAction(UserMetricsAction("Accel_Swap_Primary_Display"));
       accelerators::ShiftPrimaryDisplay();
       break;
-    case SWITCH_IME:
+    case AcceleratorAction::kSwitchIme:
       HandleSwitchIme(accelerator);
       break;
-    case SWITCH_TO_LAST_USED_IME:
+    case AcceleratorAction::kSwitchToLastUsedIme:
       HandleSwitchToLastUsedIme(accelerator);
       break;
-    case SWITCH_TO_NEXT_IME:
+    case AcceleratorAction::kSwitchToNextIme:
       RecordSwitchToNextIme(accelerator);
       accelerators::SwitchToNextIme();
       break;
-    case SWITCH_TO_NEXT_USER:
+    case AcceleratorAction::kSwitchToNextUser:
       MultiProfileUMA::RecordSwitchActiveUser(
           MultiProfileUMA::SWITCH_ACTIVE_USER_BY_ACCELERATOR);
       base::RecordAction(UserMetricsAction("Accel_Switch_To_Next_User"));
       accelerators::CycleUser(CycleUserDirection::NEXT);
       break;
-    case SWITCH_TO_PREVIOUS_USER:
+    case AcceleratorAction::kSwitchToPreviousUser:
       MultiProfileUMA::RecordSwitchActiveUser(
           MultiProfileUMA::SWITCH_ACTIVE_USER_BY_ACCELERATOR);
       base::RecordAction(UserMetricsAction("Accel_Switch_To_Previous_User"));
       accelerators::CycleUser(CycleUserDirection::PREVIOUS);
       break;
-    case TAKE_PARTIAL_SCREENSHOT:
+    case AcceleratorAction::kTakePartialScreenshot:
       // UMA metrics are recorded in the function.
       accelerators::MaybeTakePartialScreenshot();
       break;
-    case TAKE_SCREENSHOT:
+    case AcceleratorAction::kTakeScreenshot:
       base::RecordAction(UserMetricsAction("Accel_Take_Screenshot"));
       accelerators::TakeScreenshot(accelerator.key_code() == ui::VKEY_SNAPSHOT);
       break;
-    case TAKE_WINDOW_SCREENSHOT:
+    case AcceleratorAction::kTakeWindowScreenshot:
       // UMA metrics are recorded in the function.
       accelerators::MaybeTakeWindowScreenshot();
       break;
-    case TOGGLE_APP_LIST: {
+    case AcceleratorAction::kToggleAppList: {
       RecordToggleAppList(accelerator);
       accelerators::ToggleAppList(AppListShowSource::kSearchKey,
                                   base::TimeTicks());
       break;
     }
-    case TOGGLE_CALENDAR:
+    case AcceleratorAction::kToggleCalendar:
       accelerators::ToggleCalendar();
       break;
-    case TOGGLE_CAPS_LOCK:
+    case AcceleratorAction::kToggleCapsLock:
       base::RecordAction(UserMetricsAction("Accel_Toggle_Caps_Lock"));
       accelerators::ToggleCapsLock();
       break;
-    case TOGGLE_CLIPBOARD_HISTORY:
+    case AcceleratorAction::kToggleClipboardHistory:
       accelerators::ToggleClipboardHistory(/*is_plain_text_paste=*/false);
       break;
-    case TOGGLE_DICTATION:
+    case AcceleratorAction::kToggleDictation:
       base::RecordAction(UserMetricsAction("Accel_Toggle_Dictation"));
       accelerators::ToggleDictation();
       break;
-    case TOGGLE_DOCKED_MAGNIFIER:
+    case AcceleratorAction::kToggleDockedMagnifier:
       base::RecordAction(UserMetricsAction("Accel_Toggle_Docked_Magnifier"));
       accelerators::ToggleDockedMagnifier();
       break;
-    case DEBUG_TUCK_FLOATED_WINDOW_LEFT:
-    case DEBUG_TUCK_FLOATED_WINDOW_RIGHT:
+    case AcceleratorAction::kDebugTuckFloatedWindowLeft:
+    case AcceleratorAction::kDebugTuckFloatedWindowRight:
       debug::PerformDebugActionIfEnabled(action);
       break;
-    case TOGGLE_FLOATING:
+    case AcceleratorAction::kToggleFloating:
       // UMA metrics are recorded in the function.
       accelerators::ToggleFloating();
       break;
-    case TOGGLE_FULLSCREEN:
+    case AcceleratorAction::kToggleFullscreen:
       RecordToggleFullscreen(accelerator);
       accelerators::ToggleFullscreen();
       break;
-    case TOGGLE_FULLSCREEN_MAGNIFIER:
+    case AcceleratorAction::kToggleFullscreenMagnifier:
       base::RecordAction(
           UserMetricsAction("Accel_Toggle_Fullscreen_Magnifier"));
       accelerators::ToggleFullscreenMagnifier();
       break;
-    case TOGGLE_GAME_DASHBOARD:
+    case AcceleratorAction::kToggleGameDashboard:
       accelerators::ToggleGameDashboard();
       break;
-    case TOGGLE_HIGH_CONTRAST:
+    case AcceleratorAction::kToggleHighContrast:
       base::RecordAction(UserMetricsAction("Accel_Toggle_High_Contrast"));
       accelerators::ToggleHighContrast();
       break;
-    case TOGGLE_MAXIMIZED:
+    case AcceleratorAction::kToggleMaximized:
       accelerators::ToggleMaximized();
       break;
-    case TOGGLE_MESSAGE_CENTER_BUBBLE:
+    case AcceleratorAction::kToggleMessageCenterBubble:
       base::RecordAction(
           UserMetricsAction("Accel_Toggle_Message_Center_Bubble"));
       accelerators::ToggleMessageCenterBubble();
       break;
-    case TOGGLE_MIRROR_MODE:
+    case AcceleratorAction::kToggleMirrorMode:
       base::RecordAction(UserMetricsAction("Accel_Toggle_Mirror_Mode"));
       accelerators::ToggleMirrorMode();
       break;
-    case TOGGLE_MULTITASK_MENU:
+    case AcceleratorAction::kToggleMultitaskMenu:
       accelerators::ToggleMultitaskMenu();
       return;
-    case TOGGLE_OVERVIEW:
+    case AcceleratorAction::kToggleOverview:
       base::RecordAction(base::UserMetricsAction("Accel_Overview_F5"));
       accelerators::ToggleOverview();
       break;
-    case TOGGLE_SNAP_GROUP_WINDOWS_MINIMIZE_AND_RESTORE:
+    case AcceleratorAction::kToggleSnapGroupWindowsMinimizeAndRestore:
       base::RecordAction(base::UserMetricsAction(
           "Accel_Toggle_Snap_Group_Windows_Minimize_Restore"));
       accelerators::MinimizeWindowsInSnapGroup();
       break;
-    case TOGGLE_RESIZE_LOCK_MENU:
+    case AcceleratorAction::kToggleResizeLockMenu:
       base::RecordAction(
           base::UserMetricsAction("Accel_Toggle_Resize_Lock_Menu"));
       accelerators::ToggleResizeLockMenu();
       break;
-    case TOGGLE_SPOKEN_FEEDBACK:
+    case AcceleratorAction::kToggleSpokenFeedback:
       base::RecordAction(UserMetricsAction("Accel_Toggle_Spoken_Feedback"));
       accelerators::ToggleSpokenFeedback();
       break;
-    case TOGGLE_SYSTEM_TRAY_BUBBLE:
+    case AcceleratorAction::kToggleSystemTrayBubble:
       base::RecordAction(UserMetricsAction("Accel_Toggle_System_Tray_Bubble"));
       accelerators::ToggleSystemTrayBubble();
       break;
-    case TOGGLE_WIFI:
+    case AcceleratorAction::kToggleWifi:
       accelerators::ToggleWifi();
       break;
-    case TOUCH_HUD_CLEAR:
+    case AcceleratorAction::kTouchHudClear:
       accelerators::TouchHudClear();
       break;
-    case TOUCH_HUD_MODE_CHANGE:
+    case AcceleratorAction::kTouchHudModeChange:
       accelerators::TouchHudModeChange();
       break;
-    case UNPIN:
+    case AcceleratorAction::kUnpin:
       accelerators::UnpinWindow();
       break;
-    case VOLUME_DOWN:
+    case AcceleratorAction::kVolumeDown:
       base::RecordAction(UserMetricsAction("Accel_VolumeDown_F9"));
       output_volume_metric_delay_timer_.Reset();
       accelerators::VolumeDown();
       break;
-    case VOLUME_MUTE:
+    case AcceleratorAction::kVolumeMute:
       if (accelerator.key_code() == ui::VKEY_VOLUME_MUTE)
         base::RecordAction(UserMetricsAction("Accel_VolumeMute_F8"));
       accelerators::VolumeMute();
       break;
-    case VOLUME_UP:
+    case AcceleratorAction::kVolumeUp:
       base::RecordAction(UserMetricsAction("Accel_VolumeUp_F10"));
       output_volume_metric_delay_timer_.Reset();
       accelerators::VolumeUp();
       break;
-    case WINDOW_CYCLE_SNAP_LEFT:
+    case AcceleratorAction::kWindowCycleSnapLeft:
       base::RecordAction(UserMetricsAction("Accel_Window_Snap_Left"));
-      accelerators::WindowSnap(AcceleratorAction::WINDOW_CYCLE_SNAP_LEFT);
+      accelerators::WindowSnap(AcceleratorAction::kWindowCycleSnapLeft);
       break;
-    case WINDOW_CYCLE_SNAP_RIGHT:
+    case AcceleratorAction::kWindowCycleSnapRight:
       base::RecordAction(UserMetricsAction("Accel_Window_Snap_Right"));
-      accelerators::WindowSnap(AcceleratorAction::WINDOW_CYCLE_SNAP_RIGHT);
+      accelerators::WindowSnap(AcceleratorAction::kWindowCycleSnapRight);
       break;
-    case WINDOW_MINIMIZE:
+    case AcceleratorAction::kWindowMinimize:
       base::RecordAction(
           base::UserMetricsAction("Accel_Toggle_Minimized_Minus"));
       accelerators::WindowMinimize();
       break;
-    case MINIMIZE_TOP_WINDOW_ON_BACK:
+    case AcceleratorAction::kMinimizeTopWindowOnBack:
       base::RecordAction(
           base::UserMetricsAction("Accel_Minimize_Top_Window_On_Back"));
       accelerators::TopWindowMinimizeOnBack();
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index f326f5c..035e249a 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -601,13 +601,15 @@
   window_state->Activate();
 
   {
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                        {});
     gfx::Rect expected_bounds = GetDefaultSnappedWindowBoundsInParent(
         window.get(), SnapViewType::kPrimary);
     EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
   }
   {
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+    controller_->PerformActionIfEnabled(
+        AcceleratorAction::kWindowCycleSnapRight, {});
     gfx::Rect expected_bounds = GetDefaultSnappedWindowBoundsInParent(
         window.get(), SnapViewType::kSecondary);
     EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
@@ -615,11 +617,13 @@
   {
     gfx::Rect normal_bounds = window_state->GetRestoreBoundsInParent();
 
-    controller_->PerformActionIfEnabled(TOGGLE_MAXIMIZED, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleMaximized,
+                                        {});
     EXPECT_TRUE(window_state->IsMaximized());
     EXPECT_NE(normal_bounds.ToString(), window->bounds().ToString());
 
-    controller_->PerformActionIfEnabled(TOGGLE_MAXIMIZED, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleMaximized,
+                                        {});
     EXPECT_FALSE(window_state->IsMaximized());
 
     // Window gets restored to its right snapped window bounds and its window
@@ -629,43 +633,54 @@
     EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
     EXPECT_EQ(window_state->GetStateType(), WindowStateType::kSecondarySnapped);
 
-    controller_->PerformActionIfEnabled(TOGGLE_MAXIMIZED, {});
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleMaximized,
+                                        {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                        {});
     EXPECT_FALSE(window_state->IsMaximized());
 
-    controller_->PerformActionIfEnabled(TOGGLE_MAXIMIZED, {});
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleMaximized,
+                                        {});
+    controller_->PerformActionIfEnabled(
+        AcceleratorAction::kWindowCycleSnapRight, {});
     EXPECT_FALSE(window_state->IsMaximized());
 
-    controller_->PerformActionIfEnabled(TOGGLE_MAXIMIZED, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleMaximized,
+                                        {});
     EXPECT_TRUE(window_state->IsMaximized());
-    controller_->PerformActionIfEnabled(WINDOW_MINIMIZE, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowMinimize, {});
     EXPECT_FALSE(window_state->IsMaximized());
     EXPECT_TRUE(window_state->IsMinimized());
     window_state->Restore();
     window_state->Activate();
 
-    controller_->PerformActionIfEnabled(TOGGLE_FULLSCREEN, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleFullscreen,
+                                        {});
     EXPECT_TRUE(window_state->IsFullscreen());
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                        {});
     EXPECT_TRUE(window_state->IsSnapped());
     EXPECT_FALSE(window_state->IsFullscreen());
-    controller_->PerformActionIfEnabled(TOGGLE_FULLSCREEN, {});
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kToggleFullscreen,
+                                        {});
+    controller_->PerformActionIfEnabled(
+        AcceleratorAction::kWindowCycleSnapRight, {});
     EXPECT_TRUE(window_state->IsSnapped());
     EXPECT_FALSE(window_state->IsFullscreen());
   }
   {
     // Tests that window snap doesn't work while the window is minimized.
-    controller_->PerformActionIfEnabled(WINDOW_MINIMIZE, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowMinimize, {});
     EXPECT_TRUE(window_state->IsMinimized());
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                        {});
     EXPECT_TRUE(window_state->IsMinimized());
 
     // Unminimize the window. Now window snap should work.
-    controller_->PerformActionIfEnabled(WINDOW_MINIMIZE, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowMinimize, {});
     EXPECT_FALSE(window_state->IsMinimized());
-    controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                        {});
     EXPECT_TRUE(window_state->IsSnapped());
   }
 }
@@ -679,27 +694,32 @@
   window_state->Activate();
 
   // Snap right.
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapRight,
+                                      {});
   gfx::Rect normal_bounds = window_state->GetRestoreBoundsInParent();
   gfx::Rect expected_bounds = GetDefaultSnappedWindowBoundsInParent(
       window.get(), SnapViewType::kSecondary);
   EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
   EXPECT_TRUE(window_state->IsSnapped());
   // Snap right again ->> becomes normal.
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapRight,
+                                      {});
   EXPECT_TRUE(window_state->IsNormalStateType());
   EXPECT_EQ(normal_bounds.ToString(), window->bounds().ToString());
   // Snap right.
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapRight,
+                                      {});
   EXPECT_TRUE(window_state->IsSnapped());
   // Snap left.
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                      {});
   EXPECT_TRUE(window_state->IsSnapped());
   expected_bounds = GetDefaultSnappedWindowBoundsInParent(
       window.get(), SnapViewType::kPrimary);
   EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
   // Snap left again ->> becomes normal.
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                      {});
   EXPECT_TRUE(window_state->IsNormalStateType());
   EXPECT_EQ(normal_bounds.ToString(), window->bounds().ToString());
 }
@@ -792,67 +812,73 @@
   // Alt+[, clamshell, no overview
   wm::ActivateWindow(window1.get());
   left_clamshell_no_overview = 1;
-  test("Snap left, clamshell, no overview", WINDOW_CYCLE_SNAP_LEFT,
+  test("Snap left, clamshell, no overview",
+       AcceleratorAction::kWindowCycleSnapLeft,
        WindowStateType::kPrimarySnapped);
   left_clamshell_no_overview = 2;
-  test("Unsnap left, clamshell, no overview", WINDOW_CYCLE_SNAP_LEFT,
-       WindowStateType::kNormal);
+  test("Unsnap left, clamshell, no overview",
+       AcceleratorAction::kWindowCycleSnapLeft, WindowStateType::kNormal);
   // Alt+[, clamshell, overview
   EnterOverviewAndDragToSnapRight(window1.get());
   left_clamshell_overview = 1;
-  test("Snap left, clamshell, overview", WINDOW_CYCLE_SNAP_LEFT,
+  test("Snap left, clamshell, overview",
+       AcceleratorAction::kWindowCycleSnapLeft,
        WindowStateType::kPrimarySnapped);
   left_clamshell_overview = 2;
-  test("Unsnap left, clamshell, overview", WINDOW_CYCLE_SNAP_LEFT,
-       WindowStateType::kNormal);
+  test("Unsnap left, clamshell, overview",
+       AcceleratorAction::kWindowCycleSnapLeft, WindowStateType::kNormal);
   // Alt+], clamshell, no overview
   right_clamshell_no_overview = 1;
-  test("Snap right, clamshell, no overview", WINDOW_CYCLE_SNAP_RIGHT,
+  test("Snap right, clamshell, no overview",
+       AcceleratorAction::kWindowCycleSnapRight,
        WindowStateType::kSecondarySnapped);
   right_clamshell_no_overview = 2;
-  test("Unsnap right, clamshell, no overview", WINDOW_CYCLE_SNAP_RIGHT,
-       WindowStateType::kNormal);
+  test("Unsnap right, clamshell, no overview",
+       AcceleratorAction::kWindowCycleSnapRight, WindowStateType::kNormal);
   // Alt+], clamshell, overview
   EnterOverviewAndDragToSnapLeft(window1.get());
   right_clamshell_overview = 1;
-  test("Snap right, clamshell, overview", WINDOW_CYCLE_SNAP_RIGHT,
+  test("Snap right, clamshell, overview",
+       AcceleratorAction::kWindowCycleSnapRight,
        WindowStateType::kSecondarySnapped);
   right_clamshell_overview = 2;
-  test("Unsnap right, clamshell, overview", WINDOW_CYCLE_SNAP_RIGHT,
-       WindowStateType::kNormal);
+  test("Unsnap right, clamshell, overview",
+       AcceleratorAction::kWindowCycleSnapRight, WindowStateType::kNormal);
   // Alt+[, tablet, no overview
   ShellTestApi().SetTabletModeEnabledForTest(true);
   left_tablet = 1;
-  test("Snap left, tablet, no overview", WINDOW_CYCLE_SNAP_LEFT,
+  test("Snap left, tablet, no overview",
+       AcceleratorAction::kWindowCycleSnapLeft,
        WindowStateType::kPrimarySnapped);
   ToggleOverview();
   left_tablet = 2;
-  test("Unsnap left, tablet, no overview", WINDOW_CYCLE_SNAP_LEFT,
-       WindowStateType::kMaximized);
+  test("Unsnap left, tablet, no overview",
+       AcceleratorAction::kWindowCycleSnapLeft, WindowStateType::kMaximized);
   // Alt+[, tablet, overview
   EnterOverviewAndDragToSnapRight(window1.get());
   left_tablet = 3;
-  test("Snap left, tablet, overview", WINDOW_CYCLE_SNAP_LEFT,
+  test("Snap left, tablet, overview", AcceleratorAction::kWindowCycleSnapLeft,
        WindowStateType::kPrimarySnapped);
   left_tablet = 4;
-  test("Unsnap left, tablet, overview", WINDOW_CYCLE_SNAP_LEFT,
+  test("Unsnap left, tablet, overview", AcceleratorAction::kWindowCycleSnapLeft,
        WindowStateType::kMaximized);
   // Alt+], tablet, no overview
   right_tablet = 1;
-  test("Snap right, tablet, no overview", WINDOW_CYCLE_SNAP_RIGHT,
+  test("Snap right, tablet, no overview",
+       AcceleratorAction::kWindowCycleSnapRight,
        WindowStateType::kSecondarySnapped);
   ToggleOverview();
   right_tablet = 2;
-  test("Unsnap right, tablet, no overview", WINDOW_CYCLE_SNAP_RIGHT,
-       WindowStateType::kMaximized);
+  test("Unsnap right, tablet, no overview",
+       AcceleratorAction::kWindowCycleSnapRight, WindowStateType::kMaximized);
   // Alt+], tablet, overview
   EnterOverviewAndDragToSnapLeft(window1.get());
   right_tablet = 3;
-  test("Snap right, tablet, overview", WINDOW_CYCLE_SNAP_RIGHT,
+  test("Snap right, tablet, overview", AcceleratorAction::kWindowCycleSnapRight,
        WindowStateType::kSecondarySnapped);
   right_tablet = 4;
-  test("Unsnap right, tablet, overview", WINDOW_CYCLE_SNAP_RIGHT,
-       WindowStateType::kMaximized);
+  test("Unsnap right, tablet, overview",
+       AcceleratorAction::kWindowCycleSnapRight, WindowStateType::kMaximized);
 }
 
 TEST_F(AcceleratorControllerTestWithClamshellSplitView,
@@ -872,7 +898,8 @@
       SplitViewMetricsController::DeviceOrientation::kLandscape, 0);
 
   window_state->Activate();
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                      {});
   gfx::Rect expected_bounds = GetDefaultSnappedWindowBoundsInParent(
       window.get(), SnapViewType::kPrimary);
   EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
@@ -883,7 +910,8 @@
       kSnapWindowDeviceOrientationHistogram,
       SplitViewMetricsController::DeviceOrientation::kPortrait, 0);
 
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapRight,
+                                      {});
   histogram_tester.ExpectBucketCount(
       kSnapWindowDeviceOrientationHistogram,
       SplitViewMetricsController::DeviceOrientation::kLandscape, 2);
@@ -894,7 +922,8 @@
 
   window_state2->Activate();
   UpdateDisplay("800x600/l");
-  controller_->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+  controller_->PerformActionIfEnabled(AcceleratorAction::kWindowCycleSnapLeft,
+                                      {});
   histogram_tester.ExpectBucketCount(
       kSnapWindowDeviceOrientationHistogram,
       SplitViewMetricsController::DeviceOrientation::kPortrait, 1);
@@ -1144,8 +1173,8 @@
 
 TEST_F(AcceleratorControllerTest, DontRepeatToggleFullscreen) {
   const AcceleratorData accelerators[] = {
-      {true, ui::VKEY_J, ui::EF_ALT_DOWN, TOGGLE_FULLSCREEN},
-      {true, ui::VKEY_K, ui::EF_ALT_DOWN, TOGGLE_FULLSCREEN},
+      {true, ui::VKEY_J, ui::EF_ALT_DOWN, AcceleratorAction::kToggleFullscreen},
+      {true, ui::VKEY_K, ui::EF_ALT_DOWN, AcceleratorAction::kToggleFullscreen},
   };
   test_api_->RegisterAccelerators(accelerators);
 
@@ -1813,7 +1842,7 @@
          std::make_pair<std::string, std::string>(kVolumeButtonRegionScreen,
                                                   kVolumeButtonSideBottom)}));
 
-// Tests the TOGGLE_CAPS_LOCK accelerator.
+// Tests the AcceleratorAction::kToggleCapsLock accelerator.
 TEST_F(AcceleratorControllerTest, ToggleCapsLockAccelerators) {
   ImeControllerImpl* controller = Shell::Get()->ime_controller();
 
@@ -2180,7 +2209,7 @@
   for (const auto& iter : accelerators_needing_window) {
     window.reset(CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
     wm::ActivateWindow(window.get());
-    controller_->PerformActionIfEnabled(WINDOW_MINIMIZE, {});
+    controller_->PerformActionIfEnabled(AcceleratorAction::kWindowMinimize, {});
     accessibility_controller->TriggerAccessibilityAlert(
         AccessibilityAlert::NONE);
     controller_->PerformActionIfEnabled(iter.first, iter.second);
@@ -2267,8 +2296,9 @@
   EXPECT_CALL(*new_window_delegate_, OpenCalculator)
       .WillOnce(testing::Return());
   EXPECT_CALL(*observer, OnActionPerformed)
-      .WillOnce(
-          [](AcceleratorAction action) { EXPECT_EQ(OPEN_CALCULATOR, action); });
+      .WillOnce([](AcceleratorAction action) {
+        EXPECT_EQ(AcceleratorAction::kOpenCalculator, action);
+      });
   EXPECT_TRUE(ProcessInController(accelerator));
   accelerator_controller->RemoveObserver(observer.get());
 }
@@ -2361,17 +2391,18 @@
       ui::VKEY_OEM_1, ui::DomCode::BRACKET_LEFT, ui::EF_ALT_DOWN);
 
   // With positional shortcuts disabled, the accelerator should not match
-  // WINDOW_CYCLE_SNAP_LEFT.
+  // AcceleratorAction::kWindowCycleSnapLeft.
   input_method_manager_->use_positional_shortcuts_ = false;
   input_method_manager_->NotifyInputMethodChanged();
-  EXPECT_FALSE(controller_->DoesAcceleratorMatchAction(accelerator,
-                                                       WINDOW_CYCLE_SNAP_LEFT));
+  EXPECT_FALSE(controller_->DoesAcceleratorMatchAction(
+      accelerator, AcceleratorAction::kWindowCycleSnapLeft));
 
-  // When enabled, accelerator should match WINDOW_CYCLE_SNAP_LEFT.
+  // When enabled, accelerator should match
+  // AcceleratorAction::kWindowCycleSnapLeft.
   input_method_manager_->use_positional_shortcuts_ = true;
   input_method_manager_->NotifyInputMethodChanged();
-  EXPECT_TRUE(controller_->DoesAcceleratorMatchAction(accelerator,
-                                                      WINDOW_CYCLE_SNAP_LEFT));
+  EXPECT_TRUE(controller_->DoesAcceleratorMatchAction(
+      accelerator, AcceleratorAction::kWindowCycleSnapLeft));
 }
 
 class AcceleratorControllerInputMethodTest : public AcceleratorControllerTest {
@@ -2517,8 +2548,9 @@
         ContainsDeprecatedAcceleratorNotification(data->uma_histogram_name));
     RemoveAllNotifications();
 
-    // If the action is LOCK_SCREEN, we must reset the state by unlocking the
-    // screen before we proceed testing the rest of accelerators.
+    // If the action is AcceleratorAction::kLockScreen, we must reset the state
+    // by unlocking the screen before we proceed testing the rest of
+    // accelerators.
     ResetStateIfNeeded();
   }
 }
@@ -2526,17 +2558,19 @@
 TEST_F(DeprecatedAcceleratorTester, TestNewAccelerators) {
   // Add below the new accelerators that replaced the deprecated ones (if any).
   const AcceleratorData kNewAccelerators[] = {
-      {true, ui::VKEY_L, ui::EF_COMMAND_DOWN, LOCK_SCREEN},
+      {true, ui::VKEY_L, ui::EF_COMMAND_DOWN, AcceleratorAction::kLockScreen},
       {true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-       SWITCH_TO_NEXT_IME},
-      {true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN, SHOW_TASK_MANAGER},
+       AcceleratorAction::kSwitchToNextIme},
+      {true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kShowTaskManager},
       {true, ui::VKEY_K, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
-       TOGGLE_IME_MENU_BUBBLE},
+       AcceleratorAction::kToggleImeMenuBubble},
       {true, ui::VKEY_H, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
-       TOGGLE_HIGH_CONTRAST},
+       AcceleratorAction::kToggleHighContrast},
   };
 
-  // The SWITCH_TO_NEXT_IME accelerator requires multiple IMEs to be available.
+  // The AcceleratorAction::kSwitchToNextIme accelerator requires multiple IMEs
+  // to be available.
   AddTestImes();
 
   EXPECT_TRUE(IsMessageCenterEmpty());
@@ -2545,14 +2579,15 @@
     EXPECT_TRUE(ProcessInController(CreateAccelerator(data)));
 
     // Expect no notifications from the new accelerators.
-    if (data.action != TOGGLE_HIGH_CONTRAST) {
+    if (data.action != AcceleratorAction::kToggleHighContrast) {
       // The toggle high contrast accelerator displays a notification specific
       // to the high contrast mode.
       EXPECT_TRUE(IsMessageCenterEmpty());
     }
 
-    // If the action is LOCK_SCREEN, we must reset the state by unlocking the
-    // screen before we proceed testing the rest of accelerators.
+    // If the action is AcceleratorAction::kLockScreen, we must reset the state
+    // by unlocking the screen before we proceed testing the rest of
+    // accelerators.
     ResetStateIfNeeded();
   }
 
@@ -2566,7 +2601,7 @@
 
   // New incognito window is disabled.
   EXPECT_FALSE(Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      NEW_INCOGNITO_WINDOW, {}));
+      AcceleratorAction::kNewIncognitoWindow, {}));
 }
 
 constexpr char kUserEmail[] = "user@magnifier";
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc
index 1500d8ae..cea5e51 100644
--- a/ash/accelerators/accelerator_table.cc
+++ b/ash/accelerators/accelerator_table.cc
@@ -34,14 +34,16 @@
 // 5- Don't forget to update the keyboard_shortcut_viewer_metadata.cc and
 //    shortcut_viewer_strings.grdp.
 const AcceleratorData kDeprecatedAccelerators[] = {
-    {true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN, SHOW_TASK_MANAGER}};
+    {true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kShowTaskManager}};
 
 const size_t kDeprecatedAcceleratorsLength = std::size(kDeprecatedAccelerators);
 
 const DeprecatedAcceleratorData kDeprecatedAcceleratorsData[] = {
     // The action for the old shortcut was stopped in M92. Delete
     // completely in M94.
-    {SHOW_TASK_MANAGER, "Ash.Accelerators.Deprecated.ShowTaskManager",
+    {AcceleratorAction::kShowTaskManager,
+     "Ash.Accelerators.Deprecated.ShowTaskManager",
      IDS_DEPRECATED_SHOW_TASK_MANAGER_MSG, IDS_SHORTCUT_TASK_MANAGER_OLD,
      IDS_SHORTCUT_TASK_MANAGER_NEW, false}};
 
@@ -53,67 +55,88 @@
               "Deprecated accelerator tables must be kept in sync");
 
 const AcceleratorData kDebugAcceleratorData[] = {
-    {true, ui::VKEY_N, kDebugModifier, TOGGLE_WIFI},
-    {true, ui::VKEY_X, kDebugModifier, DEBUG_KEYBOARD_BACKLIGHT_TOGGLE},
-    {true, ui::VKEY_M, kDebugModifier, DEBUG_MICROPHONE_MUTE_TOGGLE},
-    {true, ui::VKEY_O, kDebugModifier, DEBUG_SHOW_TOAST},
-    {true, ui::VKEY_Z, kDebugModifier, DEBUG_SYSTEM_UI_STYLE_VIEWER},
+    {true, ui::VKEY_N, kDebugModifier, AcceleratorAction::kToggleWifi},
+    {true, ui::VKEY_X, kDebugModifier,
+     AcceleratorAction::kDebugKeyboardBacklightToggle},
+    {true, ui::VKEY_M, kDebugModifier,
+     AcceleratorAction::kDebugMicrophoneMuteToggle},
+    {true, ui::VKEY_O, kDebugModifier, AcceleratorAction::kDebugShowToast},
+    {true, ui::VKEY_Z, kDebugModifier,
+     AcceleratorAction::kDebugSystemUiStyleViewer},
     {true, ui::VKEY_P, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DEBUG_TOGGLE_TOUCH_PAD},
+     AcceleratorAction::kDebugToggleTouchPad},
     {true, ui::VKEY_T, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DEBUG_TOGGLE_TOUCH_SCREEN},
-    {true, ui::VKEY_T, kDebugModifier, DEBUG_TOGGLE_TABLET_MODE},
+     AcceleratorAction::kDebugToggleTouchScreen},
+    {true, ui::VKEY_T, kDebugModifier,
+     AcceleratorAction::kDebugToggleTabletMode},
     {true, ui::VKEY_A, kDebugModifier,
-     DEBUG_TOGGLE_VIDEO_CONFERENCE_CAMERA_TRAY_ICON},
+     AcceleratorAction::kDebugToggleVideoConferenceCameraTrayIcon},
     {true, ui::VKEY_B, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     DEBUG_TOGGLE_WALLPAPER_MODE},
-    {true, ui::VKEY_L, kDebugModifier, DEBUG_PRINT_LAYER_HIERARCHY},
-    {true, ui::VKEY_V, kDebugModifier, DEBUG_PRINT_VIEW_HIERARCHY},
-    {true, ui::VKEY_W, kDebugModifier, DEBUG_PRINT_WINDOW_HIERARCHY},
-    {true, ui::VKEY_9, kDebugModifier, DEBUG_TOGGLE_GLANCEABLES},
-    {true, ui::VKEY_B, kDebugModifier, DEBUG_TOGGLE_SHOW_DEBUG_BORDERS},
-    {true, ui::VKEY_F, kDebugModifier, DEBUG_TOGGLE_SHOW_FPS_COUNTER},
-    {true, ui::VKEY_P, kDebugModifier, DEBUG_TOGGLE_SHOW_PAINT_RECTS},
-    {true, ui::VKEY_K, kDebugModifier, DEBUG_TRIGGER_CRASH},
-    {true, ui::VKEY_G, kDebugModifier, DEBUG_TOGGLE_HUD_DISPLAY},
-    {true, ui::VKEY_D, kDebugModifier, DEBUG_TOGGLE_DARK_MODE},
-    {true, ui::VKEY_OEM_4, kDebugModifier, DEBUG_TUCK_FLOATED_WINDOW_LEFT},
-    {true, ui::VKEY_OEM_6, kDebugModifier, DEBUG_TUCK_FLOATED_WINDOW_RIGHT},
-    {true, ui::VKEY_Y, kDebugModifier, DEBUG_TOGGLE_DYNAMIC_COLOR},
-    {true, ui::VKEY_E, kDebugModifier, DEBUG_TOGGLE_POWER_BUTTON_MENU},
+     AcceleratorAction::kDebugToggleWallpaperMode},
+    {true, ui::VKEY_L, kDebugModifier,
+     AcceleratorAction::kDebugPrintLayerHierarchy},
+    {true, ui::VKEY_V, kDebugModifier,
+     AcceleratorAction::kDebugPrintViewHierarchy},
+    {true, ui::VKEY_W, kDebugModifier,
+     AcceleratorAction::kDebugPrintWindowHierarchy},
+    {true, ui::VKEY_9, kDebugModifier,
+     AcceleratorAction::kDebugToggleGlanceables},
+    {true, ui::VKEY_B, kDebugModifier,
+     AcceleratorAction::kDebugToggleShowDebugBorders},
+    {true, ui::VKEY_F, kDebugModifier,
+     AcceleratorAction::kDebugToggleShowFpsCounter},
+    {true, ui::VKEY_P, kDebugModifier,
+     AcceleratorAction::kDebugToggleShowPaintRects},
+    {true, ui::VKEY_K, kDebugModifier, AcceleratorAction::kDebugTriggerCrash},
+    {true, ui::VKEY_G, kDebugModifier,
+     AcceleratorAction::kDebugToggleHudDisplay},
+    {true, ui::VKEY_D, kDebugModifier, AcceleratorAction::kDebugToggleDarkMode},
+    {true, ui::VKEY_OEM_4, kDebugModifier,
+     AcceleratorAction::kDebugTuckFloatedWindowLeft},
+    {true, ui::VKEY_OEM_6, kDebugModifier,
+     AcceleratorAction::kDebugTuckFloatedWindowRight},
+    {true, ui::VKEY_Y, kDebugModifier,
+     AcceleratorAction::kDebugToggleDynamicColor},
+    {true, ui::VKEY_E, kDebugModifier,
+     AcceleratorAction::kDebugTogglePowerButtonMenu},
 };
 
 const size_t kDebugAcceleratorDataLength = std::size(kDebugAcceleratorData);
 
 const AcceleratorData kDeveloperAcceleratorData[] = {
     // Extra shortcut for debug build to control magnifier on Linux desktop.
-    {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_CONTROL_DOWN, MAGNIFIER_ZOOM_OUT},
-    {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_CONTROL_DOWN, MAGNIFIER_ZOOM_IN},
+    {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kMagnifierZoomOut},
+    {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kMagnifierZoomIn},
     // Extra shortcuts to lock the screen on Linux desktop.
-    {true, ui::VKEY_L, ui::EF_ALT_DOWN, LOCK_PRESSED},
-    {false, ui::VKEY_L, ui::EF_ALT_DOWN, LOCK_RELEASED},
-    {true, ui::VKEY_P, ui::EF_ALT_DOWN, POWER_PRESSED},
-    {false, ui::VKEY_P, ui::EF_ALT_DOWN, POWER_RELEASED},
-    {true, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, LOCK_PRESSED},
-    {false, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, LOCK_RELEASED},
+    {true, ui::VKEY_L, ui::EF_ALT_DOWN, AcceleratorAction::kLockPressed},
+    {false, ui::VKEY_L, ui::EF_ALT_DOWN, AcceleratorAction::kLockReleased},
+    {true, ui::VKEY_P, ui::EF_ALT_DOWN, AcceleratorAction::kPowerPressed},
+    {false, ui::VKEY_P, ui::EF_ALT_DOWN, AcceleratorAction::kPowerReleased},
+    {true, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, AcceleratorAction::kLockPressed},
+    {false, ui::VKEY_POWER, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kLockReleased},
     {true, ui::VKEY_D, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     DEV_ADD_REMOVE_DISPLAY},
+     AcceleratorAction::kDevAddRemoveDisplay},
     {true, ui::VKEY_U, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     DEV_TOGGLE_UNIFIED_DESKTOP},
+     AcceleratorAction::kDevToggleUnifiedDesktop},
     {true, ui::VKEY_M, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     TOGGLE_MIRROR_MODE},
-    {true, ui::VKEY_W, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, TOGGLE_WIFI},
+     AcceleratorAction::kToggleMirrorMode},
+    {true, ui::VKEY_W, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kToggleWifi},
     // Extra shortcut for display swapping as Alt-F4 is taken on Linux desktop.
-    {true, ui::VKEY_S, kDebugModifier, SWAP_PRIMARY_DISPLAY},
+    {true, ui::VKEY_S, kDebugModifier, AcceleratorAction::kSwapPrimaryDisplay},
     // Extra shortcut to rotate/scale up/down the screen on Linux desktop.
-    {true, ui::VKEY_R, kDebugModifier, ROTATE_SCREEN},
+    {true, ui::VKEY_R, kDebugModifier, AcceleratorAction::kRotateScreen},
     // For testing on systems where Alt-Tab is already mapped.
-    {true, ui::VKEY_W, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU},
-    {true, ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+    {true, ui::VKEY_W, ui::EF_ALT_DOWN, AcceleratorAction::kCycleForwardMru},
+    {true, ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kCycleBackwardMru},
     {true, ui::VKEY_F, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
-     TOGGLE_FULLSCREEN},
+     AcceleratorAction::kToggleFullscreen},
     // For testing on Linux desktop where it's hard to rebind the caps lock key.
-    {true, ui::VKEY_A, ui::EF_ALT_DOWN, DEV_TOGGLE_APP_LIST},
+    {true, ui::VKEY_A, ui::EF_ALT_DOWN, AcceleratorAction::kDevToggleAppList},
 };
 
 const size_t kDeveloperAcceleratorDataLength =
@@ -121,73 +144,75 @@
 
 const AcceleratorAction kPreferredActions[] = {
     // Window cycling accelerators.
-    CYCLE_BACKWARD_MRU,               // Shift+Alt+Tab
-    CYCLE_FORWARD_MRU,                // Alt+Tab
-    CYCLE_SAME_APP_WINDOWS_BACKWARD,  // Shift+Alt+Backtick
-    CYCLE_SAME_APP_WINDOWS_FORWARD,   // Alt+Backtick
+    AcceleratorAction::kCycleBackwardMru,             // Shift+Alt+Tab
+    AcceleratorAction::kCycleForwardMru,              // Alt+Tab
+    AcceleratorAction::kCycleSameAppWindowsBackward,  // Shift+Alt+Backtick
+    AcceleratorAction::kCycleSameAppWindowsForward,   // Alt+Backtick
 };
 
 const size_t kPreferredActionsLength = std::size(kPreferredActions);
 
 const AcceleratorAction kReservedActions[] = {
-    POWER_PRESSED, POWER_RELEASED, LOCK_PRESSED, LOCK_RELEASED, SUSPEND,
+    AcceleratorAction::kPowerPressed, AcceleratorAction::kPowerReleased,
+    AcceleratorAction::kLockPressed,  AcceleratorAction::kLockReleased,
+    AcceleratorAction::kSuspend,
 };
 
 const size_t kReservedActionsLength = std::size(kReservedActions);
 
 const AcceleratorAction kActionsAllowedAtLoginOrLockScreen[] = {
-    BRIGHTNESS_DOWN,
-    BRIGHTNESS_UP,
-    DEBUG_PRINT_LAYER_HIERARCHY,
-    DEBUG_PRINT_VIEW_HIERARCHY,
-    DEBUG_PRINT_WINDOW_HIERARCHY,
-    DEBUG_TOGGLE_HUD_DISPLAY,
-    DEBUG_TOGGLE_TOUCH_PAD,
-    DEBUG_TOGGLE_TOUCH_SCREEN,
-    DEBUG_TOGGLE_TABLET_MODE,
-    DEV_ADD_REMOVE_DISPLAY,
-    DISABLE_CAPS_LOCK,
-    KEYBOARD_BACKLIGHT_TOGGLE,
-    KEYBOARD_BRIGHTNESS_DOWN,
-    KEYBOARD_BRIGHTNESS_UP,
-    MAGNIFIER_ZOOM_IN,   // Control+F7
-    MAGNIFIER_ZOOM_OUT,  // Control+F6
-    MEDIA_FAST_FORWARD,
-    MEDIA_NEXT_TRACK,
-    MEDIA_PAUSE,
-    MEDIA_PLAY,
-    MEDIA_PLAY_PAUSE,
-    MEDIA_PREV_TRACK,
-    MEDIA_REWIND,
-    MEDIA_STOP,
-    MICROPHONE_MUTE_TOGGLE,
-    PRIVACY_SCREEN_TOGGLE,
-    PRINT_UI_HIERARCHIES,
-    ROTATE_SCREEN,
-    SCALE_UI_DOWN,
-    SCALE_UI_RESET,
-    SCALE_UI_UP,
-    TOGGLE_IME_MENU_BUBBLE,
-    SWITCH_TO_LAST_USED_IME,
-    SWITCH_TO_NEXT_IME,
-    TAKE_SCREENSHOT,
-    TOGGLE_CALENDAR,
-    TOGGLE_CAPS_LOCK,
-    TOGGLE_DICTATION,
-    TOGGLE_DOCKED_MAGNIFIER,
-    TOGGLE_FULLSCREEN_MAGNIFIER,
-    TOGGLE_HIGH_CONTRAST,
-    TOGGLE_MIRROR_MODE,
-    TOGGLE_SPOKEN_FEEDBACK,
-    TOGGLE_SYSTEM_TRAY_BUBBLE,
-    TOGGLE_WIFI,
-    TOUCH_HUD_CLEAR,
-    VOLUME_DOWN,
-    VOLUME_MUTE,
-    VOLUME_UP,
+    AcceleratorAction::kBrightnessDown,
+    AcceleratorAction::kBrightnessUp,
+    AcceleratorAction::kDebugPrintLayerHierarchy,
+    AcceleratorAction::kDebugPrintViewHierarchy,
+    AcceleratorAction::kDebugPrintWindowHierarchy,
+    AcceleratorAction::kDebugToggleHudDisplay,
+    AcceleratorAction::kDebugToggleTouchPad,
+    AcceleratorAction::kDebugToggleTouchScreen,
+    AcceleratorAction::kDebugToggleTabletMode,
+    AcceleratorAction::kDevAddRemoveDisplay,
+    AcceleratorAction::kDisableCapsLock,
+    AcceleratorAction::kKeyboardBacklightToggle,
+    AcceleratorAction::kKeyboardBrightnessDown,
+    AcceleratorAction::kKeyboardBrightnessUp,
+    AcceleratorAction::kMagnifierZoomIn,   // Control+F7
+    AcceleratorAction::kMagnifierZoomOut,  // Control+F6
+    AcceleratorAction::kMediaFastForward,
+    AcceleratorAction::kMediaNextTrack,
+    AcceleratorAction::kMediaPause,
+    AcceleratorAction::kMediaPlay,
+    AcceleratorAction::kMediaPlayPause,
+    AcceleratorAction::kMediaPrevTrack,
+    AcceleratorAction::kMediaRewind,
+    AcceleratorAction::kMediaStop,
+    AcceleratorAction::kMicrophoneMuteToggle,
+    AcceleratorAction::kPrivacyScreenToggle,
+    AcceleratorAction::kPrintUiHierarchies,
+    AcceleratorAction::kRotateScreen,
+    AcceleratorAction::kScaleUiDown,
+    AcceleratorAction::kScaleUiReset,
+    AcceleratorAction::kScaleUiUp,
+    AcceleratorAction::kToggleImeMenuBubble,
+    AcceleratorAction::kSwitchToLastUsedIme,
+    AcceleratorAction::kSwitchToNextIme,
+    AcceleratorAction::kTakeScreenshot,
+    AcceleratorAction::kToggleCalendar,
+    AcceleratorAction::kToggleCapsLock,
+    AcceleratorAction::kToggleDictation,
+    AcceleratorAction::kToggleDockedMagnifier,
+    AcceleratorAction::kToggleFullscreenMagnifier,
+    AcceleratorAction::kToggleHighContrast,
+    AcceleratorAction::kToggleMirrorMode,
+    AcceleratorAction::kToggleSpokenFeedback,
+    AcceleratorAction::kToggleSystemTrayBubble,
+    AcceleratorAction::kToggleWifi,
+    AcceleratorAction::kTouchHudClear,
+    AcceleratorAction::kVolumeDown,
+    AcceleratorAction::kVolumeMute,
+    AcceleratorAction::kVolumeUp,
 #if !defined(NDEBUG)
-    POWER_PRESSED,
-    POWER_RELEASED,
+    AcceleratorAction::kPowerPressed,
+    AcceleratorAction::kPowerReleased,
 #endif  // !defined(NDEBUG)
 };
 
@@ -195,169 +220,171 @@
     std::size(kActionsAllowedAtLoginOrLockScreen);
 
 const AcceleratorAction kActionsAllowedAtLockScreen[] = {
-    EXIT,
-    SUSPEND,
+    AcceleratorAction::kExit,
+    AcceleratorAction::kSuspend,
 };
 
 const size_t kActionsAllowedAtLockScreenLength =
     std::size(kActionsAllowedAtLockScreen);
 
 const AcceleratorAction kActionsAllowedAtPowerMenu[] = {
-    BRIGHTNESS_DOWN, BRIGHTNESS_UP, VOLUME_DOWN, VOLUME_UP, VOLUME_MUTE,
+    AcceleratorAction::kBrightnessDown, AcceleratorAction::kBrightnessUp,
+    AcceleratorAction::kVolumeDown,     AcceleratorAction::kVolumeUp,
+    AcceleratorAction::kVolumeMute,
 };
 
 const size_t kActionsAllowedAtPowerMenuLength =
     std::size(kActionsAllowedAtPowerMenu);
 
 const AcceleratorAction kActionsAllowedAtModalWindow[] = {
-    BRIGHTNESS_DOWN,
-    BRIGHTNESS_UP,
-    DEBUG_KEYBOARD_BACKLIGHT_TOGGLE,
-    DEBUG_MICROPHONE_MUTE_TOGGLE,
-    DEBUG_TOGGLE_TOUCH_PAD,
-    DEBUG_TOGGLE_TOUCH_SCREEN,
-    DEV_ADD_REMOVE_DISPLAY,
-    DISABLE_CAPS_LOCK,
-    EXIT,
-    KEYBOARD_BACKLIGHT_TOGGLE,
-    KEYBOARD_BRIGHTNESS_DOWN,
-    KEYBOARD_BRIGHTNESS_UP,
-    LOCK_SCREEN,
-    MAGNIFIER_ZOOM_IN,
-    MAGNIFIER_ZOOM_OUT,
-    MEDIA_FAST_FORWARD,
-    MEDIA_NEXT_TRACK,
-    MEDIA_PAUSE,
-    MEDIA_PLAY,
-    MEDIA_PLAY_PAUSE,
-    MEDIA_PREV_TRACK,
-    MEDIA_REWIND,
-    MEDIA_STOP,
-    MICROPHONE_MUTE_TOGGLE,
-    OPEN_FEEDBACK_PAGE,
-    POWER_PRESSED,
-    POWER_RELEASED,
-    PRINT_UI_HIERARCHIES,
-    PRIVACY_SCREEN_TOGGLE,
-    ROTATE_SCREEN,
-    SCALE_UI_DOWN,
-    SCALE_UI_RESET,
-    SCALE_UI_UP,
-    TOGGLE_IME_MENU_BUBBLE,
-    SHOW_SHORTCUT_VIEWER,
-    SUSPEND,
-    SWAP_PRIMARY_DISPLAY,
-    SWITCH_TO_LAST_USED_IME,
-    SWITCH_TO_NEXT_IME,
-    TAKE_PARTIAL_SCREENSHOT,
-    TAKE_SCREENSHOT,
-    TAKE_WINDOW_SCREENSHOT,
-    TOGGLE_CAPS_LOCK,
-    TOGGLE_DICTATION,
-    TOGGLE_DOCKED_MAGNIFIER,
-    TOGGLE_FULLSCREEN_MAGNIFIER,
-    TOGGLE_HIGH_CONTRAST,
-    TOGGLE_MIRROR_MODE,
-    TOGGLE_SPOKEN_FEEDBACK,
-    TOGGLE_WIFI,
-    VOLUME_DOWN,
-    VOLUME_MUTE,
-    VOLUME_UP,
+    AcceleratorAction::kBrightnessDown,
+    AcceleratorAction::kBrightnessUp,
+    AcceleratorAction::kDebugKeyboardBacklightToggle,
+    AcceleratorAction::kDebugMicrophoneMuteToggle,
+    AcceleratorAction::kDebugToggleTouchPad,
+    AcceleratorAction::kDebugToggleTouchScreen,
+    AcceleratorAction::kDevAddRemoveDisplay,
+    AcceleratorAction::kDisableCapsLock,
+    AcceleratorAction::kExit,
+    AcceleratorAction::kKeyboardBacklightToggle,
+    AcceleratorAction::kKeyboardBrightnessDown,
+    AcceleratorAction::kKeyboardBrightnessUp,
+    AcceleratorAction::kLockScreen,
+    AcceleratorAction::kMagnifierZoomIn,
+    AcceleratorAction::kMagnifierZoomOut,
+    AcceleratorAction::kMediaFastForward,
+    AcceleratorAction::kMediaNextTrack,
+    AcceleratorAction::kMediaPause,
+    AcceleratorAction::kMediaPlay,
+    AcceleratorAction::kMediaPlayPause,
+    AcceleratorAction::kMediaPrevTrack,
+    AcceleratorAction::kMediaRewind,
+    AcceleratorAction::kMediaStop,
+    AcceleratorAction::kMicrophoneMuteToggle,
+    AcceleratorAction::kOpenFeedbackPage,
+    AcceleratorAction::kPowerPressed,
+    AcceleratorAction::kPowerReleased,
+    AcceleratorAction::kPrintUiHierarchies,
+    AcceleratorAction::kPrivacyScreenToggle,
+    AcceleratorAction::kRotateScreen,
+    AcceleratorAction::kScaleUiDown,
+    AcceleratorAction::kScaleUiReset,
+    AcceleratorAction::kScaleUiUp,
+    AcceleratorAction::kToggleImeMenuBubble,
+    AcceleratorAction::kShowShortcutViewer,
+    AcceleratorAction::kSuspend,
+    AcceleratorAction::kSwapPrimaryDisplay,
+    AcceleratorAction::kSwitchToLastUsedIme,
+    AcceleratorAction::kSwitchToNextIme,
+    AcceleratorAction::kTakePartialScreenshot,
+    AcceleratorAction::kTakeScreenshot,
+    AcceleratorAction::kTakeWindowScreenshot,
+    AcceleratorAction::kToggleCapsLock,
+    AcceleratorAction::kToggleDictation,
+    AcceleratorAction::kToggleDockedMagnifier,
+    AcceleratorAction::kToggleFullscreenMagnifier,
+    AcceleratorAction::kToggleHighContrast,
+    AcceleratorAction::kToggleMirrorMode,
+    AcceleratorAction::kToggleSpokenFeedback,
+    AcceleratorAction::kToggleWifi,
+    AcceleratorAction::kVolumeDown,
+    AcceleratorAction::kVolumeMute,
+    AcceleratorAction::kVolumeUp,
 };
 
 const size_t kActionsAllowedAtModalWindowLength =
     std::size(kActionsAllowedAtModalWindow);
 
 const AcceleratorAction kRepeatableActions[] = {
-    BRIGHTNESS_DOWN,
-    BRIGHTNESS_UP,
-    FOCUS_NEXT_PANE,
-    FOCUS_PREVIOUS_PANE,
-    KEYBOARD_BRIGHTNESS_DOWN,
-    KEYBOARD_BRIGHTNESS_UP,
-    MAGNIFIER_ZOOM_IN,
-    MAGNIFIER_ZOOM_OUT,
-    MEDIA_FAST_FORWARD,
-    MEDIA_NEXT_TRACK,
-    MEDIA_PREV_TRACK,
-    MEDIA_REWIND,
-    RESTORE_TAB,
-    VOLUME_DOWN,
-    VOLUME_UP,
+    AcceleratorAction::kBrightnessDown,
+    AcceleratorAction::kBrightnessUp,
+    AcceleratorAction::kFocusNextPane,
+    AcceleratorAction::kFocusPreviousPane,
+    AcceleratorAction::kKeyboardBrightnessDown,
+    AcceleratorAction::kKeyboardBrightnessUp,
+    AcceleratorAction::kMagnifierZoomIn,
+    AcceleratorAction::kMagnifierZoomOut,
+    AcceleratorAction::kMediaFastForward,
+    AcceleratorAction::kMediaNextTrack,
+    AcceleratorAction::kMediaPrevTrack,
+    AcceleratorAction::kMediaRewind,
+    AcceleratorAction::kRestoreTab,
+    AcceleratorAction::kVolumeDown,
+    AcceleratorAction::kVolumeUp,
 };
 
 const size_t kRepeatableActionsLength = std::size(kRepeatableActions);
 
 const AcceleratorAction kActionsAllowedInAppModeOrPinnedMode[] = {
-    BRIGHTNESS_DOWN,
-    BRIGHTNESS_UP,
-    DEBUG_KEYBOARD_BACKLIGHT_TOGGLE,
-    DEBUG_MICROPHONE_MUTE_TOGGLE,
-    DEBUG_PRINT_LAYER_HIERARCHY,
-    DEBUG_PRINT_VIEW_HIERARCHY,
-    DEBUG_PRINT_WINDOW_HIERARCHY,
-    DEBUG_TOGGLE_TOUCH_PAD,
-    DEBUG_TOGGLE_TOUCH_SCREEN,
-    DEV_ADD_REMOVE_DISPLAY,
-    DISABLE_CAPS_LOCK,
-    KEYBOARD_BACKLIGHT_TOGGLE,
-    KEYBOARD_BRIGHTNESS_DOWN,
-    KEYBOARD_BRIGHTNESS_UP,
-    MAGNIFIER_ZOOM_IN,   // Control+F7
-    MAGNIFIER_ZOOM_OUT,  // Control+F6
-    MEDIA_FAST_FORWARD,
-    MEDIA_NEXT_TRACK,
-    MEDIA_PAUSE,
-    MEDIA_PLAY,
-    MEDIA_PLAY_PAUSE,
-    MEDIA_PREV_TRACK,
-    MEDIA_REWIND,
-    MEDIA_STOP,
-    MICROPHONE_MUTE_TOGGLE,
-    PASTE_CLIPBOARD_HISTORY_PLAIN_TEXT,
-    POWER_PRESSED,
-    POWER_RELEASED,
-    PRINT_UI_HIERARCHIES,
-    PRIVACY_SCREEN_TOGGLE,
-    ROTATE_SCREEN,
-    SCALE_UI_DOWN,
-    SCALE_UI_RESET,
-    SCALE_UI_UP,
-    SWAP_PRIMARY_DISPLAY,
-    SWITCH_TO_LAST_USED_IME,
-    SWITCH_TO_NEXT_IME,
-    TOGGLE_CAPS_LOCK,
-    TOGGLE_CLIPBOARD_HISTORY,
-    TOGGLE_DICTATION,
-    TOGGLE_DOCKED_MAGNIFIER,
-    TOGGLE_FULLSCREEN_MAGNIFIER,
-    TOGGLE_HIGH_CONTRAST,
-    TOGGLE_MIRROR_MODE,
-    TOGGLE_SPOKEN_FEEDBACK,
-    TOGGLE_WIFI,
-    TOUCH_HUD_CLEAR,
-    VOLUME_DOWN,
-    VOLUME_MUTE,
-    VOLUME_UP,
+    AcceleratorAction::kBrightnessDown,
+    AcceleratorAction::kBrightnessUp,
+    AcceleratorAction::kDebugKeyboardBacklightToggle,
+    AcceleratorAction::kDebugMicrophoneMuteToggle,
+    AcceleratorAction::kDebugPrintLayerHierarchy,
+    AcceleratorAction::kDebugPrintViewHierarchy,
+    AcceleratorAction::kDebugPrintWindowHierarchy,
+    AcceleratorAction::kDebugToggleTouchPad,
+    AcceleratorAction::kDebugToggleTouchScreen,
+    AcceleratorAction::kDevAddRemoveDisplay,
+    AcceleratorAction::kDisableCapsLock,
+    AcceleratorAction::kKeyboardBacklightToggle,
+    AcceleratorAction::kKeyboardBrightnessDown,
+    AcceleratorAction::kKeyboardBrightnessUp,
+    AcceleratorAction::kMagnifierZoomIn,   // Control+F7
+    AcceleratorAction::kMagnifierZoomOut,  // Control+F6
+    AcceleratorAction::kMediaFastForward,
+    AcceleratorAction::kMediaNextTrack,
+    AcceleratorAction::kMediaPause,
+    AcceleratorAction::kMediaPlay,
+    AcceleratorAction::kMediaPlayPause,
+    AcceleratorAction::kMediaPrevTrack,
+    AcceleratorAction::kMediaRewind,
+    AcceleratorAction::kMediaStop,
+    AcceleratorAction::kMicrophoneMuteToggle,
+    AcceleratorAction::kPasteClipboardHistoryPlainText,
+    AcceleratorAction::kPowerPressed,
+    AcceleratorAction::kPowerReleased,
+    AcceleratorAction::kPrintUiHierarchies,
+    AcceleratorAction::kPrivacyScreenToggle,
+    AcceleratorAction::kRotateScreen,
+    AcceleratorAction::kScaleUiDown,
+    AcceleratorAction::kScaleUiReset,
+    AcceleratorAction::kScaleUiUp,
+    AcceleratorAction::kSwapPrimaryDisplay,
+    AcceleratorAction::kSwitchToLastUsedIme,
+    AcceleratorAction::kSwitchToNextIme,
+    AcceleratorAction::kToggleCapsLock,
+    AcceleratorAction::kToggleClipboardHistory,
+    AcceleratorAction::kToggleDictation,
+    AcceleratorAction::kToggleDockedMagnifier,
+    AcceleratorAction::kToggleFullscreenMagnifier,
+    AcceleratorAction::kToggleHighContrast,
+    AcceleratorAction::kToggleMirrorMode,
+    AcceleratorAction::kToggleSpokenFeedback,
+    AcceleratorAction::kToggleWifi,
+    AcceleratorAction::kTouchHudClear,
+    AcceleratorAction::kVolumeDown,
+    AcceleratorAction::kVolumeMute,
+    AcceleratorAction::kVolumeUp,
 };
 
 const size_t kActionsAllowedInAppModeOrPinnedModeLength =
     std::size(kActionsAllowedInAppModeOrPinnedMode);
 
 const AcceleratorAction kActionsAllowedInPinnedMode[] = {
-    LOCK_SCREEN,
-    SUSPEND,
-    TAKE_PARTIAL_SCREENSHOT,
-    TAKE_SCREENSHOT,
-    TAKE_WINDOW_SCREENSHOT,
-    UNPIN,
+    AcceleratorAction::kLockScreen,
+    AcceleratorAction::kSuspend,
+    AcceleratorAction::kTakePartialScreenshot,
+    AcceleratorAction::kTakeScreenshot,
+    AcceleratorAction::kTakeWindowScreenshot,
+    AcceleratorAction::kUnpin,
 };
 
 const size_t kActionsAllowedInPinnedModeLength =
     std::size(kActionsAllowedInPinnedMode);
 
 const AcceleratorAction kActionsAllowedInAppMode[] = {
-    FOCUS_SHELF,
+    AcceleratorAction::kFocusShelf,
 };
 
 const size_t kActionsAllowedInAppModeLength =
@@ -365,86 +392,86 @@
 
 const AcceleratorAction kActionsNeedingWindow[] = {
     // clang-format off
-    DESKS_MOVE_ACTIVE_ITEM_LEFT,
-    DESKS_MOVE_ACTIVE_ITEM_RIGHT,
-    DESKS_TOGGLE_ASSIGN_TO_ALL_DESKS,
-    MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS,
-    ROTATE_WINDOW,
-    TOGGLE_FLOATING,
-    TOGGLE_FULLSCREEN,
-    TOGGLE_MAXIMIZED,
-    TOGGLE_SNAP_GROUP_WINDOWS_MINIMIZE_AND_RESTORE,
-    WINDOW_CYCLE_SNAP_LEFT,
-    WINDOW_CYCLE_SNAP_RIGHT,
-    WINDOW_MINIMIZE,
+    AcceleratorAction::kDesksMoveActiveItemLeft,
+    AcceleratorAction::kDesksMoveActiveItemRight,
+    AcceleratorAction::kDesksToggleAssignToAllDesks,
+    AcceleratorAction::kMoveActiveWindowBetweenDisplays,
+    AcceleratorAction::kRotateWindow,
+    AcceleratorAction::kToggleFloating,
+    AcceleratorAction::kToggleFullscreen,
+    AcceleratorAction::kToggleMaximized,
+    AcceleratorAction::kToggleSnapGroupWindowsMinimizeAndRestore,
+    AcceleratorAction::kWindowCycleSnapLeft,
+    AcceleratorAction::kWindowCycleSnapRight,
+    AcceleratorAction::kWindowMinimize,
     // clang-format on
 };
 
 const size_t kActionsNeedingWindowLength = std::size(kActionsNeedingWindow);
 
 const AcceleratorAction kActionsKeepingMenuOpen[] = {
-    BRIGHTNESS_DOWN,
-    BRIGHTNESS_UP,
-    DEBUG_KEYBOARD_BACKLIGHT_TOGGLE,
-    DEBUG_MICROPHONE_MUTE_TOGGLE,
-    DEBUG_TOGGLE_TOUCH_PAD,
-    DEBUG_TOGGLE_TOUCH_SCREEN,
+    AcceleratorAction::kBrightnessDown,
+    AcceleratorAction::kBrightnessUp,
+    AcceleratorAction::kDebugKeyboardBacklightToggle,
+    AcceleratorAction::kDebugMicrophoneMuteToggle,
+    AcceleratorAction::kDebugToggleTouchPad,
+    AcceleratorAction::kDebugToggleTouchScreen,
     // Keep the menu open when switching desks. The desk activation code will
     // close the menu without animation manually. Otherwise, the menu will fade
     // out and a trace will be visible while switching desks.
-    DESKS_ACTIVATE_DESK_LEFT,
-    DESKS_ACTIVATE_DESK_RIGHT,
-    DESKS_NEW_DESK,
-    DESKS_REMOVE_CURRENT_DESK,
-    DISABLE_CAPS_LOCK,
-    KEYBOARD_BACKLIGHT_TOGGLE,
-    KEYBOARD_BRIGHTNESS_DOWN,
-    KEYBOARD_BRIGHTNESS_UP,
-    MEDIA_FAST_FORWARD,
-    MEDIA_NEXT_TRACK,
-    MEDIA_PAUSE,
-    MEDIA_PLAY,
-    MEDIA_PLAY_PAUSE,
-    MEDIA_PREV_TRACK,
-    MEDIA_REWIND,
-    MEDIA_STOP,
-    MICROPHONE_MUTE_TOGGLE,
-    PASTE_CLIPBOARD_HISTORY_PLAIN_TEXT,
-    PRINT_UI_HIERARCHIES,
-    PRIVACY_SCREEN_TOGGLE,
-    SWITCH_TO_LAST_USED_IME,
-    SWITCH_TO_NEXT_IME,
-    TAKE_PARTIAL_SCREENSHOT,
-    TAKE_SCREENSHOT,
-    TAKE_WINDOW_SCREENSHOT,
-    TOGGLE_APP_LIST,
-    TOGGLE_CAPS_LOCK,
-    TOGGLE_CLIPBOARD_HISTORY,
-    TOGGLE_DICTATION,
-    TOGGLE_DOCKED_MAGNIFIER,
-    TOGGLE_FULLSCREEN_MAGNIFIER,
-    TOGGLE_HIGH_CONTRAST,
-    TOGGLE_SPOKEN_FEEDBACK,
-    TOGGLE_WIFI,
-    VOLUME_DOWN,
-    VOLUME_MUTE,
-    VOLUME_UP,
+    AcceleratorAction::kDesksActivateDeskLeft,
+    AcceleratorAction::kDesksActivateDeskRight,
+    AcceleratorAction::kDesksNewDesk,
+    AcceleratorAction::kDesksRemoveCurrentDesk,
+    AcceleratorAction::kDisableCapsLock,
+    AcceleratorAction::kKeyboardBacklightToggle,
+    AcceleratorAction::kKeyboardBrightnessDown,
+    AcceleratorAction::kKeyboardBrightnessUp,
+    AcceleratorAction::kMediaFastForward,
+    AcceleratorAction::kMediaNextTrack,
+    AcceleratorAction::kMediaPause,
+    AcceleratorAction::kMediaPlay,
+    AcceleratorAction::kMediaPlayPause,
+    AcceleratorAction::kMediaPrevTrack,
+    AcceleratorAction::kMediaRewind,
+    AcceleratorAction::kMediaStop,
+    AcceleratorAction::kMicrophoneMuteToggle,
+    AcceleratorAction::kPasteClipboardHistoryPlainText,
+    AcceleratorAction::kPrintUiHierarchies,
+    AcceleratorAction::kPrivacyScreenToggle,
+    AcceleratorAction::kSwitchToLastUsedIme,
+    AcceleratorAction::kSwitchToNextIme,
+    AcceleratorAction::kTakePartialScreenshot,
+    AcceleratorAction::kTakeScreenshot,
+    AcceleratorAction::kTakeWindowScreenshot,
+    AcceleratorAction::kToggleAppList,
+    AcceleratorAction::kToggleCapsLock,
+    AcceleratorAction::kToggleClipboardHistory,
+    AcceleratorAction::kToggleDictation,
+    AcceleratorAction::kToggleDockedMagnifier,
+    AcceleratorAction::kToggleFullscreenMagnifier,
+    AcceleratorAction::kToggleHighContrast,
+    AcceleratorAction::kToggleSpokenFeedback,
+    AcceleratorAction::kToggleWifi,
+    AcceleratorAction::kVolumeDown,
+    AcceleratorAction::kVolumeMute,
+    AcceleratorAction::kVolumeUp,
 };
 
 const size_t kActionsKeepingMenuOpenLength = std::size(kActionsKeepingMenuOpen);
 
 const AcceleratorAction kActionsDuplicatedWithBrowser[] = {
     // clang-format off
-    NEW_WINDOW,
-    NEW_INCOGNITO_WINDOW,
-    RESTORE_TAB,
-    NEW_TAB,
+    AcceleratorAction::kNewWindow,
+    AcceleratorAction::kNewIncognitoWindow,
+    AcceleratorAction::kRestoreTab,
+    AcceleratorAction::kNewTab,
 // clang-format on
 
-// OPEN_FEEDBACK_PAGE is guarded by the BRANDING macro on defining Browser's
-// shortcuts. To follow it, guard it here, too.
+// AcceleratorAction::kOpenFeedbackPage is guarded by the BRANDING macro on
+// defining Browser's shortcuts. To follow it, guard it here, too.
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-    OPEN_FEEDBACK_PAGE,
+    AcceleratorAction::kOpenFeedbackPage,
 #endif
 };
 
@@ -452,9 +479,9 @@
     std::size(kActionsDuplicatedWithBrowser);
 
 const AcceleratorAction kActionsInterceptableByBrowser[] = {
-    SHOW_TASK_MANAGER,
-    OPEN_GET_HELP,
-    MINIMIZE_TOP_WINDOW_ON_BACK,
+    AcceleratorAction::kShowTaskManager,
+    AcceleratorAction::kOpenGetHelp,
+    AcceleratorAction::kMinimizeTopWindowOnBack,
 };
 
 const size_t kActionsInterceptableByBrowserLength =
diff --git a/ash/accelerators/ash_accelerator_configuration_unittest.cc b/ash/accelerators/ash_accelerator_configuration_unittest.cc
index abc2f03..41a02c2 100644
--- a/ash/accelerators/ash_accelerator_configuration_unittest.cc
+++ b/ash/accelerators/ash_accelerator_configuration_unittest.cc
@@ -139,13 +139,15 @@
 TEST_F(AshAcceleratorConfigurationTest, VerifyAcceleratorMappingPopulated) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -156,38 +158,41 @@
 }
 
 TEST_F(AshAcceleratorConfigurationTest, DeprecatedAccelerators) {
-  // Test deprecated accelerators, in this case `SHOW_TASK_MANAGER` has two
-  // associated accelerators: (deprecated) ESCAPE + SHIFT and
-  // (active) ESCAPE + COMMAND.
+  // Test deprecated accelerators, in this case
+  // `AcceleratorAction::kShowTaskManager` has two associated accelerators:
+  // (deprecated) ESCAPE + SHIFT and (active) ESCAPE + COMMAND.
   const AcceleratorData initial_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   const AcceleratorData expected_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   const DeprecatedAcceleratorData deprecated_data[] = {
-      {SHOW_TASK_MANAGER, /*uma_histogram_name=*/"deprecated.showTaskManager",
+      {AcceleratorAction::kShowTaskManager,
+       /*uma_histogram_name=*/"deprecated.showTaskManager",
        /*notification_message_id=*/1, /*old_shortcut_id=*/1,
        /*new_shortcut_id=*/2, /*deprecated_enabled=*/true},
   };
 
   const AcceleratorData test_deprecated_accelerators[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   config_->Initialize(initial_test_data);
@@ -216,10 +221,12 @@
                                                ui::EF_SHIFT_DOWN);
   EXPECT_TRUE(config_->IsDeprecated(deprecated_accelerator));
   // Verify fetching a deprecated accelerator works.
-  EXPECT_EQ(deprecated_data,
-            config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
-  // CYCLE_BACKWARD_MRU is not a deprecated action, expect nullptr.
-  EXPECT_EQ(nullptr, config_->GetDeprecatedAcceleratorData(CYCLE_BACKWARD_MRU));
+  EXPECT_EQ(deprecated_data, config_->GetDeprecatedAcceleratorData(
+                                 AcceleratorAction::kShowTaskManager));
+  // AcceleratorAction::kCycleBackwardMru is not a deprecated action, expect
+  // nullptr.
+  EXPECT_EQ(nullptr, config_->GetDeprecatedAcceleratorData(
+                         AcceleratorAction::kCycleBackwardMru));
 
   // Verify that ESCAPE + COMMAND is not deprecated.
   const ui::Accelerator active_accelerator(ui::VKEY_ESCAPE,
@@ -229,38 +236,41 @@
 
 TEST_F(AshAcceleratorConfigurationTest,
        RemoveAndRestoreDeprecatedAccelerators) {
-  // Test deprecated accelerators, in this case `SHOW_TASK_MANAGER` has two
-  // associated accelerators: (deprecated) ESCAPE + SHIFT and
-  // (active) ESCAPE + COMMAND.
+  // Test deprecated accelerators, in this case
+  // `AcceleratorAction::kShowTaskManager` has two associated accelerators:
+  // (deprecated) ESCAPE + SHIFT and (active) ESCAPE + COMMAND.
   const AcceleratorData initial_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   const AcceleratorData expected_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   const DeprecatedAcceleratorData deprecated_data[] = {
-      {SHOW_TASK_MANAGER, /*uma_histogram_name=*/"deprecated.showTaskManager",
+      {AcceleratorAction::kShowTaskManager,
+       /*uma_histogram_name=*/"deprecated.showTaskManager",
        /*notification_message_id=*/1, /*old_shortcut_id=*/1,
        /*new_shortcut_id=*/2, /*deprecated_enabled=*/true},
   };
 
   const AcceleratorData test_deprecated_accelerators[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   config_->Initialize(initial_test_data);
@@ -273,27 +283,30 @@
   // Remove the deprecated accelerator ESCAPE + SHIFT.
   const AcceleratorData updated_expected_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
-  AcceleratorConfigResult result =
-      config_->RemoveAccelerator(SHOW_TASK_MANAGER, deprecated_accelerator);
+  AcceleratorConfigResult result = config_->RemoveAccelerator(
+      AcceleratorAction::kShowTaskManager, deprecated_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   // Verify that the accelerator is no longer deprecated.
   EXPECT_FALSE(config_->IsDeprecated(deprecated_accelerator));
-  EXPECT_FALSE(config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
+  EXPECT_FALSE(config_->GetDeprecatedAcceleratorData(
+      AcceleratorAction::kShowTaskManager));
   ExpectAllAcceleratorsEqual(updated_expected_test_data,
                              config_->GetAllAccelerators());
 
-  // Attempt to restore SHOW_TASK_MANAGER, expect deprecated accelerator to NOT
-  // be re-added.
-  result = config_->RestoreDefault(SHOW_TASK_MANAGER);
+  // Attempt to restore AcceleratorAction::kShowTaskManager, expect deprecated
+  // accelerator to NOT be re-added.
+  result = config_->RestoreDefault(AcceleratorAction::kShowTaskManager);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   EXPECT_FALSE(config_->IsDeprecated(deprecated_accelerator));
-  EXPECT_FALSE(config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
+  EXPECT_FALSE(config_->GetDeprecatedAcceleratorData(
+      AcceleratorAction::kShowTaskManager));
   ExpectAllAcceleratorsEqual(updated_expected_test_data,
                              config_->GetAllAccelerators());
 
@@ -302,38 +315,40 @@
   result = config_->RestoreAllDefaults();
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   EXPECT_TRUE(config_->IsDeprecated(deprecated_accelerator));
-  EXPECT_EQ(deprecated_data,
-            config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
+  EXPECT_EQ(deprecated_data, config_->GetDeprecatedAcceleratorData(
+                                 AcceleratorAction::kShowTaskManager));
   ExpectAllAcceleratorsEqual(expected_test_data, config_->GetAllAccelerators());
 }
 
 TEST_F(AshAcceleratorConfigurationTest, IsDefaultAccelerator) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
       {/*trigger_on_press=*/true, ui::VKEY_MEDIA_LAUNCH_APP1,
-       ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT},
+       ui::EF_CONTROL_DOWN, AcceleratorAction::kTakeScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_KBD_BRIGHTNESS_UP, ui::EF_NONE,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
   };
 
   // `Initialize()` sets up the default accelerators.
   config_->Initialize(test_data);
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
 
-  // Verify that Control + Zoom is the default for TOGGLE_MIRROR_MODE.
+  // Verify that Control + Zoom is the default for
+  // AcceleratorAction::kToggleMirrorMode.
   ui::Accelerator expected_default =
       ui::Accelerator(ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN);
   absl::optional<AcceleratorAction> accelerator_id =
       config_->GetIdForDefaultAccelerator(expected_default);
   EXPECT_TRUE(accelerator_id.has_value());
-  EXPECT_EQ(TOGGLE_MIRROR_MODE, accelerator_id.value());
+  EXPECT_EQ(AcceleratorAction::kToggleMirrorMode, accelerator_id.value());
   std::vector<ui::Accelerator> default_accelerators =
-      config_->GetDefaultAcceleratorsForId(TOGGLE_MIRROR_MODE);
+      config_->GetDefaultAcceleratorsForId(
+          AcceleratorAction::kToggleMirrorMode);
   EXPECT_EQ(1u, default_accelerators.size());
   EXPECT_EQ(expected_default, default_accelerators[0]);
 }
@@ -341,15 +356,15 @@
 TEST_F(AshAcceleratorConfigurationTest, MultipleDefaultAccelerators) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_MEDIA_LAUNCH_APP1,
-       ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT},
+       ui::EF_CONTROL_DOWN, AcceleratorAction::kTakeScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_KBD_BRIGHTNESS_UP, ui::EF_NONE,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
   };
 
   // `Initialize()` sets up the default accelerators.
@@ -357,7 +372,7 @@
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
 
   // Verify that Control + Zoom and Alt + Zoom are defaults for
-  // TOGGLE_MIRROR_MODE.
+  // AcceleratorAction::kToggleMirrorMode.
   ui::Accelerator expected_default =
       ui::Accelerator(ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN);
   ui::Accelerator expected_default_2 =
@@ -366,14 +381,15 @@
   absl::optional<AcceleratorAction> accelerator_id =
       config_->GetIdForDefaultAccelerator(expected_default);
   EXPECT_TRUE(accelerator_id.has_value());
-  EXPECT_EQ(TOGGLE_MIRROR_MODE, accelerator_id.value());
+  EXPECT_EQ(AcceleratorAction::kToggleMirrorMode, accelerator_id.value());
 
   accelerator_id = config_->GetIdForDefaultAccelerator(expected_default_2);
   EXPECT_TRUE(accelerator_id.has_value());
-  EXPECT_EQ(TOGGLE_MIRROR_MODE, accelerator_id.value());
+  EXPECT_EQ(AcceleratorAction::kToggleMirrorMode, accelerator_id.value());
 
   std::vector<ui::Accelerator> default_accelerators =
-      config_->GetDefaultAcceleratorsForId(TOGGLE_MIRROR_MODE);
+      config_->GetDefaultAcceleratorsForId(
+          AcceleratorAction::kToggleMirrorMode);
 
   EXPECT_EQ(2u, default_accelerators.size());
 
@@ -383,15 +399,15 @@
 TEST_F(AshAcceleratorConfigurationTest, DefaultNotFound) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
       {/*trigger_on_press=*/true, ui::VKEY_MEDIA_LAUNCH_APP1,
-       ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT},
+       ui::EF_CONTROL_DOWN, AcceleratorAction::kTakeScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_KBD_BRIGHTNESS_UP, ui::EF_NONE,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
   };
 
   // `Initialize()` sets up the default accelerators.
@@ -409,15 +425,15 @@
 TEST_F(AshAcceleratorConfigurationTest, GetAcceleratorsFromActionId) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
       {/*trigger_on_press=*/true, ui::VKEY_MEDIA_LAUNCH_APP1,
-       ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT},
+       ui::EF_CONTROL_DOWN, AcceleratorAction::kTakeScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_KBD_BRIGHTNESS_UP, ui::EF_NONE,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
   };
   config_->Initialize(test_data);
 
@@ -443,13 +459,15 @@
 
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -461,7 +479,7 @@
   // Now update accelerators with a different set of accelerators.
   const AcceleratorData test_data_updated[] = {
       {/*trigger_on_press=*/true, ui::VKEY_J, ui::EF_CONTROL_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
   };
 
   config_->Initialize(test_data_updated);
@@ -475,13 +493,15 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -496,14 +516,16 @@
   // Remove `SWITCH_TO_LAST_USE_IME`.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
@@ -511,18 +533,19 @@
   // There should now be an entry in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
-  const base::Value::List* accelerator_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
-  // Removing one accelerator in `SWITCH_TO_LAST_USED_IME` will result in
+  // `kSwitchToLastUsedIme`.
+  const base::Value::List* accelerator_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
+  // Removing one accelerator in `kSwitchToLastUsedIme` will result in
   // the removed accelerator in the override with `kRemove`.
   EXPECT_EQ(1u, accelerator_overrides->size());
   AcceleratorModificationData override_data =
       ValueToAcceleratorModificationData(
           accelerator_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-                      override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kRemove, override_data.action);
 
   // Compare expected accelerators and that the observer was fired after
@@ -532,7 +555,7 @@
 
   // Attempt to remove the accelerator again, expect to return error.
   AcceleratorConfigResult re_remove_result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kNotFound, re_remove_result);
 
@@ -545,7 +568,7 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   config_->Initialize(test_data);
@@ -555,7 +578,8 @@
 
   // Attempt to remove an accelerator with an action ID that doesn't exist.
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      CYCLE_BACKWARD_MRU, ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
+      AcceleratorAction::kCycleBackwardMru,
+      ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kNotFound, result);
 
   // Nothing should change.
@@ -567,7 +591,7 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   config_->Initialize(test_data);
@@ -578,7 +602,7 @@
   // Remove an accelerator that doesn't exist, but with an
   // existing action ID. Expect no change.
   AcceleratorConfigResult updated_result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_M, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kNotFound, updated_result);
 
@@ -591,13 +615,15 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, BRIGHTNESS_DOWN},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kBrightnessDown},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -608,24 +634,27 @@
   // Remove `SWITCH_TO_LAST_USE_IME`.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   ui::Accelerator removed_accelerator =
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result =
-      config_->RemoveAccelerator(SWITCH_TO_LAST_USED_IME, removed_accelerator);
+  AcceleratorConfigResult result = config_->RemoveAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, removed_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // We removed a default accelerator, it should still be cached as a default.
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME,
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme,
             config_->GetIdForDefaultAccelerator(removed_accelerator));
   std::vector<ui::Accelerator> default_accelerators =
-      config_->GetDefaultAcceleratorsForId(SWITCH_TO_LAST_USED_IME);
+      config_->GetDefaultAcceleratorsForId(
+          AcceleratorAction::kSwitchToLastUsedIme);
   EXPECT_EQ(1u, default_accelerators.size());
   EXPECT_EQ(removed_accelerator, default_accelerators[0]);
 
@@ -639,13 +668,15 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -656,14 +687,16 @@
   // Remove `SWITCH_TO_LAST_USE_IME`.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
@@ -686,13 +719,15 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -721,13 +756,15 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -738,14 +775,16 @@
   // Remove `SWITCH_TO_LAST_USE_IME`.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
@@ -754,8 +793,8 @@
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
   EXPECT_EQ(2, observer_.num_times_accelerator_updated_called());
 
-  // Reset the `SWITCH_TO_LAST_USED_IME` action..
-  result = config_->RestoreDefault(SWITCH_TO_LAST_USED_IME);
+  // Reset the `AcceleratorAction::kSwitchToLastUsedIme` action..
+  result = config_->RestoreDefault(AcceleratorAction::kSwitchToLastUsedIme);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Expect accelerators to revert back to the default state and observer
@@ -764,7 +803,7 @@
   EXPECT_EQ(3, observer_.num_times_accelerator_updated_called());
 
   // Reset one more time, no changes should be made.
-  result = config_->RestoreDefault(SWITCH_TO_LAST_USED_IME);
+  result = config_->RestoreDefault(AcceleratorAction::kSwitchToLastUsedIme);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // No changes to be made, but observer should be called.
@@ -776,13 +815,15 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -793,7 +834,7 @@
   // `BRIGHTNESS_DOWN` is not a valid accelerator, so this should return an
   // error.
   const AcceleratorConfigResult result =
-      config_->RestoreDefault(BRIGHTNESS_DOWN);
+      config_->RestoreDefault(AcceleratorAction::kBrightnessDown);
   EXPECT_EQ(AcceleratorConfigResult::kNotFound, result);
 
   // Expect nothing to change.
@@ -806,11 +847,13 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -818,21 +861,23 @@
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
   EXPECT_EQ(1, observer_.num_times_accelerator_updated_called());
 
-  // Add CTRL + SPACE to SWITCH_TO_LAST_USED_IME.
+  // Add CTRL + SPACE to AcceleratorAction::kSwitchToLastUsedIme.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   const ui::Accelerator new_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -842,7 +887,7 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 }
 
 // Add accelerator that conflict with default accelerator.
@@ -850,11 +895,13 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -862,21 +909,23 @@
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
   EXPECT_EQ(1, observer_.num_times_accelerator_updated_called());
 
-  // Add ALT + SHIFT + TAB to SWITCH_TO_LAST_USED_IME, which conflicts with
-  // CYCLE_BACKWARD_MRU.
+  // Add ALT + SHIFT + TAB to AcceleratorAction::kSwitchToLastUsedIme, which
+  // conflicts with AcceleratorAction::kCycleBackwardMru.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
   };
 
   const ui::Accelerator new_accelerator(ui::VKEY_TAB,
                                         ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -886,11 +935,11 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 
   // Confirm that conflicting accelerator was removed.
   const std::vector<ui::Accelerator>& backward_mru_accelerators =
-      config_->GetAcceleratorsForAction(CYCLE_BACKWARD_MRU);
+      config_->GetAcceleratorsForAction(AcceleratorAction::kCycleBackwardMru);
   EXPECT_TRUE(backward_mru_accelerators.empty());
 }
 
@@ -899,33 +948,38 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   const DeprecatedAcceleratorData deprecated_data[] = {
-      {SHOW_TASK_MANAGER, /*uma_histogram_name=*/"deprecated.showTaskManager",
+      {AcceleratorAction::kShowTaskManager,
+       /*uma_histogram_name=*/"deprecated.showTaskManager",
        /*notification_message_id=*/1, /*old_shortcut_id=*/1,
        /*new_shortcut_id=*/2, /*deprecated_enabled=*/true},
   };
 
   const AcceleratorData test_deprecated_accelerators[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   const AcceleratorData initial_expected_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
 
   config_->Initialize(test_data);
@@ -941,21 +995,23 @@
                                                ui::EF_SHIFT_DOWN);
   EXPECT_TRUE(config_->IsDeprecated(deprecated_accelerator));
 
-  // Add SHIFT + ESCAPE to SWITCH_TO_LAST_USED_IME, which conflicts with
-  // a deprecated accelerator.
+  // Add SHIFT + ESCAPE to AcceleratorAction::kSwitchToLastUsedIme, which
+  // conflicts with a deprecated accelerator.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   AcceleratorConfigResult result = config_->AddUserAccelerator(
-      SWITCH_TO_LAST_USED_IME, deprecated_accelerator);
+      AcceleratorAction::kSwitchToLastUsedIme, deprecated_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -965,7 +1021,7 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(deprecated_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 
   // Confirm that the deprecated accelerator was removed.
   EXPECT_FALSE(config_->IsDeprecated(deprecated_accelerator));
@@ -976,11 +1032,13 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -988,21 +1046,23 @@
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
   EXPECT_EQ(1, observer_.num_times_accelerator_updated_called());
 
-  // Add CTRL + SPACE to SWITCH_TO_LAST_USED_IME.
+  // Add CTRL + SPACE to AcceleratorAction::kSwitchToLastUsedIme.
   const AcceleratorData added_updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   const ui::Accelerator new_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -1013,20 +1073,23 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 
-  // Remove CTRL + SPACE from SWITCH_TO_LAST_USED_IME.
+  // Remove CTRL + SPACE from AcceleratorAction::kSwitchToLastUsedIme.
   const AcceleratorData removed_updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   // Remove the accelerator now.
-  result = config_->RemoveAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  result = config_->RemoveAccelerator(AcceleratorAction::kSwitchToLastUsedIme,
+                                      new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   EXPECT_EQ(3, observer_.num_times_accelerator_updated_called());
   ExpectAllAcceleratorsEqual(removed_updated_test_data,
@@ -1039,11 +1102,13 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -1051,21 +1116,23 @@
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
   EXPECT_EQ(1, observer_.num_times_accelerator_updated_called());
 
-  // Add CTRL + SPACE to SWITCH_TO_LAST_USED_IME.
+  // Add CTRL + SPACE to AcceleratorAction::kSwitchToLastUsedIme.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   const ui::Accelerator new_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -1075,10 +1142,10 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 
   // Restore default, expect to be back to default state.
-  result = config_->RestoreDefault(SWITCH_TO_LAST_USED_IME);
+  result = config_->RestoreDefault(AcceleratorAction::kSwitchToLastUsedIme);
   EXPECT_EQ(3, observer_.num_times_accelerator_updated_called());
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   EXPECT_FALSE(config_->FindAcceleratorAction(new_accelerator));
@@ -1090,11 +1157,13 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -1102,21 +1171,23 @@
   ExpectAllAcceleratorsEqual(test_data, config_->GetAllAccelerators());
   EXPECT_EQ(1, observer_.num_times_accelerator_updated_called());
 
-  // Add CTRL + SPACE to SWITCH_TO_LAST_USED_IME.
+  // Add CTRL + SPACE to AcceleratorAction::kSwitchToLastUsedIme.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   const ui::Accelerator new_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -1126,34 +1197,38 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 
-  // Add CTRL + SPACE to CYCLE_BACKWARD_MRU.
+  // Add CTRL + SPACE to AcceleratorAction::kCycleBackwardMru.
   const AcceleratorData reupdated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       CYCLE_BACKWARD_MRU},
+       AcceleratorAction::kCycleBackwardMru},
   };
-  result = config_->AddUserAccelerator(CYCLE_BACKWARD_MRU, new_accelerator);
+  result = config_->AddUserAccelerator(AcceleratorAction::kCycleBackwardMru,
+                                       new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   ExpectAllAcceleratorsEqual(reupdated_test_data,
                              config_->GetAllAccelerators());
   const AcceleratorAction* found_action2 =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action2);
-  EXPECT_EQ(CYCLE_BACKWARD_MRU, *found_action2);
+  EXPECT_EQ(AcceleratorAction::kCycleBackwardMru, *found_action2);
 }
 
 TEST_F(AshAcceleratorConfigurationTest, ReplaceAccelerator) {
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   config_->Initialize(test_data);
@@ -1164,14 +1239,15 @@
   // Replace  CTRL + ALT + SPACE -> CTRL + VKEY_M.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   const ui::Accelerator old_accelerator(ui::VKEY_SPACE,
                                         ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
   const ui::Accelerator new_accelerator(ui::VKEY_M, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result = config_->ReplaceAccelerator(
-      SWITCH_TO_LAST_USED_IME, old_accelerator, new_accelerator);
+  AcceleratorConfigResult result =
+      config_->ReplaceAccelerator(AcceleratorAction::kSwitchToLastUsedIme,
+                                  old_accelerator, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -1181,14 +1257,15 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 }
 
 TEST_F(AshAcceleratorConfigurationTest, ReplaceNonExistentAccelerator) {
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   config_->Initialize(test_data);
@@ -1199,8 +1276,9 @@
   const ui::Accelerator old_accelerator(ui::VKEY_J, ui::EF_CONTROL_DOWN);
   const ui::Accelerator new_accelerator(ui::VKEY_C, ui::EF_COMMAND_DOWN);
 
-  AcceleratorConfigResult result = config_->ReplaceAccelerator(
-      SWITCH_TO_LAST_USED_IME, old_accelerator, new_accelerator);
+  AcceleratorConfigResult result =
+      config_->ReplaceAccelerator(AcceleratorAction::kSwitchToLastUsedIme,
+                                  old_accelerator, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kNotFound, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -1212,7 +1290,8 @@
   EXPECT_EQ(0, observer_.num_times_accelerator_updated_called());
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   config_->Initialize(test_data);
@@ -1223,14 +1302,15 @@
   // Replace  CTRL + ALT + SPACE -> CTRL + VKEY_M.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   const ui::Accelerator old_accelerator(ui::VKEY_SPACE,
                                         ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
   const ui::Accelerator new_accelerator(ui::VKEY_M, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result = config_->ReplaceAccelerator(
-      SWITCH_TO_LAST_USED_IME, old_accelerator, new_accelerator);
+  AcceleratorConfigResult result =
+      config_->ReplaceAccelerator(AcceleratorAction::kSwitchToLastUsedIme,
+                                  old_accelerator, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Compare expected accelerators and that the observer was fired after
@@ -1240,7 +1320,7 @@
   const AcceleratorAction* found_action =
       config_->FindAcceleratorAction(new_accelerator);
   EXPECT_TRUE(found_action);
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME, *found_action);
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme, *found_action);
 
   // Restore defaults, expect everything to be back to default state.
   config_->RestoreAllDefaults();
@@ -1252,13 +1332,15 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -1268,7 +1350,7 @@
   EXPECT_TRUE(pref_overrides.empty());
 
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
@@ -1276,18 +1358,19 @@
   // There should now be an entry in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
-  const base::Value::List* accelerator_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
-  // Removing one accelerator in `SWITCH_TO_LAST_USED_IME` will result in
-  // one default accelerator remaining.
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
+  const base::Value::List* accelerator_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
+  // Removing one accelerator in `AcceleratorAction::kSwitchToLastUsedIme` will
+  // result in one default accelerator remaining.
   EXPECT_EQ(1u, accelerator_overrides->size());
   AcceleratorModificationData override_data =
       ValueToAcceleratorModificationData(
           accelerator_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-                      override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kRemove, override_data.action);
 
   // Simulate login on another account, expect the pref to not be present.
@@ -1306,11 +1389,13 @@
   // Verify pref overrides were applied correctly.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
 }
@@ -1319,13 +1404,15 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -1335,7 +1422,7 @@
   EXPECT_TRUE(pref_overrides.empty());
 
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
@@ -1343,18 +1430,19 @@
   // There should now be an entry in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
-  const base::Value::List* accelerator_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
+  const base::Value::List* accelerator_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
   EXPECT_EQ(1u, accelerator_overrides->size());
-  // Removing one accelerator in `SWITCH_TO_LAST_USED_IME` will result in
-  // one entry with the `kRemove` tag.
+  // Removing one accelerator in `AcceleratorAction::kSwitchToLastUsedIme` will
+  // result in one entry with the `kRemove` tag.
   AcceleratorModificationData override_data =
       ValueToAcceleratorModificationData(
           accelerator_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-                      override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kRemove, override_data.action);
 
   // Now re-login to the original profile.
@@ -1367,11 +1455,13 @@
   // Verify pref overrides were applied correctly.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
 
@@ -1394,13 +1484,15 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
 
   config_->Initialize(test_data);
@@ -1410,7 +1502,7 @@
   EXPECT_TRUE(pref_overrides.empty());
 
   AcceleratorConfigResult result = config_->RemoveAccelerator(
-      SWITCH_TO_LAST_USED_IME,
+      AcceleratorAction::kSwitchToLastUsedIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN));
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
@@ -1418,18 +1510,19 @@
   // There should now be an entry in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
-  const base::Value::List* accelerator_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
-  // Removing one accelerator in `SWITCH_TO_LAST_USED_IME` will result in
-  // one entry with the `kRemove` tag.
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
+  const base::Value::List* accelerator_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
+  // Removing one accelerator in `AcceleratorAction::kSwitchToLastUsedIme` will
+  // result in one entry with the `kRemove` tag.
   EXPECT_EQ(1u, accelerator_overrides->size());
   AcceleratorModificationData override_data =
       ValueToAcceleratorModificationData(
           accelerator_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-                      override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kRemove, override_data.action);
 
   // Now re-login to the original profile.
@@ -1442,16 +1535,18 @@
   // Verify pref overrides were applied correctly.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
   };
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
 
   // Now reset the action to default.
-  result = config_->RestoreDefault(SWITCH_TO_LAST_USED_IME);
+  result = config_->RestoreDefault(AcceleratorAction::kSwitchToLastUsedIme);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Relogin, expect shortcuts to be back to default.
@@ -1468,9 +1563,10 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   config_->Initialize(test_data);
@@ -1480,35 +1576,38 @@
   EXPECT_TRUE(pref_overrides.empty());
 
   const ui::Accelerator new_accelerator(ui::VKEY_A, ui::EF_COMMAND_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   const base::Value::Dict& updated_overrides = GetOverridePref();
   // There should now be an entry in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
-  const base::Value::List* accelerator_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
-  // Expect 1 override accelerator for `SWITCH_TO_LAST_USED_IME`.
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
+  const base::Value::List* accelerator_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
+  // Expect 1 override accelerator for
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
   EXPECT_EQ(1u, accelerator_overrides->size());
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
 
   AcceleratorModificationData override_data =
       ValueToAcceleratorModificationData(
           accelerator_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_A,
-                       ui::EF_COMMAND_DOWN, SWITCH_TO_LAST_USED_IME},
-                      override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kAdd, override_data.action);
 
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
@@ -1536,9 +1635,9 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
   };
 
   config_->Initialize(test_data);
@@ -1547,40 +1646,44 @@
   const base::Value::Dict& pref_overrides = GetOverridePref();
   EXPECT_TRUE(pref_overrides.empty());
 
-  // Search + C exists in `TOGGLE_CALENDAR`, so this should result in adding a
-  // new accelerator to `SWITCH_TO_LAST_USED_IME` and removing an accelerator
-  // from `TOGGLE_CALENDAR`.
+  // Search + C exists in `AcceleratorAction::kToggleCalendar`, so this should
+  // result in adding a new accelerator to
+  // `AcceleratorAction::kSwitchToLastUsedIme` and removing an accelerator from
+  // `AcceleratorAction::kToggleCalendar`.
   const ui::Accelerator new_accelerator(ui::VKEY_C, ui::EF_COMMAND_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   const base::Value::Dict& updated_overrides = GetOverridePref();
   // There two entries in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
   const base::Value::List* switch_to_last_used_ime_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
+      updated_overrides.FindList(
+          base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
 
   // Confirm that prefs are stored correctly.
   EXPECT_EQ(1u, switch_to_last_used_ime_overrides->size());
   AcceleratorModificationData switch_ime_override_data =
       ValueToAcceleratorModificationData(
           switch_to_last_used_ime_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_C,
-                       ui::EF_COMMAND_DOWN, SWITCH_TO_LAST_USED_IME},
-                      switch_ime_override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      switch_ime_override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kAdd,
             switch_ime_override_data.action);
 
   const AcceleratorData expected_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
-  // `switch_to_last_used_ime_data` has all the available accelerators.
+  // `AcceleratorAction::kSwitchToLastUsedIme_data` has all the available
+  // accelerators.
   ExpectAllAcceleratorsEqual(expected_test_data, config_->GetAllAccelerators());
 
   // Lock screen and sign into another user.
@@ -1600,10 +1703,11 @@
   EXPECT_EQ(1u, relogin_overrides.size());
 
   // Verify pref overrides were applied correctly.
-  EXPECT_EQ(SWITCH_TO_LAST_USED_IME,
+  EXPECT_EQ(AcceleratorAction::kSwitchToLastUsedIme,
             *config_->FindAcceleratorAction(new_accelerator));
 
-  // `switch_to_last_used_ime_data` has all the available accelerators.
+  // `AcceleratorAction::kSwitchToLastUsedIme_data` has all the available
+  // accelerators.
   ExpectAllAcceleratorsEqual(expected_test_data, config_->GetAllAccelerators());
 }
 
@@ -1612,11 +1716,11 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
       {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
-       TOGGLE_DICTATION},
+       AcceleratorAction::kToggleDictation},
   };
 
   config_->Initialize(test_data);
@@ -1625,72 +1729,79 @@
   const base::Value::Dict& pref_overrides = GetOverridePref();
   EXPECT_TRUE(pref_overrides.empty());
 
-  // Search + C exists in `TOGGLE_CALENDAR`, so this should result in adding a
-  // new accelerator to `SWITCH_TO_LAST_USED_IME` and removing an accelerator
-  // from `TOGGLE_CALENDAR`.
+  // Search + C exists in `AcceleratorAction::kToggleCalendar`, so this should
+  // result in adding a new accelerator to
+  // `AcceleratorAction::kSwitchToLastUsedIme` and removing an accelerator from
+  // `AcceleratorAction::kToggleCalendar`.
   const ui::Accelerator new_accelerator(ui::VKEY_C, ui::EF_COMMAND_DOWN);
-  AcceleratorConfigResult result =
-      config_->AddUserAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->AddUserAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   const base::Value::Dict& updated_overrides = GetOverridePref();
   // There is one entry in the pref overrides.
   EXPECT_EQ(1u, updated_overrides.size());
   // Expect the pref to have one entry that has the key of
-  // `SWITCH_TO_LAST_USED_IME`.
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
   const base::Value::List* switch_to_last_used_ime_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
+      updated_overrides.FindList(
+          base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
 
   // Confirm that prefs are stored correctly.
   EXPECT_EQ(1u, switch_to_last_used_ime_overrides->size());
   AcceleratorModificationData switch_ime_override_data =
       ValueToAcceleratorModificationData(
           switch_to_last_used_ime_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_C,
-                       ui::EF_COMMAND_DOWN, SWITCH_TO_LAST_USED_IME},
-                      switch_ime_override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      switch_ime_override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kAdd,
             switch_ime_override_data.action);
 
   const AcceleratorData expected_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
-       TOGGLE_DICTATION},
+       AcceleratorAction::kToggleDictation},
   };
-  // `switch_to_last_used_ime_data` has all the available accelerators.
+  // `AcceleratorAction::kSwitchToLastUsedIme_data` has all the available
+  // accelerators.
   ExpectAllAcceleratorsEqual(expected_test_data, config_->GetAllAccelerators());
 
-  // Now have `TOGGLE_DICTATION` add Search + C, removing it from
-  // `SWITCH_TO_LAST_USED_IME`.
-  result = config_->AddUserAccelerator(TOGGLE_DICTATION, new_accelerator);
+  // Now have `AcceleratorAction::kToggleDictation` add Search + C, removing it
+  // from `AcceleratorAction::kSwitchToLastUsedIme`.
+  result = config_->AddUserAccelerator(AcceleratorAction::kToggleDictation,
+                                       new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
-  // Expect just one entry, since `SWITCH_TO_LAST_USED_IME` no longer holds the
-  // Search + C accelerator.
+  // Expect just one entry, since `AcceleratorAction::kSwitchToLastUsedIme` no
+  // longer holds the Search + C accelerator.
   const base::Value::Dict& updated_overrides_2 = GetOverridePref();
   EXPECT_EQ(1u, updated_overrides_2.size());
 
   const base::Value::List* toggle_dictation_overrides =
-      updated_overrides_2.FindList(base::NumberToString(TOGGLE_DICTATION));
+      updated_overrides_2.FindList(
+          base::NumberToString(AcceleratorAction::kToggleDictation));
   // Confirm that prefs are stored correctly.
   EXPECT_EQ(1u, toggle_dictation_overrides->size());
   AcceleratorModificationData toggle_dictation_data =
       ValueToAcceleratorModificationData(
           toggle_dictation_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_C,
-                       ui::EF_COMMAND_DOWN, SWITCH_TO_LAST_USED_IME},
-                      toggle_dictation_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      toggle_dictation_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kAdd, toggle_dictation_data.action);
 
   const AcceleratorData expected_test_data_2[] = {
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_DICTATION},
+       AcceleratorAction::kToggleDictation},
       {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
-       TOGGLE_DICTATION},
+       AcceleratorAction::kToggleDictation},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
   };
   ExpectAllAcceleratorsEqual(expected_test_data_2,
                              config_->GetAllAccelerators());
@@ -1712,9 +1823,11 @@
   EXPECT_EQ(1u, relogin_overrides.size());
 
   // Verify pref overrides were applied correctly.
-  EXPECT_EQ(TOGGLE_DICTATION, *config_->FindAcceleratorAction(new_accelerator));
+  EXPECT_EQ(AcceleratorAction::kToggleDictation,
+            *config_->FindAcceleratorAction(new_accelerator));
 
-  // `switch_to_last_used_ime_data` has all the available accelerators.
+  // `AcceleratorAction::kSwitchToLastUsedIme_data` has all the available
+  // accelerators.
   ExpectAllAcceleratorsEqual(expected_test_data_2,
                              config_->GetAllAccelerators());
 }
@@ -1723,11 +1836,12 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
   };
 
   config_->Initialize(test_data);
@@ -1736,47 +1850,51 @@
   const base::Value::Dict& pref_overrides = GetOverridePref();
   EXPECT_TRUE(pref_overrides.empty());
 
-  // Remove Ctrl + space from `SWITCH_TO_LAST_USED_IME`.
+  // Remove Ctrl + space from `AcceleratorAction::kSwitchToLastUsedIme`.
   ui::Accelerator new_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
-  AcceleratorConfigResult result =
-      config_->RemoveAccelerator(SWITCH_TO_LAST_USED_IME, new_accelerator);
+  AcceleratorConfigResult result = config_->RemoveAccelerator(
+      AcceleratorAction::kSwitchToLastUsedIme, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
-  // Now add Ctrl + Space to `TOGGLE_CALENDAR`.
-  result = config_->AddUserAccelerator(TOGGLE_CALENDAR, new_accelerator);
+  // Now add Ctrl + Space to `AcceleratorAction::kToggleCalendar`.
+  result = config_->AddUserAccelerator(AcceleratorAction::kToggleCalendar,
+                                       new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
   const base::Value::Dict& remove_add_overrides = GetOverridePref();
   EXPECT_EQ(2u, remove_add_overrides.size());
 
   // Verify prefs are populated correctly.
   const base::Value::Dict& updated_overrides = GetOverridePref();
-  const base::Value::List* last_used_ime_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
+  const base::Value::List* last_used_ime_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
   AcceleratorModificationData override_data =
       ValueToAcceleratorModificationData(
           last_used_ime_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-                      override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kRemove, override_data.action);
 
   // Now verify add pref is present.
   const base::Value::List* toggle_calendar_overrides =
-      updated_overrides.FindList(base::NumberToString(TOGGLE_CALENDAR));
+      updated_overrides.FindList(
+          base::NumberToString(AcceleratorAction::kToggleCalendar));
   override_data = ValueToAcceleratorModificationData(
       toggle_calendar_overrides->front().GetDict());
   CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, TOGGLE_CALENDAR},
+                       ui::EF_CONTROL_DOWN, AcceleratorAction::kToggleCalendar},
                       override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kAdd, override_data.action);
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
   };
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
 
@@ -1803,11 +1921,12 @@
   SimulateNewUserFirstLogin(kFakeUserEmail);
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
   };
 
   config_->Initialize(test_data);
@@ -1816,41 +1935,46 @@
   const base::Value::Dict& pref_overrides = GetOverridePref();
   EXPECT_TRUE(pref_overrides.empty());
 
-  // Replace Ctrl + Space with Meta + A in `SWITCH_TO_LAST_USED_IME`.
+  // Replace Ctrl + Space with Meta + A in
+  // `AcceleratorAction::kSwitchToLastUsedIme`.
   ui::Accelerator old_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
   ui::Accelerator new_accelerator(ui::VKEY_A, ui::EF_COMMAND_DOWN);
-  AcceleratorConfigResult result = config_->ReplaceAccelerator(
-      SWITCH_TO_LAST_USED_IME, old_accelerator, new_accelerator);
+  AcceleratorConfigResult result =
+      config_->ReplaceAccelerator(AcceleratorAction::kSwitchToLastUsedIme,
+                                  old_accelerator, new_accelerator);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
 
   // Verify prefs are populated correctly.
   const base::Value::Dict& updated_overrides = GetOverridePref();
-  const base::Value::List* last_used_ime_overrides =
-      updated_overrides.FindList(base::NumberToString(SWITCH_TO_LAST_USED_IME));
+  const base::Value::List* last_used_ime_overrides = updated_overrides.FindList(
+      base::NumberToString(AcceleratorAction::kSwitchToLastUsedIme));
   AcceleratorModificationData remove_override_data =
       ValueToAcceleratorModificationData(
           last_used_ime_overrides->front().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_SPACE,
-                       ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-                      remove_override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      remove_override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kRemove,
             remove_override_data.action);
 
   AcceleratorModificationData add_override_data =
       ValueToAcceleratorModificationData(
           last_used_ime_overrides->back().GetDict());
-  CompareAccelerators({/*trigger_on_press=*/true, ui::VKEY_A,
-                       ui::EF_COMMAND_DOWN, SWITCH_TO_LAST_USED_IME},
-                      add_override_data.accelerator);
+  CompareAccelerators(
+      {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
+      add_override_data.accelerator);
   EXPECT_EQ(AcceleratorModificationAction::kAdd, add_override_data.action);
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_A, ui::EF_COMMAND_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE,
-       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, SWITCH_TO_LAST_USED_IME},
+       ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
   };
   ExpectAllAcceleratorsEqual(updated_test_data, config_->GetAllAccelerators());
 
diff --git a/ash/accelerators/debug_commands.cc b/ash/accelerators/debug_commands.cc
index e2de2f43..fcf5507e 100644
--- a/ash/accelerators/debug_commands.cc
+++ b/ash/accelerators/debug_commands.cc
@@ -232,7 +232,7 @@
   DCHECK(floated_window);
 
   const float velocity_x =
-      action == DEBUG_TUCK_FLOATED_WINDOW_LEFT ? -500.f : 500.f;
+      action == AcceleratorAction::kDebugTuckFloatedWindowLeft ? -500.f : 500.f;
   Shell::Get()->float_controller()->OnFlingOrSwipeForTablet(floated_window,
                                                             velocity_x,
                                                             /*velocity_y=*/0.f);
@@ -297,62 +297,62 @@
     return;
 
   switch (action) {
-    case DEBUG_KEYBOARD_BACKLIGHT_TOGGLE:
+    case AcceleratorAction::kDebugKeyboardBacklightToggle:
       HandleToggleKeyboardBacklight();
       break;
-    case DEBUG_MICROPHONE_MUTE_TOGGLE:
+    case AcceleratorAction::kDebugMicrophoneMuteToggle:
       HandleToggleMicrophoneMute();
       break;
-    case DEBUG_PRINT_LAYER_HIERARCHY:
+    case AcceleratorAction::kDebugPrintLayerHierarchy:
       HandlePrintLayerHierarchy();
       break;
-    case DEBUG_PRINT_VIEW_HIERARCHY:
+    case AcceleratorAction::kDebugPrintViewHierarchy:
       HandlePrintViewHierarchy();
       break;
-    case DEBUG_PRINT_WINDOW_HIERARCHY:
+    case AcceleratorAction::kDebugPrintWindowHierarchy:
       HandlePrintWindowHierarchy();
       break;
-    case DEBUG_SHOW_TOAST:
+    case AcceleratorAction::kDebugShowToast:
       HandleShowToast();
       break;
-    case DEBUG_SYSTEM_UI_STYLE_VIEWER:
+    case AcceleratorAction::kDebugSystemUiStyleViewer:
       SystemUIComponentsStyleViewerView::CreateAndShowWidget();
       break;
-    case DEBUG_TOGGLE_DARK_MODE:
+    case AcceleratorAction::kDebugToggleDarkMode:
       HandleToggleDarkMode();
       break;
-    case DEBUG_TOGGLE_DYNAMIC_COLOR:
+    case AcceleratorAction::kDebugToggleDynamicColor:
       HandleToggleDynamicColor();
       break;
-    case DEBUG_TOGGLE_GLANCEABLES:
+    case AcceleratorAction::kDebugToggleGlanceables:
       HandleToggleGlanceables();
       break;
-    case DEBUG_TOGGLE_POWER_BUTTON_MENU:
+    case AcceleratorAction::kDebugTogglePowerButtonMenu:
       HandleTogglePowerButtonMenu();
       break;
-    case DEBUG_TOGGLE_TOUCH_PAD:
+    case AcceleratorAction::kDebugToggleTouchPad:
       HandleToggleTouchpad();
       break;
-    case DEBUG_TOGGLE_TOUCH_SCREEN:
+    case AcceleratorAction::kDebugToggleTouchScreen:
       HandleToggleTouchscreen();
       break;
-    case DEBUG_TOGGLE_TABLET_MODE:
+    case AcceleratorAction::kDebugToggleTabletMode:
       HandleToggleTabletMode();
       break;
-    case DEBUG_TOGGLE_WALLPAPER_MODE:
+    case AcceleratorAction::kDebugToggleWallpaperMode:
       HandleToggleWallpaperMode();
       break;
-    case DEBUG_TRIGGER_CRASH:
+    case AcceleratorAction::kDebugTriggerCrash:
       HandleTriggerCrash();
       break;
-    case DEBUG_TOGGLE_HUD_DISPLAY:
+    case AcceleratorAction::kDebugToggleHudDisplay:
       HandleTriggerHUDDisplay();
       break;
-    case DEBUG_TUCK_FLOATED_WINDOW_LEFT:
-    case DEBUG_TUCK_FLOATED_WINDOW_RIGHT:
+    case AcceleratorAction::kDebugTuckFloatedWindowLeft:
+    case AcceleratorAction::kDebugTuckFloatedWindowRight:
       HandleTuckFloatedWindow(action);
       break;
-    case DEBUG_TOGGLE_VIDEO_CONFERENCE_CAMERA_TRAY_ICON:
+    case AcceleratorAction::kDebugToggleVideoConferenceCameraTrayIcon:
       HandleToggleVideoConferenceCameraTrayIcon();
       break;
     default:
diff --git a/ash/ambient/DEPS b/ash/ambient/DEPS
index 833722a..910a7450 100644
--- a/ash/ambient/DEPS
+++ b/ash/ambient/DEPS
@@ -11,6 +11,9 @@
   "ambient_controller.*": [
     "+chromeos/ash/components/assistant/buildflags.h",
   ],
+  "screensaver_images_policy_handler.*" : [
+    "+chromeos/ash/components/login",
+  ],
   ".*test.cc": [
     "+cc/test",
   ],
diff --git a/ash/ambient/managed/screensaver_image_downloader.cc b/ash/ambient/managed/screensaver_image_downloader.cc
index 87cbcf72..fa7c1f4 100644
--- a/ash/ambient/managed/screensaver_image_downloader.cc
+++ b/ash/ambient/managed/screensaver_image_downloader.cc
@@ -163,6 +163,10 @@
                      download_directory_));
 }
 
+base::FilePath ScreensaverImageDownloader::GetDowloadDirForTesting() {
+  return download_directory_;
+}
+
 void ScreensaverImageDownloader::StartDownloadJob(
     std::unique_ptr<Job> download_job) {
   queue_state_ = QueueState::kDownloading;
diff --git a/ash/ambient/managed/screensaver_image_downloader.h b/ash/ambient/managed/screensaver_image_downloader.h
index 8d17f86..a8f7258e 100644
--- a/ash/ambient/managed/screensaver_image_downloader.h
+++ b/ash/ambient/managed/screensaver_image_downloader.h
@@ -97,6 +97,8 @@
   // Clears out the download folder.
   void DeleteDownloadedImages();
 
+  base::FilePath GetDowloadDirForTesting();
+
  private:
   friend class ScreensaverImageDownloaderTest;
 
diff --git a/ash/ambient/managed/screensaver_images_policy_handler.cc b/ash/ambient/managed/screensaver_images_policy_handler.cc
index 44237bf..7476808 100644
--- a/ash/ambient/managed/screensaver_images_policy_handler.cc
+++ b/ash/ambient/managed/screensaver_images_policy_handler.cc
@@ -13,6 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/functional/callback.h"
 #include "base/path_service.h"
+#include "chromeos/ash/components/login/login_state/login_state.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -22,12 +23,19 @@
 namespace {
 
 constexpr char kCacheDirectoryName[] = "managed_screensaver";
+constexpr char kManagedGuestsCacheDirectoryPath[] =
+    "/var/cache/managed_screensaver/guest";
 
 // This limit is specified in the policy definition for the policies
 // ScreensaverLockScreenImages and DeviceScreensaverLoginScreenImages.
 constexpr size_t kMaxUrlsToProcessFromPolicy = 25u;
 
 base::FilePath GetDownloaderRootPath() {
+  if (LoginState::IsInitialized() && LoginState::Get()->IsPublicSessionUser()) {
+    return base::FilePath(kManagedGuestsCacheDirectoryPath);
+  }
+  // TODO(b/271093537): Support the folder location for sign-in screensaver.
+
   base::FilePath home_dir;
   CHECK(base::PathService::Get(base::DIR_HOME, &home_dir));
   return home_dir.Append(FILE_PATH_LITERAL(kCacheDirectoryName));
diff --git a/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc b/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc
index 769d98e..7250b621 100644
--- a/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc
+++ b/ash/ambient/managed/screensaver_images_policy_handler_unittest.cc
@@ -23,6 +23,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/test/repeating_test_future.h"
 #include "base/test/scoped_path_override.h"
+#include "chromeos/ash/components/login/login_state/scoped_test_public_session_login_state.h"
 #include "components/prefs/testing_pref_service.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_url_loader_factory.h"
@@ -38,6 +39,8 @@
 constexpr char kFakeFilePath2[] = "/path/to/file2";
 
 constexpr char kCacheDirectoryName[] = "managed_screensaver";
+constexpr char kManagedGuestsCacheDirectoryPath[] =
+    "/var/cache/managed_screensaver/guest";
 constexpr char kCacheFileExt[] = ".cache";
 
 constexpr char kImageUrl1[] = "https://example.com/1.jpg";
@@ -81,7 +84,20 @@
     policy_handler_->OnDownloadJobCompleted(result, path);
   }
 
-  void CreateHandlerInstanceWithUserProfile() {
+  ScreensaverImageDownloader* GetPrivateImageDownloader(
+      const ScreensaverImagesPolicyHandler& policy_handler) {
+    return policy_handler.image_downloader_.get();
+  }
+
+  void VerifyPrivateImageDownloaderDownloadFolder(
+      const ScreensaverImagesPolicyHandler& policy_handler,
+      const base::FilePath& expected_path) {
+    ASSERT_TRUE(policy_handler.image_downloader_.get());
+    EXPECT_EQ(expected_path,
+              policy_handler.image_downloader_->GetDowloadDirForTesting());
+  }
+
+  void RegisterUserWithUserPrefs(const AccountId& account_id) {
     // Create a fake user prefs map.
     auto user_prefs = std::make_unique<TestingPrefServiceSimple>();
     RegisterUserProfilePrefs(user_prefs->registry(), /*for_test=*/true);
@@ -93,15 +109,24 @@
     GetSessionControllerClient()->AddUserSession(
         kUserEmail, user_manager::USER_TYPE_REGULAR,
         /*provide_pref_service=*/false);
-    GetSessionControllerClient()->SetUserPrefService(
-        AccountId::FromUserEmail(kUserEmail), std::move(user_prefs));
-    GetSessionControllerClient()->SwitchActiveUser(
-        AccountId::FromUserEmail(kUserEmail));
+    GetSessionControllerClient()->SetUserPrefService(account_id,
+                                                     std::move(user_prefs));
+    GetSessionControllerClient()->SwitchActiveUser(account_id);
     GetSessionControllerClient()->SetSessionState(
         session_manager::SessionState::ACTIVE);
+  }
+
+  void CreateHandlerInstanceWithUserProfile() {
+    RegisterUserWithUserPrefs(AccountId::FromUserEmail(kUserEmail));
 
     policy_handler_ =
         std::make_unique<ScreensaverImagesPolicyHandler>(user_prefs_);
+
+    // Verify that the policy handler detected the new user and created a new
+    // image downloader instance.
+    ASSERT_TRUE(GetPrivateImageDownloader(*policy_handler_));
+    VerifyPrivateImageDownloaderDownloadFolder(
+        *policy_handler_, temp_dir_.GetPath().AppendASCII(kCacheDirectoryName));
   }
 
   base::FilePath GetExpectedFilePath(const std::string url) {
@@ -141,6 +166,22 @@
   std::unique_ptr<ScreensaverImagesPolicyHandler> policy_handler_;
 };
 
+TEST_F(ScreensaverImagesPolicyHandlerTest,
+       SharedDirectoryForManagedGuestSessions) {
+  ash::ScopedTestPublicSessionLoginState test_scoped_mgs_session;
+
+  // Register the user profile with its own pref service.
+  RegisterUserWithUserPrefs(AccountId::FromUserEmail(kUserEmail));
+
+  ScreensaverImagesPolicyHandler policy_handler(user_prefs());
+
+  // Verify that the policy handler detected the new user and created a new
+  // image downloader instance.
+  ASSERT_TRUE(GetPrivateImageDownloader(policy_handler));
+  VerifyPrivateImageDownloaderDownloadFolder(
+      policy_handler, base::FilePath(kManagedGuestsCacheDirectoryPath));
+}
+
 TEST_F(ScreensaverImagesPolicyHandlerTest, ShouldRunCallbackIfImagesUpdated) {
   CreateHandlerInstanceWithUserProfile();
   base::test::RepeatingTestFuture<std::vector<base::FilePath>> test_future;
diff --git a/ash/ambient/ui/ambient_video_view.cc b/ash/ambient/ui/ambient_video_view.cc
index bb1385c..b1277251 100644
--- a/ash/ambient/ui/ambient_video_view.cc
+++ b/ash/ambient/ui/ambient_video_view.cc
@@ -47,8 +47,12 @@
   DCHECK(!html_path.empty());
   DCHECK(AshWebViewFactory::Get());
   SetUseDefaultFillLayout(true);
+  AshWebView::InitParams web_view_params;
+  // Disables wake locks so the video doesn't stop the device from going to
+  // sleep.
+  web_view_params.enable_wake_locks = false;
   AshWebView* ash_web_view =
-      AddChildView(AshWebViewFactory::Get()->Create(AshWebView::InitParams()));
+      AddChildView(AshWebViewFactory::Get()->Create(web_view_params));
   ash_web_view->SetID(kAmbientVideoWebView);
   ash_web_view->SetUseDefaultFillLayout(true);
   GURL ambient_video_url = net::AppendQueryParameter(
diff --git a/ash/ambient/ui/ambient_video_view_unittest.cc b/ash/ambient/ui/ambient_video_view_unittest.cc
index c0328649..7726e2f 100644
--- a/ash/ambient/ui/ambient_video_view_unittest.cc
+++ b/ash/ambient/ui/ambient_video_view_unittest.cc
@@ -31,6 +31,7 @@
   const TestAshWebView* web_view = static_cast<const TestAshWebView*>(
       view.GetViewByID(kAmbientVideoWebView));
   ASSERT_THAT(web_view, NotNull());
+  EXPECT_FALSE(web_view->init_params_for_testing().enable_wake_locks);
   EXPECT_TRUE(web_view->current_url().SchemeIsFile());
   EXPECT_THAT(web_view->current_url().path(), Eq("/path/to/html"));
   std::string video_path_requested;
diff --git a/ash/app_list/app_list_test_api.cc b/ash/app_list/app_list_test_api.cc
index 3dd718a1..ce2f6755 100644
--- a/ash/app_list/app_list_test_api.cc
+++ b/ash/app_list/app_list_test_api.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "ash/public/cpp/test/app_list_test_api.h"
-#include "base/memory/raw_ptr.h"
 
 #include <string>
 #include <utility>
@@ -38,6 +37,7 @@
 #include "ash/public/cpp/accelerators.h"
 #include "ash/shell.h"
 #include "base/functional/callback.h"
+#include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/window_observer.h"
@@ -304,7 +304,7 @@
 
 void AppListTestApi::ShowBubbleAppListAndWait() {
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   WaitForBubbleWindow(
       /*wait_for_opening_animation=*/true);
 }
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 4b9f2cd..b9e2956 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -3109,6 +3109,9 @@
       <message name="IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_DISABLING_PROFILE" desc="Tooltip message for disabled add cellular button, indicating cellular network profile is being disabled.">
        Disabling profile. Wait a few minutes.
       </message>
+      <message name="IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_REQUESTING_AVAILABLE_PROFILES" desc="Tooltip message for disabled add cellular button, indicating cellular device is requesting profiles available to install.">
+        Requesting available profiles. Wait a few minutes.
+      </message>
       <message name="IDS_ASH_STATUS_TRAY_INITIALIZING_CELLULAR" desc="Message for the status area when initializing the cellular device.">
         Initializing...
       </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_REQUESTING_AVAILABLE_PROFILES.png.sha1 b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_REQUESTING_AVAILABLE_PROFILES.png.sha1
new file mode 100644
index 0000000..8419e16
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_REQUESTING_AVAILABLE_PROFILES.png.sha1
@@ -0,0 +1 @@
+e08824203009078607bbb979c88d581302fe1b9d
\ No newline at end of file
diff --git a/ash/booting/booting_animation_controller.cc b/ash/booting/booting_animation_controller.cc
new file mode 100644
index 0000000..b3e46ae
--- /dev/null
+++ b/ash/booting/booting_animation_controller.cc
@@ -0,0 +1,101 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/booting/booting_animation_controller.h"
+
+#include <memory>
+
+#include "ash/booting/booting_animation_view.h"
+#include "ash/public/cpp/shell_window_ids.h"
+#include "ash/shell.h"
+#include "base/files/file_util.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_delegate.h"
+
+namespace ash {
+
+namespace {
+
+constexpr base::FilePath::CharType kAnimationPath[] = FILE_PATH_LITERAL(
+    "/usr/share/chromeos-assets/animated_splash_screen/splash_animation.json");
+
+std::string ReadFileToString(const base::FilePath& path) {
+  std::string result;
+  if (!base::ReadFileToString(path, &result)) {
+    LOG(WARNING) << "Failed reading file";
+    result.clear();
+  }
+
+  return result;
+}
+
+}  // namespace
+
+BootingAnimationController::BootingAnimationController() {
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+      base::BindOnce(&ReadFileToString, base::FilePath(kAnimationPath)),
+      base::BindOnce(&BootingAnimationController::OnAnimationDataFetched,
+                     weak_factory_.GetWeakPtr()));
+}
+
+BootingAnimationController::~BootingAnimationController() = default;
+
+void BootingAnimationController::Show() {
+  widget_ = std::make_unique<views::Widget>();
+  views::Widget::InitParams params;
+  params.delegate = new views::WidgetDelegate;  // Takes ownership.
+  params.delegate->SetOwnedByWidget(true);
+  // Allow maximize so the booting container's FillLayoutManager can
+  // fill the screen with the widget. This is required even for
+  // fullscreen widgets.
+  params.delegate->SetCanMaximize(true);
+  params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+  params.name = "BootingAnimationWidget";
+  params.show_state = ui::SHOW_STATE_FULLSCREEN;
+  // Create the Booting Animation widget on the primary display.
+  auto* animation_window = Shell::GetContainer(
+      Shell::GetPrimaryRootWindow(), kShellWindowId_BootingAnimationContainer);
+  params.parent = animation_window;
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.opacity = views::Widget::InitParams::WindowOpacity::kOpaque;
+  widget_->Init(std::move(params));
+
+  if (animation_data_.empty()) {
+    start_once_ready_ = true;
+    return;
+  }
+  StartAnimation();
+}
+
+void BootingAnimationController::Finish() {
+  widget_.reset();
+}
+
+void BootingAnimationController::OnAnimationDataFetched(std::string data) {
+  if (data.empty()) {
+    LOG(ERROR) << "No booting animation file available.";
+    return;
+  }
+
+  animation_data_ = std::move(data);
+
+  if (start_once_ready_) {
+    StartAnimation();
+  }
+}
+
+void BootingAnimationController::StartAnimation() {
+  start_once_ready_ = false;
+  BootingAnimationView* view = widget_->SetContentsView(
+      std::make_unique<BootingAnimationView>(animation_data_));
+  widget_->Show();
+  view->Play();
+}
+
+}  // namespace ash
diff --git a/ash/booting/booting_animation_controller.h b/ash/booting/booting_animation_controller.h
new file mode 100644
index 0000000..3addc45
--- /dev/null
+++ b/ash/booting/booting_animation_controller.h
@@ -0,0 +1,42 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_BOOTING_BOOTING_ANIMATION_CONTROLLER_H_
+#define ASH_BOOTING_BOOTING_ANIMATION_CONTROLLER_H_
+
+#include "ash/ash_export.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "ui/views/widget/unique_widget_ptr.h"
+
+namespace ash {
+
+class ASH_EXPORT BootingAnimationController {
+ public:
+  BootingAnimationController();
+  BootingAnimationController(const BootingAnimationController&) = delete;
+  BootingAnimationController& operator=(const BootingAnimationController&) =
+      delete;
+  ~BootingAnimationController();
+
+  // Shows the widget and starts to play a booting animation.
+  void Show();
+
+  // Cleans up the animation, resets the widget and the view.
+  void Finish();
+
+ private:
+  void OnAnimationDataFetched(std::string data);
+  void StartAnimation();
+
+  std::string animation_data_;
+  views::UniqueWidgetPtr widget_;
+  bool start_once_ready_ = false;
+
+  base::WeakPtrFactory<BootingAnimationController> weak_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // ASH_BOOTING_BOOTING_ANIMATION_CONTROLLER_H_
diff --git a/ash/booting/booting_animation_view.cc b/ash/booting/booting_animation_view.cc
new file mode 100644
index 0000000..0ee7767
--- /dev/null
+++ b/ash/booting/booting_animation_view.cc
@@ -0,0 +1,98 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/booting/booting_animation_view.h"
+
+#include <string>
+
+#include "ash/public/cpp/image_util.h"
+#include "cc/paint/skottie_wrapper.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/lottie/animation.h"
+#include "ui/views/background.h"
+#include "ui/views/controls/animated_image_view.h"
+#include "ui/views/layout/fill_layout.h"
+
+namespace ash {
+
+namespace {
+
+void Resize(views::AnimatedImageView& animated_image_view) {
+  DCHECK(animated_image_view.animated_image());
+  gfx::Size animation_size =
+      animated_image_view.animated_image()->GetOriginalSize();
+  DCHECK(!animation_size.IsEmpty());
+  gfx::Rect destination_bounds = animated_image_view.GetContentsBounds();
+  DCHECK(!destination_bounds.IsEmpty());
+  gfx::Size animation_resized;
+  const float width_scale_factor =
+      static_cast<float>(destination_bounds.width()) / animation_size.width();
+  const float height_scale_factor =
+      static_cast<float>(destination_bounds.height()) / animation_size.height();
+
+  const bool scale_to_width = width_scale_factor > height_scale_factor;
+  if (scale_to_width) {
+    animation_resized.set_width(destination_bounds.width());
+    animation_resized.set_height(
+        base::ClampRound(animation_size.height() * width_scale_factor));
+  } else {
+    animation_resized.set_height(destination_bounds.height());
+    animation_resized.set_width(
+        base::ClampRound(animation_size.width() * height_scale_factor));
+  }
+  animated_image_view.SetVerticalAlignment(
+      views::ImageViewBase::Alignment::kCenter);
+  animated_image_view.SetHorizontalAlignment(
+      views::ImageViewBase::Alignment::kCenter);
+  // The animation's new scaled size has been computed above.
+  // AnimatedImageView::SetImageSize() takes care of both a) applying the
+  // scaled size and b) cropping by translating the canvas before painting such
+  // that the rescaled animation's origin resides outside the boundaries of the
+  // view. The portions of the rescaled animation that reside outside of the
+  // view's boundaries ultimately get cropped.
+  animated_image_view.SetImageSize(animation_resized);
+}
+
+}  // namespace
+
+BootingAnimationView::BootingAnimationView(const std::string& animation_data) {
+  SetLayoutManager(std::make_unique<views::FillLayout>());
+  auto skottie = cc::SkottieWrapper::CreateSerializable(
+      std::vector<uint8_t>(animation_data.begin(), animation_data.end()));
+  AddChildView(
+      views::Builder<views::AnimatedImageView>()
+          .CopyAddressTo(&animation_)
+          .SetAnimatedImage(std::make_unique<lottie::Animation>(skottie))
+          .Build());
+  animation_->SetBackground(views::CreateSolidBackground(SK_ColorBLACK));
+  animated_image_view_observer_.Observe(animation_);
+}
+
+BootingAnimationView::~BootingAnimationView() = default;
+
+void BootingAnimationView::Play() {
+  animation_->Play(lottie::Animation::PlaybackConfig::CreateWithStyle(
+      lottie::Animation::Style::kLinear, *animation_->animated_image()));
+}
+
+void BootingAnimationView::OnViewBoundsChanged(View* observed_view) {
+  gfx::Rect content_bounds = observed_view->GetContentsBounds();
+  if (content_bounds.IsEmpty()) {
+    return;
+  }
+
+  // By default, the |animated_image_view_| will render the animation with the
+  // fixed dimensions specified in the Lottie file. To render the animation
+  // at the view's full bounds, wait for the view's initial layout to happen
+  // so that its proper bounds become available (they are 0x0 initially) before
+  // starting the animation playback.
+  gfx::Rect previous_animation_bounds = animation_->GetImageBounds();
+  Resize(*animation_);
+  VLOG(1) << "View bounds available. Resized animation with native size "
+          << animation_->animated_image()->GetOriginalSize().ToString()
+          << " from " << previous_animation_bounds.ToString() << " to "
+          << animation_->GetImageBounds().ToString();
+}
+
+}  // namespace ash
diff --git a/ash/booting/booting_animation_view.h b/ash/booting/booting_animation_view.h
new file mode 100644
index 0000000..724a2d1
--- /dev/null
+++ b/ash/booting/booting_animation_view.h
@@ -0,0 +1,43 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_BOOTING_BOOTING_ANIMATION_VIEW_H_
+#define ASH_BOOTING_BOOTING_ANIMATION_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "base/scoped_observation.h"
+#include "ui/lottie/animation.h"
+#include "ui/views/controls/animated_image_view.h"
+#include "ui/views/view.h"
+#include "ui/views/view_observer.h"
+
+namespace views {
+class AnimatedImageView;
+}  // namespace views
+
+namespace ash {
+
+class ASH_EXPORT BootingAnimationView : public views::View,
+                                        public views::ViewObserver {
+ public:
+  explicit BootingAnimationView(const std::string& animation_data);
+  BootingAnimationView(const BootingAnimationView&) = delete;
+  BootingAnimationView& operator=(const BootingAnimationView&) = delete;
+  ~BootingAnimationView() override;
+
+  void Play();
+
+ private:
+  // views::ViewObserver:
+  void OnViewBoundsChanged(View* observed_view) override;
+
+  base::raw_ptr<views::AnimatedImageView, ExperimentalAsh> animation_ = nullptr;
+
+  base::ScopedObservation<View, ViewObserver> animated_image_view_observer_{
+      this};
+};
+
+}  // namespace ash
+
+#endif  // ASH_BOOTING_BOOTING_ANIMATION_VIEW_H_
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 3a13703..51a2a18 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -456,7 +456,7 @@
   return size_in_bytes / 1024;
 }
 
-constexpr char kShareToYouTubeURL[] = "https://studio.youtube.com";
+constexpr char kShareToYouTubeURL[] = "https://youtube.com/upload";
 
 }  // namespace
 
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 22006b9..fcd25b28 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1599,7 +1599,7 @@
 // This tool under development will be rolled out via Finch.
 // Enabling this flag will use the new feedback tool instead of the current
 // tool on CrOS.
-BASE_FEATURE(kOsFeedback, "OsFeedback", base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kOsFeedback, "OsFeedback", base::FEATURE_ENABLED_BY_DEFAULT);
 
 // If enabled, a new App Notifications subpage will appear in CrOS Apps section.
 BASE_FEATURE(kOsSettingsAppNotificationsPage,
@@ -2016,6 +2016,12 @@
              "ShowPlayInDemoMode",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Enables custom Demo Mode behavior on features-aware devices, as controlled by
+// the feature management module
+BASE_FEATURE(kFeatureManagementFeaturesAwareDeviceDemoMode,
+             "FeatureManagementFeaturedDemoMode",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enables the shutdown confirmation bubble from the login shelf view.
 BASE_FEATURE(kShutdownConfirmationBubble,
              "ShutdownConfirmationBubble",
@@ -3091,7 +3097,7 @@
 
 bool IsOobeDrivePinningEnabled() {
   return base::FeatureList::IsEnabled(kOobeDrivePinning) &&
-         IsOobeChoobeEnabled();
+         IsOobeChoobeEnabled() && IsDriveFsBulkPinningEnabled();
 }
 
 bool IsOobeQuickStartEnabled() {
@@ -3481,6 +3487,11 @@
   return base::FeatureList::IsEnabled(kShowPlayInDemoMode);
 }
 
+bool IsFeaturesAwareDeviceDemoModeEnabled() {
+  return base::FeatureList::IsEnabled(
+      kFeatureManagementFeaturesAwareDeviceDemoMode);
+}
+
 bool ShouldUseV1DeviceSync() {
   return !ShouldUseV2DeviceSync() ||
          !base::FeatureList::IsEnabled(kDisableCryptAuthV1DeviceSync);
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 31875c5a..5c97225 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -583,6 +583,8 @@
 BASE_DECLARE_FEATURE(kShowBluetoothDebugLogToggle);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kShowPlayInDemoMode);
 COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kFeatureManagementFeaturesAwareDeviceDemoMode);
+COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kShutdownConfirmationBubble);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSideAlignedToasts);
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -957,6 +959,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool ShouldOnlyShowNewShortcutApp();
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsSearchInShortcutsAppEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS)
+bool IsFeaturesAwareDeviceDemoModeEnabled();
 // TODO(michaelpg): Remove after M71 branch to re-enable Play Store by default.
 COMPONENT_EXPORT(ASH_CONSTANTS) bool ShouldShowPlayStoreInDemoMode();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool ShouldUseV1DeviceSync();
diff --git a/ash/constants/notifier_catalogs.h b/ash/constants/notifier_catalogs.h
index cb29d9f..a45e755 100644
--- a/ash/constants/notifier_catalogs.h
+++ b/ash/constants/notifier_catalogs.h
@@ -259,6 +259,12 @@
   kMaxValue = kVideoConferenceTrayUseWhileDisabled,
 };
 
+// A living catalog that registers anchored nudges.
+// Current values should not be renumbered or removed.
+// TODO(b/280309972): Add metrics for AnchoredNudge catalog.
+// To deprecate comment out the entry.
+enum class AnchoredNudgeCatalogName { kTest = 0, kMaxValue = kTest };
+
 }  // namespace ash
 
 #endif  // ASH_CONSTANTS_NOTIFIER_CATALOGS_H_
diff --git a/ash/display/display_move_window_util_unittest.cc b/ash/display/display_move_window_util_unittest.cc
index 1217f6f..4f1750b 100644
--- a/ash/display/display_move_window_util_unittest.cc
+++ b/ash/display/display_move_window_util_unittest.cc
@@ -61,7 +61,7 @@
 
 void PerformMoveWindowAccel() {
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS, {});
+      AcceleratorAction::kMoveActiveWindowBetweenDisplays, {});
 }
 
 }  // namespace
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index 297df3cf..2f10451 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -10,6 +10,7 @@
 # C++ headers and sources that can be used outside ash.
 component("cpp") {
   sources = [
+    "accelerator_actions.h",
     "accelerator_configuration.cc",
     "accelerator_configuration.h",
     "accelerator_keycode_lookup_cache.cc",
@@ -328,6 +329,8 @@
     "style/dark_light_mode_controller.h",
     "stylus_utils.cc",
     "stylus_utils.h",
+    "system/anchored_nudge_data.cc",
+    "system/anchored_nudge_data.h",
     "system/power/power_button_controller_base.cc",
     "system/power/power_button_controller_base.h",
     "system/toast_data.cc",
diff --git a/ash/public/cpp/accelerator_actions.h b/ash/public/cpp/accelerator_actions.h
new file mode 100644
index 0000000..99e187736
--- /dev/null
+++ b/ash/public/cpp/accelerator_actions.h
@@ -0,0 +1,172 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_PUBLIC_CPP_ACCELERATOR_ACTIONS_H_
+#define ASH_PUBLIC_CPP_ACCELERATOR_ACTIONS_H_
+
+namespace ash {
+
+enum AcceleratorAction {
+  kBrightnessDown,
+  kBrightnessUp,
+  kCycleBackwardMru,
+  kCycleForwardMru,
+  kCycleSameAppWindowsBackward,
+  kCycleSameAppWindowsForward,
+  kDesksActivateDeskLeft,
+  kDesksActivateDeskRight,
+  kDesksMoveActiveItemLeft,
+  kDesksMoveActiveItemRight,
+  kDesksNewDesk,
+  kDesksRemoveCurrentDesk,
+  kDesksActivate0,
+  kDesksActivate1,
+  kDesksActivate2,
+  kDesksActivate3,
+  kDesksActivate4,
+  kDesksActivate5,
+  kDesksActivate6,
+  kDesksActivate7,
+  kDesksToggleAssignToAllDesks,
+  kDisableCapsLock,
+  kExit,
+  kFocusCameraPreview,
+  kFocusNextPane,
+  kFocusPreviousPane,
+  kFocusShelf,
+  kFocusPip,
+  kKeyboardBacklightToggle,
+  kKeyboardBrightnessDown,
+  kKeyboardBrightnessUp,
+  kLaunchApp0,
+  kLaunchApp1,
+  kLaunchApp2,
+  kLaunchApp3,
+  kLaunchApp4,
+  kLaunchApp5,
+  kLaunchApp6,
+  kLaunchApp7,
+  kLaunchLastApp,
+  kLockPressed,
+  kLockReleased,
+  kLockScreen,
+  kMagnifierZoomIn,
+  kMagnifierZoomOut,
+  kMediaFastForward,
+  kMediaNextTrack,
+  kMediaPause,
+  kMediaPlay,
+  kMediaPlayPause,
+  kMediaPrevTrack,
+  kMediaRewind,
+  kMediaStop,
+  kMicrophoneMuteToggle,
+  kMoveActiveWindowBetweenDisplays,
+  kNewIncognitoWindow,
+  kNewTab,
+  kNewWindow,
+  kOpenCalculator,
+  kOpenCrosh,
+  kOpenDiagnostics,
+  kOpenFeedbackPage,
+  kOpenFileManager,
+  kOpenGetHelp,
+  // Similar to kToggleClipboardHistory but is used to paste plain text only
+  // when clipboard history menu is already open.
+  kPasteClipboardHistoryPlainText,
+  kPowerPressed,
+  kPowerReleased,
+  kPrintUiHierarchies,
+  kPrivacyScreenToggle,
+  kRestoreTab,
+  kRotateScreen,
+  kRotateWindow,
+  kScaleUiDown,
+  kScaleUiReset,
+  kScaleUiUp,
+  kShowEmojiPicker,
+  kToggleImeMenuBubble,
+  kShowShortcutViewer,
+  kShowStylusTools,
+  kShowTaskManager,
+  kStartAssistant,
+  kSuspend,
+  kSwapPrimaryDisplay,
+  kSwitchIme,  // Switch to another IME depending on the accelerator.
+  kSwitchToLastUsedIme,
+  kSwitchToNextIme,
+  kSwitchToNextUser,
+  kSwitchToPreviousUser,
+  kTakePartialScreenshot,
+  kTakeScreenshot,
+  kTakeWindowScreenshot,
+  kToggleAppList,
+  kToggleCalendar,
+  kToggleCapsLock,
+  kToggleClipboardHistory,
+  kToggleDictation,
+  kToggleDockedMagnifier,
+  kToggleFloating,
+  kToggleFullscreen,
+  kToggleFullscreenMagnifier,
+  kToggleGameDashboard,
+  kToggleHighContrast,
+  kToggleMaximized,
+  kToggleMessageCenterBubble,
+  kToggleMirrorMode,
+  kToggleMultitaskMenu,
+  kToggleOverview,
+  kToggleProjectorMarker,
+  kToggleResizeLockMenu,
+  kToggleSpokenFeedback,
+  kToggleSystemTrayBubble,
+  kToggleWifi,
+  kToggleSnapGroupWindowsMinimizeAndRestore,
+  kTouchHudClear,
+  kTouchHudModeChange,
+  kUnpin,
+  kVolumeDown,
+  kVolumeMute,
+  kVolumeUp,
+  kWindowCycleSnapLeft,
+  kWindowCycleSnapRight,
+  kWindowMinimize,
+  kMinimizeTopWindowOnBack,
+
+  // Debug accelerators are intentionally at the end, so that if you remove one
+  // you don't need to update tests which check hashes of the ids.
+  kDebugKeyboardBacklightToggle,
+  kDebugMicrophoneMuteToggle,
+  kDebugPrintLayerHierarchy,
+  kDebugPrintViewHierarchy,
+  kDebugPrintWindowHierarchy,
+  kDebugShowToast,
+  kDebugSystemUiStyleViewer,
+  // TODO(crbug.com/1336836): Remove fling accelerators after float is released.
+  kDebugTuckFloatedWindowLeft,
+  kDebugTuckFloatedWindowRight,
+  kDebugToggleDarkMode,
+  kDebugToggleDynamicColor,
+  kDebugToggleGlanceables,
+  kDebugTogglePowerButtonMenu,
+  kDebugToggleShowDebugBorders,
+  kDebugToggleShowFpsCounter,
+  kDebugToggleShowPaintRects,
+  kDebugToggleTouchPad,
+  kDebugToggleTouchScreen,
+  kDebugToggleTabletMode,
+  kDebugToggleVideoConferenceCameraTrayIcon,
+  kDebugToggleWallpaperMode,
+  kDebugTriggerCrash,  // Intentionally crash the ash process.
+  kDebugToggleHudDisplay,
+  kDevAddRemoveDisplay,
+  // Different than kToggleAppList to ignore search-as-modifier-key rules for
+  // enabling the accelerator.
+  kDevToggleAppList,
+  kDevToggleUnifiedDesktop,
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_ACCELERATOR_ACTIONS_H_
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc
index db1e906..de25adf 100644
--- a/ash/public/cpp/accelerators.cc
+++ b/ash/public/cpp/accelerators.cc
@@ -24,228 +24,282 @@
 //  Shortcuts app, please follow the instructions at:
 // `ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h`.
 const AcceleratorData kAcceleratorData[] = {
-    {true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-    {false, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, SWITCH_TO_LAST_USED_IME},
-    {true, ui::VKEY_TAB, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU},
+    {true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kSwitchToLastUsedIme},
+    {false, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kSwitchToLastUsedIme},
+    {true, ui::VKEY_TAB, ui::EF_ALT_DOWN, AcceleratorAction::kCycleForwardMru},
     {true, ui::VKEY_TAB, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-     CYCLE_BACKWARD_MRU},
-    {true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE, TOGGLE_OVERVIEW},
+     AcceleratorAction::kCycleBackwardMru},
+    {true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE,
+     AcceleratorAction::kToggleOverview},
     // Historically, the browser search key with and without the shift key can
     // toggle the app list into different open states. Now the two combinations
     // are used to toggle the app list in the same way to keep the behavior
     // consistent.
-    {true, ui::VKEY_BROWSER_SEARCH, ui::EF_NONE, TOGGLE_APP_LIST},
-    {true, ui::VKEY_BROWSER_SEARCH, ui::EF_SHIFT_DOWN, TOGGLE_APP_LIST},
-    {true, ui::VKEY_ALL_APPLICATIONS, ui::EF_NONE, TOGGLE_APP_LIST},
-    {true, ui::VKEY_WLAN, ui::EF_NONE, TOGGLE_WIFI},
-    {true, ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::EF_NONE, PRIVACY_SCREEN_TOGGLE},
+    {true, ui::VKEY_BROWSER_SEARCH, ui::EF_NONE,
+     AcceleratorAction::kToggleAppList},
+    {true, ui::VKEY_BROWSER_SEARCH, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kToggleAppList},
+    {true, ui::VKEY_ALL_APPLICATIONS, ui::EF_NONE,
+     AcceleratorAction::kToggleAppList},
+    {true, ui::VKEY_WLAN, ui::EF_NONE, AcceleratorAction::kToggleWifi},
+    {true, ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::EF_NONE,
+     AcceleratorAction::kPrivacyScreenToggle},
     {true, ui::VKEY_MICROPHONE_MUTE_TOGGLE, ui::EF_NONE,
-     MICROPHONE_MUTE_TOGGLE},
+     AcceleratorAction::kMicrophoneMuteToggle},
     {true, ui::VKEY_KBD_BACKLIGHT_TOGGLE, ui::EF_NONE,
-     KEYBOARD_BACKLIGHT_TOGGLE},
-    {true, ui::VKEY_KBD_BRIGHTNESS_DOWN, ui::EF_NONE, KEYBOARD_BRIGHTNESS_DOWN},
-    {true, ui::VKEY_KBD_BRIGHTNESS_UP, ui::EF_NONE, KEYBOARD_BRIGHTNESS_UP},
+     AcceleratorAction::kKeyboardBacklightToggle},
+    {true, ui::VKEY_KBD_BRIGHTNESS_DOWN, ui::EF_NONE,
+     AcceleratorAction::kKeyboardBrightnessDown},
+    {true, ui::VKEY_KBD_BRIGHTNESS_UP, ui::EF_NONE,
+     AcceleratorAction::kKeyboardBrightnessUp},
     // Maximize button.
-    {true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN, TOGGLE_MIRROR_MODE},
-    {true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN, SWAP_PRIMARY_DISPLAY},
+    {true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kToggleMirrorMode},
+    {true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
+     AcceleratorAction::kSwapPrimaryDisplay},
     // Cycle windows button.
-    {true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT},
+    {true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kTakeScreenshot},
     {true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
-     TAKE_PARTIAL_SCREENSHOT},
+     AcceleratorAction::kTakePartialScreenshot},
     {true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
-     TAKE_WINDOW_SCREENSHOT},
-    {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE, BRIGHTNESS_DOWN},
-    {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_ALT_DOWN, KEYBOARD_BRIGHTNESS_DOWN},
-    {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE, BRIGHTNESS_UP},
-    {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN, KEYBOARD_BRIGHTNESS_UP},
+     AcceleratorAction::kTakeWindowScreenshot},
+    {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE,
+     AcceleratorAction::kBrightnessDown},
+    {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
+     AcceleratorAction::kKeyboardBrightnessDown},
+    {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE,
+     AcceleratorAction::kBrightnessUp},
+    {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN,
+     AcceleratorAction::kKeyboardBrightnessUp},
     {true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     MAGNIFIER_ZOOM_OUT},
+     AcceleratorAction::kMagnifierZoomOut},
     {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     MAGNIFIER_ZOOM_IN},
-    {true, ui::VKEY_L, ui::EF_COMMAND_DOWN, LOCK_SCREEN},
-    {true, ui::VKEY_L, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, SUSPEND},
+     AcceleratorAction::kMagnifierZoomIn},
+    {true, ui::VKEY_L, ui::EF_COMMAND_DOWN, AcceleratorAction::kLockScreen},
+    {true, ui::VKEY_L, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kSuspend},
     // The lock key on Chrome OS keyboards produces F13 scancodes.
-    {true, ui::VKEY_F13, ui::EF_NONE, LOCK_PRESSED},
-    {false, ui::VKEY_F13, ui::EF_NONE, LOCK_RELEASED},
+    {true, ui::VKEY_F13, ui::EF_NONE, AcceleratorAction::kLockPressed},
+    {false, ui::VKEY_F13, ui::EF_NONE, AcceleratorAction::kLockReleased},
     // Generic keyboards can use VKEY_SLEEP to mimic ChromeOS keyboard's lock
     // key.
-    {true, ui::VKEY_SLEEP, ui::EF_NONE, LOCK_PRESSED},
-    {false, ui::VKEY_SLEEP, ui::EF_NONE, LOCK_RELEASED},
-    {true, ui::VKEY_POWER, ui::EF_NONE, POWER_PRESSED},
-    {false, ui::VKEY_POWER, ui::EF_NONE, POWER_RELEASED},
-    {true, ui::VKEY_MEDIA_LAUNCH_APP2, ui::EF_NONE, OPEN_CALCULATOR},
+    {true, ui::VKEY_SLEEP, ui::EF_NONE, AcceleratorAction::kLockPressed},
+    {false, ui::VKEY_SLEEP, ui::EF_NONE, AcceleratorAction::kLockReleased},
+    {true, ui::VKEY_POWER, ui::EF_NONE, AcceleratorAction::kPowerPressed},
+    {false, ui::VKEY_POWER, ui::EF_NONE, AcceleratorAction::kPowerReleased},
+    {true, ui::VKEY_MEDIA_LAUNCH_APP2, ui::EF_NONE,
+     AcceleratorAction::kOpenCalculator},
     {true, ui::VKEY_ESCAPE, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN,
-     OPEN_DIAGNOSTICS},
-    {true, ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, OPEN_FILE_MANAGER},
-    {true, ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN, OPEN_GET_HELP},
+     AcceleratorAction::kOpenDiagnostics},
+    {true, ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kOpenFileManager},
+    {true, ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kOpenGetHelp},
     {true, ui::VKEY_OEM_2, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
-     OPEN_GET_HELP},
-    {true, ui::VKEY_T, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, OPEN_CROSH},
+     AcceleratorAction::kOpenGetHelp},
+    {true, ui::VKEY_T, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kOpenCrosh},
     {true, ui::VKEY_I, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     TOUCH_HUD_MODE_CHANGE},
+     AcceleratorAction::kTouchHudModeChange},
     {true, ui::VKEY_I,
      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN,
-     TOUCH_HUD_CLEAR},
+     AcceleratorAction::kTouchHudClear},
     {true, ui::VKEY_H, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
-     TOGGLE_HIGH_CONTRAST},
+     AcceleratorAction::kToggleHighContrast},
     {true, ui::VKEY_Z, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     TOGGLE_SPOKEN_FEEDBACK},
-    {true, ui::VKEY_D, ui::EF_COMMAND_DOWN, TOGGLE_DICTATION},
-    {true, ui::VKEY_DICTATE, ui::EF_NONE, TOGGLE_DICTATION},
+     AcceleratorAction::kToggleSpokenFeedback},
+    {true, ui::VKEY_D, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleDictation},
+    {true, ui::VKEY_DICTATE, ui::EF_NONE, AcceleratorAction::kToggleDictation},
     {true, ui::VKEY_OEM_COMMA, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     SWITCH_TO_PREVIOUS_USER},
+     AcceleratorAction::kSwitchToPreviousUser},
     {true, ui::VKEY_OEM_PERIOD, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     SWITCH_TO_NEXT_USER},
+     AcceleratorAction::kSwitchToNextUser},
     // Single shift release turns off caps lock.
-    {false, ui::VKEY_LSHIFT, ui::EF_NONE, DISABLE_CAPS_LOCK},
-    {false, ui::VKEY_SHIFT, ui::EF_NONE, DISABLE_CAPS_LOCK},
-    {false, ui::VKEY_RSHIFT, ui::EF_NONE, DISABLE_CAPS_LOCK},
-    {true, ui::VKEY_C, ui::EF_COMMAND_DOWN, TOGGLE_CALENDAR},
+    {false, ui::VKEY_LSHIFT, ui::EF_NONE, AcceleratorAction::kDisableCapsLock},
+    {false, ui::VKEY_SHIFT, ui::EF_NONE, AcceleratorAction::kDisableCapsLock},
+    {false, ui::VKEY_RSHIFT, ui::EF_NONE, AcceleratorAction::kDisableCapsLock},
+    {true, ui::VKEY_C, ui::EF_COMMAND_DOWN, AcceleratorAction::kToggleCalendar},
     // Accelerators to toggle Caps Lock.
     // The following is triggered when Search is released while Alt is still
     // down. The key_code here is LWIN (for search) and Alt is a modifier.
-    {false, ui::VKEY_LWIN, ui::EF_ALT_DOWN, TOGGLE_CAPS_LOCK},
+    {false, ui::VKEY_LWIN, ui::EF_ALT_DOWN, AcceleratorAction::kToggleCapsLock},
     // The following is triggered when Alt is released while search is still
     // down. The key_code here is MENU (for Alt) and Search is a modifier
     // (EF_COMMAND_DOWN is used for Search as a modifier).
-    {false, ui::VKEY_MENU, ui::EF_COMMAND_DOWN, TOGGLE_CAPS_LOCK},
-    {true, ui::VKEY_V, ui::EF_COMMAND_DOWN, TOGGLE_CLIPBOARD_HISTORY},
+    {false, ui::VKEY_MENU, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleCapsLock},
+    {true, ui::VKEY_V, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleClipboardHistory},
     {true, ui::VKEY_V, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
-     PASTE_CLIPBOARD_HISTORY_PLAIN_TEXT},
-    {true, ui::VKEY_VOLUME_MUTE, ui::EF_NONE, VOLUME_MUTE},
-    {true, ui::VKEY_VOLUME_DOWN, ui::EF_NONE, VOLUME_DOWN},
-    {true, ui::VKEY_VOLUME_UP, ui::EF_NONE, VOLUME_UP},
-    {true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN, SHOW_TASK_MANAGER},
+     AcceleratorAction::kPasteClipboardHistoryPlainText},
+    {true, ui::VKEY_VOLUME_MUTE, ui::EF_NONE, AcceleratorAction::kVolumeMute},
+    {true, ui::VKEY_VOLUME_DOWN, ui::EF_NONE, AcceleratorAction::kVolumeDown},
+    {true, ui::VKEY_VOLUME_UP, ui::EF_NONE, AcceleratorAction::kVolumeUp},
+    {true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kShowTaskManager},
     {true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     SWITCH_TO_NEXT_IME},
-    {true, ui::VKEY_I, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, OPEN_FEEDBACK_PAGE},
-    {true, ui::VKEY_Q, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, EXIT},
+     AcceleratorAction::kSwitchToNextIme},
+    {true, ui::VKEY_I, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kOpenFeedbackPage},
+    {true, ui::VKEY_Q, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kExit},
     {true, ui::VKEY_N, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
-     NEW_INCOGNITO_WINDOW},
-    {true, ui::VKEY_N, ui::EF_CONTROL_DOWN, NEW_WINDOW},
-    {true, ui::VKEY_T, ui::EF_CONTROL_DOWN, NEW_TAB},
-    {true, ui::VKEY_NEW, ui::EF_NONE, NEW_TAB},
+     AcceleratorAction::kNewIncognitoWindow},
+    {true, ui::VKEY_N, ui::EF_CONTROL_DOWN, AcceleratorAction::kNewWindow},
+    {true, ui::VKEY_T, ui::EF_CONTROL_DOWN, AcceleratorAction::kNewTab},
+    {true, ui::VKEY_NEW, ui::EF_NONE, AcceleratorAction::kNewTab},
     {true, ui::VKEY_OEM_MINUS, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     SCALE_UI_UP},
+     AcceleratorAction::kScaleUiUp},
     {true, ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     SCALE_UI_DOWN},
-    {true, ui::VKEY_0, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, SCALE_UI_RESET},
+     AcceleratorAction::kScaleUiDown},
+    {true, ui::VKEY_0, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kScaleUiReset},
     {true, ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     ROTATE_SCREEN},
+     AcceleratorAction::kRotateScreen},
     {true, ui::VKEY_BROWSER_REFRESH,
-     ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ROTATE_WINDOW},
-    {true, ui::VKEY_T, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, RESTORE_TAB},
+     ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kRotateWindow},
+    {true, ui::VKEY_T, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kRestoreTab},
     // This corresponds to the "Print Screen" key.
-    {true, ui::VKEY_SNAPSHOT, ui::EF_NONE, TAKE_SCREENSHOT},
-    {true, ui::VKEY_SNAPSHOT, ui::EF_ALT_DOWN, TAKE_PARTIAL_SCREENSHOT},
+    {true, ui::VKEY_SNAPSHOT, ui::EF_NONE, AcceleratorAction::kTakeScreenshot},
+    {true, ui::VKEY_SNAPSHOT, ui::EF_ALT_DOWN,
+     AcceleratorAction::kTakePartialScreenshot},
     // On Chrome OS, Search key is mapped to LWIN. The Search key binding should
     // act on release instead of press when using Search as a modifier key for
     // extended keyboard shortcuts.
-    {false, ui::VKEY_LWIN, ui::EF_NONE, TOGGLE_APP_LIST},
-    {false, ui::VKEY_LWIN, ui::EF_SHIFT_DOWN, TOGGLE_APP_LIST},
-    {true, ui::VKEY_ZOOM, ui::EF_NONE, TOGGLE_FULLSCREEN},
-    {true, ui::VKEY_ZOOM, ui::EF_SHIFT_DOWN, TOGGLE_FULLSCREEN},
-    {true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN, UNPIN},
+    {false, ui::VKEY_LWIN, ui::EF_NONE, AcceleratorAction::kToggleAppList},
+    {false, ui::VKEY_LWIN, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kToggleAppList},
+    {true, ui::VKEY_ZOOM, ui::EF_NONE, AcceleratorAction::kToggleFullscreen},
+    {true, ui::VKEY_ZOOM, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kToggleFullscreen},
+    {true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kUnpin},
     {true, ui::VKEY_S, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
-     FOCUS_CAMERA_PREVIEW},
-    {true, ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, FOCUS_SHELF},
-    {true, ui::VKEY_V, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, FOCUS_PIP},
-    {true, ui::VKEY_HELP, ui::EF_NONE, SHOW_SHORTCUT_VIEWER},
+     AcceleratorAction::kFocusCameraPreview},
+    {true, ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kFocusShelf},
+    {true, ui::VKEY_V, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kFocusPip},
+    {true, ui::VKEY_HELP, ui::EF_NONE, AcceleratorAction::kShowShortcutViewer},
     {true, ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     SHOW_SHORTCUT_VIEWER},
+     AcceleratorAction::kShowShortcutViewer},
     {true, ui::VKEY_OEM_2,
      ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-     SHOW_SHORTCUT_VIEWER},
-    {true, ui::VKEY_F14, ui::EF_NONE, SHOW_SHORTCUT_VIEWER},
+     AcceleratorAction::kShowShortcutViewer},
+    {true, ui::VKEY_F14, ui::EF_NONE, AcceleratorAction::kShowShortcutViewer},
     {true, ui::VKEY_N, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-     TOGGLE_MESSAGE_CENTER_BUBBLE},
-    {true, ui::VKEY_P, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SHOW_STYLUS_TOOLS},
+     AcceleratorAction::kToggleMessageCenterBubble},
+    {true, ui::VKEY_P, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+     AcceleratorAction::kShowStylusTools},
     {true, ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-     TOGGLE_SYSTEM_TRAY_BUBBLE},
+     AcceleratorAction::kToggleSystemTrayBubble},
     // Until we have unified settings and notifications the "hamburger"
     // key opens quick settings.
-    {true, ui::VKEY_SETTINGS, ui::EF_NONE, TOGGLE_SYSTEM_TRAY_BUBBLE},
+    {true, ui::VKEY_SETTINGS, ui::EF_NONE,
+     AcceleratorAction::kToggleSystemTrayBubble},
     {true, ui::VKEY_K, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
-     TOGGLE_IME_MENU_BUBBLE},
-    {true, ui::VKEY_1, ui::EF_ALT_DOWN, LAUNCH_APP_0},
-    {true, ui::VKEY_2, ui::EF_ALT_DOWN, LAUNCH_APP_1},
-    {true, ui::VKEY_3, ui::EF_ALT_DOWN, LAUNCH_APP_2},
-    {true, ui::VKEY_4, ui::EF_ALT_DOWN, LAUNCH_APP_3},
-    {true, ui::VKEY_5, ui::EF_ALT_DOWN, LAUNCH_APP_4},
-    {true, ui::VKEY_6, ui::EF_ALT_DOWN, LAUNCH_APP_5},
-    {true, ui::VKEY_7, ui::EF_ALT_DOWN, LAUNCH_APP_6},
-    {true, ui::VKEY_8, ui::EF_ALT_DOWN, LAUNCH_APP_7},
-    {true, ui::VKEY_9, ui::EF_ALT_DOWN, LAUNCH_LAST_APP},
+     AcceleratorAction::kToggleImeMenuBubble},
+    {true, ui::VKEY_1, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp0},
+    {true, ui::VKEY_2, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp1},
+    {true, ui::VKEY_3, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp2},
+    {true, ui::VKEY_4, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp3},
+    {true, ui::VKEY_5, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp4},
+    {true, ui::VKEY_6, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp5},
+    {true, ui::VKEY_7, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp6},
+    {true, ui::VKEY_8, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchApp7},
+    {true, ui::VKEY_9, ui::EF_ALT_DOWN, AcceleratorAction::kLaunchLastApp},
 
     // Window management shortcuts.
-    {true, ui::VKEY_OEM_4, ui::EF_ALT_DOWN, WINDOW_CYCLE_SNAP_LEFT},
-    {true, ui::VKEY_OEM_6, ui::EF_ALT_DOWN, WINDOW_CYCLE_SNAP_RIGHT},
-    {true, ui::VKEY_OEM_MINUS, ui::EF_ALT_DOWN, WINDOW_MINIMIZE},
-    {true, ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, TOGGLE_FLOATING},
-    {true, ui::VKEY_OEM_PLUS, ui::EF_ALT_DOWN, TOGGLE_MAXIMIZED},
-    {true, ui::VKEY_BROWSER_FORWARD, ui::EF_CONTROL_DOWN, FOCUS_NEXT_PANE},
-    {true, ui::VKEY_BROWSER_BACK, ui::EF_CONTROL_DOWN, FOCUS_PREVIOUS_PANE},
+    {true, ui::VKEY_OEM_4, ui::EF_ALT_DOWN,
+     AcceleratorAction::kWindowCycleSnapLeft},
+    {true, ui::VKEY_OEM_6, ui::EF_ALT_DOWN,
+     AcceleratorAction::kWindowCycleSnapRight},
+    {true, ui::VKEY_OEM_MINUS, ui::EF_ALT_DOWN,
+     AcceleratorAction::kWindowMinimize},
+    {true, ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleFloating},
+    {true, ui::VKEY_OEM_PLUS, ui::EF_ALT_DOWN,
+     AcceleratorAction::kToggleMaximized},
+    {true, ui::VKEY_BROWSER_FORWARD, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kFocusNextPane},
+    {true, ui::VKEY_BROWSER_BACK, ui::EF_CONTROL_DOWN,
+     AcceleratorAction::kFocusPreviousPane},
     {true, ui::VKEY_BROWSER_BACK, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
-     FOCUS_NEXT_PANE},
-    {true, ui::VKEY_BROWSER_BACK, ui::EF_NONE, MINIMIZE_TOP_WINDOW_ON_BACK},
+     AcceleratorAction::kFocusNextPane},
+    {true, ui::VKEY_BROWSER_BACK, ui::EF_NONE,
+     AcceleratorAction::kMinimizeTopWindowOnBack},
     {true, ui::VKEY_D, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
-     TOGGLE_SNAP_GROUP_WINDOWS_MINIMIZE_AND_RESTORE},
+     AcceleratorAction::kToggleSnapGroupWindowsMinimizeAndRestore},
 
     // Moving active window between displays shortcut.
     {true, ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
-     MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS},
+     AcceleratorAction::kMoveActiveWindowBetweenDisplays},
 
     // Magnifiers shortcuts.
     {true, ui::VKEY_D, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
-     TOGGLE_DOCKED_MAGNIFIER},
+     AcceleratorAction::kToggleDockedMagnifier},
     {true, ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
-     TOGGLE_FULLSCREEN_MAGNIFIER},
+     AcceleratorAction::kToggleFullscreenMagnifier},
 
     // Media Player shortcuts.
-    {true, ui::VKEY_MEDIA_NEXT_TRACK, ui::EF_NONE, MEDIA_NEXT_TRACK},
-    {true, ui::VKEY_MEDIA_PAUSE, ui::EF_NONE, MEDIA_PAUSE},
-    {true, ui::VKEY_MEDIA_PLAY, ui::EF_NONE, MEDIA_PLAY},
-    {true, ui::VKEY_MEDIA_PLAY_PAUSE, ui::EF_NONE, MEDIA_PLAY_PAUSE},
-    {true, ui::VKEY_MEDIA_PREV_TRACK, ui::EF_NONE, MEDIA_PREV_TRACK},
-    {true, ui::VKEY_MEDIA_STOP, ui::EF_NONE, MEDIA_STOP},
-    {true, ui::VKEY_OEM_103, ui::EF_NONE, MEDIA_REWIND},
-    {true, ui::VKEY_OEM_104, ui::EF_NONE, MEDIA_FAST_FORWARD},
+    {true, ui::VKEY_MEDIA_NEXT_TRACK, ui::EF_NONE,
+     AcceleratorAction::kMediaNextTrack},
+    {true, ui::VKEY_MEDIA_PAUSE, ui::EF_NONE, AcceleratorAction::kMediaPause},
+    {true, ui::VKEY_MEDIA_PLAY, ui::EF_NONE, AcceleratorAction::kMediaPlay},
+    {true, ui::VKEY_MEDIA_PLAY_PAUSE, ui::EF_NONE,
+     AcceleratorAction::kMediaPlayPause},
+    {true, ui::VKEY_MEDIA_PREV_TRACK, ui::EF_NONE,
+     AcceleratorAction::kMediaPrevTrack},
+    {true, ui::VKEY_MEDIA_STOP, ui::EF_NONE, AcceleratorAction::kMediaStop},
+    {true, ui::VKEY_OEM_103, ui::EF_NONE, AcceleratorAction::kMediaRewind},
+    {true, ui::VKEY_OEM_104, ui::EF_NONE, AcceleratorAction::kMediaFastForward},
 
     // Assistant shortcuts.
-    {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, START_ASSISTANT},
-    {true, ui::VKEY_ASSISTANT, ui::EF_NONE, START_ASSISTANT},
+    {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, AcceleratorAction::kStartAssistant},
+    {true, ui::VKEY_ASSISTANT, ui::EF_NONE, AcceleratorAction::kStartAssistant},
 
     // IME mode change key.
-    {true, ui::VKEY_MODECHANGE, ui::EF_NONE, SWITCH_TO_NEXT_IME},
+    {true, ui::VKEY_MODECHANGE, ui::EF_NONE,
+     AcceleratorAction::kSwitchToNextIme},
 
     // Emoji picker shortcut.
     {true, ui::VKEY_SPACE, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
-     SHOW_EMOJI_PICKER},
-    {true, ui::VKEY_EMOJI_PICKER, ui::EF_NONE, SHOW_EMOJI_PICKER},
+     AcceleratorAction::kShowEmojiPicker},
+    {true, ui::VKEY_EMOJI_PICKER, ui::EF_NONE,
+     AcceleratorAction::kShowEmojiPicker},
 
     // Debugging shortcuts that need to be available to end-users in
     // release builds.
-    {true, ui::VKEY_U, kDebugModifier, PRINT_UI_HIERARCHIES},
+    {true, ui::VKEY_U, kDebugModifier, AcceleratorAction::kPrintUiHierarchies},
 
     // Virtual Desks shortcuts.
     // Desk activation:
-    {true, ui::VKEY_OEM_4, ui::EF_COMMAND_DOWN, DESKS_ACTIVATE_DESK_LEFT},
-    {true, ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN, DESKS_ACTIVATE_DESK_RIGHT},
+    {true, ui::VKEY_OEM_4, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kDesksActivateDeskLeft},
+    {true, ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kDesksActivateDeskRight},
     // Moving windows to desks:
     {true, ui::VKEY_OEM_4, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DESKS_MOVE_ACTIVE_ITEM_LEFT},
+     AcceleratorAction::kDesksMoveActiveItemLeft},
     {true, ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DESKS_MOVE_ACTIVE_ITEM_RIGHT},
+     AcceleratorAction::kDesksMoveActiveItemRight},
     // TODO(afakhry): Implement moving windows to a desk by its index directly.
 
     // TODO(yusukes): Handle VKEY_MEDIA_STOP, and VKEY_MEDIA_LAUNCH_MAIL.
 
     // ARC-specific shortcut.
     {true, ui::VKEY_C, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
-     TOGGLE_RESIZE_LOCK_MENU},
+     AcceleratorAction::kToggleResizeLockMenu},
 
     // Projector shortcuts.
-    {true, ui::VKEY_OEM_3, ui::EF_COMMAND_DOWN, TOGGLE_PROJECTOR_MARKER},
+    {true, ui::VKEY_OEM_3, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleProjectorMarker},
 };
 
 const size_t kAcceleratorDataLength = std::size(kAcceleratorData);
@@ -259,8 +313,9 @@
     // consumed by apps and pages (since they're not search-based).
     // TODO(afakhry): Change the following to Search+Shift+"+"/"-" once
     // https://crbug.com/976487 is fixed.
-    {true, ui::VKEY_F12, ui::EF_SHIFT_DOWN, DESKS_NEW_DESK},
-    {true, ui::VKEY_F11, ui::EF_SHIFT_DOWN, DESKS_REMOVE_CURRENT_DESK},
+    {true, ui::VKEY_F12, ui::EF_SHIFT_DOWN, AcceleratorAction::kDesksNewDesk},
+    {true, ui::VKEY_F11, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kDesksRemoveCurrentDesk},
 };
 
 const size_t kDisableWithNewMappingAcceleratorDataLength =
@@ -269,44 +324,44 @@
 const AcceleratorData kEnableWithNewMappingAcceleratorData[] = {
     // Desk creation and removal:
     {true, ui::VKEY_OEM_PLUS, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DESKS_NEW_DESK},
+     AcceleratorAction::kDesksNewDesk},
     {true, ui::VKEY_OEM_MINUS, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DESKS_REMOVE_CURRENT_DESK},
+     AcceleratorAction::kDesksRemoveCurrentDesk},
 
     // Desk activation:
     {true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
-     DESKS_ACTIVATE_DESK_LEFT},
+     AcceleratorAction::kDesksActivateDeskLeft},
     {true, ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
-     DESKS_ACTIVATE_DESK_RIGHT},
+     AcceleratorAction::kDesksActivateDeskRight},
 
     // Moving windows to desks:
     {true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
-     DESKS_MOVE_ACTIVE_ITEM_LEFT},
+     AcceleratorAction::kDesksMoveActiveItemLeft},
     {true, ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
-     DESKS_MOVE_ACTIVE_ITEM_RIGHT},
+     AcceleratorAction::kDesksMoveActiveItemRight},
 
     // Snap
     {true, ui::VKEY_OEM_COMMA,
      ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-     WINDOW_CYCLE_SNAP_LEFT},
+     AcceleratorAction::kWindowCycleSnapLeft},
     {true, ui::VKEY_OEM_PERIOD,
      ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-     WINDOW_CYCLE_SNAP_RIGHT},
+     AcceleratorAction::kWindowCycleSnapRight},
 
     // Zoom
     {true, ui::VKEY_UP,
      ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     SCALE_UI_UP},
+     AcceleratorAction::kScaleUiUp},
     {true, ui::VKEY_DOWN,
      ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     SCALE_UI_DOWN},
+     AcceleratorAction::kScaleUiDown},
     {true, ui::VKEY_BACK,
      ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-     SCALE_UI_RESET},
+     AcceleratorAction::kScaleUiReset},
 
     // Shortcut Viewer
     {true, ui::VKEY_OEM_2, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     SHOW_SHORTCUT_VIEWER},
+     AcceleratorAction::kShowShortcutViewer},
 };
 
 const size_t kEnableWithNewMappingAcceleratorDataLength =
@@ -321,9 +376,9 @@
     // TODO(crbug.com/1179893): Merge these to the main table once
     // IsImprovedKeyboardShortcutsEnabled() is permanently enabled.
     {true, ui::VKEY_OEM_PLUS, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DESKS_NEW_DESK},
+     AcceleratorAction::kDesksNewDesk},
     {true, ui::VKEY_OEM_MINUS, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-     DESKS_REMOVE_CURRENT_DESK},
+     AcceleratorAction::kDesksRemoveCurrentDesk},
 };
 
 const size_t kEnableWithPositionalAcceleratorsDataLength =
@@ -333,47 +388,50 @@
     kEnabledWithImprovedDesksKeyboardShortcutsAcceleratorData[] = {
         // Indexed-desk activation:
         {true, ui::VKEY_1, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_0},
+         AcceleratorAction::kDesksActivate0},
         {true, ui::VKEY_2, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_1},
+         AcceleratorAction::kDesksActivate1},
         {true, ui::VKEY_3, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_2},
+         AcceleratorAction::kDesksActivate2},
         {true, ui::VKEY_4, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_3},
+         AcceleratorAction::kDesksActivate3},
         {true, ui::VKEY_5, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_4},
+         AcceleratorAction::kDesksActivate4},
         {true, ui::VKEY_6, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_5},
+         AcceleratorAction::kDesksActivate5},
         {true, ui::VKEY_7, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_6},
+         AcceleratorAction::kDesksActivate6},
         {true, ui::VKEY_8, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_ACTIVATE_7},
+         AcceleratorAction::kDesksActivate7},
         // Toggle assign to all desks:
         {true, ui::VKEY_A, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
-         DESKS_TOGGLE_ASSIGN_TO_ALL_DESKS},
+         AcceleratorAction::kDesksToggleAssignToAllDesks},
 };
 
 const size_t kEnabledWithImprovedDesksKeyboardShortcutsAcceleratorDataLength =
     std::size(kEnabledWithImprovedDesksKeyboardShortcutsAcceleratorData);
 
 const AcceleratorData kEnableWithSameAppWindowCycleAcceleratorData[] = {
-    {true, ui::VKEY_OEM_3, ui::EF_ALT_DOWN, CYCLE_SAME_APP_WINDOWS_FORWARD},
+    {true, ui::VKEY_OEM_3, ui::EF_ALT_DOWN,
+     AcceleratorAction::kCycleSameAppWindowsForward},
     {true, ui::VKEY_OEM_3, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-     CYCLE_SAME_APP_WINDOWS_BACKWARD},
+     AcceleratorAction::kCycleSameAppWindowsBackward},
 };
 
 const size_t kEnableWithSameAppWindowCycleAcceleratorDataLength =
     std::size(kEnableWithSameAppWindowCycleAcceleratorData);
 
 const AcceleratorData kEnableWithFloatWindowAcceleratorData[] = {
-    {true, ui::VKEY_Z, ui::EF_COMMAND_DOWN, TOGGLE_MULTITASK_MENU},
+    {true, ui::VKEY_Z, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleMultitaskMenu},
 };
 
 const size_t kEnableWithFloatWindowAcceleratorDataLength =
     std::size(kEnableWithFloatWindowAcceleratorData);
 
 const AcceleratorData kToggleGameDashboardAcceleratorData[] = {
-    {true, ui::VKEY_G, ui::EF_COMMAND_DOWN, TOGGLE_GAME_DASHBOARD},
+    {true, ui::VKEY_G, ui::EF_COMMAND_DOWN,
+     AcceleratorAction::kToggleGameDashboard},
 };
 
 const size_t kToggleGameDashboardAcceleratorDataLength =
diff --git a/ash/public/cpp/accelerators.h b/ash/public/cpp/accelerators.h
index 116e2ee..ba0ffce 100644
--- a/ash/public/cpp/accelerators.h
+++ b/ash/public/cpp/accelerators.h
@@ -7,6 +7,7 @@
 
 #include <stddef.h>
 
+#include "ash/public/cpp/accelerator_actions.h"
 #include "ash/public/cpp/ash_public_export.h"
 #include "base/functional/callback_forward.h"
 #include "base/observer_list.h"
@@ -22,166 +23,6 @@
 
 // See documentation in ash/accelerators/accelerator_table.h.
 
-enum AcceleratorAction {
-  BRIGHTNESS_DOWN,
-  BRIGHTNESS_UP,
-  CYCLE_BACKWARD_MRU,
-  CYCLE_FORWARD_MRU,
-  CYCLE_SAME_APP_WINDOWS_BACKWARD,
-  CYCLE_SAME_APP_WINDOWS_FORWARD,
-  DESKS_ACTIVATE_DESK_LEFT,
-  DESKS_ACTIVATE_DESK_RIGHT,
-  DESKS_MOVE_ACTIVE_ITEM_LEFT,
-  DESKS_MOVE_ACTIVE_ITEM_RIGHT,
-  DESKS_NEW_DESK,
-  DESKS_REMOVE_CURRENT_DESK,
-  DESKS_ACTIVATE_0,
-  DESKS_ACTIVATE_1,
-  DESKS_ACTIVATE_2,
-  DESKS_ACTIVATE_3,
-  DESKS_ACTIVATE_4,
-  DESKS_ACTIVATE_5,
-  DESKS_ACTIVATE_6,
-  DESKS_ACTIVATE_7,
-  DESKS_TOGGLE_ASSIGN_TO_ALL_DESKS,
-  DISABLE_CAPS_LOCK,
-  EXIT,
-  FOCUS_CAMERA_PREVIEW,
-  FOCUS_NEXT_PANE,
-  FOCUS_PREVIOUS_PANE,
-  FOCUS_SHELF,
-  FOCUS_PIP,
-  KEYBOARD_BACKLIGHT_TOGGLE,
-  KEYBOARD_BRIGHTNESS_DOWN,
-  KEYBOARD_BRIGHTNESS_UP,
-  LAUNCH_APP_0,
-  LAUNCH_APP_1,
-  LAUNCH_APP_2,
-  LAUNCH_APP_3,
-  LAUNCH_APP_4,
-  LAUNCH_APP_5,
-  LAUNCH_APP_6,
-  LAUNCH_APP_7,
-  LAUNCH_LAST_APP,
-  LOCK_PRESSED,
-  LOCK_RELEASED,
-  LOCK_SCREEN,
-  MAGNIFIER_ZOOM_IN,
-  MAGNIFIER_ZOOM_OUT,
-  MEDIA_FAST_FORWARD,
-  MEDIA_NEXT_TRACK,
-  MEDIA_PAUSE,
-  MEDIA_PLAY,
-  MEDIA_PLAY_PAUSE,
-  MEDIA_PREV_TRACK,
-  MEDIA_REWIND,
-  MEDIA_STOP,
-  MICROPHONE_MUTE_TOGGLE,
-  MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS,
-  NEW_INCOGNITO_WINDOW,
-  NEW_TAB,
-  NEW_WINDOW,
-  OPEN_CALCULATOR,
-  OPEN_CROSH,
-  OPEN_DIAGNOSTICS,
-  OPEN_FEEDBACK_PAGE,
-  OPEN_FILE_MANAGER,
-  OPEN_GET_HELP,
-  // Similar to TOGGLE_CLIPBOARD_HISTORY but is used to paste plain text only
-  // when clipboard history menu is already open.
-  PASTE_CLIPBOARD_HISTORY_PLAIN_TEXT,
-  POWER_PRESSED,
-  POWER_RELEASED,
-  PRINT_UI_HIERARCHIES,
-  PRIVACY_SCREEN_TOGGLE,
-  RESTORE_TAB,
-  ROTATE_SCREEN,
-  ROTATE_WINDOW,
-  SCALE_UI_DOWN,
-  SCALE_UI_RESET,
-  SCALE_UI_UP,
-  SHOW_EMOJI_PICKER,
-  TOGGLE_IME_MENU_BUBBLE,
-  SHOW_SHORTCUT_VIEWER,
-  SHOW_STYLUS_TOOLS,
-  SHOW_TASK_MANAGER,
-  START_ASSISTANT,
-  SUSPEND,
-  SWAP_PRIMARY_DISPLAY,
-  SWITCH_IME,  // Switch to another IME depending on the accelerator.
-  SWITCH_TO_LAST_USED_IME,
-  SWITCH_TO_NEXT_IME,
-  SWITCH_TO_NEXT_USER,
-  SWITCH_TO_PREVIOUS_USER,
-  TAKE_PARTIAL_SCREENSHOT,
-  TAKE_SCREENSHOT,
-  TAKE_WINDOW_SCREENSHOT,
-  TOGGLE_APP_LIST,
-  TOGGLE_CALENDAR,
-  TOGGLE_CAPS_LOCK,
-  TOGGLE_CLIPBOARD_HISTORY,
-  TOGGLE_DICTATION,
-  TOGGLE_DOCKED_MAGNIFIER,
-  TOGGLE_FLOATING,
-  TOGGLE_FULLSCREEN,
-  TOGGLE_FULLSCREEN_MAGNIFIER,
-  TOGGLE_GAME_DASHBOARD,
-  TOGGLE_HIGH_CONTRAST,
-  TOGGLE_MAXIMIZED,
-  TOGGLE_MESSAGE_CENTER_BUBBLE,
-  TOGGLE_MIRROR_MODE,
-  TOGGLE_MULTITASK_MENU,
-  TOGGLE_OVERVIEW,
-  TOGGLE_PROJECTOR_MARKER,
-  TOGGLE_RESIZE_LOCK_MENU,
-  TOGGLE_SPOKEN_FEEDBACK,
-  TOGGLE_SYSTEM_TRAY_BUBBLE,
-  TOGGLE_WIFI,
-  TOGGLE_SNAP_GROUP_WINDOWS_MINIMIZE_AND_RESTORE,
-  TOUCH_HUD_CLEAR,
-  TOUCH_HUD_MODE_CHANGE,
-  UNPIN,
-  VOLUME_DOWN,
-  VOLUME_MUTE,
-  VOLUME_UP,
-  WINDOW_CYCLE_SNAP_LEFT,
-  WINDOW_CYCLE_SNAP_RIGHT,
-  WINDOW_MINIMIZE,
-  MINIMIZE_TOP_WINDOW_ON_BACK,
-
-  // Debug accelerators are intentionally at the end, so that if you remove one
-  // you don't need to update tests which check hashes of the ids.
-  DEBUG_KEYBOARD_BACKLIGHT_TOGGLE,
-  DEBUG_MICROPHONE_MUTE_TOGGLE,
-  DEBUG_PRINT_LAYER_HIERARCHY,
-  DEBUG_PRINT_VIEW_HIERARCHY,
-  DEBUG_PRINT_WINDOW_HIERARCHY,
-  DEBUG_SHOW_TOAST,
-  DEBUG_SYSTEM_UI_STYLE_VIEWER,
-  // TODO(crbug.com/1336836): Remove fling accelerators after float is released.
-  DEBUG_TUCK_FLOATED_WINDOW_LEFT,
-  DEBUG_TUCK_FLOATED_WINDOW_RIGHT,
-  DEBUG_TOGGLE_DARK_MODE,
-  DEBUG_TOGGLE_DYNAMIC_COLOR,
-  DEBUG_TOGGLE_GLANCEABLES,
-  DEBUG_TOGGLE_POWER_BUTTON_MENU,
-  DEBUG_TOGGLE_SHOW_DEBUG_BORDERS,
-  DEBUG_TOGGLE_SHOW_FPS_COUNTER,
-  DEBUG_TOGGLE_SHOW_PAINT_RECTS,
-  DEBUG_TOGGLE_TOUCH_PAD,
-  DEBUG_TOGGLE_TOUCH_SCREEN,
-  DEBUG_TOGGLE_TABLET_MODE,
-  DEBUG_TOGGLE_VIDEO_CONFERENCE_CAMERA_TRAY_ICON,
-  DEBUG_TOGGLE_WALLPAPER_MODE,
-  DEBUG_TRIGGER_CRASH,  // Intentionally crash the ash process.
-  DEBUG_TOGGLE_HUD_DISPLAY,
-  DEV_ADD_REMOVE_DISPLAY,
-  // Different than TOGGLE_APP_LIST to ignore search-as-modifier-key rules for
-  // enabling the accelerator.
-  DEV_TOGGLE_APP_LIST,
-  DEV_TOGGLE_UNIFIED_DESKTOP,
-};
-
 struct AcceleratorData {
   bool trigger_on_press;
   ui::KeyboardCode keycode;
diff --git a/ash/public/cpp/ash_web_view.h b/ash/public/cpp/ash_web_view.h
index 86a7ec4..ad6a91f 100644
--- a/ash/public/cpp/ash_web_view.h
+++ b/ash/public/cpp/ash_web_view.h
@@ -51,6 +51,10 @@
     // If enabled, AshWebView fixes its zoom level to 1 (100%) for this
     // AshWebView. This uses zoom level 1 regardless of default zoom level.
     bool fix_zoom_level_to_one = false;
+
+    // Enables AshWebView to hold wake locks, for example, to keep the screen on
+    // while playing video. Passed as an param to init WebContents.
+    bool enable_wake_locks = true;
   };
 
   // An observer which receives AshWebView events.
diff --git a/ash/public/cpp/shell_window_ids.h b/ash/public/cpp/shell_window_ids.h
index 5292f0b5..dd480a5 100644
--- a/ash/public/cpp/shell_window_ids.h
+++ b/ash/public/cpp/shell_window_ids.h
@@ -23,6 +23,9 @@
   // screenshots will screenshot previous screenshots.
   kShellWindowId_ScreenAnimationContainer = 0,
 
+  // The container that displays booting animations.
+  kShellWindowId_BootingAnimationContainer,
+
   // The magnified container which contains everything that would be magnified
   // when docked magnifier is enabled.
   kShellWindowId_MagnifiedContainer,
diff --git a/ash/public/cpp/system/anchored_nudge_data.cc b/ash/public/cpp/system/anchored_nudge_data.cc
new file mode 100644
index 0000000..805c877
--- /dev/null
+++ b/ash/public/cpp/system/anchored_nudge_data.cc
@@ -0,0 +1,57 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/public/cpp/system/anchored_nudge_data.h"
+
+#include <utility>
+
+#include "ash/strings/grit/ash_strings.h"
+#include "base/time/time.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+namespace {
+
+// TODO(b/280499122): Simplify by using ActionButtonParams struct.
+std::u16string GetDismissText(const std::u16string& custom_dismiss_text,
+                              bool has_dismiss_button) {
+  if (!has_dismiss_button) {
+    return {};
+  }
+
+  return !custom_dismiss_text.empty()
+             ? custom_dismiss_text
+             : l10n_util::GetStringUTF16(IDS_ASH_TOAST_DISMISS_BUTTON);
+}
+
+}  // namespace
+
+AnchoredNudgeData::AnchoredNudgeData(const std::string& id,
+                                     AnchoredNudgeCatalogName catalog_name,
+                                     const std::u16string& text,
+                                     views::View* anchor,
+                                     // TODO(b/280499122): Condense "dismiss"
+                                     // vars into ActionButtonParams struct.
+                                     bool has_dismiss_button,
+                                     const std::u16string& custom_dismiss_text,
+                                     base::RepeatingClosure dismiss_callback,
+                                     const gfx::VectorIcon& leading_icon)
+    : id(std::move(id)),
+      catalog_name(catalog_name),
+      text(text),
+      anchor(anchor),
+      dismiss_text(GetDismissText(custom_dismiss_text, has_dismiss_button)),
+      dismiss_callback(std::move(dismiss_callback)),
+      leading_icon(&leading_icon) {}
+
+AnchoredNudgeData::AnchoredNudgeData(AnchoredNudgeData&& other) = default;
+
+AnchoredNudgeData& AnchoredNudgeData::operator=(AnchoredNudgeData&& other) =
+    default;
+
+AnchoredNudgeData::~AnchoredNudgeData() = default;
+
+}  // namespace ash
diff --git a/ash/public/cpp/system/anchored_nudge_data.h b/ash/public/cpp/system/anchored_nudge_data.h
new file mode 100644
index 0000000..e9d2810
--- /dev/null
+++ b/ash/public/cpp/system/anchored_nudge_data.h
@@ -0,0 +1,69 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_PUBLIC_CPP_SYSTEM_ANCHORED_NUDGE_DATA_H_
+#define ASH_PUBLIC_CPP_SYSTEM_ANCHORED_NUDGE_DATA_H_
+
+#include <string>
+
+#include "ash/constants/notifier_catalogs.h"
+#include "ash/public/cpp/ash_public_export.h"
+#include "base/functional/callback.h"
+#include "base/time/time.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/bubble/bubble_border.h"
+
+namespace views {
+class View;
+}
+
+namespace ash {
+
+// Describes the contents of an AnchoredNudge, which is a notifier that anchors
+// to an `anchor` view and informs users about something that might enhance
+// their experience immediately. See the "Educational Nudges" section in
+// go/notifier-framework for example usages.
+struct ASH_PUBLIC_EXPORT AnchoredNudgeData {
+  AnchoredNudgeData(
+      const std::string& id,
+      AnchoredNudgeCatalogName catalog_name,
+      const std::u16string& text,
+      views::View* anchor,
+      bool has_dismiss_button = false,
+      const std::u16string& custom_dismiss_text = std::u16string(),
+      base::RepeatingClosure dismiss_callback = base::RepeatingClosure(),
+      const gfx::VectorIcon& leading_icon = gfx::kNoneIcon);
+  AnchoredNudgeData(AnchoredNudgeData&& other);
+  AnchoredNudgeData& operator=(AnchoredNudgeData&& other);
+  ~AnchoredNudgeData();
+
+  std::string id;
+  AnchoredNudgeCatalogName catalog_name;
+  std::u16string text;
+
+  // Unowned. Must outlive the `AnchoredNudge` created with this by observing
+  // its `OnViewIsDeleting()` in `AnchoredNudgeManagerImpl`.
+  raw_ptr<views::View> anchor;
+
+  views::BubbleBorder::Arrow arrow = views::BubbleBorder::BOTTOM_CENTER;
+
+  // If `has_dismiss_button` is true, it will use the default dismiss text
+  // unless a non-empty `custom_dismiss_text` is given.
+  std::u16string dismiss_text;
+
+  // To disable dismiss via timer, set `has_infinite_duration_` to true.
+  // A nudge with infinite duration will be displayed until the dismiss button
+  // on the nudge is clicked, or when it is destroyed due to other reasons (e.g.
+  // anchor view is deleted, user locks session, etc.)
+  bool has_infinite_duration = false;
+
+  // TODO(b/259100049): We should turn this into a `OnceClosure`.
+  base::RepeatingClosure dismiss_callback;
+  const gfx::VectorIcon* leading_icon;
+  base::OnceClosure expired_callback;
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_SYSTEM_ANCHORED_NUDGE_DATA_H_
diff --git a/ash/quick_pair/repository/fast_pair/device_image_store_unittest.cc b/ash/quick_pair/repository/fast_pair/device_image_store_unittest.cc
index 5a7594e7..67431ff 100644
--- a/ash/quick_pair/repository/fast_pair/device_image_store_unittest.cc
+++ b/ash/quick_pair/repository/fast_pair/device_image_store_unittest.cc
@@ -199,9 +199,10 @@
   PrefService* local_state = Shell::Get()->local_state();
   const base::Value::Dict& device_image_store_dict =
       local_state->GetDict(DeviceImageStore::kDeviceImageStorePref);
-  const base::Value* images_dict = device_image_store_dict.Find(kTestModelId);
+  const base::Value::Dict* images_dict =
+      device_image_store_dict.FindDict(kTestModelId);
   EXPECT_TRUE(images_dict);
-  const std::string* persisted_image = images_dict->FindStringKey("Default");
+  const std::string* persisted_image = images_dict->FindString("Default");
   std::string expected_encoded_image =
       webui::GetBitmapDataUrl(test_image_.AsBitmap());
   EXPECT_EQ(*persisted_image, expected_encoded_image);
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 9c11234..71d2fad 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -103,6 +103,7 @@
 #include "ui/events/event_utils.h"
 #include "ui/views/controls/menu/menu_model_adapter.h"
 #include "ui/views/controls/menu/menu_runner.h"
+#include "ui/views/layout/fill_layout.h"
 #include "ui/views/view_model.h"
 #include "ui/views/view_model_utils.h"
 #include "ui/views/widget/widget.h"
@@ -1374,6 +1375,16 @@
 
   CreateContainer(kShellWindowId_PowerButtonAnimationContainer,
                   "PowerButtonAnimationContainer", magnified_container);
+
+  // Make sure booting animation container is always on top of all other
+  // siblings under the `magnified_container`.
+  if (ash::features::IsOobeSimonEnabled()) {
+    aura::Window* booting_animation_container =
+        CreateContainer(kShellWindowId_BootingAnimationContainer,
+                        "BootingAnimationContainer", magnified_container);
+    booting_animation_container->SetLayoutManager(
+        std::make_unique<FillLayoutManager>(booting_animation_container));
+  }
 }
 
 aura::Window* RootWindowController::CreateContainer(int window_id,
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 6ecd367..899fb826 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -618,8 +618,8 @@
             GetShelfWidget()->GetBackgroundType());
 }
 
-// Verifies that the hidden shelf shows after triggering the FOCUS_SHELF
-// accelerator (https://crbug.com/1111426).
+// Verifies that the hidden shelf shows after triggering the
+// AcceleratorAction::kFocusShelf accelerator (https://crbug.com/1111426).
 TEST_F(ShelfLayoutManagerTest, ShowHiddenShelfByFocusShelfAccelerator) {
   // Open a window so that the shelf will auto-hide.
   std::unique_ptr<aura::Window> window(CreateTestWindow());
@@ -630,8 +630,8 @@
   EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState());
 
   // Focus on the shelf by accelerator.
-  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(FOCUS_SHELF,
-                                                                 {});
+  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
+      AcceleratorAction::kFocusShelf, {});
 
   // Shelf should be visible.
   EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState());
@@ -1979,7 +1979,7 @@
 
   // Show the status menu. That should make the shelf visible again.
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      TOGGLE_SYSTEM_TRAY_BUBBLE, {});
+      AcceleratorAction::kToggleSystemTrayBubble, {});
   GetAppListTestHelper()->WaitUntilIdle();
   EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState());
   EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState());
@@ -4188,7 +4188,7 @@
 
   // Show the system tray on the secondary display.
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      TOGGLE_SYSTEM_TRAY_BUBBLE, {});
+      AcceleratorAction::kToggleSystemTrayBubble, {});
   Shelf* secondary_shelf =
       RootWindowController::ForWindow(secondary_root_window)->shelf();
   ASSERT_TRUE(secondary_shelf->status_area_widget()->IsMessageBubbleShown());
diff --git a/ash/shell.cc b/ash/shell.cc
index ed1437e..af714cb4 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -30,6 +30,7 @@
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/app_list/app_list_feature_usage_metrics.h"
 #include "ash/assistant/assistant_controller_impl.h"
+#include "ash/booting/booting_animation_controller.h"
 #include "ash/calendar/calendar_controller.h"
 #include "ash/capture_mode/capture_mode_controller.h"
 #include "ash/child_accounts/parent_access_controller_impl.h"
@@ -1571,6 +1572,11 @@
 
   window_tree_host_manager_->InitHosts();
 
+  if (ash::features::IsOobeSimonEnabled()) {
+    booting_animation_controller_ =
+        std::make_unique<BootingAnimationController>();
+  }
+
   // Create virtual keyboard after WindowTreeHostManager::InitHosts() since
   // it may enable the virtual keyboard immediately, which requires a
   // WindowTreeHostManager to host the keyboard window.
diff --git a/ash/shell.h b/ash/shell.h
index 3328058..e056762 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -116,6 +116,7 @@
 class BluetoothDeviceStatusUiHandler;
 class BluetoothNotificationController;
 class BluetoothStateCache;
+class BootingAnimationController;
 class BrightnessControlDelegate;
 class CalendarController;
 class CameraEffectsController;
@@ -430,6 +431,9 @@
   BluetoothStateCache* bluetooth_state_cache() {
     return bluetooth_state_cache_.get();
   }
+  BootingAnimationController* booting_animation_controller() {
+    return booting_animation_controller_.get();
+  }
   BrightnessControlDelegate* brightness_control_delegate() {
     return brightness_control_delegate_.get();
   }
@@ -953,6 +957,7 @@
   std::unique_ptr<FloatController> float_controller_;
   std::unique_ptr<GameDashboardController> game_dashboard_controller_;
   std::unique_ptr<GeolocationController> geolocation_controller_;
+  std::unique_ptr<BootingAnimationController> booting_animation_controller_;
   std::unique_ptr<GlanceablesController> glanceables_controller_;
   std::unique_ptr<GlanceablesV2Controller> glanceables_v2_controller_;
   std::unique_ptr<HoldingSpaceController> holding_space_controller_;
diff --git a/ash/system/accessibility/dictation_button_tray_unittest.cc b/ash/system/accessibility/dictation_button_tray_unittest.cc
index 811a6a8..bfa5ff2 100644
--- a/ash/system/accessibility/dictation_button_tray_unittest.cc
+++ b/ash/system/accessibility/dictation_button_tray_unittest.cc
@@ -195,12 +195,12 @@
   EXPECT_TRUE(GetTray()->GetEnabled());
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::TOGGLE_DICTATION, {});
+      AcceleratorAction::kToggleDictation, {});
   EXPECT_TRUE(controller->dictation_active());
   EXPECT_TRUE(GetTray()->is_active());
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::TOGGLE_DICTATION, {});
+      AcceleratorAction::kToggleDictation, {});
   EXPECT_FALSE(controller->dictation_active());
   EXPECT_FALSE(GetTray()->is_active());
 }
@@ -222,7 +222,7 @@
                                          *off_icon.bitmap()));
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::TOGGLE_DICTATION, {});
+      AcceleratorAction::kToggleDictation, {});
 
   EXPECT_TRUE(gfx::test::AreBitmapsEqual(*view->GetImage().bitmap(),
                                          *on_icon.bitmap()));
@@ -239,7 +239,7 @@
 
   // Action doesn't work because disabled.
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::TOGGLE_DICTATION, {});
+      AcceleratorAction::kToggleDictation, {});
   EXPECT_FALSE(controller->dictation_active());
   EXPECT_FALSE(tray->GetEnabled());
 
diff --git a/ash/system/accessibility/floating_accessibility_controller_unittest.cc b/ash/system/accessibility/floating_accessibility_controller_unittest.cc
index d61f74a..0149dde 100644
--- a/ash/system/accessibility/floating_accessibility_controller_unittest.cc
+++ b/ash/system/accessibility/floating_accessibility_controller_unittest.cc
@@ -620,7 +620,7 @@
   views::FocusManager* focus_manager = widget()->GetFocusManager();
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::FOCUS_SHELF, {});
+      AcceleratorAction::kFocusShelf, {});
   // If nothing else is enabled, it should focus on the detailed view button.
   EXPECT_EQ(focus_manager->GetFocusedView(),
             GetMenuButton(FloatingAccessibilityView::ButtonId::kSettingsList));
@@ -631,7 +631,7 @@
             GetMenuButton(FloatingAccessibilityView::ButtonId::kSettingsList));
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::FOCUS_SHELF, {});
+      AcceleratorAction::kFocusShelf, {});
   // It should get back to the settings list button.
   EXPECT_EQ(focus_manager->GetFocusedView(),
             GetMenuButton(FloatingAccessibilityView::ButtonId::kSettingsList));
@@ -643,7 +643,7 @@
   // We should be focused on the first button in the menu.
   // Order: select to speak, virtual keyboard, settings menu, position.
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      AcceleratorAction::FOCUS_SHELF, {});
+      AcceleratorAction::kFocusShelf, {});
   EXPECT_EQ(focus_manager->GetFocusedView(),
             GetMenuButton(FloatingAccessibilityView::ButtonId::kSelectToSpeak));
 }
diff --git a/ash/system/eche/eche_tray.cc b/ash/system/eche/eche_tray.cc
index 763ecb5..637673b 100644
--- a/ash/system/eche/eche_tray.cc
+++ b/ash/system/eche/eche_tray.cc
@@ -130,33 +130,33 @@
 // AcceleratorsActions which should be handled by the AcceleratorController, not
 // the eche tray.
 constexpr AcceleratorAction kLocallyProcessedAcceleratorActions[] = {
-    AcceleratorAction::OPEN_FEEDBACK_PAGE,            // Shift + Alt + I
-    AcceleratorAction::EXIT,                          // Shift + Ctrl + Q
-    AcceleratorAction::SHOW_SHORTCUT_VIEWER,          // Ctrl + Alt + /
-    AcceleratorAction::TOGGLE_CAPS_LOCK,              // Alt + Search
-    AcceleratorAction::NEW_WINDOW,                    // Ctrl + N
-    AcceleratorAction::NEW_INCOGNITO_WINDOW,          // Shift + Ctrl + N
-    AcceleratorAction::NEW_TAB,                       // Ctrl + T
-    AcceleratorAction::OPEN_FILE_MANAGER,             // Shift + Alt + M
-    AcceleratorAction::LAUNCH_APP_0,                  // Alt + 1
-    AcceleratorAction::LAUNCH_APP_1,                  // Alt + 2
-    AcceleratorAction::LAUNCH_APP_2,                  // Alt + 3
-    AcceleratorAction::LAUNCH_APP_3,                  // Alt + 4
-    AcceleratorAction::LAUNCH_APP_4,                  // Alt + 5
-    AcceleratorAction::LAUNCH_APP_5,                  // Alt + 6
-    AcceleratorAction::LAUNCH_APP_6,                  // Alt + 7
-    AcceleratorAction::LAUNCH_APP_7,                  // Alt + 8
-    AcceleratorAction::LAUNCH_LAST_APP,               // Alt + 9
-    AcceleratorAction::TOGGLE_MESSAGE_CENTER_BUBBLE,  // Shift + Alt + N
-    AcceleratorAction::SCALE_UI_UP,                   // Shift + Ctrl + "+"
-    AcceleratorAction::SCALE_UI_DOWN,                 // Shift + Ctrl + "-"
-    AcceleratorAction::SCALE_UI_RESET,                // Shift + Ctrl + 0
-    AcceleratorAction::ROTATE_SCREEN,                 // Shift + Ctrl + Refresh
-    AcceleratorAction::TOGGLE_SPOKEN_FEEDBACK,        // Ctrl + Alt + Z
-    AcceleratorAction::FOCUS_SHELF,                   // Shift + Alt + L
-    AcceleratorAction::FOCUS_NEXT_PANE,               // Ctrl + Back
-    AcceleratorAction::FOCUS_PREVIOUS_PANE,           // Ctrl + Forward
-    AcceleratorAction::TOGGLE_APP_LIST                // Launcher(Search)
+    AcceleratorAction::kOpenFeedbackPage,           // Shift + Alt + I
+    AcceleratorAction::kExit,                       // Shift + Ctrl + Q
+    AcceleratorAction::kShowShortcutViewer,         // Ctrl + Alt + /
+    AcceleratorAction::kToggleCapsLock,             // Alt + Search
+    AcceleratorAction::kNewWindow,                  // Ctrl + N
+    AcceleratorAction::kNewIncognitoWindow,         // Shift + Ctrl + N
+    AcceleratorAction::kNewTab,                     // Ctrl + T
+    AcceleratorAction::kOpenFileManager,            // Shift + Alt + M
+    AcceleratorAction::kLaunchApp0,                 // Alt + 1
+    AcceleratorAction::kLaunchApp1,                 // Alt + 2
+    AcceleratorAction::kLaunchApp2,                 // Alt + 3
+    AcceleratorAction::kLaunchApp3,                 // Alt + 4
+    AcceleratorAction::kLaunchApp4,                 // Alt + 5
+    AcceleratorAction::kLaunchApp5,                 // Alt + 6
+    AcceleratorAction::kLaunchApp6,                 // Alt + 7
+    AcceleratorAction::kLaunchApp7,                 // Alt + 8
+    AcceleratorAction::kLaunchLastApp,              // Alt + 9
+    AcceleratorAction::kToggleMessageCenterBubble,  // Shift + Alt + N
+    AcceleratorAction::kScaleUiUp,                  // Shift + Ctrl + "+"
+    AcceleratorAction::kScaleUiDown,                // Shift + Ctrl + "-"
+    AcceleratorAction::kScaleUiReset,               // Shift + Ctrl + 0
+    AcceleratorAction::kRotateScreen,               // Shift + Ctrl + Refresh
+    AcceleratorAction::kToggleSpokenFeedback,       // Ctrl + Alt + Z
+    AcceleratorAction::kFocusShelf,                 // Shift + Alt + L
+    AcceleratorAction::kFocusNextPane,              // Ctrl + Back
+    AcceleratorAction::kFocusPreviousPane,          // Ctrl + Forward
+    AcceleratorAction::kToggleAppList               // Launcher(Search)
 };
 
 // Creates a button with the given callback, icon, and tooltip text.
@@ -917,7 +917,7 @@
   // upper in the chain and perform the minimize by reacting to
   // ToggleMinimized().
   if (accelerator_controller->DoesAcceleratorMatchAction(
-          accelerator, AcceleratorAction::WINDOW_MINIMIZE)) {
+          accelerator, AcceleratorAction::kWindowMinimize)) {
     CloseBubble();
     return true;
   }
@@ -960,7 +960,7 @@
       if (!is_only_control_down)
         return false;
       // Please note that ctrl+w does not have a global accelerator action
-      // similar to AcceleratorAction::WINDOW_MINIMIZE that was used above.
+      // similar to AcceleratorAction::kWindowMinimize that was used above.
       //
       // TODO(https://crbug/1338650): See if we can just leave this to be
       // handled upper in the chain.
diff --git a/ash/system/ime_menu/ime_menu_tray_unittest.cc b/ash/system/ime_menu/ime_menu_tray_unittest.cc
index b04dadc9..e9c1c1c 100644
--- a/ash/system/ime_menu/ime_menu_tray_unittest.cc
+++ b/ash/system/ime_menu/ime_menu_tray_unittest.cc
@@ -351,7 +351,7 @@
   ASSERT_FALSE(IsTrayBackgroundActive());
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      TOGGLE_IME_MENU_BUBBLE, {});
+      AcceleratorAction::kToggleImeMenuBubble, {});
   EXPECT_TRUE(IsTrayBackgroundActive());
   EXPECT_TRUE(IsBubbleShown());
 
diff --git a/ash/system/network/network_list_mobile_header_view_impl.cc b/ash/system/network/network_list_mobile_header_view_impl.cc
index 390c7ef..ecc55ed 100644
--- a/ash/system/network/network_list_mobile_header_view_impl.cc
+++ b/ash/system/network/network_list_mobile_header_view_impl.cc
@@ -58,6 +58,9 @@
       return IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_RESETTING_ESIM;
     case chromeos::network_config::mojom::InhibitReason::kDisablingProfile:
       return IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_DISABLING_PROFILE;
+    case chromeos::network_config::mojom::InhibitReason::
+        kRequestingAvailableProfiles:
+      return IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_REQUESTING_AVAILABLE_PROFILES;
   }
 }
 
diff --git a/ash/system/network/network_list_mobile_header_view_unittest.cc b/ash/system/network/network_list_mobile_header_view_unittest.cc
index 925b1217..59022e1 100644
--- a/ash/system/network/network_list_mobile_header_view_unittest.cc
+++ b/ash/system/network/network_list_mobile_header_view_unittest.cc
@@ -198,6 +198,8 @@
        IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_RESETTING_ESIM},
       {CellularInhibitor::InhibitReason::kDisablingProfile,
        IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_DISABLING_PROFILE},
+      {CellularInhibitor::InhibitReason::kRequestingAvailableProfiles,
+       IDS_ASH_STATUS_TRAY_INHIBITED_CELLULAR_REQUESTING_AVAILABLE_PROFILES},
   };
 
   for (auto cases : kTestCases) {
diff --git a/ash/system/power/power_button_screenshot_controller.cc b/ash/system/power/power_button_screenshot_controller.cc
index 6638435..3b95346 100644
--- a/ash/system/power/power_button_screenshot_controller.cc
+++ b/ash/system/power/power_button_screenshot_controller.cc
@@ -169,7 +169,7 @@
       now <= volume_up_key_pressed_time_ + kScreenshotChordDelay;
   if (consume_volume_down_ || consume_volume_up_) {
     Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-        TAKE_SCREENSHOT, {});
+        AcceleratorAction::kTakeScreenshot, {});
 
     base::RecordAction(base::UserMetricsAction("Accel_PowerButton_Screenshot"));
   }
@@ -180,7 +180,8 @@
     const ui::Accelerator& accelerator,
     bool down) {
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      down ? VOLUME_DOWN : VOLUME_UP, accelerator);
+      down ? AcceleratorAction::kVolumeDown : AcceleratorAction::kVolumeUp,
+      accelerator);
 }
 
 }  // namespace ash
diff --git a/ash/system/toast/anchored_nudge.cc b/ash/system/toast/anchored_nudge.cc
index 3e38905..675d373 100644
--- a/ash/system/toast/anchored_nudge.cc
+++ b/ash/system/toast/anchored_nudge.cc
@@ -30,26 +30,16 @@
 
 }  // namespace
 
-AnchoredNudge::AnchoredNudge(views::View* anchor)
-    : views::BubbleDialogDelegateView(anchor,
-                                      views::BubbleBorder::BOTTOM_CENTER,
+AnchoredNudge::AnchoredNudge(AnchoredNudgeData nudge_data)
+    : views::BubbleDialogDelegateView(nudge_data.anchor,
+                                      nudge_data.arrow,
                                       views::BubbleBorder::NO_SHADOW) {
   SetButtons(ui::DIALOG_BUTTON_NONE);
   set_color(SK_ColorTRANSPARENT);
   set_margins(gfx::Insets());
   SetLayoutManager(std::make_unique<views::FlexLayout>());
-
-  // Temporary placeholder texts.
-  // TODO(b/279653685): Pass this data through `AnchoredNudgeData` parameter.
-  std::u16string multiline_text =
-      u"Meet wants to use the camera. Turn on your device's physical camera "
-      u"switch.";
-  std::u16string text = u"Meet wants to use the camera.";
-  std::u16string empty_dismiss_text = std::u16string();
-  std::u16string dismiss_text = u"Learn more";
-
   toast_contents_view_ = AddChildView(std::make_unique<SystemToastStyle>(
-      /*dismiss_callback=*/base::DoNothing(), text, empty_dismiss_text));
+      nudge_data.dismiss_callback, nudge_data.text, nudge_data.dismiss_text));
 }
 
 AnchoredNudge::~AnchoredNudge() = default;
diff --git a/ash/system/toast/anchored_nudge.h b/ash/system/toast/anchored_nudge.h
index cd1d736..9c5c8fa 100644
--- a/ash/system/toast/anchored_nudge.h
+++ b/ash/system/toast/anchored_nudge.h
@@ -7,11 +7,11 @@
 
 #include "ash/ash_export.h"
 #include "ash/public/cpp/shelf_types.h"
+#include "ash/public/cpp/system/anchored_nudge_data.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 namespace views {
-class View;
 class Widget;
 }  // namespace views
 
@@ -26,7 +26,7 @@
  public:
   METADATA_HEADER(AnchoredNudge);
 
-  explicit AnchoredNudge(views::View* anchor);
+  explicit AnchoredNudge(AnchoredNudgeData nudge_data);
   AnchoredNudge(const AnchoredNudge&) = delete;
   AnchoredNudge& operator=(const AnchoredNudge&) = delete;
   ~AnchoredNudge() override;
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index 9f8f374..cbe98d2 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -504,7 +504,7 @@
 
 absl::optional<AcceleratorAction> UnifiedSystemTray::GetAcceleratorAction()
     const {
-  return absl::make_optional(TOGGLE_SYSTEM_TRAY_BUBBLE);
+  return absl::make_optional(AcceleratorAction::kToggleSystemTrayBubble);
 }
 
 void UnifiedSystemTray::OnAnyBubbleVisibilityChanged(
diff --git a/ash/touch/touch_devices_controller_unittest.cc b/ash/touch/touch_devices_controller_unittest.cc
index 728c042..570a423 100644
--- a/ash/touch/touch_devices_controller_unittest.cc
+++ b/ash/touch/touch_devices_controller_unittest.cc
@@ -115,7 +115,7 @@
 // Tests that touchpad enabled user pref works properly under debug accelerator.
 TEST_F(TouchDevicesControllerSigninTest, ToggleTouchpad) {
   ASSERT_TRUE(GetUserPrefTouchpadEnabled());
-  debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_PAD);
+  debug::PerformDebugActionIfEnabled(AcceleratorAction::kDebugToggleTouchPad);
   EXPECT_FALSE(GetUserPrefTouchpadEnabled());
 
   // Switch to user 2 and switch back.
@@ -124,7 +124,7 @@
   SwitchActiveUser(kUser1Email);
   EXPECT_FALSE(GetUserPrefTouchpadEnabled());
 
-  debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_PAD);
+  debug::PerformDebugActionIfEnabled(AcceleratorAction::kDebugToggleTouchPad);
   EXPECT_TRUE(GetUserPrefTouchpadEnabled());
 }
 
@@ -154,7 +154,8 @@
   ASSERT_TRUE(GetGlobalTouchscreenEnabled());
   ASSERT_TRUE(GetUserPrefTouchscreenEnabled());
 
-  debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_SCREEN);
+  debug::PerformDebugActionIfEnabled(
+      AcceleratorAction::kDebugToggleTouchScreen);
   EXPECT_TRUE(GetGlobalTouchscreenEnabled());
   EXPECT_FALSE(GetUserPrefTouchscreenEnabled());
 
@@ -165,7 +166,8 @@
   EXPECT_TRUE(GetGlobalTouchscreenEnabled());
   EXPECT_FALSE(GetUserPrefTouchscreenEnabled());
 
-  debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_SCREEN);
+  debug::PerformDebugActionIfEnabled(
+      AcceleratorAction::kDebugToggleTouchScreen);
   EXPECT_TRUE(GetUserPrefTouchscreenEnabled());
   EXPECT_TRUE(GetGlobalTouchscreenEnabled());
 
diff --git a/ash/webui/common/resources/network/apn_list.js b/ash/webui/common/resources/network/apn_list.js
index 4f246f2..f597e78 100644
--- a/ash/webui/common/resources/network/apn_list.js
+++ b/ash/webui/common/resources/network/apn_list.js
@@ -110,6 +110,13 @@
    * @private
    */
   shouldShowErrorMessage_() {
+    // In some instances, there can be an |errorState| and also a connected APN.
+    // Don't show the error message as the network is actually connected.
+    if (this.managedCellularProperties &&
+        this.managedCellularProperties.connectedApn) {
+      return false;
+    }
+
     return this.errorState === SHILL_INVALID_APN_ERROR;
   }
 
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.html b/ash/webui/os_feedback_ui/resources/confirmation_page.html
index a69a167..ab4ea5c6 100644
--- a/ash/webui/os_feedback_ui/resources/confirmation_page.html
+++ b/ash/webui/os_feedback_ui/resources/confirmation_page.html
@@ -5,6 +5,14 @@
     --iron-icon-height: 40px;
   }
 
+  :host-context(body.jelly-enabled) .label {
+    font: var(--cros-button-1-font);
+  }
+
+  :host-context(body.jelly-enabled) .sub-label {
+    font: var(--cros-button-2-font);
+  }
+
   :host-context(body.jelly-enabled) cr-link-row {
     background-color: var(--cros-sys-app_base);
     border: none;
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js
index 47d1931..ca009bf 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_flow.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -271,8 +271,13 @@
     if (loadTimeData.getBoolean('isJellyEnabledForOsFeedback')) {
       // TODO(b/276493287): After the Jelly experiment is launched, replace
       // `cros_styles.css` with `theme/colors.css` directly in `index.html`.
+      // Also add `theme/typography.css` to `index.html`.
       document.querySelector('link[href*=\'cros_styles.css\']')
           ?.setAttribute('href', 'chrome://theme/colors.css?sets=legacy,sys');
+      const typographyLink = document.createElement('link');
+      typographyLink.href = 'chrome://theme/typography.css';
+      typographyLink.rel = 'stylesheet';
+      document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
       startColorChangeUpdater();
     }
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.html b/ash/webui/os_feedback_ui/resources/file_attachment.html
index b32192d..9af59c5 100644
--- a/ash/webui/os_feedback_ui/resources/file_attachment.html
+++ b/ash/webui/os_feedback_ui/resources/file_attachment.html
@@ -1,12 +1,19 @@
 <style include="os-feedback-shared">
   :host-context(body.jelly-enabled) .file-input {
     color: var(--cros-sys-on_surface);
+    font: var(--cros-body-2-font);
   }
 
   :host-context(body.jelly-enabled) #addFileIcon {
     --cr-icon-button-fill-color: var(--cros-sys-on_surface);
   }
 
+  :host-context(body.jelly-enabled) #addFileLabel,
+  :host-context(body.jelly-enabled) #selectedFileName,
+  :host-context(body.jelly-enabled) #replaceFileButton {
+    font: var(--cros-button-2-font);
+  }
+
   /* Special attribute to hide elements. */
   [hidden] {
     display: none !important;
diff --git a/ash/webui/os_feedback_ui/resources/help_content.html b/ash/webui/os_feedback_ui/resources/help_content.html
index 039384a3..09ac9cb4 100644
--- a/ash/webui/os_feedback_ui/resources/help_content.html
+++ b/ash/webui/os_feedback_ui/resources/help_content.html
@@ -1,4 +1,16 @@
 <style>
+  :host-context(body.jelly-enabled) .help-content-label {
+    font: var(--cros-headline-1-font);
+  }
+
+  :host-context(body.jelly-enabled) .help-item a {
+    font: var(--cros-body-1-font);
+  }
+
+  :host-context(body.jelly-enabled) paper-tooltip::part(tooltip) {
+    font: var(--cros-annotation-2-font);
+  }
+
   [class~='help-item']:last-of-type  {
     padding-bottom: 3px;
   }
diff --git a/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html b/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
index 282e22a..73dc1e0 100644
--- a/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
+++ b/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
@@ -11,20 +11,51 @@
       --feedback-medium-font-weight: 500;
     }
 
+    :host-context(body.jelly-enabled) {
+      --feedback-roboto-font-family: var(--cros-body-0-font);
+      --feedback-google-sans-font-family: var(--cros-body-0-font);
+      font: var(--cros-body-2-font);
+    }
+
     :host-context([dir='rtl']) .dialog-back-arrow {
       transform: rotate(180deg);
     }
 
+    :host-context(body.jelly-enabled) .dialog-toolbar {
+      font: var(--cros-headline-1-font);
+    }
+
     :host-context(body.jelly-enabled) .md-select {
       --md-select-bg-color: var(--cros-sys-app_base);
     }
 
+    :host-context(body.jelly-enabled) .page-title {
+      font: var(--cros-display-6-font);
+    }
+
+    :host-context(body:not(jelly-enabled)) cr-button {
+      font: var(--cros-button-2-font);
+    }
+
+    :host-context(body:not(jelly-enabled)) cr-button.action-button {
+      font: var(--cros-body-1-font);
+    }
+
     :host-context(body:not(jelly-enabled)) cr-checkbox {
       --cr-checkbox-unchecked-box-color: var(--cros-icon-color-primary);
     }
 
     :host-context(body.jelly-enabled) cr-dialog::part(dialog) {
       border-radius: 20px;
+      font: var(--cros-body-2-font);
+    }
+
+    :host-context(body.jelly-enabled) paper-tooltip::part(tooltip) {
+      font: var(--cros-annotation-2-font);
+    }
+
+    :host-context(body.jelly-enabled) h2 {
+      font: var(--cros-headline-1-font);
     }
 
     a {
diff --git a/ash/webui/os_feedback_ui/resources/search_page.html b/ash/webui/os_feedback_ui/resources/search_page.html
index 9bd94f6..f995dc79 100644
--- a/ash/webui/os_feedback_ui/resources/search_page.html
+++ b/ash/webui/os_feedback_ui/resources/search_page.html
@@ -1,6 +1,15 @@
 <style include="os-feedback-shared">
+  :host-context(body.jelly-enabled) #descriptionEmptyError {
+    font: var(--cros-annotation-2-font);
+  }
+
   :host-context(body.jelly-enabled) #descriptionText {
     background-color: var(--cros-sys-input_field_on_shaded);
+    font: var(--cros-body-2-font);
+  }
+
+  :host-context(body.jelly-enabled) #descriptionText::placeholder {
+    font: var(--cros-body-2-font);
   }
 
   :host-context(body.jelly-enabled) #descriptionText.has-error {
@@ -8,6 +17,10 @@
     outline: 2px solid var(--cros-sys-error);
   }
 
+  :host-context(body.jelly-enabled) #feedbackWritingGuidance {
+    font: var(--cros-body-2-font);
+  }
+
   :host-context(body.jelly-enabled) #emptyErrorIcon {
     --iron-icon-fill-color: var(--cros-sys-error);
   }
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html
index df39857..fab7e21 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.html
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -1,4 +1,20 @@
 <style include="os-feedback-shared">
+  :host-context(body.jelly-enabled) #privacyNote {
+    font: var(--cros-body-2-font);
+  }
+
+  :host-context(body.jelly-enabled) #screenshotCheckLabel {
+    font: var(--cros-button-2-font);
+  }
+
+  :host-context(body.jelly-enabled) .checkbox-label {
+    font: var(--cros-body-2-font);
+  }
+
+  :host-context(body.jelly-enabled) cr-dialog [slot=body] {
+    font: var(--cros-body-1-font);
+  }
+
   ::-webkit-scrollbar {
     background-color: transparent;
     border-radius: 4px;
@@ -24,7 +40,6 @@
     border-radius: 0 12px 12px 0;
   }
 
-
   #privacyNote {
     color: var(--cros-color-secondary);
     font-size: 13px;
diff --git a/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js b/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js
index 4d1073b7..aa672a4 100644
--- a/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js
+++ b/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js
@@ -40,8 +40,14 @@
   if (loadTimeData.getBoolean('isJellyEnabledForOsFeedback')) {
     // TODO(b/276493287): After the Jelly experiment is launched, replace
     // `cros_styles.css` with `theme/colors.css` directly in `index.html`.
+    // Also add `theme/typography.css` to `index.html`.
     document.querySelector('link[href*=\'cros_styles.css\']')
         ?.setAttribute('href', '//theme/colors.css?sets=legacy,sys');
+    const typographyLink = document.createElement('link');
+    typographyLink.href = '//theme/typography.css';
+    typographyLink.rel = 'stylesheet';
+    document.head.appendChild(typographyLink);
+    document.body.classList.add('jelly-enabled');
     startColorChangeUpdater();
     // Post a message to parent to make testing `startColorChangeUpdater()`
     // called from untrusted ui easier.
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html
index a93163a..7ed06f84 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html
@@ -70,10 +70,31 @@
     white-space: pre-wrap;
   }
 
+  #descriptionDialog h3[slot='title'] {
+    color: var(--cros-sys-on_secondary_container);
+    font: var(--cros-title-1-font);
+    padding-top: 24px;
+  }
+
+  #descriptionDialog p[slot='body'] {
+    color: var(--cros-sys-secondary);
+    font: var(--cros-body-1-font);
+  }
+
+  #descriptionDialog div[slot='button-container'] {
+    height: 36px;
+    padding: 8px 20px 20px 20px;
+  }
+
+  #descriptionDialog div[slot='button-container'] cr-button {
+    border-radius: 18px;
+    font: var(--cros-button-2-font);
+    height: 100%;
+  }
+
   info-svg::part(path) {
     fill: var(--text-color);
   }
-
 </style>
 <header id="container" class$="[[getContainerClass_(isLoading_, showImage_)]]">
   <template is="dom-if" if="[[showPlaceholders_(isLoading_, showImage_)]]">
diff --git a/ash/webui/print_management/resources/print_management_shared.css b/ash/webui/print_management/resources/print_management_shared.css
index d5a0b007..d21b8a78 100644
--- a/ash/webui/print_management/resources/print_management_shared.css
+++ b/ash/webui/print_management/resources/print_management_shared.css
@@ -139,7 +139,7 @@
 
 @media (min-width: 600px) and (max-width: 767px) {
   :host-context(body.jelly-enabled) #headerContainer {
-    margin: 0 20px;
+    margin-inline: 20px;
   }
 
   :host-context(body.jelly-enabled) .data-container {
@@ -159,7 +159,7 @@
   }
 
   :host-context(body:not(.jelly-enabled)) .margin-border {
-    margin: 0px 40px 0px 40px;
+    margin-inline: 40px;
   }
 
   .padded-left {
@@ -177,13 +177,13 @@
   #activeStatusContainer:hover {
     border-radius: 16px;
     margin-inline-start: 16px;
-    padding-left: 16px;
+    padding-inline-start: 16px;
   }
 }
 
 @media (min-width: 768px) and (max-width: 959px) {
   :host-context(body.jelly-enabled) #headerContainer {
-    margin: 0 20px;
+    margin-inline: 20px;
   }
 
   :host-context(body.jelly-enabled) .data-container {
@@ -203,7 +203,7 @@
   }
 
   :host-context(body:not(.jelly-enabled)) .margin-border {
-    margin: 0px 40px 0px 40px;
+    margin-inline: 40px;
   }
 
   .padded-left {
@@ -221,13 +221,13 @@
   #activeStatusContainer:hover {
     border-radius: 16px;
     margin-inline-start: 16px;
-    padding-left: 16px;
+    padding-inline-start: 16px;
   }
 }
 
 @media (min-width: 960px) and (max-width: 1279px) {
   :host-context(body.jelly-enabled) #headerContainer {
-    margin: 0 32px;
+    margin-inline: 32px;
   }
 
   :host-context(body.jelly-enabled) .data-container {
@@ -247,7 +247,7 @@
   }
 
   .margin-border {
-    margin: 0px 64px 0px 64px;
+    margin-inline: 64px;
   }
 
   .padded-left {
@@ -265,13 +265,13 @@
   #activeStatusContainer:hover {
     border-radius: 16px;
     margin-inline-start: 16px;
-    padding-left: 16px;
+    padding-inline-start: 16px;
   }
 }
 
 @media (min-width: 1280px) {
   :host-context(body.jelly-enabled) #headerContainer {
-    margin: 0 72px;
+    margin-inline: 72px;
   }
 
   :host-context(body.jelly-enabled) .data-container {
@@ -291,7 +291,7 @@
   }
 
   :host-context(body:not(.jelly-enabled)) .margin-border {
-    margin: 0px 144px 0px 144px;
+    margin-inline: 144px;
   }
 
   .padded-left {
@@ -309,6 +309,6 @@
   #activeStatusContainer:hover {
     border-radius: 16px;
     margin-inline-start: 16px;
-    padding-left: 16px;
+    padding-inline-start: 16px;
   }
 }
diff --git a/ash/webui/scanning/resources/action_toolbar.html b/ash/webui/scanning/resources/action_toolbar.html
index c0585ef..5308ff8 100644
--- a/ash/webui/scanning/resources/action_toolbar.html
+++ b/ash/webui/scanning/resources/action_toolbar.html
@@ -3,6 +3,10 @@
     background-color: var(--cros-sys-secondary_container);
   }
 
+  :host-context(body.jelly-enabled) #pageNumbers {
+    font: var(--cros-button-2-font);
+  }
+
   :host-context(body:not(.jelly-enabled)) cr-icon-button {
     --cr-icon-button-fill-color: var(--google-grey-200);
     --cr-icon-button-hover-background-color:
diff --git a/ash/webui/scanning/resources/loading_page.html b/ash/webui/scanning/resources/loading_page.html
index 26b6eeb..8d5d9a7 100644
--- a/ash/webui/scanning/resources/loading_page.html
+++ b/ash/webui/scanning/resources/loading_page.html
@@ -1,4 +1,12 @@
 <style include="scanning-fonts scanning-shared">
+  :host-context(body.jelly-enabled) #noScannersSubtext {
+    font: var(--cros-body-1-font);
+  }
+
+  :host-context(body.jelly-enabled) h1 {
+    font: var(--cros-display-6-font);
+  }
+
   #loadingContainer {
     align-items: center;
     display: flex;
diff --git a/ash/webui/scanning/resources/multi_page_checkbox.html b/ash/webui/scanning/resources/multi_page_checkbox.html
index 642b0d3..c3b6c6a7 100644
--- a/ash/webui/scanning/resources/multi_page_checkbox.html
+++ b/ash/webui/scanning/resources/multi_page_checkbox.html
@@ -1,4 +1,8 @@
 <style include="scanning-shared">
+  :host-context(body.jelly-enabled) #checkboxDiv {
+    font: var(--cros-annotation-1-font);
+  }
+
   scan-settings-section {
     --scan-setting-section-height: 40px;
   }
diff --git a/ash/webui/scanning/resources/multi_page_scan.html b/ash/webui/scanning/resources/multi_page_scan.html
index 87961cc..d7a0afc 100644
--- a/ash/webui/scanning/resources/multi_page_scan.html
+++ b/ash/webui/scanning/resources/multi_page_scan.html
@@ -1,4 +1,8 @@
 <style include="scanning-fonts cros-color-overrides">
+  :host-context(body.jelly-enabled) .container {
+    font: var(--cros-body-2-font);
+  }
+
   .label,
   #buttonContainer {
     width: 272px;
diff --git a/ash/webui/scanning/resources/scan_done_section.html b/ash/webui/scanning/resources/scan_done_section.html
index 9140e15e..3db0c048 100644
--- a/ash/webui/scanning/resources/scan_done_section.html
+++ b/ash/webui/scanning/resources/scan_done_section.html
@@ -1,4 +1,8 @@
 <style include="scanning-fonts cros-color-overrides">
+  :host-context(body.jelly-enabled) .container {
+    font: var(--cros-body-2-font);
+  }
+
   .container,
   #doneButtonContainer {
     width: 272px;
diff --git a/ash/webui/scanning/resources/scan_preview.html b/ash/webui/scanning/resources/scan_preview.html
index 24cf65ce..5bdfb81 100644
--- a/ash/webui/scanning/resources/scan_preview.html
+++ b/ash/webui/scanning/resources/scan_preview.html
@@ -14,6 +14,15 @@
                             0 8px 12px 1px var(--cros-shadow-color-ambient);
   }
 
+  :host-context(body.jelly-enabled) #cancelingText,
+  :host-context(body.jelly-enabled) #progressText {
+    font: var(--cros-body-0-font);
+  }
+
+  :host-context(body.jelly-enabled) #helperText {
+    font: var(--cros-body-2-font);
+  }
+
   :host-context(body.jelly-enabled) #helpOrProgress {
     background-color: var(--cros-sys-app_base);
   }
diff --git a/ash/webui/scanning/resources/scan_settings_section.html b/ash/webui/scanning/resources/scan_settings_section.html
index 773f90c..616e6d7 100644
--- a/ash/webui/scanning/resources/scan_settings_section.html
+++ b/ash/webui/scanning/resources/scan_settings_section.html
@@ -1,4 +1,8 @@
 <style include="scanning-shared scanning-fonts">
+  :host-context(body.jelly-enabled) ::slotted([slot=label]) {
+    font: var(--cros-body-2-font);
+  }
+
   #selectDiv {
     align-items: center;
     display: flex;
diff --git a/ash/webui/scanning/resources/scanning_app.html b/ash/webui/scanning/resources/scanning_app.html
index 4243a012..d1cc3a00f 100644
--- a/ash/webui/scanning/resources/scanning_app.html
+++ b/ash/webui/scanning/resources/scanning_app.html
@@ -1,4 +1,12 @@
 <style include="cr-shared-style scanning-shared scanning-fonts">
+  :host-context(body.jelly-enabled) #appTitle {
+    font: var(--cros-display-6-font);
+  }
+
+  :host-context(body.jelly-enabled) #moreSettingsButton {
+    font: var(--cros-annotation-1-font);
+  }
+
   #appTitle {
     color: var(--scanning-app-title-text-color);
     font-family: var(--scanning-app-title-font-family);
diff --git a/ash/webui/scanning/resources/scanning_app.js b/ash/webui/scanning/resources/scanning_app.js
index 50cac09..568c984 100644
--- a/ash/webui/scanning/resources/scanning_app.js
+++ b/ash/webui/scanning/resources/scanning_app.js
@@ -406,8 +406,13 @@
     if (loadTimeData.getBoolean('isJellyEnabledForScanningApp')) {
       // TODO(b/276493795): After the Jelly experiment is launched, replace
       // `cros_styles.css` with `theme/colors.css` directly in `index.html`.
+      // Also add `theme/typography.css` to `index.html`.
       document.querySelector('link[href*=\'cros_styles.css\']')
           ?.setAttribute('href', 'chrome://theme/colors.css?sets=legacy,sys');
+      const typographyLink = document.createElement('link');
+      typographyLink.href = 'chrome://theme/typography.css';
+      typographyLink.rel = 'stylesheet';
+      document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
       startColorChangeUpdater();
     }
diff --git a/ash/webui/scanning/resources/scanning_fonts_css.html b/ash/webui/scanning/resources/scanning_fonts_css.html
index 4ba5ed3..f4ca3c2 100644
--- a/ash/webui/scanning/resources/scanning_fonts_css.html
+++ b/ash/webui/scanning/resources/scanning_fonts_css.html
@@ -50,7 +50,55 @@
     }
 
     :host-context(body.jelly-enabled) {
+      --scanning-action-toolbar-font-family: var(--cros-body-0-font-family);
+      --scanning-app-title-font-family: var(--cros-body-0-font-family);
+      --scanning-done-section-option-font-family: var(--cros-body-0-font-family);
+      --scanning-helper-text-font-family: var(--cros-body-0-font-family);
+      --scanning-more-settings-font-family: var(--cros-body-0-font-family);
+      --scanning-multi-page-checkbox-font-family: var(--cros-body-0-font-family);
+      --scanning-no-scanners-subtext-font-family: var(--cros-body-0-font-family);
+      --scanning-progress-text-font-family: var(--cros-body-0-font-family);
+      --scanning-scan-setting-font-family: var(--cros-body-0-font-family);
+      --scanning-scanners-loading-font-family: var(--cros-body-0-font-family);
+
+      --scanning-action-toolbar-font-size: var(--cros-body-2-font-size);
+      --scanning-app-title-font-size: var(--cros-display-6-font-size);
+      --scanning-done-section-option-font-size: var(--cros-body-2-font-size);
+      --scanning-helper-text-font-size: var(--cros-body-2-font-size);
+      --scanning-more-settings-font-size: var(--cros-annotation-1-font-size);
+      --scanning-multi-page-checkbox-font-size: var(--cros-annotation-1-font-size);
+      --scanning-no-scanners-subtext-font-size: var(--cros-body-1-font-size);
+      --scanning-progress-text-font-size: var(--cros-body-0-font-size);
+      --scanning-scan-setting-font-size: var(--cros-body-2-font-size);
+      --scanning-scanners-loading-font-size: var(--cros-display-6-font-size);
+
+      --scanning-action-toolbar-line-height: var(--cros-body-2-font-line-height);
+      --scanning-app-title-line-height: var(--cros-display-6-font-line-height);
+      --scanning-done-section-option-line-height: var(--cros-body-2-font-line-height);
+      --scanning-helper-text-line-height: var(--cros-body-2-font-line-height);
+      --scanning-more-settings-line-height: var(--cros-display-7-font-line-height);
+      --scanning-multi-page-checkbox-line-height: var(--cros-display-7-font-line-height);
+      --scanning-no-scanners-subtext-line-height: var(--cros-body-2-font-line-height);
+      --scanning-progress-text-line-height: var(--cros-title-1-font-line-height);
+      --scanning-scan-setting-line-height: var(--cros-body-2-font-line-height);
+      --scanning-scanners-loading-line-height: var(--cros-display-6-font-line-height);
+
+      --scanning-regular-font-weight: var(--cros-body-2-font-weight);
+      --scanning-medium-font-weight: var(--cros-display-6-font-font-weight);
+
       --scanning-action-toolbar-text-color: var(--cros-sys-on_disabled_container);
     }
+
+    :host-context(body.jelly-enabled) cr-button {
+      font: var(--cros-button-2-font);
+    }
+
+    :host-context(body.jelly-enabled) cr-button.action-button {
+      font: var(--cros-button-1-font);
+    }
+
+    :host-context(body.jelly-enabled) cr-toast {
+      font: var(--cros-body-2-font);
+    }
   </style>
 </template>
diff --git a/ash/webui/scanning/resources/scanning_shared_css.html b/ash/webui/scanning/resources/scanning_shared_css.html
index edd465b..3d3651f 100644
--- a/ash/webui/scanning/resources/scanning_shared_css.html
+++ b/ash/webui/scanning/resources/scanning_shared_css.html
@@ -22,6 +22,15 @@
       --md-select-bg-color: var(--cros-sys-app_base_shaded);
       --md-select-focus-shadow-color: var(--cros-sys-focus_ring);
       --md-select-option-bg-color: var(--cros-sys-app_base_shaded);
+      font: var(--cros-button-2-font);
+    }
+
+    :host-context(body.jelly-enabled) cr-dialog::part(dialog) {
+      font: var(--cros-body-1-font);
+    }
+
+    :host-context(body.jelly-enabled) cr-dialog [slot=title] {
+      font: var(--cros-display-7-font);
     }
 
     paper-progress {
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
index db80cff..099d0fb 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
@@ -57,26 +57,26 @@
 // accelerators and hide them from display.
 const HiddenAcceleratorMap& GetHiddenAcceleratorMap() {
   static auto hiddenAcceleratorMap = base::NoDestructor<HiddenAcceleratorMap>(
-      {{TOGGLE_APP_LIST,
+      {{AcceleratorAction::kToggleAppList,
         {ui::Accelerator(ui::VKEY_BROWSER_SEARCH, ui::EF_SHIFT_DOWN,
                          ui::Accelerator::KeyState::PRESSED),
          ui::Accelerator(ui::VKEY_LWIN, ui::EF_SHIFT_DOWN,
                          ui::Accelerator::KeyState::RELEASED)}},
-       {SHOW_SHORTCUT_VIEWER,
+       {AcceleratorAction::kShowShortcutViewer,
         {ui::Accelerator(ui::VKEY_F14, ui::EF_NONE,
                          ui::Accelerator::KeyState::PRESSED),
          ui::Accelerator(
              ui::VKEY_OEM_2,
              ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
              ui::Accelerator::KeyState::PRESSED)}},
-       {OPEN_GET_HELP,
+       {AcceleratorAction::kOpenGetHelp,
         {ui::Accelerator(ui::VKEY_OEM_2,
                          ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
                          ui::Accelerator::KeyState::PRESSED)}},
-       {TOGGLE_FULLSCREEN,
+       {AcceleratorAction::kToggleFullscreen,
         {ui::Accelerator(ui::VKEY_ZOOM, ui::EF_SHIFT_DOWN,
                          ui::Accelerator::KeyState::PRESSED)}},
-       {SWITCH_TO_LAST_USED_IME,
+       {AcceleratorAction::kSwitchToLastUsedIme,
         {ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
                          ui::Accelerator::KeyState::RELEASED)}}});
   return *hiddenAcceleratorMap;
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
index 03ed23c..18c19add 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -480,11 +480,12 @@
 
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
   Shell::Get()->ash_accelerator_configuration()->Initialize(test_data);
   base::RunLoop().RunUntilIdle();
@@ -498,11 +499,11 @@
   // Initialize with a new set of accelerators.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
       {/*trigger_on_press=*/true, ui::VKEY_MEDIA_LAUNCH_APP1,
-       ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT},
+       ui::EF_CONTROL_DOWN, AcceleratorAction::kTakeScreenshot},
   };
   Shell::Get()->ash_accelerator_configuration()->Initialize(updated_test_data);
   base::RunLoop().RunUntilIdle();
@@ -568,25 +569,26 @@
 
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       // Accelerators that should be hidden from display.
       {/*trigger_on_press=*/true, ui::VKEY_BROWSER_SEARCH, ui::EF_SHIFT_DOWN,
-       TOGGLE_APP_LIST},
+       AcceleratorAction::kToggleAppList},
       {/*trigger_on_press=*/false, ui::VKEY_LWIN, ui::EF_SHIFT_DOWN,
-       TOGGLE_APP_LIST},
+       AcceleratorAction::kToggleAppList},
       {/*trigger_on_press=*/true, ui::VKEY_F14, ui::EF_NONE,
-       SHOW_SHORTCUT_VIEWER},
+       AcceleratorAction::kShowShortcutViewer},
       {/*trigger_on_press=*/true, ui::VKEY_OEM_2,
        ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
-       SHOW_SHORTCUT_VIEWER},
+       AcceleratorAction::kShowShortcutViewer},
       {/*trigger_on_press=*/true, ui::VKEY_OEM_2,
-       ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, OPEN_GET_HELP},
+       ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
+       AcceleratorAction::kOpenGetHelp},
       {/*trigger_on_press=*/false, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_LAST_USED_IME},
+       AcceleratorAction::kSwitchToLastUsedIme},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_SHIFT_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
   };
 
   // Initialize with a set of accelerators that include hidden accelerators.
@@ -595,9 +597,9 @@
 
   const AcceleratorData expected_test_data[]{
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
   };
   EXPECT_EQ(1, observer_.num_times_notified());
 
@@ -635,24 +637,26 @@
 
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_SHIFT_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_NONE,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE,
-       BRIGHTNESS_UP},
+       AcceleratorAction::kBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       // Fake accelerator data - [search] is part of the original accelerator.
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_COMMAND_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
   };
 
   Shell::Get()->ash_accelerator_configuration()->Initialize(test_data);
@@ -692,25 +696,28 @@
   const AcceleratorData expected_test_data[] = {
       // alt + tab -> alt + tab
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       // alt + shift + tab -> alt + shift + tab
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleBackwardMru},
       // search + esc -> search + esc
       {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       // shift + zoom -> shift + search + VKEY_ZOOM
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM,
-       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN, TOGGLE_FULLSCREEN},
+       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kToggleFullscreen},
       // zoom -> search + VKEY_ZOOM
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_COMMAND_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
       // brightness_up -> search + VKEY_BRIGHTNESS_UP
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
-       BRIGHTNESS_UP},
+       AcceleratorAction::kBrightnessUp},
       // alt + brightness_up -> alt + search + VKEY_BRIGHTNESS_UP
       {/*trigger_on_press=*/true, ui::VKEY_BRIGHTNESS_UP,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
   };
 
   EXPECT_EQ(3, mojo_observer.num_times_notified());
@@ -729,81 +736,94 @@
 
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       // Below are fake shortcuts, only used for testing.
       {/*trigger_on_press=*/true, ui::VKEY_DELETE, ui::EF_NONE,
-       CYCLE_BACKWARD_MRU},
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_NONE,
-       TAKE_WINDOW_SCREENSHOT},
+       AcceleratorAction::kTakeWindowScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_END, ui::EF_SHIFT_DOWN,
-       DISABLE_CAPS_LOCK},
-      {/*trigger_on_press=*/true, ui::VKEY_NEXT, ui::EF_ALT_DOWN, NEW_TAB},
-      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE, NEW_TAB},
-      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_ALT_DOWN, NEW_TAB},
+       AcceleratorAction::kDisableCapsLock},
+      {/*trigger_on_press=*/true, ui::VKEY_NEXT, ui::EF_ALT_DOWN,
+       AcceleratorAction::kNewTab},
+      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE,
+       AcceleratorAction::kNewTab},
+      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_ALT_DOWN,
+       AcceleratorAction::kNewTab},
       // When [search] is part of the original accelerator.
       {/*trigger_on_press=*/true, ui::VKEY_HOME,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_END,
-       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN, DISABLE_CAPS_LOCK},
+       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kDisableCapsLock},
       //  Edge case: [Shift] + [Delete].
       {/*trigger_on_press=*/true, ui::VKEY_DELETE, ui::EF_SHIFT_DOWN,
-       DESKS_NEW_DESK},
+       AcceleratorAction::kDesksNewDesk},
   };
 
   const AcceleratorData expected_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       // Below are fake shortcuts, only used for testing.
       {/*trigger_on_press=*/true, ui::VKEY_DELETE, ui::EF_NONE,
-       CYCLE_BACKWARD_MRU},
+       AcceleratorAction::kCycleBackwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_NONE,
-       TAKE_WINDOW_SCREENSHOT},
+       AcceleratorAction::kTakeWindowScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_END, ui::EF_SHIFT_DOWN,
-       DISABLE_CAPS_LOCK},
-      {/*trigger_on_press=*/true, ui::VKEY_NEXT, ui::EF_ALT_DOWN, NEW_TAB},
-      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE, NEW_TAB},
-      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_ALT_DOWN, NEW_TAB},
+       AcceleratorAction::kDisableCapsLock},
+      {/*trigger_on_press=*/true, ui::VKEY_NEXT, ui::EF_ALT_DOWN,
+       AcceleratorAction::kNewTab},
+      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE,
+       AcceleratorAction::kNewTab},
+      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_ALT_DOWN,
+       AcceleratorAction::kNewTab},
 
       // When [search] is part of the original accelerator. No remapping is
       // done. Search+Alt+Home -> Search+Alt+Home.
       {/*trigger_on_press=*/true, ui::VKEY_HOME,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
       // Search+Shift+End -> Search+Shift+End.
       {/*trigger_on_press=*/true, ui::VKEY_END,
-       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN, DISABLE_CAPS_LOCK},
+       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kDisableCapsLock},
 
       // Edge case: [Shift] + [Delete]. It should not remapped to
       // [Shift]+[Search]+[Back](aka, Insert).
       //  Shift+Delete -> Shift+Delete
       {/*trigger_on_press=*/true, ui::VKEY_DELETE, ui::EF_SHIFT_DOWN,
-       DESKS_NEW_DESK},
+       AcceleratorAction::kDesksNewDesk},
 
       // Additional six-pack remapped accelerators.
       // Delete -> Search+Backspace
       {/*trigger_on_press=*/true, ui::VKEY_BACK, ui::EF_COMMAND_DOWN,
-       CYCLE_BACKWARD_MRU},
+       AcceleratorAction::kCycleBackwardMru},
       // Home -> Search+Left
       {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN,
-       TAKE_WINDOW_SCREENSHOT},
+       AcceleratorAction::kTakeWindowScreenshot},
       // Alt+Home -> Search+Alt+Left
       {/*trigger_on_press=*/true, ui::VKEY_LEFT,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
       // Shift+End -> Search+Shift+Right
       {/*trigger_on_press=*/true, ui::VKEY_RIGHT,
-       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN, DISABLE_CAPS_LOCK},
+       ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kDisableCapsLock},
       // Alt+Next -> Search+Alt+Down
       {/*trigger_on_press=*/true, ui::VKEY_DOWN,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, NEW_TAB},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, AcceleratorAction::kNewTab},
       // Insert -> Search+Shift+Backspace
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
-       ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, NEW_TAB},
+       ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, AcceleratorAction::kNewTab},
       // Alt+Insert -> Search+Shift+Alt+Backspace
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
-       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, NEW_TAB},
+       ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
+       AcceleratorAction::kNewTab},
   };
 
   Shell::Get()->ash_accelerator_configuration()->Initialize(test_data);
@@ -827,89 +847,105 @@
   const AcceleratorData test_data[] = {
       // Below are fake shortcuts, only used for testing.
       {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_ALT_DOWN,
-       CYCLE_BACKWARD_MRU},
-      {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN, NEW_TAB},
+       AcceleratorAction::kCycleBackwardMru},
+      {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kNewTab},
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, DISABLE_CAPS_LOCK},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kDisableCapsLock},
 
       {/*trigger_on_press=*/true, ui::VKEY_LEFT,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_LEFT,
        ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN,
-       TAKE_WINDOW_SCREENSHOT},
+       AcceleratorAction::kTakeWindowScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_UP,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, DESKS_NEW_DESK},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, AcceleratorAction::kDesksNewDesk},
       {/*trigger_on_press=*/true, ui::VKEY_RIGHT,
        ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
       {/*trigger_on_press=*/true, ui::VKEY_DOWN,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, KEYBOARD_BRIGHTNESS_DOWN},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kKeyboardBrightnessDown},
 
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
        ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
-       ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, BRIGHTNESS_UP},
+       ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
+       AcceleratorAction::kBrightnessUp},
   };
 
   const AcceleratorData expected_data[] = {
       // When [Search] is not part of original accelerator, no remapping is
       // done. [Left]+[Alt]>[Left]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_ALT_DOWN,
-       CYCLE_BACKWARD_MRU},
+       AcceleratorAction::kCycleBackwardMru},
       // When [Search] is the only modifier, [Left]+[Search]->[Home].
-      {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN, NEW_TAB},
-      {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_NONE, NEW_TAB},
+      {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kNewTab},
+      {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_NONE,
+       AcceleratorAction::kNewTab},
       // When key code is not reversed six pack key, no remapping is done.
       // [Tab]+[Search]+[Alt]->[Tab]+[Search]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_TAB,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, DISABLE_CAPS_LOCK},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kDisableCapsLock},
 
       // [Left]+[Search]+[Alt]->[Home]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_LEFT,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, KEYBOARD_BRIGHTNESS_UP},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kKeyboardBrightnessUp},
       {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_UP},
+       AcceleratorAction::kKeyboardBrightnessUp},
       // [Left]+[Search]+[Shift]+[Alt]->[Home]+[Shift]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_LEFT,
        ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-       TAKE_WINDOW_SCREENSHOT},
+       AcceleratorAction::kTakeWindowScreenshot},
       {/*trigger_on_press=*/true, ui::VKEY_HOME,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, TAKE_WINDOW_SCREENSHOT},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kTakeWindowScreenshot},
       // [Up]+[Search]+[Alt]->[Prior]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_UP,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, DESKS_NEW_DESK},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, AcceleratorAction::kDesksNewDesk},
       {/*trigger_on_press=*/true, ui::VKEY_PRIOR, ui::EF_ALT_DOWN,
-       DESKS_NEW_DESK},
+       AcceleratorAction::kDesksNewDesk},
       // [Right]+[Search]+[Shift]+[Alt]->[End]+[Shift]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_RIGHT,
        ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-       TOGGLE_FULLSCREEN},
+       AcceleratorAction::kToggleFullscreen},
       {/*trigger_on_press=*/true, ui::VKEY_END,
-       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, TOGGLE_FULLSCREEN},
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kToggleFullscreen},
       // [Down]+[Search]+[Alt]->[Next]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_DOWN,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, KEYBOARD_BRIGHTNESS_DOWN},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kKeyboardBrightnessDown},
       {/*trigger_on_press=*/true, ui::VKEY_NEXT, ui::EF_ALT_DOWN,
-       KEYBOARD_BRIGHTNESS_DOWN},
+       AcceleratorAction::kKeyboardBrightnessDown},
 
       // [Back]+[Search]+[Alt]->[Delete]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
-       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU},
+       ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
+       AcceleratorAction::kCycleForwardMru},
       {/*trigger_on_press=*/true, ui::VKEY_DELETE, ui::EF_ALT_DOWN,
-       CYCLE_FORWARD_MRU},
+       AcceleratorAction::kCycleForwardMru},
       // [Back]+[Search]+[Shift]+[Alt]->[Insert]+[Alt].
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
        ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_ALT_DOWN,
-       SHOW_TASK_MANAGER},
+       AcceleratorAction::kShowTaskManager},
       // [Back]+[Search]+[Shift] -> [Insert].
       {/*trigger_on_press=*/true, ui::VKEY_BACK,
-       ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, BRIGHTNESS_UP},
-      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE, BRIGHTNESS_UP},
+       ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
+       AcceleratorAction::kBrightnessUp},
+      {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE,
+       AcceleratorAction::kBrightnessUp},
   };
 
   Shell::Get()->ash_accelerator_configuration()->Initialize(test_data);
@@ -1041,7 +1077,7 @@
   // Initialize with all custom accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_NEXT_IME},
+       AcceleratorAction::kSwitchToNextIme},
   };
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
@@ -1054,7 +1090,7 @@
 
   // Remove the accelerator.
   provider_->RemoveAccelerator(
-      mojom::AcceleratorSource::kAsh, SWITCH_TO_NEXT_IME,
+      mojom::AcceleratorSource::kAsh, AcceleratorAction::kSwitchToNextIme,
       ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN),
       base::BindLambdaForTesting([&](AcceleratorResultDataPtr result) {
         EXPECT_EQ(AcceleratorConfigResult::kSuccess, result->result);
@@ -1064,15 +1100,17 @@
             config->GetAllAccelerators();
         EXPECT_EQ(0u, updated_accelerators.size());
 
-        // Now verify that removing the default for `SWITCH_TO_NEXT_IME` will
-        // only disable it from the config.
+        // Now verify that removing the default for
+        // `AcceleratorAction::kSwitchToNextIme` will only disable it from the
+        // config.
         base::RunLoop().RunUntilIdle();
         AcceleratorConfigurationProvider::AcceleratorConfigurationMap
             actual_config = observer.config();
         ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data,
                                      actual_config);
-        std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone(
-            actual_config[mojom::AcceleratorSource::kAsh][SWITCH_TO_NEXT_IME]));
+        std::vector<mojom::AcceleratorInfoPtr> actual_infos(
+            mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                                     [AcceleratorAction::kSwitchToNextIme]));
         EXPECT_EQ(1u, actual_infos.size());
         // A disabled default accelerator should be marked as `kDisabledByUser`.
         EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser,
@@ -1086,9 +1124,9 @@
   // Initialize with all custom accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
   };
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
@@ -1097,7 +1135,7 @@
 
   // Remove the accelerator.
   provider_->RemoveAccelerator(
-      mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+      mojom::AcceleratorSource::kAsh, AcceleratorAction::kToggleMirrorMode,
       ui::Accelerator(ui::VKEY_C, ui::EF_CONTROL_DOWN),
       base::BindLambdaForTesting([&](AcceleratorResultDataPtr result) {
         EXPECT_EQ(AcceleratorConfigResult::kNotFound, result->result);
@@ -1110,9 +1148,9 @@
   // Initialize with all custom accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
   };
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
@@ -1121,7 +1159,7 @@
 
   // Remove the accelerator.
   provider_->RemoveAccelerator(
-      mojom::AcceleratorSource::kBrowser, TOGGLE_MIRROR_MODE,
+      mojom::AcceleratorSource::kBrowser, AcceleratorAction::kToggleMirrorMode,
       ui::Accelerator(ui::VKEY_C, ui::EF_CONTROL_DOWN),
       base::BindLambdaForTesting([&](AcceleratorResultDataPtr result) {
         EXPECT_EQ(AcceleratorConfigResult::kActionLocked, result->result);
@@ -1137,7 +1175,7 @@
   // Initialize with all custom accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       SWITCH_TO_NEXT_IME},
+       AcceleratorAction::kSwitchToNextIme},
   };
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
@@ -1154,7 +1192,8 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .RemoveAccelerator(
-              mojom::AcceleratorSource::kAsh, SWITCH_TO_NEXT_IME,
+              mojom::AcceleratorSource::kAsh,
+              AcceleratorAction::kSwitchToNextIme,
               ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN), &result);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result->result);
   EXPECT_FALSE(result->shortcut_name.has_value());
@@ -1163,15 +1202,16 @@
       config->GetAllAccelerators();
   EXPECT_EQ(0u, updated_accelerators.size());
 
-  // Now verify that removing the default for `SWITCH_TO_NEXT_IME` will
-  // only disable it from the config.
+  // Now verify that removing the default for
+  // `AcceleratorAction::kSwitchToNextIme` will only disable it from the config.
   base::RunLoop().RunUntilIdle();
   AcceleratorConfigurationProvider::AcceleratorConfigurationMap actual_config =
       observer.config();
   ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data,
                                actual_config);
-  std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][SWITCH_TO_NEXT_IME]));
+  std::vector<mojom::AcceleratorInfoPtr> actual_infos(
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kSwitchToNextIme]));
   EXPECT_EQ(1u, actual_infos.size());
   // A disabled default accelerator should be marked as `kDisabledByUser`.
   EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, actual_infos[0]->state);
@@ -1193,8 +1233,9 @@
   actual_config = observer.config();
   ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data,
                                actual_config);
-  actual_infos = mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][SWITCH_TO_NEXT_IME]);
+  actual_infos =
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kSwitchToNextIme]);
   EXPECT_EQ(1u, actual_infos.size());
   // Resetting to default will reset it back to `kEnabled`.
   EXPECT_EQ(mojom::AcceleratorState::kEnabled, actual_infos[0]->state);
@@ -1208,7 +1249,7 @@
   // Initialize with all custom accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
@@ -1224,7 +1265,8 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .RemoveAccelerator(
-              mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+              mojom::AcceleratorSource::kAsh,
+              AcceleratorAction::kToggleMirrorMode,
               ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN), &result);
   EXPECT_EQ(AcceleratorConfigResult::kSuccess, result->result);
   EXPECT_FALSE(result->shortcut_name.has_value());
@@ -1233,15 +1275,17 @@
       config->GetAllAccelerators();
   EXPECT_EQ(0u, updated_accelerators.size());
 
-  // Now verify that removing the default for `TOGGLE_MIRROR_MODE` will
-  // only disable it from the config.
+  // Now verify that removing the default for
+  // `AcceleratorAction::kToggleMirrorMode` will only disable it from the
+  // config.
   base::RunLoop().RunUntilIdle();
   AcceleratorConfigurationProvider::AcceleratorConfigurationMap actual_config =
       observer.config();
   ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data,
                                actual_config);
-  std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE]));
+  std::vector<mojom::AcceleratorInfoPtr> actual_infos(
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kToggleMirrorMode]));
   EXPECT_EQ(1u, actual_infos.size());
   // A disabled default accelerator should be marked as `kDisabledByUser`.
   EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, actual_infos[0]->state);
@@ -1250,8 +1294,8 @@
   // Restore all defaults.
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .RestoreDefault(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
-                          &result);
+          .RestoreDefault(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode, &result);
 
   base::RunLoop().RunUntilIdle();
 
@@ -1263,8 +1307,9 @@
   actual_config = observer.config();
   ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data,
                                actual_config);
-  actual_infos = mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE]);
+  actual_infos =
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kToggleMirrorMode]);
   EXPECT_EQ(1u, actual_infos.size());
   // Resetting to default will reset it back to `kEnabled`.
   EXPECT_EQ(mojom::AcceleratorState::kEnabled, actual_infos[0]->state);
@@ -1275,9 +1320,9 @@
   // Initialize with all custom accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_ALT_DOWN,
-       SWAP_PRIMARY_DISPLAY},
+       AcceleratorAction::kSwapPrimaryDisplay},
   };
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
@@ -1286,7 +1331,7 @@
 
   // Remove the accelerator.
   provider_->RestoreDefault(
-      mojom::AcceleratorSource::kBrowser, TOGGLE_MIRROR_MODE,
+      mojom::AcceleratorSource::kBrowser, AcceleratorAction::kToggleMirrorMode,
       base::BindLambdaForTesting([&](AcceleratorResultDataPtr result) {
         EXPECT_EQ(AcceleratorConfigResult::kActionLocked, result->result);
         EXPECT_FALSE(result->shortcut_name.has_value());
@@ -1298,7 +1343,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1319,7 +1364,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1332,15 +1377,17 @@
   const ui::Accelerator accelerator(ui::VKEY_M, ui::EF_NONE);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
-                          accelerator, &result);
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode, accelerator,
+                          &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kMissingModifier, result->result);
 
   // Shift as the only modifier is an error.
   const ui::Accelerator shift_only_accelerator(ui::VKEY_M, ui::EF_SHIFT_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           shift_only_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kShiftOnlyNotAllowed,
             result->result);
@@ -1350,7 +1397,8 @@
                                             ui::EF_CONTROL_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           top_row_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kKeyNotAllowed, result->result);
 }
@@ -1358,7 +1406,7 @@
 TEST_F(AcceleratorConfigurationProviderTest, ReservedKeysNotAllowed) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1371,7 +1419,7 @@
   const ui::Accelerator power_accelerator(ui::VKEY_POWER, ui::EF_COMMAND_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh, kToggleMirrorMode,
                           power_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kKeyNotAllowed, result->result);
 
@@ -1379,7 +1427,7 @@
   const ui::Accelerator sleep_accelerator(ui::VKEY_SLEEP, ui::EF_COMMAND_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh, kToggleMirrorMode,
                           sleep_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kKeyNotAllowed, result->result);
 
@@ -1387,7 +1435,7 @@
   const ui::Accelerator lock_accelerator(ui::VKEY_F13, ui::EF_COMMAND_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh, kToggleMirrorMode,
                           lock_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kKeyNotAllowed, result->result);
 }
@@ -1396,7 +1444,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1414,8 +1462,9 @@
   AcceleratorResultDataPtr result;
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
-                          accelerator, &result);
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode, accelerator,
+                          &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kConflict, result->result);
   EXPECT_EQ(l10n_util::GetStringUTF16(
                 IDS_BROWSER_ACCELERATOR_DESCRIPTION_SHOW_HISTORY),
@@ -1429,7 +1478,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1448,16 +1497,17 @@
   AcceleratorResultDataPtr result;
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           good_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
   AcceleratorConfigurationProvider::AcceleratorConfigurationMap actual_config =
       observer.config();
@@ -1469,15 +1519,17 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN, OPEN_CROSH},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kOpenCrosh},
   };
 
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
   config->Initialize(test_data);
   SetLayoutDetailsMap(
-      {{OPEN_CROSH, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_CROSH,
+      {{AcceleratorAction::kOpenCrosh,
+        IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_CROSH,
         mojom::AcceleratorCategory::kGeneral,
         mojom::AcceleratorSubcategory::kGeneralControls,
         /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
@@ -1495,7 +1547,8 @@
   AcceleratorResultDataPtr result;
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           conflict_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kActionLocked, result->result);
@@ -1511,8 +1564,9 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN, OPEN_CROSH},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kOpenCrosh},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1525,7 +1579,8 @@
   AcceleratorResultDataPtr result;
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           conflict_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kConflictCanOverride,
@@ -1548,7 +1603,8 @@
   // Press the same accelerator, expect the same error.
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           conflict_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kConflictCanOverride,
@@ -1568,8 +1624,9 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN, OPEN_CROSH},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kOpenCrosh},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1588,7 +1645,8 @@
   AcceleratorResultDataPtr result;
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           conflict_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kConflictCanOverride,
@@ -1605,7 +1663,8 @@
   // Now override the accelerator.
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           conflict_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
@@ -1613,9 +1672,9 @@
   // Since this is an overridable accelerator, nothing should change at first.
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   actual_config = observer.config();
@@ -1630,7 +1689,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1645,14 +1704,15 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .ReplaceAccelerator(mojom::AcceleratorSource::kBrowser,
-                              TOGGLE_MIRROR_MODE, old_accelerator,
-                              new_accelerator, &result);
+                              AcceleratorAction::kToggleMirrorMode,
+                              old_accelerator, new_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kActionLocked, result->result);
 
-  // TOGGLE_CALENDAR does not exist.
+  // AcceleratorAction::kToggleCalendar does not exist.
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .ReplaceAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_CALENDAR,
+          .ReplaceAccelerator(mojom::AcceleratorSource::kAsh,
+                              AcceleratorAction::kToggleCalendar,
                               old_accelerator, new_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kNotFound, result->result);
 }
@@ -1664,8 +1724,9 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN, OPEN_CROSH},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kOpenCrosh},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1684,7 +1745,8 @@
   AcceleratorResultDataPtr result;
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           conflict_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kConflictCanOverride,
@@ -1702,17 +1764,19 @@
   const ui::Accelerator good_accelerator(ui::VKEY_K, ui::EF_COMMAND_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
                           good_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_K, ui::EF_COMMAND_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN, OPEN_CROSH},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_COMMAND_DOWN,
+       AcceleratorAction::kOpenCrosh},
   };
 
   actual_config = observer.config();
@@ -1743,7 +1807,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1757,17 +1821,17 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .ReplaceAccelerator(mojom::AcceleratorSource::kAsh,
-                              TOGGLE_MIRROR_MODE, old_accelerator,
-                              new_accelerator, &result);
+                              AcceleratorAction::kToggleMirrorMode,
+                              old_accelerator, new_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
 
   base::RunLoop().RunUntilIdle();
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_ALT_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   // Replacing a default will result in disabling the default and then adding
@@ -1777,8 +1841,9 @@
   ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh,
                                updated_test_data, mojo::Clone(actual_config));
 
-  std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE]));
+  std::vector<mojom::AcceleratorInfoPtr> actual_infos(
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kToggleMirrorMode]));
   EXPECT_EQ(2u, actual_infos.size());
   // A disabled default accelerator should be marked as `kDisabledByUser`.
   EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, actual_infos[0]->state);
@@ -1792,7 +1857,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1806,8 +1871,8 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .ReplaceAccelerator(mojom::AcceleratorSource::kAsh,
-                              TOGGLE_MIRROR_MODE, old_accelerator,
-                              new_accelerator, &result);
+                              AcceleratorAction::kToggleMirrorMode,
+                              old_accelerator, new_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kNotFound, result->result);
 }
 
@@ -1818,7 +1883,7 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1830,15 +1895,16 @@
   const ui::Accelerator accelerator(ui::VKEY_M, ui::EF_ALT_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .AddAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE,
-                          accelerator, &result);
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode, accelerator,
+                          &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_M, ui::EF_ALT_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   AcceleratorConfigurationProvider::AcceleratorConfigurationMap actual_config =
@@ -1851,15 +1917,15 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .ReplaceAccelerator(mojom::AcceleratorSource::kAsh,
-                              TOGGLE_MIRROR_MODE, accelerator, new_accelerator,
-                              &result);
+                              AcceleratorAction::kToggleMirrorMode, accelerator,
+                              new_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
 
   const AcceleratorData updated_test_data2[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
       {/*trigger_on_press=*/true, ui::VKEY_C, ui::EF_COMMAND_DOWN,
-       TOGGLE_MIRROR_MODE},
+       AcceleratorAction::kToggleMirrorMode},
   };
 
   actual_config = observer.config();
@@ -1875,8 +1941,9 @@
   // Initialize default accelerators.
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_D, ui::EF_ALT_DOWN, TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_D, ui::EF_ALT_DOWN,
+       AcceleratorAction::kToggleCalendar},
   };
 
   AshAcceleratorConfiguration* config =
@@ -1884,16 +1951,18 @@
   config->Initialize(test_data);
   base::RunLoop().RunUntilIdle();
 
-  // Replace the default of `TOGGLE_CALENDAR` with that of the default of
-  // `TOGGLE_MIRROR_MODE`. This results in `TOGGLE_MIRROR_MODE` to have only the
-  // disabled default accelerator, `TOGGLE_CALENDAR` will also have disabled
+  // Replace the default of `AcceleratorAction::kToggleCalendar` with that of
+  // the default of `AcceleratorAction::kToggleMirrorMode`. This results in
+  // `AcceleratorAction::kToggleMirrorMode` to have only the disabled default
+  // accelerator, `AcceleratorAction::kToggleCalendar` will also have disabled
   // default accelerator but also a new accelerator added.
   AcceleratorResultDataPtr result;
   const ui::Accelerator old_accelerator(ui::VKEY_D, ui::EF_ALT_DOWN);
   const ui::Accelerator new_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .ReplaceAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_CALENDAR,
+          .ReplaceAccelerator(mojom::AcceleratorSource::kAsh,
+                              AcceleratorAction::kToggleCalendar,
                               old_accelerator, new_accelerator, &result);
   // Overridable accelerator, but will need to re-call `ReplaceAccelerator` to
   // confirm the override.
@@ -1905,7 +1974,8 @@
 
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
-          .ReplaceAccelerator(mojom::AcceleratorSource::kAsh, TOGGLE_CALENDAR,
+          .ReplaceAccelerator(mojom::AcceleratorSource::kAsh,
+                              AcceleratorAction::kToggleCalendar,
                               old_accelerator, new_accelerator, &result);
 
   EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
@@ -1914,10 +1984,11 @@
 
   const AcceleratorData updated_test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_MIRROR_MODE},
-      {/*trigger_on_press=*/true, ui::VKEY_D, ui::EF_ALT_DOWN, TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleMirrorMode},
+      {/*trigger_on_press=*/true, ui::VKEY_D, ui::EF_ALT_DOWN,
+       AcceleratorAction::kToggleCalendar},
       {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN,
-       TOGGLE_CALENDAR},
+       AcceleratorAction::kToggleCalendar},
   };
 
   AcceleratorConfigurationProvider::AcceleratorConfigurationMap actual_config =
@@ -1925,14 +1996,16 @@
   ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh,
                                updated_test_data, mojo::Clone(actual_config));
 
-  std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE]));
+  std::vector<mojom::AcceleratorInfoPtr> actual_infos(
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kToggleMirrorMode]));
   EXPECT_EQ(1u, actual_infos.size());
   EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, actual_infos[0]->state);
   EXPECT_EQ(mojom::AcceleratorType::kDefault, actual_infos[0]->type);
 
-  std::vector<mojom::AcceleratorInfoPtr> actual_infos2(mojo::Clone(
-      actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_CALENDAR]));
+  std::vector<mojom::AcceleratorInfoPtr> actual_infos2(
+      mojo::Clone(actual_config[mojom::AcceleratorSource::kAsh]
+                               [AcceleratorAction::kToggleCalendar]));
   EXPECT_EQ(2u, actual_infos2.size());
   EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, actual_infos2[0]->state);
   EXPECT_EQ(mojom::AcceleratorType::kDefault, actual_infos2[0]->type);
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h
index 99648ad..49a4c5a1 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h
@@ -236,92 +236,102 @@
 // app.
 constexpr AcceleratorLayoutDetails kAcceleratorLayouts[] = {
     // General
-    {TOGGLE_APP_LIST, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_APP_LIST,
+    {AcceleratorAction::kToggleAppList,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_APP_LIST,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_OVERVIEW, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_OVERVIEW,
+    {AcceleratorAction::kToggleOverview,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_OVERVIEW,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_SYSTEM_TRAY_BUBBLE,
+    {AcceleratorAction::kToggleSystemTrayBubble,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_SYSTEM_TRAY_BUBBLE,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_CALENDAR, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_CALENDAR,
+    {AcceleratorAction::kToggleCalendar,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_CALENDAR,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_MESSAGE_CENTER_BUBBLE,
+    {AcceleratorAction::kToggleMessageCenterBubble,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_MESSAGE_CENTER_BUBBLE,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TAKE_SCREENSHOT, IDS_ASH_ACCELERATOR_DESCRIPTION_TAKE_SCREENSHOT,
+    {AcceleratorAction::kTakeScreenshot,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TAKE_SCREENSHOT,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TAKE_PARTIAL_SCREENSHOT,
+    {AcceleratorAction::kTakePartialScreenshot,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TAKE_PARTIAL_SCREENSHOT,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TAKE_WINDOW_SCREENSHOT,
+    {AcceleratorAction::kTakeWindowScreenshot,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TAKE_WINDOW_SCREENSHOT,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {LOCK_SCREEN, IDS_ASH_ACCELERATOR_DESCRIPTION_LOCK_SCREEN,
+    {AcceleratorAction::kLockScreen,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_LOCK_SCREEN,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SUSPEND, IDS_ASH_ACCELERATOR_DESCRIPTION_SUSPEND,
+    {AcceleratorAction::kSuspend, IDS_ASH_ACCELERATOR_DESCRIPTION_SUSPEND,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {EXIT, IDS_ASH_ACCELERATOR_DESCRIPTION_EXIT,
+    {AcceleratorAction::kExit, IDS_ASH_ACCELERATOR_DESCRIPTION_EXIT,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SWITCH_TO_NEXT_USER, IDS_ASH_ACCELERATOR_DESCRIPTION_SWITCH_TO_NEXT_USER,
+    {AcceleratorAction::kSwitchToNextUser,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SWITCH_TO_NEXT_USER,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SWITCH_TO_PREVIOUS_USER,
+    {AcceleratorAction::kSwitchToPreviousUser,
      IDS_ASH_ACCELERATOR_DESCRIPTION_SWITCH_TO_PREVIOUS_USER,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {FOCUS_CAMERA_PREVIEW, IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_CAMERA_PREVIEW,
+    {AcceleratorAction::kFocusCameraPreview,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_CAMERA_PREVIEW,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_DICTATION, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_DICTATION,
+    {AcceleratorAction::kToggleDictation,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_DICTATION,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {START_ASSISTANT, IDS_ASH_ACCELERATOR_DESCRIPTION_START_ASSISTANT,
+    {AcceleratorAction::kStartAssistant,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_START_ASSISTANT,
      mojom::AcceleratorCategory::kGeneral,
      mojom::AcceleratorSubcategory::kGeneralControls,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {OPEN_FILE_MANAGER, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_FILE_MANAGER,
+    {AcceleratorAction::kOpenFileManager,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_FILE_MANAGER,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
@@ -335,23 +345,28 @@
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAmbient},
-    {SHOW_SHORTCUT_VIEWER, IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_SHORTCUT_VIEWER,
+    {AcceleratorAction::kShowShortcutViewer,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_SHORTCUT_VIEWER,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {OPEN_CALCULATOR, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_CALCULATOR,
+    {AcceleratorAction::kOpenCalculator,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_CALCULATOR,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {OPEN_DIAGNOSTICS, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_DIAGNOSTICS,
+    {AcceleratorAction::kOpenDiagnostics,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_DIAGNOSTICS,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {OPEN_GET_HELP, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_GET_HELP,
+    {AcceleratorAction::kOpenGetHelp,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_GET_HELP,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {OPEN_FEEDBACK_PAGE, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_FEEDBACK_PAGE,
+    {AcceleratorAction::kOpenFeedbackPage,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_FEEDBACK_PAGE,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
@@ -360,104 +375,114 @@
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kText,
      mojom::AcceleratorSource::kAmbient},
-    {LAUNCH_LAST_APP, IDS_ASH_ACCELERATOR_DESCRIPTION_LAUNCH_LAST_APP,
+    {AcceleratorAction::kLaunchLastApp,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_LAUNCH_LAST_APP,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {UNPIN, IDS_ASH_ACCELERATOR_DESCRIPTION_UNPIN,
+    {AcceleratorAction::kUnpin, IDS_ASH_ACCELERATOR_DESCRIPTION_UNPIN,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_RESIZE_LOCK_MENU,
+    {AcceleratorAction::kToggleResizeLockMenu,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_RESIZE_LOCK_MENU,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SHOW_TASK_MANAGER, IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_TASK_MANAGER,
+    {AcceleratorAction::kShowTaskManager,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_TASK_MANAGER,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {OPEN_CROSH, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_CROSH,
+    {AcceleratorAction::kOpenCrosh, IDS_ASH_ACCELERATOR_DESCRIPTION_OPEN_CROSH,
      mojom::AcceleratorCategory::kGeneral, mojom::AcceleratorSubcategory::kApps,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
 
     // Device
-    {VOLUME_UP, IDS_ASH_ACCELERATOR_DESCRIPTION_VOLUME_UP,
+    {AcceleratorAction::kVolumeUp, IDS_ASH_ACCELERATOR_DESCRIPTION_VOLUME_UP,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {VOLUME_DOWN, IDS_ASH_ACCELERATOR_DESCRIPTION_VOLUME_DOWN,
+    {AcceleratorAction::kVolumeDown,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_VOLUME_DOWN,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {VOLUME_MUTE, IDS_ASH_ACCELERATOR_DESCRIPTION_VOLUME_MUTE,
+    {AcceleratorAction::kVolumeMute,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_VOLUME_MUTE,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MICROPHONE_MUTE_TOGGLE,
+    {AcceleratorAction::kMicrophoneMuteToggle,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_MICROPHONE_MUTE,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MEDIA_PLAY, IDS_ASH_ACCELERATOR_DESCRIPTION_PLAY_MEDIA,
+    {AcceleratorAction::kMediaPlay, IDS_ASH_ACCELERATOR_DESCRIPTION_PLAY_MEDIA,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MEDIA_PAUSE, IDS_ASH_ACCELERATOR_DESCRIPTION_PAUSE_MEDIA,
+    {AcceleratorAction::kMediaPause,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_PAUSE_MEDIA,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MEDIA_PLAY_PAUSE, IDS_ASH_ACCELERATOR_DESCRIPTION_PLAY_PAUSE_MEDIA,
+    {AcceleratorAction::kMediaPlayPause,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_PLAY_PAUSE_MEDIA,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MEDIA_NEXT_TRACK, IDS_ASH_ACCELERATOR_DESCRIPTION_NEXT_TRACK,
+    {AcceleratorAction::kMediaNextTrack,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_NEXT_TRACK,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MEDIA_PREV_TRACK, IDS_ASH_ACCELERATOR_DESCRIPTION_PREVIOUS_TRACK,
+    {AcceleratorAction::kMediaPrevTrack,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_PREVIOUS_TRACK,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MEDIA_FAST_FORWARD, IDS_ASH_ACCELERATOR_DESCRIPTION_FAST_FORWARD_MEDIA,
+    {AcceleratorAction::kMediaFastForward,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_FAST_FORWARD_MEDIA,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {FOCUS_PIP, IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_PIP,
+    {AcceleratorAction::kFocusPip, IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_PIP,
      mojom::AcceleratorCategory::kDevice, mojom::AcceleratorSubcategory::kMedia,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {KEYBOARD_BACKLIGHT_TOGGLE,
+    {AcceleratorAction::kKeyboardBacklightToggle,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_KEYBOARD_BACKLIGHT,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {KEYBOARD_BRIGHTNESS_UP,
+    {AcceleratorAction::kKeyboardBrightnessUp,
      IDS_ASH_ACCELERATOR_DESCRIPTION_KEYBOARD_BRIGHTNESS_UP,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {KEYBOARD_BRIGHTNESS_DOWN,
+    {AcceleratorAction::kKeyboardBrightnessDown,
      IDS_ASH_ACCELERATOR_DESCRIPTION_KEYBOARD_BRIGHTNESS_DOWN,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_IME_MENU_BUBBLE,
+    {AcceleratorAction::kToggleImeMenuBubble,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_IME_MENU_BUBBLE,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SWITCH_TO_NEXT_IME, IDS_ASH_ACCELERATOR_DESCRIPTION_SWITCH_TO_NEXT_IME,
+    {AcceleratorAction::kSwitchToNextIme,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SWITCH_TO_NEXT_IME,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SWITCH_TO_LAST_USED_IME,
+    {AcceleratorAction::kSwitchToLastUsedIme,
      IDS_ASH_ACCELERATOR_DESCRIPTION_SWITCH_TO_LAST_USED_IME,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
@@ -469,53 +494,61 @@
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kText,
      mojom::AcceleratorSource::kAmbient},
-    {SHOW_STYLUS_TOOLS, IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_STYLUS_TOOLS,
+    {AcceleratorAction::kShowStylusTools,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_STYLUS_TOOLS,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kInputs,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {BRIGHTNESS_UP, IDS_ASH_ACCELERATOR_DESCRIPTION_BRIGHTNESS_UP,
+    {AcceleratorAction::kBrightnessUp,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_BRIGHTNESS_UP,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {BRIGHTNESS_DOWN, IDS_ASH_ACCELERATOR_DESCRIPTION_BRIGHTNESS_DOWN,
+    {AcceleratorAction::kBrightnessDown,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_BRIGHTNESS_DOWN,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SCALE_UI_UP, IDS_ASH_ACCELERATOR_DESCRIPTION_SCALE_UI_UP,
+    {AcceleratorAction::kScaleUiUp, IDS_ASH_ACCELERATOR_DESCRIPTION_SCALE_UI_UP,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SCALE_UI_DOWN, IDS_ASH_ACCELERATOR_DESCRIPTION_SCALE_UI_DOWN,
+    {AcceleratorAction::kScaleUiDown,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SCALE_UI_DOWN,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SCALE_UI_RESET, IDS_ASH_ACCELERATOR_DESCRIPTION_SCALE_UI_RESET,
+    {AcceleratorAction::kScaleUiReset,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SCALE_UI_RESET,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {PRIVACY_SCREEN_TOGGLE,
+    {AcceleratorAction::kPrivacyScreenToggle,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_PRIVACY_SCREEN,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_MIRROR_MODE, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_MIRROR_MODE,
+    {AcceleratorAction::kToggleMirrorMode,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_MIRROR_MODE,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SWAP_PRIMARY_DISPLAY, IDS_ASH_ACCELERATOR_DESCRIPTION_SWAP_PRIMARY_DISPLAY,
+    {AcceleratorAction::kSwapPrimaryDisplay,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SWAP_PRIMARY_DISPLAY,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {ROTATE_SCREEN, IDS_ASH_ACCELERATOR_DESCRIPTION_ROTATE_SCREEN,
+    {AcceleratorAction::kRotateScreen,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_ROTATE_SCREEN,
      mojom::AcceleratorCategory::kDevice,
      mojom::AcceleratorSubcategory::kDisplay,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
@@ -594,7 +627,8 @@
      mojom::AcceleratorSubcategory::kBrowserNavigation,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAmbient},
-    {FOCUS_PREVIOUS_PANE, IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_PREVIOUS_PANE,
+    {AcceleratorAction::kFocusPreviousPane,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_PREVIOUS_PANE,
      mojom::AcceleratorCategory::kBrowser,
      mojom::AcceleratorSubcategory::kBrowserNavigation,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
@@ -869,12 +903,14 @@
      mojom::AcceleratorSubcategory::kTextNavigation,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAmbient},
-    {TOGGLE_CAPS_LOCK, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_CAPS_LOCK,
+    {AcceleratorAction::kToggleCapsLock,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_CAPS_LOCK,
      mojom::AcceleratorCategory::kText,
      mojom::AcceleratorSubcategory::kTextEditing,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {SHOW_EMOJI_PICKER, IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_EMOJI_PICKER,
+    {AcceleratorAction::kShowEmojiPicker,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_SHOW_EMOJI_PICKER,
      mojom::AcceleratorCategory::kText,
      mojom::AcceleratorSubcategory::kTextEditing,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
@@ -902,7 +938,7 @@
      mojom::AcceleratorSubcategory::kTextEditing,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAmbient},
-    {TOGGLE_CLIPBOARD_HISTORY,
+    {AcceleratorAction::kToggleClipboardHistory,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_CLIPBOARD_HISTORY,
      mojom::AcceleratorCategory::kText,
      mojom::AcceleratorSubcategory::kTextEditing,
@@ -964,7 +1000,8 @@
      mojom::AcceleratorSource::kAmbient},
 
     // Windows and Desks
-    {CYCLE_FORWARD_MRU, IDS_ASH_ACCELERATOR_DESCRIPTION_CYCLE_FORWARD_MRU,
+    {AcceleratorAction::kCycleForwardMru,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_CYCLE_FORWARD_MRU,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
@@ -975,17 +1012,20 @@
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kText,
      mojom::AcceleratorSource::kAmbient},
-    {TOGGLE_MAXIMIZED, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_MAXIMIZED,
+    {AcceleratorAction::kToggleMaximized,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_MAXIMIZED,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {WINDOW_MINIMIZE, IDS_ASH_ACCELERATOR_DESCRIPTION_WINDOW_MINIMIZE,
+    {AcceleratorAction::kWindowMinimize,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_WINDOW_MINIMIZE,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_FULLSCREEN, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_FULLSCREEN,
+    {AcceleratorAction::kToggleFullscreen,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_FULLSCREEN,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
@@ -996,65 +1036,67 @@
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAmbient},
-    {WINDOW_CYCLE_SNAP_LEFT,
+    {AcceleratorAction::kWindowCycleSnapLeft,
      IDS_ASH_ACCELERATOR_DESCRIPTION_WINDOW_CYCLE_SNAP_LEFT,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {WINDOW_CYCLE_SNAP_RIGHT,
+    {AcceleratorAction::kWindowCycleSnapRight,
      IDS_ASH_ACCELERATOR_DESCRIPTION_WINDOW_CYCLE_SNAP_RIGHT,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS,
+    {AcceleratorAction::kMoveActiveWindowBetweenDisplays,
      IDS_ASH_ACCELERATOR_DESCRIPTION_MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MINIMIZE_TOP_WINDOW_ON_BACK,
+    {AcceleratorAction::kMinimizeTopWindowOnBack,
      IDS_ASH_ACCELERATOR_DESCRIPTION_MINIMIZE_TOP_WINDOW_ON_BACK,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_FLOATING, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_FLOATING,
+    {AcceleratorAction::kToggleFloating,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_FLOATING,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kWindows,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {DESKS_NEW_DESK, IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_NEW_DESK,
+    {AcceleratorAction::kDesksNewDesk,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_NEW_DESK,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {DESKS_REMOVE_CURRENT_DESK,
+    {AcceleratorAction::kDesksRemoveCurrentDesk,
      IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_REMOVE_CURRENT_DESK,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {DESKS_ACTIVATE_DESK_LEFT,
+    {AcceleratorAction::kDesksActivateDeskLeft,
      IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_ACTIVATE_DESK_LEFT,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {DESKS_ACTIVATE_DESK_RIGHT,
+    {AcceleratorAction::kDesksActivateDeskRight,
      IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_ACTIVATE_DESK_RIGHT,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {DESKS_MOVE_ACTIVE_ITEM_LEFT,
+    {AcceleratorAction::kDesksMoveActiveItemLeft,
      IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_MOVE_ACTIVE_ITEM_LEFT,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
      /*locked=*/false, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {DESKS_MOVE_ACTIVE_ITEM_RIGHT,
+    {AcceleratorAction::kDesksMoveActiveItemRight,
      IDS_ASH_ACCELERATOR_DESCRIPTION_DESKS_MOVE_ACTIVE_ITEM_RIGHT,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
@@ -1066,7 +1108,7 @@
      mojom::AcceleratorSubcategory::kDesks,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kText,
      mojom::AcceleratorSource::kAmbient},
-    {DESKS_TOGGLE_ASSIGN_TO_ALL_DESKS,
+    {AcceleratorAction::kDesksToggleAssignToAllDesks,
      IDS_ASH_ACCELERATOR_ACTIONDESKS_TOGGLE_ASSIGN_TO_ALL_DESKS,
      mojom::AcceleratorCategory::kWindowsAndDesks,
      mojom::AcceleratorSubcategory::kDesks,
@@ -1074,35 +1116,38 @@
      mojom::AcceleratorSource::kAsh},
 
     // Accessibility
-    {TOGGLE_SPOKEN_FEEDBACK,
+    {AcceleratorAction::kToggleSpokenFeedback,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_SPOKEN_FEEDBACK,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kChromeVox,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_HIGH_CONTRAST, IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_HIGH_CONTRAST,
+    {AcceleratorAction::kToggleHighContrast,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_HIGH_CONTRAST,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kVisibility,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_DOCKED_MAGNIFIER,
+    {AcceleratorAction::kToggleDockedMagnifier,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_DOCKED_MAGNIFIER,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kVisibility,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {TOGGLE_FULLSCREEN_MAGNIFIER,
+    {AcceleratorAction::kToggleFullscreenMagnifier,
      IDS_ASH_ACCELERATOR_DESCRIPTION_TOGGLE_FULLSCREEN_MAGNIFIER,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kVisibility,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MAGNIFIER_ZOOM_IN, IDS_ASH_ACCELERATOR_DESCRIPTION_MAGNIFIER_ZOOM_IN,
+    {AcceleratorAction::kMagnifierZoomIn,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_MAGNIFIER_ZOOM_IN,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kVisibility,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAsh},
-    {MAGNIFIER_ZOOM_OUT, IDS_ASH_ACCELERATOR_DESCRIPTION_MAGNIFIER_ZOOM_OUT,
+    {AcceleratorAction::kMagnifierZoomOut,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_MAGNIFIER_ZOOM_OUT,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kVisibility,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
@@ -1119,7 +1164,8 @@
      mojom::AcceleratorSubcategory::kAccessibilityNavigation,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
      mojom::AcceleratorSource::kAmbient},
-    {FOCUS_SHELF, IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_SHELF,
+    {AcceleratorAction::kFocusShelf,
+     IDS_ASH_ACCELERATOR_DESCRIPTION_FOCUS_SHELF,
      mojom::AcceleratorCategory::kAccessibility,
      mojom::AcceleratorSubcategory::kAccessibilityNavigation,
      /*locked=*/true, mojom::AcceleratorLayoutStyle::kDefault,
diff --git a/ash/webui/shortcut_customization_ui/resources/js/search/search_box.ts b/ash/webui/shortcut_customization_ui/resources/js/search/search_box.ts
index 0d9caba2..1f95efa 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/search/search_box.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/search/search_box.ts
@@ -13,6 +13,7 @@
 import {CrToolbarSearchFieldElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
+import {IronDropdownElement} from 'chrome://resources/polymer/v3_0/iron-dropdown/iron-dropdown.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {PolymerElementProperties} from 'chrome://resources/polymer/v3_0/polymer/interfaces.js';
 import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -143,9 +144,12 @@
   override connectedCallback(): void {
     super.connectedCallback();
 
-    this.searchInputElement =
-        strictQuery('#search', this.shadowRoot, CrToolbarSearchFieldElement)
-            .getSearchInput();
+    const searchFieldElement =
+        strictQuery('#search', this.shadowRoot, CrToolbarSearchFieldElement);
+    searchFieldElement.addEventListener(
+        'transitionend', this.onSearchFieldTransitionEnd.bind(this));
+
+    this.searchInputElement = searchFieldElement.getSearchInput();
 
     // Focus the search bar when the app opens.
     afterNextRender(this, () => {
@@ -256,6 +260,18 @@
     }
   }
 
+  private onSearchFieldTransitionEnd(): void {
+    // Cast to IronDropdownElement since the interface cannot be used as a
+    // value.
+    const ironDropdown =
+        (strictQuery('iron-dropdown', this.shadowRoot, HTMLElement) as
+         IronDropdownElement);
+
+    // Resize the dropdown once the search bar has finishing resizing to avoid
+    // misalignment when the window resizes.
+    ironDropdown.notifyResize();
+  }
+
   private onKeyDown(e: KeyboardEvent): void {
     const isSearchFocused =
         strictQuery('#search', this.shadowRoot, CrToolbarSearchFieldElement)
diff --git a/ash/wm/float/float_controller_unittest.cc b/ash/wm/float/float_controller_unittest.cc
index 51a6e3c..10d0416 100644
--- a/ash/wm/float/float_controller_unittest.cc
+++ b/ash/wm/float/float_controller_unittest.cc
@@ -319,7 +319,8 @@
       Shell::Get()->accelerator_controller();
 
   // Snap Left.
-  acc_controller->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT, {});
+  acc_controller->PerformActionIfEnabled(
+      AcceleratorAction::kWindowCycleSnapLeft, {});
   ASSERT_EQ(chromeos::WindowStateType::kPrimarySnapped,
             window_state2->GetStateType());
   PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN);
@@ -332,7 +333,8 @@
             window_state2->GetStateType());
 
   // Snap Right.
-  acc_controller->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_RIGHT, {});
+  acc_controller->PerformActionIfEnabled(
+      AcceleratorAction::kWindowCycleSnapRight, {});
   ASSERT_EQ(chromeos::WindowStateType::kSecondarySnapped,
             WindowState::Get(window2.get())->GetStateType());
   PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN);
@@ -833,7 +835,8 @@
   EXPECT_FALSE(floated_window->IsVisible());
 
   // Unpin the window.
-  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(UNPIN, {});
+  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
+      AcceleratorAction::kUnpin, {});
   EXPECT_TRUE(floated_window->IsVisible());
 
   // Trusted pin the window.
diff --git a/ash/wm/screen_pinning_controller_unittest.cc b/ash/wm/screen_pinning_controller_unittest.cc
index d8c476f8..998ebc5 100644
--- a/ash/wm/screen_pinning_controller_unittest.cc
+++ b/ash/wm/screen_pinning_controller_unittest.cc
@@ -172,9 +172,10 @@
   window_util::PinWindow(w1, /* trusted */ true);
   EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned());
 
-  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(UNPIN, {});
-  // The UNPIN accelerator key is disabled for trusted pinned and the window
-  // must be still pinned.
+  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
+      AcceleratorAction::kUnpin, {});
+  // The AcceleratorAction::kUnpin accelerator key is disabled for trusted
+  // pinned and the window must be still pinned.
   EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned());
 }
 
diff --git a/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler_unittest.cc b/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler_unittest.cc
index f179e0b..ab4c2448 100644
--- a/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler_unittest.cc
@@ -775,7 +775,7 @@
   ShowMultitaskMenu(*window);
 
   Shell::Get()->accelerator_controller()->PerformActionIfEnabled(
-      WINDOW_MINIMIZE, {});
+      AcceleratorAction::kWindowMinimize, {});
   ASSERT_TRUE(WindowState::Get(window.get())->IsMinimized());
   EXPECT_FALSE(GetMultitaskMenu());
 }
diff --git a/ash/wm/window_restore/window_restore_controller_unittest.cc b/ash/wm/window_restore/window_restore_controller_unittest.cc
index d56b421..b515bd9 100644
--- a/ash/wm/window_restore/window_restore_controller_unittest.cc
+++ b/ash/wm/window_restore/window_restore_controller_unittest.cc
@@ -389,7 +389,7 @@
   window_state->Restore();
   EXPECT_EQ(7, GetSaveWindowsCount(window.get()));
 
-  PerformAcceleratorAction(WINDOW_CYCLE_SNAP_LEFT, {});
+  PerformAcceleratorAction(AcceleratorAction::kWindowCycleSnapLeft, {});
   EXPECT_EQ(8, GetSaveWindowsCount(window.get()));
 }
 
@@ -407,7 +407,7 @@
   // Move the window to the desk on the right. Test that we save the window in
   // the database.
   PerformAcceleratorAction(
-      DESKS_MOVE_ACTIVE_ITEM_RIGHT,
+      AcceleratorAction::kDesksMoveActiveItemRight,
       {ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN});
   ASSERT_NE(previous_parent, window->parent());
   EXPECT_EQ(1, GetSaveWindowsCount(window.get()));
@@ -444,7 +444,8 @@
 
   // Move the window to the next display. Test that we save the window in
   // the database.
-  PerformAcceleratorAction(MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS, {});
+  PerformAcceleratorAction(AcceleratorAction::kMoveActiveWindowBetweenDisplays,
+                           {});
   ASSERT_TRUE(
       gfx::Rect(801, 0, 800, 800).Contains(window->GetBoundsInScreen()));
   EXPECT_EQ(1, GetSaveWindowsCount(window.get()));
diff --git a/ash/wm/window_state_unittest.cc b/ash/wm/window_state_unittest.cc
index 56c1069..24c3944 100644
--- a/ash/wm/window_state_unittest.cc
+++ b/ash/wm/window_state_unittest.cc
@@ -1844,8 +1844,8 @@
   window_state->Maximize();
 
   // Use keyboard to snap a window.
-  AcceleratorController::Get()->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT,
-                                                       {});
+  AcceleratorController::Get()->PerformActionIfEnabled(
+      AcceleratorAction::kWindowCycleSnapLeft, {});
   histograms.ExpectBucketCount(kWindowSnapActionSourceHistogram,
                                WindowSnapActionSource::kKeyboardShortcutToSnap,
                                1);
@@ -1884,8 +1884,8 @@
   EXPECT_TRUE(Shell::Get()->tablet_mode_controller()->InTabletMode());
 
   // Use keyboard to snap the window in tablet mode.
-  AcceleratorController::Get()->PerformActionIfEnabled(WINDOW_CYCLE_SNAP_LEFT,
-                                                       {});
+  AcceleratorController::Get()->PerformActionIfEnabled(
+      AcceleratorAction::kWindowCycleSnapLeft, {});
   histograms.ExpectBucketCount(kWindowSnapActionSourceHistogram,
                                WindowSnapActionSource::kKeyboardShortcutToSnap,
                                2);
diff --git a/ash/wm/wm_pixel_diff_test.cc b/ash/wm/wm_pixel_diff_test.cc
index ce6530f..dbaaddd5 100644
--- a/ash/wm/wm_pixel_diff_test.cc
+++ b/ash/wm/wm_pixel_diff_test.cc
@@ -68,7 +68,7 @@
 
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       "overview_and_desks_bar_basic",
-      /*revision_number=*/2, desk_widget, overview_widget1, overview_widget2,
+      /*revision_number=*/3, desk_widget, overview_widget1, overview_widget2,
       overview_widget3));
 }
 
diff --git a/base/allocator/partition_allocator/thread_cache.cc b/base/allocator/partition_allocator/thread_cache.cc
index d34578d..e5b2b86 100644
--- a/base/allocator/partition_allocator/thread_cache.cc
+++ b/base/allocator/partition_allocator/thread_cache.cc
@@ -12,7 +12,6 @@
 
 #include "base/allocator/partition_allocator/partition_alloc-inl.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/partition_alloc_base/cxx17_backports.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/immediate_crash.h"
 #include "base/allocator/partition_allocator/partition_alloc_buildflags.h"
@@ -304,7 +303,7 @@
   // of cached memory cannot change between calls (since we do not purge
   // background threads, but only ask them to purge their own cache at the next
   // allocation).
-  periodic_purge_next_interval_ = internal::base::clamp(
+  periodic_purge_next_interval_ = std::clamp(
       periodic_purge_next_interval_, kMinPurgeInterval, kMaxPurgeInterval);
 
   PurgeAll();
@@ -423,8 +422,8 @@
     constexpr size_t kMinLimit = 1;
     // |PutInBucket()| is called on a full bucket, which should not overflow.
     constexpr size_t kMaxLimit = std::numeric_limits<uint8_t>::max() - 1;
-    global_limits_[index] = static_cast<uint8_t>(
-        internal::base::clamp(value, kMinLimit, kMaxLimit));
+    global_limits_[index] =
+        static_cast<uint8_t>(std::clamp(value, kMinLimit, kMaxLimit));
     PA_DCHECK(global_limits_[index] >= kMinLimit);
     PA_DCHECK(global_limits_[index] <= kMaxLimit);
   }
diff --git a/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden b/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden
deleted file mode 100644
index ba6bebe..0000000
--- a/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/example/jni_generator/SampleForAnnotationProcessor
-
-#ifndef org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
-#define org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_SampleForAnnotationProcessor_Foo(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT void Java_J_N_MygCV2jQ(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_Foo(env);
-}
-
-static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForAnnotationProcessor_Bar(JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& sample);
-
-JNI_GENERATOR_EXPORT jobject Java_J_N_MHuqnmXT(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject sample) {
-  return JNI_SampleForAnnotationProcessor_Bar(env, base::android::JavaParamRef<jobject>(env,
-      sample)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jstring> JNI_SampleForAnnotationProcessor_RevString(JNIEnv*
-    env, const base::android::JavaParamRef<jstring>& stringToReverse);
-
-JNI_GENERATOR_EXPORT jstring Java_J_N_MM5Xkwyy(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring stringToReverse) {
-  return JNI_SampleForAnnotationProcessor_RevString(env, base::android::JavaParamRef<jstring>(env,
-      stringToReverse)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_SendToNative(JNIEnv* env, const
-    base::android::JavaParamRef<jobjectArray>& strs);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MAC2QhR9(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs) {
-  return JNI_SampleForAnnotationProcessor_SendToNative(env,
-      base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_SendSamplesToNative(JNIEnv* env, const
-    base::android::JavaParamRef<jobjectArray>& strs);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MGhRh4Nd(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs) {
-  return JNI_SampleForAnnotationProcessor_SendSamplesToNative(env,
-      base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
-}
-
-static jboolean JNI_SampleForAnnotationProcessor_HasPhalange(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jboolean Java_J_N_MW0aEs4h(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_HasPhalange(env);
-}
-
-static base::android::ScopedJavaLocalRef<jintArray>
-    JNI_SampleForAnnotationProcessor_TestAllPrimitives(JNIEnv* env, jint zint,
-    const base::android::JavaParamRef<jintArray>& ints,
-    jlong zlong,
-    const base::android::JavaParamRef<jlongArray>& longs,
-    jshort zshort,
-    const base::android::JavaParamRef<jshortArray>& shorts,
-    jchar zchar,
-    const base::android::JavaParamRef<jcharArray>& chars,
-    jbyte zbyte,
-    const base::android::JavaParamRef<jbyteArray>& bytes,
-    jdouble zdouble,
-    const base::android::JavaParamRef<jdoubleArray>& doubles,
-    jfloat zfloat,
-    const base::android::JavaParamRef<jfloatArray>& floats,
-    jboolean zbool,
-    const base::android::JavaParamRef<jbooleanArray>& bools);
-
-JNI_GENERATOR_EXPORT jintArray Java_J_N_MlVFI4RX(
-    JNIEnv* env,
-    jclass jcaller,
-    jint zint,
-    jintArray ints,
-    jlong zlong,
-    jlongArray longs,
-    jshort zshort,
-    jshortArray shorts,
-    jchar zchar,
-    jcharArray chars,
-    jbyte zbyte,
-    jbyteArray bytes,
-    jdouble zdouble,
-    jdoubleArray doubles,
-    jfloat zfloat,
-    jfloatArray floats,
-    jboolean zbool,
-    jbooleanArray bools) {
-  return JNI_SampleForAnnotationProcessor_TestAllPrimitives(env, zint,
-      base::android::JavaParamRef<jintArray>(env, ints), zlong,
-      base::android::JavaParamRef<jlongArray>(env, longs), zshort,
-      base::android::JavaParamRef<jshortArray>(env, shorts), zchar,
-      base::android::JavaParamRef<jcharArray>(env, chars), zbyte,
-      base::android::JavaParamRef<jbyteArray>(env, bytes), zdouble,
-      base::android::JavaParamRef<jdoubleArray>(env, doubles), zfloat,
-      base::android::JavaParamRef<jfloatArray>(env, floats), zbool,
-      base::android::JavaParamRef<jbooleanArray>(env, bools)).Release();
-}
-
-static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& clazz,
-    const base::android::JavaParamRef<jobjectArray>& classes,
-    const base::android::JavaParamRef<jthrowable>& throwable,
-    const base::android::JavaParamRef<jobjectArray>& throwables,
-    const base::android::JavaParamRef<jstring>& string,
-    const base::android::JavaParamRef<jobjectArray>& strings,
-    const base::android::JavaParamRef<jobject>& tStruct,
-    const base::android::JavaParamRef<jobjectArray>& structs,
-    const base::android::JavaParamRef<jobject>& obj,
-    const base::android::JavaParamRef<jobjectArray>& objects);
-
-JNI_GENERATOR_EXPORT void Java_J_N_MqOnlud7(
-    JNIEnv* env,
-    jclass jcaller,
-    jclass clazz,
-    jobjectArray classes,
-    jthrowable throwable,
-    jobjectArray throwables,
-    jstring string,
-    jobjectArray strings,
-    jobject tStruct,
-    jobjectArray structs,
-    jobject obj,
-    jobjectArray objects) {
-  return JNI_SampleForAnnotationProcessor_TestSpecialTypes(env,
-      base::android::JavaParamRef<jclass>(env, clazz),
-      base::android::JavaParamRef<jobjectArray>(env, classes),
-      base::android::JavaParamRef<jthrowable>(env, throwable),
-      base::android::JavaParamRef<jobjectArray>(env, throwables),
-      base::android::JavaParamRef<jstring>(env, string),
-      base::android::JavaParamRef<jobjectArray>(env, strings),
-      base::android::JavaParamRef<jobject>(env, tStruct),
-      base::android::JavaParamRef<jobjectArray>(env, structs),
-      base::android::JavaParamRef<jobject>(env, obj), base::android::JavaParamRef<jobjectArray>(env,
-      objects));
-}
-
-static base::android::ScopedJavaLocalRef<jthrowable>
-    JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jthrowable Java_J_N_MuZc76Vt(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnThrowable(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MAD53J7V(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnThrowables(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jclass>
-    JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jclass Java_J_N_M_00024ZgOi4g(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnClass(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_M_00024hL1577(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnClasses(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jstring>
-    JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jstring Java_J_N_M0k1OjBK(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnString(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_Mssfs54E(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnStrings(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobject>
-    JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobject Java_J_N_MSzcel_1H(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnStruct(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MIBrQLK4(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnStructs(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobject>
-    JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobject Java_J_N_M_00024hPywjv(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnObject(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MPpCU1l5(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnObjects(env).Release();
-}
-
-
-#endif  // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
diff --git a/base/android/jni_generator/golden/SampleBidirectionalNonProxy_jni.h.golden b/base/android/jni_generator/golden/SampleBidirectionalNonProxy_jni.h.golden
new file mode 100644
index 0000000..955d3747
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleBidirectionalNonProxy_jni.h.golden
@@ -0,0 +1,200 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_generator.py
+// For
+//     org/chromium/example/jni_generator/SampleBidirectionalNonProxy
+
+#ifndef org_chromium_example_jni_generator_SampleBidirectionalNonProxy_JNI
+#define org_chromium_example_jni_generator_SampleBidirectionalNonProxy_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+    kClassPath_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy[] =
+    "org/chromium/example/jni_generator/SampleBidirectionalNonProxy";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+    g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz_defined
+#define org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(JNIEnv* env) {
+  return base::android::LazyGetClass(env,
+      kClassPath_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy,
+      &g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+JNI_GENERATOR_EXPORT jint
+    Java_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_nativeStaticMethod(
+    JNIEnv* env,
+    jclass jcaller,
+    jlong nativeTest,
+    jint arg1) {
+  Test* native = reinterpret_cast<Test*>(nativeTest);
+  CHECK_NATIVE_PTR(env, jcaller, native, "StaticMethod", 0);
+  return native->StaticMethod(env, arg1);
+}
+
+JNI_GENERATOR_EXPORT jint
+    Java_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_nativeMethod(
+    JNIEnv* env,
+    jobject jcaller,
+    jlong nativeTest,
+    jint arg1) {
+  Test* native = reinterpret_cast<Test*>(nativeTest);
+  CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
+  return native->Method(env, base::android::JavaParamRef<jobject>(env, jcaller), arg1);
+}
+
+static jint JNI_SampleBidirectionalNonProxy_Init(JNIEnv* env, const
+    base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint
+    Java_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_nativeInit(
+    JNIEnv* env,
+    jobject jcaller) {
+  return JNI_SampleBidirectionalNonProxy_Init(env, base::android::JavaParamRef<jobject>(env,
+      jcaller));
+}
+
+static jint JNI_SampleBidirectionalNonProxy_Init(JNIEnv* env, const
+    base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint
+    Java_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_nativeInit(
+    JNIEnv* env,
+    jobject jcaller) {
+  return JNI_SampleBidirectionalNonProxy_Init(env, base::android::JavaParamRef<jobject>(env,
+      jcaller));
+}
+
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testMethodWithParam(nullptr);
+static void Java_SampleBidirectionalNonProxy_testMethodWithParam(JNIEnv* env, const
+    base::android::JavaRef<jobject>& obj, JniIntWrapper iParam) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env);
+  CHECK_CLAZZ(env, obj.obj(),
+      org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env));
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_INSTANCE>(
+          env,
+          clazz,
+          "testMethodWithParam",
+          "(I)V",
+          &g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testMethodWithParam);
+
+     env->CallVoidMethod(obj.obj(),
+          call_context.base.method_id, as_jint(iParam));
+}
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testMethodWithParamAndReturn(nullptr);
+static base::android::ScopedJavaLocalRef<jstring>
+    Java_SampleBidirectionalNonProxy_testMethodWithParamAndReturn(JNIEnv* env, const
+    base::android::JavaRef<jobject>& obj, JniIntWrapper iParam) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env);
+  CHECK_CLAZZ(env, obj.obj(),
+      org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env), NULL);
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_INSTANCE>(
+          env,
+          clazz,
+          "testMethodWithParamAndReturn",
+          "(I)Ljava/lang/String;",
+&g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testMethodWithParamAndReturn);
+
+  jstring ret =
+      static_cast<jstring>(env->CallObjectMethod(obj.obj(),
+          call_context.base.method_id, as_jint(iParam)));
+  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testStaticMethodWithParam(nullptr);
+static jint Java_SampleBidirectionalNonProxy_testStaticMethodWithParam(JNIEnv* env, JniIntWrapper
+    iParam) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env);
+  CHECK_CLAZZ(env, clazz,
+      org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env), 0);
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_STATIC>(
+          env,
+          clazz,
+          "testStaticMethodWithParam",
+          "(I)I",
+&g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testStaticMethodWithParam);
+
+  jint ret =
+      env->CallStaticIntMethod(clazz,
+          call_context.base.method_id, as_jint(iParam));
+  return ret;
+}
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testMethodWithNoParam(nullptr);
+static jdouble Java_SampleBidirectionalNonProxy_testMethodWithNoParam(JNIEnv* env) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env);
+  CHECK_CLAZZ(env, clazz,
+      org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env), 0);
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_STATIC>(
+          env,
+          clazz,
+          "testMethodWithNoParam",
+          "()D",
+          &g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testMethodWithNoParam);
+
+  jdouble ret =
+      env->CallStaticDoubleMethod(clazz,
+          call_context.base.method_id);
+  return ret;
+}
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testStaticMethodWithNoParam(nullptr);
+static base::android::ScopedJavaLocalRef<jstring>
+    Java_SampleBidirectionalNonProxy_testStaticMethodWithNoParam(JNIEnv* env) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env);
+  CHECK_CLAZZ(env, clazz,
+      org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_clazz(env), NULL);
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_STATIC>(
+          env,
+          clazz,
+          "testStaticMethodWithNoParam",
+          "()Ljava/lang/String;",
+&g_org_chromium_example_jni_1generator_SampleBidirectionalNonProxy_testStaticMethodWithNoParam);
+
+  jstring ret =
+      static_cast<jstring>(env->CallStaticObjectMethod(clazz,
+          call_context.base.method_id));
+  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+#endif  // org_chromium_example_jni_generator_SampleBidirectionalNonProxy_JNI
diff --git a/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden
deleted file mode 100644
index 130ac30..0000000
--- a/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/example/jni_generator/SampleForAnnotationProcessor
-
-#ifndef org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
-#define org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_SampleForAnnotationProcessor_Foo(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_Foo(env);
-}
-
-static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForAnnotationProcessor_Bar(JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& sample);
-
-JNI_GENERATOR_EXPORT jobject
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject sample) {
-  return JNI_SampleForAnnotationProcessor_Bar(env, base::android::JavaParamRef<jobject>(env,
-      sample)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jstring> JNI_SampleForAnnotationProcessor_RevString(JNIEnv*
-    env, const base::android::JavaParamRef<jstring>& stringToReverse);
-
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring stringToReverse) {
-  return JNI_SampleForAnnotationProcessor_RevString(env, base::android::JavaParamRef<jstring>(env,
-      stringToReverse)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_SendToNative(JNIEnv* env, const
-    base::android::JavaParamRef<jobjectArray>& strs);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs) {
-  return JNI_SampleForAnnotationProcessor_SendToNative(env,
-      base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_SendSamplesToNative(JNIEnv* env, const
-    base::android::JavaParamRef<jobjectArray>& strs);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs) {
-  return JNI_SampleForAnnotationProcessor_SendSamplesToNative(env,
-      base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
-}
-
-static jboolean JNI_SampleForAnnotationProcessor_HasPhalange(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jboolean
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_HasPhalange(env);
-}
-
-static base::android::ScopedJavaLocalRef<jintArray>
-    JNI_SampleForAnnotationProcessor_TestAllPrimitives(JNIEnv* env, jint zint,
-    const base::android::JavaParamRef<jintArray>& ints,
-    jlong zlong,
-    const base::android::JavaParamRef<jlongArray>& longs,
-    jshort zshort,
-    const base::android::JavaParamRef<jshortArray>& shorts,
-    jchar zchar,
-    const base::android::JavaParamRef<jcharArray>& chars,
-    jbyte zbyte,
-    const base::android::JavaParamRef<jbyteArray>& bytes,
-    jdouble zdouble,
-    const base::android::JavaParamRef<jdoubleArray>& doubles,
-    jfloat zfloat,
-    const base::android::JavaParamRef<jfloatArray>& floats,
-    jboolean zbool,
-    const base::android::JavaParamRef<jbooleanArray>& bools);
-
-JNI_GENERATOR_EXPORT jintArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
-    JNIEnv* env,
-    jclass jcaller,
-    jint zint,
-    jintArray ints,
-    jlong zlong,
-    jlongArray longs,
-    jshort zshort,
-    jshortArray shorts,
-    jchar zchar,
-    jcharArray chars,
-    jbyte zbyte,
-    jbyteArray bytes,
-    jdouble zdouble,
-    jdoubleArray doubles,
-    jfloat zfloat,
-    jfloatArray floats,
-    jboolean zbool,
-    jbooleanArray bools) {
-  return JNI_SampleForAnnotationProcessor_TestAllPrimitives(env, zint,
-      base::android::JavaParamRef<jintArray>(env, ints), zlong,
-      base::android::JavaParamRef<jlongArray>(env, longs), zshort,
-      base::android::JavaParamRef<jshortArray>(env, shorts), zchar,
-      base::android::JavaParamRef<jcharArray>(env, chars), zbyte,
-      base::android::JavaParamRef<jbyteArray>(env, bytes), zdouble,
-      base::android::JavaParamRef<jdoubleArray>(env, doubles), zfloat,
-      base::android::JavaParamRef<jfloatArray>(env, floats), zbool,
-      base::android::JavaParamRef<jbooleanArray>(env, bools)).Release();
-}
-
-static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& clazz,
-    const base::android::JavaParamRef<jobjectArray>& classes,
-    const base::android::JavaParamRef<jthrowable>& throwable,
-    const base::android::JavaParamRef<jobjectArray>& throwables,
-    const base::android::JavaParamRef<jstring>& string,
-    const base::android::JavaParamRef<jobjectArray>& strings,
-    const base::android::JavaParamRef<jobject>& tStruct,
-    const base::android::JavaParamRef<jobjectArray>& structs,
-    const base::android::JavaParamRef<jobject>& obj,
-    const base::android::JavaParamRef<jobjectArray>& objects);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
-    JNIEnv* env,
-    jclass jcaller,
-    jclass clazz,
-    jobjectArray classes,
-    jthrowable throwable,
-    jobjectArray throwables,
-    jstring string,
-    jobjectArray strings,
-    jobject tStruct,
-    jobjectArray structs,
-    jobject obj,
-    jobjectArray objects) {
-  return JNI_SampleForAnnotationProcessor_TestSpecialTypes(env,
-      base::android::JavaParamRef<jclass>(env, clazz),
-      base::android::JavaParamRef<jobjectArray>(env, classes),
-      base::android::JavaParamRef<jthrowable>(env, throwable),
-      base::android::JavaParamRef<jobjectArray>(env, throwables),
-      base::android::JavaParamRef<jstring>(env, string),
-      base::android::JavaParamRef<jobjectArray>(env, strings),
-      base::android::JavaParamRef<jobject>(env, tStruct),
-      base::android::JavaParamRef<jobjectArray>(env, structs),
-      base::android::JavaParamRef<jobject>(env, obj), base::android::JavaParamRef<jobjectArray>(env,
-      objects));
-}
-
-static base::android::ScopedJavaLocalRef<jthrowable>
-    JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jthrowable
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnThrowable(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnThrowables(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jclass>
-    JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jclass
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnClass(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnClasses(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jstring>
-    JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnString(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnStrings(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobject>
-    JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobject
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnStruct(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnStructs(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobject>
-    JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobject
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnObject(env).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForAnnotationProcessor_ReturnObjects(env).Release();
-}
-
-
-#endif  // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
diff --git a/base/android/jni_generator/golden/SampleForAnnotationProcessorManualJni.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_manual.h.golden
similarity index 100%
rename from base/android/jni_generator/golden/SampleForAnnotationProcessorManualJni.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_manual.h.golden
diff --git a/base/android/jni_generator/golden/testProxyMultiplexNatives.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing.h.golden
similarity index 64%
rename from base/android/jni_generator/golden/testProxyMultiplexNatives.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing.h.golden
index a4868bb..cae4cf8 100644
--- a/base/android/jni_generator/golden/testProxyMultiplexNatives.golden
+++ b/base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing.h.golden
@@ -7,8 +7,8 @@
 //     base/android/jni_generator/jni_registration_generator.py
 // Please do not change its content.
 
-#ifndef HEADER_GUARD
-#define HEADER_GUARD
+#ifndef TEMP_DIR_HEADER_
+#define TEMP_DIR_HEADER_
 
 #include <jni.h>
 
@@ -23,36 +23,29 @@
 
 // Step 2: Forward declarations (methods).
 
-JNI_GENERATOR_EXPORT void
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
+JNI_GENERATOR_EXPORT void Java_J_N_MygCV2jQ(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobject
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
+JNI_GENERATOR_EXPORT jobject Java_J_N_MHuqnmXT(
     JNIEnv* env,
     jclass jcaller,
     jobject sample);
-JNI_GENERATOR_EXPORT jstring
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
+JNI_GENERATOR_EXPORT jstring Java_J_N_MM5Xkwyy(
     JNIEnv* env,
     jclass jcaller,
     jstring stringToReverse);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MAC2QhR9(
     JNIEnv* env,
     jclass jcaller,
     jobjectArray strs);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MGhRh4Nd(
     JNIEnv* env,
     jclass jcaller,
     jobjectArray strs);
-JNI_GENERATOR_EXPORT jboolean
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
+JNI_GENERATOR_EXPORT jboolean Java_J_N_MW0aEs4h(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jintArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
+JNI_GENERATOR_EXPORT jintArray Java_J_N_MlVFI4RX(
     JNIEnv* env,
     jclass jcaller,
     jint zint,
@@ -71,8 +64,7 @@
     jfloatArray floats,
     jboolean zbool,
     jbooleanArray bools);
-JNI_GENERATOR_EXPORT void
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
+JNI_GENERATOR_EXPORT void Java_J_N_MqOnlud7(
     JNIEnv* env,
     jclass jcaller,
     jclass clazz,
@@ -85,44 +77,34 @@
     jobjectArray structs,
     jobject obj,
     jobjectArray objects);
-JNI_GENERATOR_EXPORT jthrowable
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
+JNI_GENERATOR_EXPORT jthrowable Java_J_N_MuZc76Vt(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MAD53J7V(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jclass
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
+JNI_GENERATOR_EXPORT jclass Java_J_N_M_00024ZgOi4g(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_M_00024hL1577(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jstring
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
+JNI_GENERATOR_EXPORT jstring Java_J_N_M0k1OjBK(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_Mssfs54E(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobject
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
+JNI_GENERATOR_EXPORT jobject Java_J_N_MSzcel_1H(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MIBrQLK4(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobject
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
+JNI_GENERATOR_EXPORT jobject Java_J_N_M_00024hPywjv(
     JNIEnv* env,
     jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MPpCU1l5(
     JNIEnv* env,
     jclass jcaller);
 
@@ -134,7 +116,7 @@
         switch (switch_num) {
           
           case -461602969360398827:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(env, jcaller);
+            return Java_J_N_M_00024ZgOi4g(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class was called with an invalid switch number: " << switch_num;
@@ -148,7 +130,7 @@
         switch (switch_num) {
           
           case -427008638958312484:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(env, jcaller);
+            return Java_J_N_M_00024hL1577(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class_1array was called with an invalid switch number: " << switch_num;
@@ -162,10 +144,10 @@
         switch (switch_num) {
           
           case 5419834314509580268:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(env, jcaller);
+            return Java_J_N_MSzcel_1H(env, jcaller);
           
           case -426730623629742951:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(env, jcaller);
+            return Java_J_N_M_00024hPywjv(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object was called with an invalid switch number: " << switch_num;
@@ -179,7 +161,7 @@
         switch (switch_num) {
           
           case 2227777243221232668:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(env, jcaller, object_param1);
+            return Java_J_N_MHuqnmXT(env, jcaller, object_param1);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1O was called with an invalid switch number: " << switch_num;
@@ -193,10 +175,10 @@
         switch (switch_num) {
           
           case 2313390248928530514:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(env, jcaller);
+            return Java_J_N_MIBrQLK4(env, jcaller);
           
           case 4508266875426191279:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(env, jcaller);
+            return Java_J_N_MPpCU1l5(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array was called with an invalid switch number: " << switch_num;
@@ -210,7 +192,7 @@
         switch (switch_num) {
           
           case 1879234562834588228:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(env, jcaller, object_array_param1);
+            return Java_J_N_MGhRh4Nd(env, jcaller, object_array_param1);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array_1OA was called with an invalid switch number: " << switch_num;
@@ -224,7 +206,7 @@
         switch (switch_num) {
           
           case -3292889389021976364:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(env, jcaller);
+            return Java_J_N_M0k1OjBK(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string was called with an invalid switch number: " << switch_num;
@@ -238,7 +220,7 @@
         switch (switch_num) {
           
           case 3717128594383367634:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(env, jcaller, string_param1);
+            return Java_J_N_MM5Xkwyy(env, jcaller, string_param1);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1R was called with an invalid switch number: " << switch_num;
@@ -252,7 +234,7 @@
         switch (switch_num) {
           
           case -5564218335546380707:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(env, jcaller);
+            return Java_J_N_Mssfs54E(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array was called with an invalid switch number: " << switch_num;
@@ -266,7 +248,7 @@
         switch (switch_num) {
           
           case 12825275381484104:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(env, jcaller, string_array_param1);
+            return Java_J_N_MAC2QhR9(env, jcaller, string_array_param1);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array_1RA was called with an invalid switch number: " << switch_num;
@@ -280,7 +262,7 @@
         switch (switch_num) {
           
           case -5073520581764159162:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(env, jcaller);
+            return Java_J_N_MuZc76Vt(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable was called with an invalid switch number: " << switch_num;
@@ -294,7 +276,7 @@
         switch (switch_num) {
           
           case 17582460986153510:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(env, jcaller);
+            return Java_J_N_MAD53J7V(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable_1array was called with an invalid switch number: " << switch_num;
@@ -308,7 +290,7 @@
         switch (switch_num) {
           
           case 6577090212445038314:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(env, jcaller);
+            return Java_J_N_MW0aEs4h(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1boolean was called with an invalid switch number: " << switch_num;
@@ -322,7 +304,7 @@
         switch (switch_num) {
           
           case -7687282957371512872:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(env, jcaller, int_param1, int_array_param1, long_param1, long_array_param1, short_param1, short_array_param1, char_param1, char_array_param1, byte_param1, byte_array_param1, double_param1, double_array_param1, float_param1, float_array_param1, boolean_param1, boolean_array_param1);
+            return Java_J_N_MlVFI4RX(env, jcaller, int_param1, int_array_param1, long_param1, long_array_param1, short_param1, short_array_param1, char_param1, char_array_param1, byte_param1, byte_array_param1, double_param1, double_array_param1, float_param1, float_array_param1, boolean_param1, boolean_array_param1);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA was called with an invalid switch number: " << switch_num;
@@ -336,7 +318,7 @@
         switch (switch_num) {
           
           case -3890945313637314700:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(env, jcaller);
+            return Java_J_N_MygCV2jQ(env, jcaller);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void was called with an invalid switch number: " << switch_num;
@@ -350,7 +332,7 @@
         switch (switch_num) {
           
           case -6275232019293411879:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(env, jcaller, class_param1, class_array_param1, throwable_param1, throwable_array_param1, string_param1, string_array_param1, object_param1, object_array_param1, object_param2, object_array_param2);
+            return Java_J_N_MqOnlud7(env, jcaller, class_param1, class_array_param1, throwable_param1, throwable_array_param1, string_param1, string_array_param1, object_param1, object_array_param1, object_param2, object_array_param2);
           
           default:
             CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA was called with an invalid switch number: " << switch_num;
@@ -358,4 +340,4 @@
         }
 }
 
-#endif  // HEADER_GUARD
+#endif  // TEMP_DIR_HEADER_
diff --git a/base/android/jni_generator/golden/testProxyMultiplexGenJni.2.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing_GenJni.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyMultiplexGenJni.2.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing_GenJni.java.golden
diff --git a/base/android/jni_generator/golden/testProxyMultiplexGenJni.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing_JN.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyMultiplexGenJni.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_multiplexing_JN.java.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationHeader.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_manual.h.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationHeader.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_manual.h.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistration.2.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_manual_GenJni.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistration.2.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_manual_GenJni.java.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_GenJni.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_GenJni.java.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_JN.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_JN.java.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_manual.h.golden
similarity index 100%
rename from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_manual.h.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_manual_GenJni.java.golden
similarity index 100%
copy from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden
copy to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_manual_GenJni.java.golden
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_manual_JN.java.golden
similarity index 100%
copy from base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden
copy to base/android/jni_generator/golden/SampleForAnnotationProcessor_package_prefix_proxy_manual_JN.java.golden
diff --git a/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.2.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_proxy_GenJni.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.2.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_proxy_GenJni.java.golden
diff --git a/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.golden b/base/android/jni_generator/golden/SampleForAnnotationProcessor_proxy_JN.java.golden
similarity index 100%
rename from base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.golden
rename to base/android/jni_generator/golden/SampleForAnnotationProcessor_proxy_JN.java.golden
diff --git a/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_GenJni.java.golden b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_GenJni.java.golden
new file mode 100644
index 0000000..ea029da2
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_GenJni.java.golden
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+    public static final boolean TESTING_ENABLED = false;
+    public static final boolean REQUIRE_MOCK = false;
+
+
+    public static void org_chromium_example_jni_1generator_SampleProxyEdgeCases_foo_1_1weirdly_1_1escaped_1name1() {
+        J.N.MV9YSTxh();
+    }
+
+    public static String[][] org_chromium_example_jni_1generator_SampleProxyEdgeCases_crazyTypes(int[] a, Object[][] b) {
+        return J.N.My6x4jXt(a, b);
+    }
+
+    public static void org_chromium_example_jni_1generator_SampleProxyEdgeCases_fooForTest() {
+        J.N.M3dXOemX_ForTesting();
+    }
+
+    public static void org_chromium_example_jni_1generator_SampleProxyEdgeCases_fooForTesting() {
+        J.N.MCNruAwI_ForTesting();
+    }
+}
diff --git a/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_JN.java.golden b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_JN.java.golden
new file mode 100644
index 0000000..5140fa8c6
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_JN.java.golden
@@ -0,0 +1,22 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package J;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class N {
+
+
+      // Original name: org_chromium_example_jni_1generator_SampleProxyEdgeCases_foo_1_1weirdly_1_1escaped_1name1
+      public static native void MV9YSTxh();
+      // Original name: org_chromium_example_jni_1generator_SampleProxyEdgeCases_crazyTypes
+      public static native String[][] My6x4jXt(int[] a, Object[][] b);
+      // Original name: org_chromium_example_jni_1generator_SampleProxyEdgeCases_fooForTest
+      public static native void M3dXOemX_ForTesting();
+      // Original name: org_chromium_example_jni_1generator_SampleProxyEdgeCases_fooForTesting
+      public static native void MCNruAwI_ForTesting();
+}
diff --git a/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_jni.h.golden b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_jni.h.golden
new file mode 100644
index 0000000..15e72a4f
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_kept_jni.h.golden
@@ -0,0 +1,103 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_generator.py
+// For
+//     org/chromium/example/jni_generator/SampleProxyEdgeCases
+
+#ifndef org_chromium_example_jni_generator_SampleProxyEdgeCases_JNI
+#define org_chromium_example_jni_generator_SampleProxyEdgeCases_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+    kClassPath_org_chromium_example_jni_1generator_SampleProxyEdgeCases[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleProxyEdgeCases[] =
+    "org/chromium/example/jni_generator/SampleProxyEdgeCases";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+    g_org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz_defined
+#define org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz(JNIEnv* env) {
+  return base::android::LazyGetClass(env,
+      kClassPath_org_chromium_example_jni_1generator_SampleProxyEdgeCases,
+      &g_org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_SampleProxyEdgeCases_Foo__weirdly__escaped_name1(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_Foo__weirdly__escaped_name1(env);
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray> JNI_SampleProxyEdgeCases_CrazyTypes(JNIEnv*
+    env, const base::android::JavaParamRef<jintArray>& a,
+    const base::android::JavaParamRef<jobjectArray>& b);
+
+JNI_GENERATOR_EXPORT jobjectArray
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1crazyTypes(
+    JNIEnv* env,
+    jclass jcaller,
+    jintArray a,
+    jobjectArray b) {
+  return JNI_SampleProxyEdgeCases_CrazyTypes(env, base::android::JavaParamRef<jintArray>(env, a),
+      base::android::JavaParamRef<jobjectArray>(env, b)).Release();
+}
+
+static void JNI_SampleProxyEdgeCases_FooForTest(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1fooForTest(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_FooForTest(env);
+}
+
+static void JNI_SampleProxyEdgeCases_FooForTesting(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1fooForTesting(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_FooForTesting(env);
+}
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleProxyEdgeCases_nativeInstanceMethod(
+    JNIEnv* env,
+    jobject jcaller,
+    jlong nativeInstance) {
+  Instance* native = reinterpret_cast<Instance*>(nativeInstance);
+  CHECK_NATIVE_PTR(env, jcaller, native, "InstanceMethod");
+  return native->InstanceMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static void JNI_SampleProxyEdgeCases_StaticMethod(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleProxyEdgeCases_nativeStaticMethod(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_StaticMethod(env);
+}
+
+
+#endif  // org_chromium_example_jni_generator_SampleProxyEdgeCases_JNI
diff --git a/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_GenJni.java.golden b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_GenJni.java.golden
new file mode 100644
index 0000000..eb13023f
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_GenJni.java.golden
@@ -0,0 +1,23 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+    public static final boolean TESTING_ENABLED = false;
+    public static final boolean REQUIRE_MOCK = false;
+
+
+    public static void org_chromium_example_jni_1generator_SampleProxyEdgeCases_foo_1_1weirdly_1_1escaped_1name1() {
+        J.N.MV9YSTxh();
+    }
+
+    public static String[][] org_chromium_example_jni_1generator_SampleProxyEdgeCases_crazyTypes(int[] a, Object[][] b) {
+        return J.N.My6x4jXt(a, b);
+    }
+}
diff --git a/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_JN.java.golden b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_JN.java.golden
new file mode 100644
index 0000000..e82366d8
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_JN.java.golden
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package J;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class N {
+
+
+      // Original name: org_chromium_example_jni_1generator_SampleProxyEdgeCases_foo_1_1weirdly_1_1escaped_1name1
+      public static native void MV9YSTxh();
+      // Original name: org_chromium_example_jni_1generator_SampleProxyEdgeCases_crazyTypes
+      public static native String[][] My6x4jXt(int[] a, Object[][] b);
+}
diff --git a/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_jni.h.golden b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_jni.h.golden
new file mode 100644
index 0000000..15e72a4f
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForProxyEdgeCases_test_removed_jni.h.golden
@@ -0,0 +1,103 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_generator.py
+// For
+//     org/chromium/example/jni_generator/SampleProxyEdgeCases
+
+#ifndef org_chromium_example_jni_generator_SampleProxyEdgeCases_JNI
+#define org_chromium_example_jni_generator_SampleProxyEdgeCases_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+    kClassPath_org_chromium_example_jni_1generator_SampleProxyEdgeCases[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleProxyEdgeCases[] =
+    "org/chromium/example/jni_generator/SampleProxyEdgeCases";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+    g_org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz_defined
+#define org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz(JNIEnv* env) {
+  return base::android::LazyGetClass(env,
+      kClassPath_org_chromium_example_jni_1generator_SampleProxyEdgeCases,
+      &g_org_chromium_example_jni_1generator_SampleProxyEdgeCases_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_SampleProxyEdgeCases_Foo__weirdly__escaped_name1(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_Foo__weirdly__escaped_name1(env);
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray> JNI_SampleProxyEdgeCases_CrazyTypes(JNIEnv*
+    env, const base::android::JavaParamRef<jintArray>& a,
+    const base::android::JavaParamRef<jobjectArray>& b);
+
+JNI_GENERATOR_EXPORT jobjectArray
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1crazyTypes(
+    JNIEnv* env,
+    jclass jcaller,
+    jintArray a,
+    jobjectArray b) {
+  return JNI_SampleProxyEdgeCases_CrazyTypes(env, base::android::JavaParamRef<jintArray>(env, a),
+      base::android::JavaParamRef<jobjectArray>(env, b)).Release();
+}
+
+static void JNI_SampleProxyEdgeCases_FooForTest(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1fooForTest(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_FooForTest(env);
+}
+
+static void JNI_SampleProxyEdgeCases_FooForTesting(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleProxyEdgeCases_1fooForTesting(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_FooForTesting(env);
+}
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleProxyEdgeCases_nativeInstanceMethod(
+    JNIEnv* env,
+    jobject jcaller,
+    jlong nativeInstance) {
+  Instance* native = reinterpret_cast<Instance*>(nativeInstance);
+  CHECK_NATIVE_PTR(env, jcaller, native, "InstanceMethod");
+  return native->InstanceMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static void JNI_SampleProxyEdgeCases_StaticMethod(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleProxyEdgeCases_nativeStaticMethod(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleProxyEdgeCases_StaticMethod(env);
+}
+
+
+#endif  // org_chromium_example_jni_generator_SampleProxyEdgeCases_JNI
diff --git a/base/android/jni_generator/golden/SampleForTestsGenJni.java.golden b/base/android/jni_generator/golden/SampleForTestsGenJni.java.golden
new file mode 100644
index 0000000..bc14fc2
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleForTestsGenJni.java.golden
@@ -0,0 +1,38 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+    public static final boolean TESTING_ENABLED = false;
+    public static final boolean REQUIRE_MOCK = false;
+
+
+      // Hashed name: Java_J_N_Mo5zFsNz
+      public static native long org_chromium_example_jni_1generator_SampleForTests_init(Object caller, String param);
+      // Hashed name: Java_J_N_Mr6pLRV4
+      public static native void org_chromium_example_jni_1generator_SampleForTests_destroy(long nativeCPPClass, Object caller);
+      // Hashed name: Java_J_N_Mk8cdXlE
+      public static native double org_chromium_example_jni_1generator_SampleForTests_getDoubleFunction(Object caller);
+      // Hashed name: Java_J_N_MLxWa5Px
+      public static native float org_chromium_example_jni_1generator_SampleForTests_getFloatFunction();
+      // Hashed name: Java_J_N_M2FORct0
+      public static native void org_chromium_example_jni_1generator_SampleForTests_setNonPODDatatype(Object caller, Object rect);
+      // Hashed name: Java_J_N_MsSBMNlQ
+      public static native Object org_chromium_example_jni_1generator_SampleForTests_getNonPODDatatype(Object caller);
+      // Hashed name: Java_J_N_MsFLKdqd
+      public static native int org_chromium_example_jni_1generator_SampleForTests_method(long nativeCPPClass, Object caller);
+      // Hashed name: Java_J_N_MQo$lr$8
+      public static native double org_chromium_example_jni_1generator_SampleForTests_methodOtherP0(long nativePtr, Object caller);
+      // Hashed name: Java_J_N_MVfRccKr
+      public static native void org_chromium_example_jni_1generator_SampleForTests_addStructB(long nativeCPPClass, Object caller, Object b);
+      // Hashed name: Java_J_N_Mrn4dUkS
+      public static native void org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomethingWithStructB(long nativeCPPClass, Object caller);
+      // Hashed name: Java_J_N_MmArlaE5
+      public static native String org_chromium_example_jni_1generator_SampleForTests_returnAString(long nativeCPPClass, Object caller);
+}
diff --git a/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden b/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden
deleted file mode 100644
index 6b835a7f..0000000
--- a/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden
+++ /dev/null
@@ -1,527 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/example/jni_generator/SampleForTests
-
-#ifndef org_chromium_example_jni_generator_SampleForTests_JNI
-#define org_chromium_example_jni_generator_SampleForTests_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char
-    kClassPath_org_chromium_example_jni_1generator_SampleForTests[];
-const char kClassPath_org_chromium_example_jni_1generator_SampleForTests[] =
-    "org/chromium/example/jni_generator/SampleForTests";
-
-JNI_REGISTRATION_EXPORT extern const char
-    kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[];
-const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[] =
-    "org/chromium/example/jni_generator/SampleForTests$InnerStructA";
-
-JNI_REGISTRATION_EXPORT extern const char
-    kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[];
-const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[] =
-    "org/chromium/example/jni_generator/SampleForTests$InnerStructB";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_example_jni_1generator_SampleForTests_clazz(nullptr);
-#ifndef org_chromium_example_jni_1generator_SampleForTests_clazz_defined
-#define org_chromium_example_jni_1generator_SampleForTests_clazz_defined
-inline jclass org_chromium_example_jni_1generator_SampleForTests_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env,
-      kClassPath_org_chromium_example_jni_1generator_SampleForTests, "sample",
-      &g_org_chromium_example_jni_1generator_SampleForTests_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(nullptr);
-#ifndef org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined
-#define org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined
-inline jclass org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(JNIEnv*
-    env) {
-  return base::android::LazyGetClass(env,
-      kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA, "sample",
-      &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(nullptr);
-#ifndef org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined
-#define org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined
-inline jclass org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(JNIEnv*
-    env) {
-  return base::android::LazyGetClass(env,
-      kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB, "sample",
-      &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-namespace base {
-namespace android {
-
-static jlong JNI_SampleForTests_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    caller,
-    const base::android::JavaParamRef<jstring>& param);
-
-JNI_GENERATOR_EXPORT jlong
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1init(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject caller,
-    jstring param) {
-  return JNI_SampleForTests_Init(env, base::android::JavaParamRef<jobject>(env, caller),
-      base::android::JavaParamRef<jstring>(env, param));
-}
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1destroy(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeCPPClass,
-    jobject caller) {
-  CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env, caller));
-}
-
-static jdouble JNI_SampleForTests_GetDoubleFunction(JNIEnv* env, const
-    base::android::JavaParamRef<jobject>& caller);
-
-JNI_GENERATOR_EXPORT jdouble
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getDoubleFunction(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject caller) {
-  return JNI_SampleForTests_GetDoubleFunction(env, base::android::JavaParamRef<jobject>(env,
-      caller));
-}
-
-static jfloat JNI_SampleForTests_GetFloatFunction(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jfloat
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getFloatFunction(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_SampleForTests_GetFloatFunction(env);
-}
-
-static void JNI_SampleForTests_SetNonPODDatatype(JNIEnv* env, const
-    base::android::JavaParamRef<jobject>& caller,
-    const base::android::JavaParamRef<jobject>& rect);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1setNonPODDatatype(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject caller,
-    jobject rect) {
-  return JNI_SampleForTests_SetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
-      caller), base::android::JavaParamRef<jobject>(env, rect));
-}
-
-static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller);
-
-JNI_GENERATOR_EXPORT jobject
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getNonPODDatatype(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject caller) {
-  return JNI_SampleForTests_GetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
-      caller)).Release();
-}
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1method(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeCPPClass,
-    jobject caller) {
-  CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
-  return native->Method(env, base::android::JavaParamRef<jobject>(env, caller));
-}
-
-JNI_GENERATOR_EXPORT jdouble
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1methodOtherP0(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativePtr,
-    jobject caller) {
-  CPPClass::InnerClass* native = reinterpret_cast<CPPClass::InnerClass*>(nativePtr);
-  CHECK_NATIVE_PTR(env, jcaller, native, "MethodOtherP0", 0);
-  return native->MethodOtherP0(env, base::android::JavaParamRef<jobject>(env, caller));
-}
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1addStructB(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeCPPClass,
-    jobject caller,
-    jobject b) {
-  CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddStructB");
-  return native->AddStructB(env, base::android::JavaParamRef<jobject>(env, caller),
-      base::android::JavaParamRef<jobject>(env, b));
-}
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1iterateAndDoSomethingWithStructB(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeCPPClass,
-    jobject caller) {
-  CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
-  CHECK_NATIVE_PTR(env, jcaller, native, "IterateAndDoSomethingWithStructB");
-  return native->IterateAndDoSomethingWithStructB(env, base::android::JavaParamRef<jobject>(env,
-      caller));
-}
-
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1returnAString(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeCPPClass,
-    jobject caller) {
-  CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
-  CHECK_NATIVE_PTR(env, jcaller, native, "ReturnAString", NULL);
-  return native->ReturnAString(env, base::android::JavaParamRef<jobject>(env, caller)).Release();
-}
-
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_javaMethod(nullptr);
-static jint Java_SampleForTests_javaMethod(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper foo,
-    JniIntWrapper bar) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "javaMethod",
-          "(II)I",
-          &g_org_chromium_example_jni_1generator_SampleForTests_javaMethod);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id, as_jint(foo), as_jint(bar));
-  return ret;
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod(nullptr);
-static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), false);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "staticJavaMethod",
-          "()Z",
-          &g_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod);
-
-  jboolean ret =
-      env->CallStaticBooleanMethod(clazz,
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod(nullptr);
-static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "packagePrivateJavaMethod",
-          "()V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams(nullptr);
-static void Java_SampleForTests_methodWithGenericParams(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& foo,
-    const base::android::JavaRef<jobject>& bar) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "methodWithGenericParams",
-          "(Ljava/util/Map;Ljava/util/LinkedList;)V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, foo.obj(), bar.obj());
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_Constructor(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_Constructor(JNIEnv* env,
-    JniIntWrapper foo,
-    JniIntWrapper bar) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "<init>",
-          "(II)V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_Constructor);
-
-  jobject ret =
-      env->NewObject(clazz,
-          call_context.base.method_id, as_jint(foo), as_jint(bar));
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException(nullptr);
-static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextUnchecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "methodThatThrowsException",
-          "()V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.method_id);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr);
-static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper foo,
-    JniIntWrapper bar,
-    JniIntWrapper baz,
-    JniIntWrapper bat) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "javaMethodWithAnnotatedParam",
-          "(IIII)V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(foo), as_jint(bar), as_jint(baz), as_jint(bat));
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_InnerStructA_create(JNIEnv* env, jlong l,
-    JniIntWrapper i,
-    const base::android::JavaRef<jstring>& s) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "create",
-          "(JILjava/lang/String;)Lorg/chromium/example/jni_generator/SampleForTests$InnerStructA;",
-          &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, l, as_jint(i), s.obj());
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_addStructA(nullptr);
-static void Java_SampleForTests_addStructA(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    const base::android::JavaRef<jobject>& a) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "addStructA",
-          "(Lorg/chromium/example/jni_generator/SampleForTests$InnerStructA;)V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_addStructA);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, a.obj());
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething(nullptr);
-static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "iterateAndDoSomething",
-          "()V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey(nullptr);
-static jlong Java_InnerStructB_getKey(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getKey",
-          "()J",
-          &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue(nullptr);
-static base::android::ScopedJavaLocalRef<jstring> Java_InnerStructB_getValue(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getValue",
-          "()Ljava/lang/String;",
-          &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue);
-
-  jstring ret =
-      static_cast<jstring>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerInterface(JNIEnv* env)
-    {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "getInnerInterface",
-          "()Lorg/chromium/example/jni_generator/SampleForTests$InnerInterface;",
-          &g_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerEnum(JNIEnv* env) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "getInnerEnum",
-          "()Lorg/chromium/example/jni_generator/SampleForTests$InnerEnum;",
-          &g_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-}  // namespace android
-}  // namespace base
-
-#endif  // org_chromium_example_jni_generator_SampleForTests_JNI
diff --git a/base/android/jni_generator/golden/SampleForTests_jni.golden b/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.h.golden
similarity index 100%
copy from base/android/jni_generator/golden/SampleForTests_jni.golden
copy to base/android/jni_generator/golden/SampleForTestsWithSplit_jni.h.golden
diff --git a/base/android/jni_generator/golden/SampleForTests_jni.golden b/base/android/jni_generator/golden/SampleForTests_jni.h.golden
similarity index 100%
rename from base/android/jni_generator/golden/SampleForTests_jni.golden
rename to base/android/jni_generator/golden/SampleForTests_jni.h.golden
diff --git a/base/android/jni_generator/golden/SampleForTestsWithPackagePrefix_jni.golden b/base/android/jni_generator/golden/SampleForTests_package_prefix_jni.h.golden
similarity index 100%
rename from base/android/jni_generator/golden/SampleForTestsWithPackagePrefix_jni.golden
rename to base/android/jni_generator/golden/SampleForTests_package_prefix_jni.h.golden
diff --git a/base/android/jni_generator/golden/ModuleGenJni.golden b/base/android/jni_generator/golden/SampleModuleGenJni.golden
similarity index 100%
rename from base/android/jni_generator/golden/ModuleGenJni.golden
rename to base/android/jni_generator/golden/SampleModuleGenJni.golden
diff --git a/base/android/jni_generator/golden/ModuleJN.golden b/base/android/jni_generator/golden/SampleModuleJN.golden
similarity index 100%
rename from base/android/jni_generator/golden/ModuleJN.golden
rename to base/android/jni_generator/golden/SampleModuleJN.golden
diff --git a/base/android/jni_generator/golden/SampleNonProxy_class_file_jni.h.golden b/base/android/jni_generator/golden/SampleNonProxy_class_file_jni.h.golden
new file mode 100644
index 0000000..4bc6468
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleNonProxy_class_file_jni.h.golden
@@ -0,0 +1,96 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_generator.py
+// For
+//     org/chromium/example/jni_generator/SampleNonProxy
+
+#ifndef org_chromium_example_jni_generator_SampleNonProxy_JNI
+#define org_chromium_example_jni_generator_SampleNonProxy_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+    kClassPath_org_chromium_example_jni_1generator_SampleNonProxy[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleNonProxy[] =
+    "org/chromium/example/jni_generator/SampleNonProxy";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+    g_org_chromium_example_jni_1generator_SampleNonProxy_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleNonProxy_clazz_defined
+#define org_chromium_example_jni_1generator_SampleNonProxy_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleNonProxy_clazz(JNIEnv* env) {
+  return base::android::LazyGetClass(env,
+      kClassPath_org_chromium_example_jni_1generator_SampleNonProxy,
+      &g_org_chromium_example_jni_1generator_SampleNonProxy_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+namespace JNI_SampleNonProxy {
+
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleNonProxy_nativeFindAll(nullptr);
+[[maybe_unused]] static jint Java_SampleNonProxy_nativeFindAll(JNIEnv* env, const
+    base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jstring>& p0);
+static jint Java_SampleNonProxy_nativeFindAll(JNIEnv* env, const base::android::JavaRef<jobject>&
+    obj, const base::android::JavaRef<jstring>& p0) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleNonProxy_clazz(env);
+  CHECK_CLAZZ(env, obj.obj(),
+      org_chromium_example_jni_1generator_SampleNonProxy_clazz(env), 0);
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_INSTANCE>(
+          env,
+          clazz,
+          "nativeFindAll",
+          "(Ljava/lang/String;)I",
+          &g_org_chromium_example_jni_1generator_SampleNonProxy_nativeFindAll);
+
+  jint ret =
+      env->CallIntMethod(obj.obj(),
+          call_context.base.method_id, p0.obj());
+  return ret;
+}
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleNonProxy_Constructor(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+    Java_SampleNonProxy_Constructor(JNIEnv* env);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleNonProxy_Constructor(JNIEnv* env) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleNonProxy_clazz(env);
+  CHECK_CLAZZ(env, clazz,
+      org_chromium_example_jni_1generator_SampleNonProxy_clazz(env), NULL);
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_INSTANCE>(
+          env,
+          clazz,
+          "<init>",
+          "()V",
+          &g_org_chromium_example_jni_1generator_SampleNonProxy_Constructor);
+
+  jobject ret =
+      env->NewObject(clazz,
+          call_context.base.method_id);
+  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+}  // namespace JNI_SampleNonProxy
+
+#endif  // org_chromium_example_jni_generator_SampleNonProxy_JNI
diff --git a/base/android/jni_generator/golden/SampleNonProxy_jni.h.golden b/base/android/jni_generator/golden/SampleNonProxy_jni.h.golden
new file mode 100644
index 0000000..a4eaf4a
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleNonProxy_jni.h.golden
@@ -0,0 +1,268 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_generator.py
+// For
+//     org/chromium/example/jni_generator/SampleNonProxy
+
+#ifndef org_chromium_example_jni_generator_SampleNonProxy_JNI
+#define org_chromium_example_jni_generator_SampleNonProxy_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+    kClassPath_org_chromium_example_jni_1generator_SampleNonProxy[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleNonProxy[] =
+    "org/chromium/example/jni_generator/SampleNonProxy";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+    g_org_chromium_example_jni_1generator_SampleNonProxy_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleNonProxy_clazz_defined
+#define org_chromium_example_jni_1generator_SampleNonProxy_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleNonProxy_clazz(JNIEnv* env) {
+  return base::android::LazyGetClass(env,
+      kClassPath_org_chromium_example_jni_1generator_SampleNonProxy,
+      &g_org_chromium_example_jni_1generator_SampleNonProxy_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static jint JNI_SampleNonProxy_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+    jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeInit(
+    JNIEnv* env,
+    jobject jcaller) {
+  return JNI_SampleNonProxy_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static void JNI_SampleNonProxy_Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+    jcaller,
+    jint nativeChromeBrowserProvider);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeDestroy(
+    JNIEnv* env,
+    jobject jcaller,
+    jint nativeChromeBrowserProvider) {
+  return JNI_SampleNonProxy_Destroy(env, base::android::JavaParamRef<jobject>(env, jcaller),
+      nativeChromeBrowserProvider);
+}
+
+static jlong JNI_SampleNonProxy_AddBookmark(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+    jcaller,
+    jint nativeChromeBrowserProvider,
+    const base::android::JavaParamRef<jstring>& url,
+    const base::android::JavaParamRef<jstring>& title,
+    jboolean isFolder,
+    jlong parentId);
+
+JNI_GENERATOR_EXPORT jlong
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeAddBookmark(
+    JNIEnv* env,
+    jobject jcaller,
+    jint nativeChromeBrowserProvider,
+    jstring url,
+    jstring title,
+    jboolean isFolder,
+    jlong parentId) {
+  return JNI_SampleNonProxy_AddBookmark(env, base::android::JavaParamRef<jobject>(env, jcaller),
+      nativeChromeBrowserProvider, base::android::JavaParamRef<jstring>(env, url),
+      base::android::JavaParamRef<jstring>(env, title), isFolder, parentId);
+}
+
+static base::android::ScopedJavaLocalRef<jstring> JNI_SampleNonProxy_GetDomainAndRegistry(JNIEnv*
+    env, const base::android::JavaParamRef<jstring>& url);
+
+JNI_GENERATOR_EXPORT jstring
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeGetDomainAndRegistry(
+    JNIEnv* env,
+    jclass jcaller,
+    jstring url) {
+  return JNI_SampleNonProxy_GetDomainAndRegistry(env, base::android::JavaParamRef<jstring>(env,
+      url)).Release();
+}
+
+static void JNI_SampleNonProxy_CreateHistoricalTabFromState(JNIEnv* env, const
+    base::android::JavaParamRef<jbyteArray>& state,
+    jint tabIndex);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeCreateHistoricalTabFromState(
+    JNIEnv* env,
+    jclass jcaller,
+    jbyteArray state,
+    jint tabIndex) {
+  return JNI_SampleNonProxy_CreateHistoricalTabFromState(env,
+      base::android::JavaParamRef<jbyteArray>(env, state), tabIndex);
+}
+
+static base::android::ScopedJavaLocalRef<jbyteArray> JNI_SampleNonProxy_GetStateAsByteArray(JNIEnv*
+    env, const base::android::JavaParamRef<jobject>& jcaller,
+    const base::android::JavaParamRef<jobject>& view);
+
+JNI_GENERATOR_EXPORT jbyteArray
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeGetStateAsByteArray(
+    JNIEnv* env,
+    jobject jcaller,
+    jobject view) {
+  return JNI_SampleNonProxy_GetStateAsByteArray(env, base::android::JavaParamRef<jobject>(env,
+      jcaller), base::android::JavaParamRef<jobject>(env, view)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+    JNI_SampleNonProxy_GetAutofillProfileGUIDs(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeGetAutofillProfileGUIDs(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleNonProxy_GetAutofillProfileGUIDs(env).Release();
+}
+
+static void JNI_SampleNonProxy_SetRecognitionResults(JNIEnv* env, const
+    base::android::JavaParamRef<jobject>& jcaller,
+    jint sessionId,
+    const base::android::JavaParamRef<jobjectArray>& results);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeSetRecognitionResults(
+    JNIEnv* env,
+    jobject jcaller,
+    jint sessionId,
+    jobjectArray results) {
+  return JNI_SampleNonProxy_SetRecognitionResults(env, base::android::JavaParamRef<jobject>(env,
+      jcaller), sessionId, base::android::JavaParamRef<jobjectArray>(env, results));
+}
+
+static jlong JNI_SampleNonProxy_AddBookmarkFromAPI(JNIEnv* env, const
+    base::android::JavaParamRef<jobject>& jcaller,
+    jint nativeChromeBrowserProvider,
+    const base::android::JavaParamRef<jstring>& url,
+    const base::android::JavaParamRef<jobject>& created,
+    const base::android::JavaParamRef<jobject>& isBookmark,
+    const base::android::JavaParamRef<jobject>& date,
+    const base::android::JavaParamRef<jbyteArray>& favicon,
+    const base::android::JavaParamRef<jstring>& title,
+    const base::android::JavaParamRef<jobject>& visits);
+
+JNI_GENERATOR_EXPORT jlong
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeAddBookmarkFromAPI(
+    JNIEnv* env,
+    jobject jcaller,
+    jint nativeChromeBrowserProvider,
+    jstring url,
+    jobject created,
+    jobject isBookmark,
+    jobject date,
+    jbyteArray favicon,
+    jstring title,
+    jobject visits) {
+  return JNI_SampleNonProxy_AddBookmarkFromAPI(env, base::android::JavaParamRef<jobject>(env,
+      jcaller), nativeChromeBrowserProvider, base::android::JavaParamRef<jstring>(env, url),
+      base::android::JavaParamRef<jobject>(env, created), base::android::JavaParamRef<jobject>(env,
+      isBookmark), base::android::JavaParamRef<jobject>(env, date),
+      base::android::JavaParamRef<jbyteArray>(env, favicon),
+      base::android::JavaParamRef<jstring>(env, title), base::android::JavaParamRef<jobject>(env,
+      visits));
+}
+
+static jint JNI_SampleNonProxy_FindAll(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+    jcaller,
+    const base::android::JavaParamRef<jstring>& find);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeFindAll(
+    JNIEnv* env,
+    jobject jcaller,
+    jstring find) {
+  return JNI_SampleNonProxy_FindAll(env, base::android::JavaParamRef<jobject>(env, jcaller),
+      base::android::JavaParamRef<jstring>(env, find));
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_SampleNonProxy_GetInnerClass(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobject
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeGetInnerClass(
+    JNIEnv* env,
+    jclass jcaller) {
+  return JNI_SampleNonProxy_GetInnerClass(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_SampleNonProxy_QueryBitmap(JNIEnv* env, const
+    base::android::JavaParamRef<jobject>& jcaller,
+    jint nativeChromeBrowserProvider,
+    const base::android::JavaParamRef<jobjectArray>& projection,
+    const base::android::JavaParamRef<jstring>& selection,
+    const base::android::JavaParamRef<jobjectArray>& selectionArgs,
+    const base::android::JavaParamRef<jstring>& sortOrder);
+
+JNI_GENERATOR_EXPORT jobject
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeQueryBitmap(
+    JNIEnv* env,
+    jobject jcaller,
+    jint nativeChromeBrowserProvider,
+    jobjectArray projection,
+    jstring selection,
+    jobjectArray selectionArgs,
+    jstring sortOrder) {
+  return JNI_SampleNonProxy_QueryBitmap(env, base::android::JavaParamRef<jobject>(env, jcaller),
+      nativeChromeBrowserProvider, base::android::JavaParamRef<jobjectArray>(env, projection),
+      base::android::JavaParamRef<jstring>(env, selection),
+      base::android::JavaParamRef<jobjectArray>(env, selectionArgs),
+      base::android::JavaParamRef<jstring>(env, sortOrder)).Release();
+}
+
+static void JNI_SampleNonProxy_GotOrientation(JNIEnv* env, const
+    base::android::JavaParamRef<jobject>& jcaller,
+    jint nativeDataFetcherImplAndroid,
+    jdouble alpha,
+    jdouble beta,
+    jdouble gamma);
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeGotOrientation(
+    JNIEnv* env,
+    jobject jcaller,
+    jint nativeDataFetcherImplAndroid,
+    jdouble alpha,
+    jdouble beta,
+    jdouble gamma) {
+  return JNI_SampleNonProxy_GotOrientation(env, base::android::JavaParamRef<jobject>(env, jcaller),
+      nativeDataFetcherImplAndroid, alpha, beta, gamma);
+}
+
+static base::android::ScopedJavaLocalRef<jthrowable>
+    JNI_SampleNonProxy_MessWithJavaException(JNIEnv* env, const
+    base::android::JavaParamRef<jthrowable>& e);
+
+JNI_GENERATOR_EXPORT jthrowable
+    Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeMessWithJavaException(
+    JNIEnv* env,
+    jclass jcaller,
+    jthrowable e) {
+  return JNI_SampleNonProxy_MessWithJavaException(env, base::android::JavaParamRef<jthrowable>(env,
+      e)).Release();
+}
+
+static jint JNI_SampleNonProxy_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+    jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_example_jni_1generator_SampleNonProxy_nativeInit(
+    JNIEnv* env,
+    jobject jcaller) {
+  return JNI_SampleNonProxy_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+#endif  // org_chromium_example_jni_generator_SampleNonProxy_JNI
diff --git a/base/android/jni_generator/golden/SampleUniqueAnnotations_jni.h.golden b/base/android/jni_generator/golden/SampleUniqueAnnotations_jni.h.golden
new file mode 100644
index 0000000..b24ac020
--- /dev/null
+++ b/base/android/jni_generator/golden/SampleUniqueAnnotations_jni.h.golden
@@ -0,0 +1,96 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_generator.py
+// For
+//     org/chromium/example/jni_generator/SampleUniqueAnnotations
+
+#ifndef org_chromium_example_jni_generator_SampleUniqueAnnotations_JNI
+#define org_chromium_example_jni_generator_SampleUniqueAnnotations_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+    kClassPath_org_chromium_example_jni_1generator_SampleUniqueAnnotations[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleUniqueAnnotations[] =
+    "org/chromium/example/jni_generator/SampleUniqueAnnotations";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+    g_org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz_defined
+#define org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz(JNIEnv* env) {
+  return base::android::LazyGetClass(env,
+      kClassPath_org_chromium_example_jni_1generator_SampleUniqueAnnotations,
+      &g_org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleUniqueAnnotations_1foo(
+    JNIEnv* env,
+    jclass jcaller,
+    jlong nativePtr) {
+  FooAndroid::BarDelegate* native = reinterpret_cast<FooAndroid::BarDelegate*>(nativePtr);
+  CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
+  return native->Foo(env);
+}
+
+static jint JNI_SampleUniqueAnnotations_Bar(JNIEnv* env, jint x,
+    jint y);
+
+JNI_GENERATOR_EXPORT jint
+    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleUniqueAnnotations_1bar(
+    JNIEnv* env,
+    jclass jcaller,
+    jint x,
+    jint y) {
+  return JNI_SampleUniqueAnnotations_Bar(env, x, y);
+}
+
+JNI_GENERATOR_EXPORT void
+    Java_org_chromium_example_jni_1generator_SampleUniqueAnnotations_nativeCallWithQualifiedObject(
+    JNIEnv* env,
+    jobject jcaller,
+    jlong nativePtr) {
+  Foo::Bar* native = reinterpret_cast<Foo::Bar*>(nativePtr);
+  CHECK_NATIVE_PTR(env, jcaller, native, "CallWithQualifiedObject");
+  return native->CallWithQualifiedObject(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+static std::atomic<jmethodID>
+    g_org_chromium_example_jni_1generator_SampleUniqueAnnotations_useBar1(nullptr);
+static void Java_SampleUniqueAnnotations_useBar1(JNIEnv* env, const base::android::JavaRef<jobject>&
+    inner) {
+  jclass clazz = org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz(env);
+  CHECK_CLAZZ(env, clazz,
+      org_chromium_example_jni_1generator_SampleUniqueAnnotations_clazz(env));
+
+  jni_generator::JniJavaCallContextChecked call_context;
+  call_context.Init<
+      base::android::MethodID::TYPE_STATIC>(
+          env,
+          clazz,
+          "useBar1",
+          "(Lorg/chromium/example/jni_generator/Bar1$Inner;)V",
+          &g_org_chromium_example_jni_1generator_SampleUniqueAnnotations_useBar1);
+
+     env->CallStaticVoidMethod(clazz,
+          call_context.base.method_id, inner.obj());
+}
+
+#endif  // org_chromium_example_jni_generator_SampleUniqueAnnotations_JNI
diff --git a/base/android/jni_generator/golden/TinySample_enable_mocks_GenJni.java.golden b/base/android/jni_generator/golden/TinySample_enable_mocks_GenJni.java.golden
new file mode 100644
index 0000000..ae8aabf
--- /dev/null
+++ b/base/android/jni_generator/golden/TinySample_enable_mocks_GenJni.java.golden
@@ -0,0 +1,20 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+    public static final boolean TESTING_ENABLED = true;
+    public static final boolean REQUIRE_MOCK = false;
+
+
+      // Hashed name: Java_J_N_MIkEiasS
+      public static native void org_chromium_example_jni_1generator_TinySample_foo();
+      // Hashed name: Java_J_N_MtOQLwpt
+      public static native boolean org_chromium_example_jni_1generator_TinySample_bar(int a);
+}
diff --git a/base/android/jni_generator/golden/TinySample_require_mocks_GenJni.java.golden b/base/android/jni_generator/golden/TinySample_require_mocks_GenJni.java.golden
new file mode 100644
index 0000000..4b92074e
--- /dev/null
+++ b/base/android/jni_generator/golden/TinySample_require_mocks_GenJni.java.golden
@@ -0,0 +1,20 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+//     base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+    public static final boolean TESTING_ENABLED = true;
+    public static final boolean REQUIRE_MOCK = true;
+
+
+      // Hashed name: Java_J_N_MIkEiasS
+      public static native void org_chromium_example_jni_1generator_TinySample_foo();
+      // Hashed name: Java_J_N_MtOQLwpt
+      public static native boolean org_chromium_example_jni_1generator_TinySample_bar(int a);
+}
diff --git a/base/android/jni_generator/golden/testCalledByNatives.golden b/base/android/jni_generator/golden/testCalledByNatives.golden
deleted file mode 100644
index 2b34c97..0000000
--- a/base/android/jni_generator/golden/testCalledByNatives.golden
+++ /dev/null
@@ -1,500 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
-const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024InfoBar[];
-const char kClassPath_org_chromium_TestJni_00024InfoBar[] = "org/chromium/TestJni$InfoBar";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_00024InfoBar_clazz(nullptr);
-#ifndef org_chromium_TestJni_00024InfoBar_clazz_defined
-#define org_chromium_TestJni_00024InfoBar_clazz_defined
-inline jclass org_chromium_TestJni_00024InfoBar_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024InfoBar,
-      &g_org_chromium_TestJni_00024InfoBar_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_showConfirmInfoBar(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_showConfirmInfoBar(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper nativeInfoBar,
-    const base::android::JavaRef<jstring>& buttonOk,
-    const base::android::JavaRef<jstring>& buttonCancel,
-    const base::android::JavaRef<jstring>& title,
-    const base::android::JavaRef<jobject>& icon) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "showConfirmInfoBar",
-"(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Bitmap;)Lorg/chromium/Foo$InnerClass;",
-          &g_org_chromium_TestJni_showConfirmInfoBar);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id, as_jint(nativeInfoBar), buttonOk.obj(), buttonCancel.obj(),
-              title.obj(), icon.obj());
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_showAutoLoginInfoBar(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj, JniIntWrapper nativeInfoBar,
-    const base::android::JavaRef<jstring>& realm,
-    const base::android::JavaRef<jstring>& account,
-    const base::android::JavaRef<jstring>& args) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "showAutoLoginInfoBar",
-          "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/chromium/Foo$InnerClass;",
-          &g_org_chromium_TestJni_showAutoLoginInfoBar);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id, as_jint(nativeInfoBar), realm.obj(), account.obj(),
-              args.obj());
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_00024InfoBar_dismiss(nullptr);
-static void Java_InfoBar_dismiss(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_00024InfoBar_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_00024InfoBar_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "dismiss",
-          "()V",
-          &g_org_chromium_TestJni_00024InfoBar_dismiss);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_shouldShowAutoLogin(nullptr);
-static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, const base::android::JavaRef<jobject>&
-    view,
-    const base::android::JavaRef<jstring>& realm,
-    const base::android::JavaRef<jstring>& account,
-    const base::android::JavaRef<jstring>& args) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_TestJni_clazz(env), false);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "shouldShowAutoLogin",
-          "(Landroid/view/View;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
-          &g_org_chromium_TestJni_shouldShowAutoLogin);
-
-  jboolean ret =
-      env->CallStaticBooleanMethod(clazz,
-          call_context.base.method_id, view.obj(), realm.obj(), account.obj(), args.obj());
-  return ret;
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_openUrl(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv* env, const
-    base::android::JavaRef<jstring>& url) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "openUrl",
-          "(Ljava/lang/String;)Ljava/io/InputStream;",
-          &g_org_chromium_TestJni_openUrl);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, url.obj());
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_activateHardwareAcceleration(nullptr);
-static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jboolean activated,
-    JniIntWrapper iPid,
-    JniIntWrapper iType,
-    JniIntWrapper iPrimaryID,
-    JniIntWrapper iSecondaryID) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "activateHardwareAcceleration",
-          "(ZIIII)V",
-          &g_org_chromium_TestJni_activateHardwareAcceleration);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, activated, as_jint(iPid), as_jint(iType),
-              as_jint(iPrimaryID), as_jint(iSecondaryID));
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_updateStatus(nullptr);
-static jint Java_TestJni_updateStatus(JNIEnv* env, JniIntWrapper status) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_TestJni_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "updateStatus",
-          "(I)I",
-          &g_org_chromium_TestJni_updateStatus);
-
-  jint ret =
-      env->CallStaticIntMethod(clazz,
-          call_context.base.method_id, as_jint(status));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_uncheckedCall(nullptr);
-static void Java_TestJni_uncheckedCall(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper iParam) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env));
-
-  jni_generator::JniJavaCallContextUnchecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "uncheckedCall",
-          "(I)V",
-          &g_org_chromium_TestJni_uncheckedCall);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.method_id, as_jint(iParam));
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnByteArray(nullptr);
-static base::android::ScopedJavaLocalRef<jbyteArray> Java_TestJni_returnByteArray(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnByteArray",
-          "()[B",
-          &g_org_chromium_TestJni_returnByteArray);
-
-  jbyteArray ret =
-      static_cast<jbyteArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jbyteArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnBooleanArray(nullptr);
-static base::android::ScopedJavaLocalRef<jbooleanArray> Java_TestJni_returnBooleanArray(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnBooleanArray",
-          "()[Z",
-          &g_org_chromium_TestJni_returnBooleanArray);
-
-  jbooleanArray ret =
-      static_cast<jbooleanArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jbooleanArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnCharArray(nullptr);
-static base::android::ScopedJavaLocalRef<jcharArray> Java_TestJni_returnCharArray(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnCharArray",
-          "()[C",
-          &g_org_chromium_TestJni_returnCharArray);
-
-  jcharArray ret =
-      static_cast<jcharArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jcharArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnShortArray(nullptr);
-static base::android::ScopedJavaLocalRef<jshortArray> Java_TestJni_returnShortArray(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnShortArray",
-          "()[S",
-          &g_org_chromium_TestJni_returnShortArray);
-
-  jshortArray ret =
-      static_cast<jshortArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jshortArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnIntArray(nullptr);
-static base::android::ScopedJavaLocalRef<jintArray> Java_TestJni_returnIntArray(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnIntArray",
-          "()[I",
-          &g_org_chromium_TestJni_returnIntArray);
-
-  jintArray ret =
-      static_cast<jintArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jintArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnLongArray(nullptr);
-static base::android::ScopedJavaLocalRef<jlongArray> Java_TestJni_returnLongArray(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnLongArray",
-          "()[J",
-          &g_org_chromium_TestJni_returnLongArray);
-
-  jlongArray ret =
-      static_cast<jlongArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jlongArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnDoubleArray(nullptr);
-static base::android::ScopedJavaLocalRef<jdoubleArray> Java_TestJni_returnDoubleArray(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnDoubleArray",
-          "()[D",
-          &g_org_chromium_TestJni_returnDoubleArray);
-
-  jdoubleArray ret =
-      static_cast<jdoubleArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jdoubleArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnObjectArray(nullptr);
-static base::android::ScopedJavaLocalRef<jobjectArray> Java_TestJni_returnObjectArray(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnObjectArray",
-          "()[Ljava/lang/Object;",
-          &g_org_chromium_TestJni_returnObjectArray);
-
-  jobjectArray ret =
-      static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnArrayOfByteArray(nullptr);
-static base::android::ScopedJavaLocalRef<jobjectArray> Java_TestJni_returnArrayOfByteArray(JNIEnv*
-    env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnArrayOfByteArray",
-          "()[[B",
-          &g_org_chromium_TestJni_returnArrayOfByteArray);
-
-  jobjectArray ret =
-      static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_getCompressFormat(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_getCompressFormat(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getCompressFormat",
-          "()Landroid/graphics/Bitmap$CompressFormat;",
-          &g_org_chromium_TestJni_getCompressFormat);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_getCompressFormatList(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_getCompressFormatList(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getCompressFormatList",
-          "()Ljava/util/List;",
-          &g_org_chromium_TestJni_getCompressFormatList);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_TestJni_returnIntArrayForTesting(nullptr);
-static base::android::ScopedJavaLocalRef<jintArray> Java_TestJni_returnIntArrayForTesting(JNIEnv*
-    env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_TestJni_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_TestJni_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "returnIntArrayForTesting",
-          "()[I",
-          &g_org_chromium_TestJni_returnIntArrayForTesting);
-
-  jintArray ret =
-      static_cast<jintArray>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jintArray>(env, ret);
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/golden/testConstantsFromJavaP.golden b/base/android/jni_generator/golden/testConstantsFromJavaP.golden
deleted file mode 100644
index 0a787724..0000000
--- a/base/android/jni_generator/golden/testConstantsFromJavaP.golden
+++ /dev/null
@@ -1,2320 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     android/view/MotionEvent
-
-#ifndef android_view_MotionEvent_JNI
-#define android_view_MotionEvent_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_android_view_MotionEvent[];
-const char kClassPath_android_view_MotionEvent[] = "android/view/MotionEvent";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_android_view_MotionEvent_clazz(nullptr);
-#ifndef android_view_MotionEvent_clazz_defined
-#define android_view_MotionEvent_clazz_defined
-inline jclass android_view_MotionEvent_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_android_view_MotionEvent,
-      &g_android_view_MotionEvent_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-namespace JNI_MotionEvent {
-
-enum Java_MotionEvent_constant_fields {
-  INVALID_POINTER_ID = -1,
-  ACTION_MASK = 255,
-  ACTION_DOWN = 0,
-  ACTION_UP = 1,
-  ACTION_MOVE = 2,
-  ACTION_CANCEL = 3,
-  ACTION_OUTSIDE = 4,
-  ACTION_POINTER_DOWN = 5,
-  ACTION_POINTER_UP = 6,
-  ACTION_HOVER_MOVE = 7,
-  ACTION_SCROLL = 8,
-  ACTION_HOVER_ENTER = 9,
-  ACTION_HOVER_EXIT = 10,
-  ACTION_POINTER_INDEX_MASK = 65280,
-  ACTION_POINTER_INDEX_SHIFT = 8,
-  ACTION_POINTER_1_DOWN = 5,
-  ACTION_POINTER_2_DOWN = 261,
-  ACTION_POINTER_3_DOWN = 517,
-  ACTION_POINTER_1_UP = 6,
-  ACTION_POINTER_2_UP = 262,
-  ACTION_POINTER_3_UP = 518,
-  ACTION_POINTER_ID_MASK = 65280,
-  ACTION_POINTER_ID_SHIFT = 8,
-  FLAG_WINDOW_IS_OBSCURED = 1,
-  EDGE_TOP = 1,
-  EDGE_BOTTOM = 2,
-  EDGE_LEFT = 4,
-  EDGE_RIGHT = 8,
-  AXIS_X = 0,
-  AXIS_Y = 1,
-  AXIS_PRESSURE = 2,
-  AXIS_SIZE = 3,
-  AXIS_TOUCH_MAJOR = 4,
-  AXIS_TOUCH_MINOR = 5,
-  AXIS_TOOL_MAJOR = 6,
-  AXIS_TOOL_MINOR = 7,
-  AXIS_ORIENTATION = 8,
-  AXIS_VSCROLL = 9,
-  AXIS_HSCROLL = 10,
-  AXIS_Z = 11,
-  AXIS_RX = 12,
-  AXIS_RY = 13,
-  AXIS_RZ = 14,
-  AXIS_HAT_X = 15,
-  AXIS_HAT_Y = 16,
-  AXIS_LTRIGGER = 17,
-  AXIS_RTRIGGER = 18,
-  AXIS_THROTTLE = 19,
-  AXIS_RUDDER = 20,
-  AXIS_WHEEL = 21,
-  AXIS_GAS = 22,
-  AXIS_BRAKE = 23,
-  AXIS_DISTANCE = 24,
-  AXIS_TILT = 25,
-  AXIS_GENERIC_1 = 32,
-  AXIS_GENERIC_2 = 33,
-  AXIS_GENERIC_3 = 34,
-  AXIS_GENERIC_4 = 35,
-  AXIS_GENERIC_5 = 36,
-  AXIS_GENERIC_6 = 37,
-  AXIS_GENERIC_7 = 38,
-  AXIS_GENERIC_8 = 39,
-  AXIS_GENERIC_9 = 40,
-  AXIS_GENERIC_10 = 41,
-  AXIS_GENERIC_11 = 42,
-  AXIS_GENERIC_12 = 43,
-  AXIS_GENERIC_13 = 44,
-  AXIS_GENERIC_14 = 45,
-  AXIS_GENERIC_15 = 46,
-  AXIS_GENERIC_16 = 47,
-  BUTTON_PRIMARY = 1,
-  BUTTON_SECONDARY = 2,
-  BUTTON_TERTIARY = 4,
-  BUTTON_BACK = 8,
-  BUTTON_FORWARD = 16,
-  TOOL_TYPE_UNKNOWN = 0,
-  TOOL_TYPE_FINGER = 1,
-  TOOL_TYPE_STYLUS = 2,
-  TOOL_TYPE_MOUSE = 3,
-  TOOL_TYPE_ERASER = 4,
-};
-
-
-}  // namespace JNI_MotionEvent
-// Step 3: Method stubs.
-namespace JNI_MotionEvent {
-
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_finalize(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_finalize(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static void Java_MotionEvent_finalize(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "finalize",
-          "()V",
-          &g_android_view_MotionEvent_finalize);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID>
-    g_android_view_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRef<jobjectArray>& p4,
-    const base::android::JavaRef<jobjectArray>& p5,
-    JniIntWrapper p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12,
-    JniIntWrapper p13);
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRef<jobjectArray>& p4,
-    const base::android::JavaRef<jobjectArray>& p5,
-    JniIntWrapper p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12,
-    JniIntWrapper p13) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtain",
-"(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
-              as_jint(p6), as_jint(p7), p8, p9, as_jint(p10), as_jint(p11), as_jint(p12),
-              as_jint(p13));
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_android_view_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRef<jintArray>& p4,
-    const base::android::JavaRef<jobjectArray>& p5,
-    JniIntWrapper p6,
-    jfloat p7,
-    jfloat p8,
-    JniIntWrapper p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12);
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRef<jintArray>& p4,
-    const base::android::JavaRef<jobjectArray>& p5,
-    JniIntWrapper p6,
-    jfloat p7,
-    jfloat p8,
-    JniIntWrapper p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtain",
-          "(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
-              as_jint(p6), p7, p8, as_jint(p9), as_jint(p10), as_jint(p11), as_jint(p12));
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11);
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtain",
-          "(JJIFFFFIFFII)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0, p1, as_jint(p2), p3, p4, p5, p6, as_jint(p7), p8, p9,
-              as_jint(p10), as_jint(p11));
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_android_view_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    jfloat p7,
-    JniIntWrapper p8,
-    jfloat p9,
-    jfloat p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12);
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    jfloat p7,
-    JniIntWrapper p8,
-    jfloat p9,
-    jfloat p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtain",
-          "(JJIIFFFFIFFII)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, p6, p7,
-              as_jint(p8), p9, p10, as_jint(p11), as_jint(p12));
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_I(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5);
-static base::android::ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv*
-    env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtain",
-          "(JJIFFI)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0, p1, as_jint(p2), p3, p4, as_jint(p5));
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_obtainAVME_AVME(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const base::android::JavaRef<jobject>& p0);
-static base::android::ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainAVME_AVME(JNIEnv* env,
-    const base::android::JavaRef<jobject>& p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtain",
-          "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainAVME_AVME);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0.obj());
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_obtainNoHistory(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainNoHistory(JNIEnv* env, const base::android::JavaRef<jobject>& p0);
-static base::android::ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainNoHistory(JNIEnv* env,
-    const base::android::JavaRef<jobject>& p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "obtainNoHistory",
-          "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
-          &g_android_view_MotionEvent_obtainNoHistory);
-
-  jobject ret =
-      env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, p0.obj());
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_recycle(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_recycle(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static void Java_MotionEvent_recycle(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "recycle",
-          "()V",
-          &g_android_view_MotionEvent_recycle);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getDeviceId(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getDeviceId",
-          "()I",
-          &g_android_view_MotionEvent_getDeviceId);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getSource(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getSource(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getSource(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getSource",
-          "()I",
-          &g_android_view_MotionEvent_getSource);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_setSource(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_setSource(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static void Java_MotionEvent_setSource(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "setSource",
-          "(I)V",
-          &g_android_view_MotionEvent_setSource);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getAction(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getAction(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getAction(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getAction",
-          "()I",
-          &g_android_view_MotionEvent_getAction);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getActionMasked(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getActionMasked",
-          "()I",
-          &g_android_view_MotionEvent_getActionMasked);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getActionIndex(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
-    {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getActionIndex",
-          "()I",
-          &g_android_view_MotionEvent_getActionIndex);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getFlags(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getFlags(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getFlags(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getFlags",
-          "()I",
-          &g_android_view_MotionEvent_getFlags);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getDownTime(nullptr);
-[[maybe_unused]] static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getDownTime",
-          "()J",
-          &g_android_view_MotionEvent_getDownTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getEventTime(nullptr);
-[[maybe_unused]] static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
-    {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getEventTime",
-          "()J",
-          &g_android_view_MotionEvent_getEventTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getXF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getXF(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getX",
-          "()F",
-          &g_android_view_MotionEvent_getXF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getYF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getYF(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getY",
-          "()F",
-          &g_android_view_MotionEvent_getYF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getPressureF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
-    {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getPressure",
-          "()F",
-          &g_android_view_MotionEvent_getPressureF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getSizeF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getSize",
-          "()F",
-          &g_android_view_MotionEvent_getSizeF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMajorF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getTouchMajor",
-          "()F",
-          &g_android_view_MotionEvent_getTouchMajorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMinorF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getTouchMinor",
-          "()F",
-          &g_android_view_MotionEvent_getTouchMinorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMajorF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getToolMajor",
-          "()F",
-          &g_android_view_MotionEvent_getToolMajorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMinorF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getToolMinor",
-          "()F",
-          &g_android_view_MotionEvent_getToolMinorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getOrientationF(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getOrientation",
-          "()F",
-          &g_android_view_MotionEvent_getOrientationF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getAxisValueF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getAxisValue",
-          "(I)F",
-          &g_android_view_MotionEvent_getAxisValueF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerCount(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getPointerCount",
-          "()I",
-          &g_android_view_MotionEvent_getPointerCount);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerId(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jint Java_MotionEvent_getPointerId(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getPointerId",
-          "(I)I",
-          &g_android_view_MotionEvent_getPointerId);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getToolType(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getToolType(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jint Java_MotionEvent_getToolType(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getToolType",
-          "(I)I",
-          &g_android_view_MotionEvent_getToolType);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_findPointerIndex(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "findPointerIndex",
-          "(I)I",
-          &g_android_view_MotionEvent_findPointerIndex);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getXF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getX",
-          "(I)F",
-          &g_android_view_MotionEvent_getXF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getYF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getY",
-          "(I)F",
-          &g_android_view_MotionEvent_getYF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getPressureF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getPressure",
-          "(I)F",
-          &g_android_view_MotionEvent_getPressureF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getSizeF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getSize",
-          "(I)F",
-          &g_android_view_MotionEvent_getSizeF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMajorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getTouchMajor",
-          "(I)F",
-          &g_android_view_MotionEvent_getTouchMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMinorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getTouchMinor",
-          "(I)F",
-          &g_android_view_MotionEvent_getTouchMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMajorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getToolMajor",
-          "(I)F",
-          &g_android_view_MotionEvent_getToolMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMinorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getToolMinor",
-          "(I)F",
-          &g_android_view_MotionEvent_getToolMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getOrientationF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getOrientation",
-          "(I)F",
-          &g_android_view_MotionEvent_getOrientationF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getAxisValueF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getAxisValue",
-          "(II)F",
-          &g_android_view_MotionEvent_getAxisValueF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerCoords(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRef<jobject>& p1);
-static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0,
-    const base::android::JavaRef<jobject>& p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getPointerCoords",
-          "(ILandroid/view/MotionEvent$PointerCoords;)V",
-          &g_android_view_MotionEvent_getPointerCoords);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), p1.obj());
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerProperties(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRef<jobject>& p1);
-static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRef<jobject>& p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getPointerProperties",
-          "(ILandroid/view/MotionEvent$PointerProperties;)V",
-          &g_android_view_MotionEvent_getPointerProperties);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), p1.obj());
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getMetaState(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getMetaState(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getMetaState",
-          "()I",
-          &g_android_view_MotionEvent_getMetaState);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getButtonState(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getButtonState(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
-    {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getButtonState",
-          "()I",
-          &g_android_view_MotionEvent_getButtonState);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getRawX(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getRawX",
-          "()F",
-          &g_android_view_MotionEvent_getRawX);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getRawY(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getRawY",
-          "()F",
-          &g_android_view_MotionEvent_getRawY);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getXPrecision(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getXPrecision",
-          "()F",
-          &g_android_view_MotionEvent_getXPrecision);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getYPrecision(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getYPrecision",
-          "()F",
-          &g_android_view_MotionEvent_getYPrecision);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistorySize(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
-    {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistorySize",
-          "()I",
-          &g_android_view_MotionEvent_getHistorySize);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalEventTime(nullptr);
-[[maybe_unused]] static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalEventTime",
-          "(I)J",
-          &g_android_view_MotionEvent_getHistoricalEventTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalXF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalX",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalXF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalYF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalY",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalYF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalPressureF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalPressure",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalPressureF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalSizeF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalSize",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalSizeF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMajorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalTouchMajor",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalTouchMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMinorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalTouchMinor",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalTouchMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMajorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalToolMajor",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalToolMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMinorF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalToolMinor",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalToolMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalOrientationF_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalOrientation",
-          "(I)F",
-          &g_android_view_MotionEvent_getHistoricalOrientationF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalAxisValueF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalAxisValue",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalAxisValueF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalXF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalX",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalXF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalYF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalY",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalYF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalPressureF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalPressure",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalPressureF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalSizeF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalSize",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalSizeF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMajorF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalTouchMajor",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalTouchMajorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMinorF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalTouchMinor",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalTouchMinorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMajorF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalToolMajor",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalToolMajorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMinorF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalToolMinor",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalToolMinorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalOrientationF_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1);
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalOrientation",
-          "(II)F",
-          &g_android_view_MotionEvent_getHistoricalOrientationF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalAxisValueF_I_I_I(nullptr);
-[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2);
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalAxisValue",
-          "(III)F",
-          &g_android_view_MotionEvent_getHistoricalAxisValueF_I_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1), as_jint(p2));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalPointerCoords(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    const base::android::JavaRef<jobject>& p2);
-static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    const base::android::JavaRef<jobject>& p2) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getHistoricalPointerCoords",
-          "(IILandroid/view/MotionEvent$PointerCoords;)V",
-          &g_android_view_MotionEvent_getHistoricalPointerCoords);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0), as_jint(p1), p2.obj());
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_getEdgeFlags(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getEdgeFlags",
-          "()I",
-          &g_android_view_MotionEvent_getEdgeFlags);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_setEdgeFlags(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "setEdgeFlags",
-          "(I)V",
-          &g_android_view_MotionEvent_setEdgeFlags);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_setAction(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_setAction(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static void Java_MotionEvent_setAction(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "setAction",
-          "(I)V",
-          &g_android_view_MotionEvent_setAction);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_offsetLocation(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jfloat p0,
-    jfloat p1);
-static void Java_MotionEvent_offsetLocation(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    jfloat p0,
-    jfloat p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "offsetLocation",
-          "(FF)V",
-          &g_android_view_MotionEvent_offsetLocation);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, p0, p1);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_setLocation(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_setLocation(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jfloat p0,
-    jfloat p1);
-static void Java_MotionEvent_setLocation(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    jfloat p0,
-    jfloat p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "setLocation",
-          "(FF)V",
-          &g_android_view_MotionEvent_setLocation);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, p0, p1);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_transform(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_transform(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& p0);
-static void Java_MotionEvent_transform(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    const base::android::JavaRef<jobject>& p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "transform",
-          "(Landroid/graphics/Matrix;)V",
-          &g_android_view_MotionEvent_transform);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, p0.obj());
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_addBatchV_J_F_F_F_F_I(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jlong p0,
-    jfloat p1,
-    jfloat p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5);
-static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jlong p0,
-    jfloat p1,
-    jfloat p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "addBatch",
-          "(JFFFFI)V",
-          &g_android_view_MotionEvent_addBatchV_J_F_F_F_F_I);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, p0, p1, p2, p3, p4, as_jint(p5));
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_addBatchV_J_LAVMEPC_I(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jlong p0,
-    const base::android::JavaRef<jobjectArray>& p1,
-    JniIntWrapper p2);
-static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jlong p0,
-    const base::android::JavaRef<jobjectArray>& p1,
-    JniIntWrapper p2) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "addBatch",
-          "(J[Landroid/view/MotionEvent$PointerCoords;I)V",
-          &g_android_view_MotionEvent_addBatchV_J_LAVMEPC_I);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, p0, p1.obj(), as_jint(p2));
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_toString(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_toString(JNIEnv*
-    env, const base::android::JavaRef<jobject>& obj);
-static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_toString(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "toString",
-          "()Ljava/lang/String;",
-          &g_android_view_MotionEvent_toString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_actionToString(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0);
-static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_actionToString(JNIEnv* env,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "actionToString",
-          "(I)Ljava/lang/String;",
-          &g_android_view_MotionEvent_actionToString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, as_jint(p0)));
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_axisToString(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0);
-static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_axisToString(JNIEnv* env,
-    JniIntWrapper p0) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "axisToString",
-          "(I)Ljava/lang/String;",
-          &g_android_view_MotionEvent_axisToString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id, as_jint(p0)));
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_axisFromString(nullptr);
-[[maybe_unused]] static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
-    base::android::JavaRef<jstring>& p0);
-static jint Java_MotionEvent_axisFromString(JNIEnv* env, const base::android::JavaRef<jstring>& p0)
-    {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      android_view_MotionEvent_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "axisFromString",
-          "(Ljava/lang/String;)I",
-          &g_android_view_MotionEvent_axisFromString);
-
-  jint ret =
-      env->CallStaticIntMethod(clazz,
-          call_context.base.method_id, p0.obj());
-  return ret;
-}
-
-static std::atomic<jmethodID> g_android_view_MotionEvent_writeToParcel(nullptr);
-[[maybe_unused]] static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& p0,
-    JniIntWrapper p1);
-static void Java_MotionEvent_writeToParcel(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    const base::android::JavaRef<jobject>& p0,
-    JniIntWrapper p1) {
-  jclass clazz = android_view_MotionEvent_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      android_view_MotionEvent_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "writeToParcel",
-          "(Landroid/os/Parcel;I)V",
-          &g_android_view_MotionEvent_writeToParcel);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, p0.obj(), as_jint(p1));
-}
-
-}  // namespace JNI_MotionEvent
-
-#endif  // android_view_MotionEvent_JNI
diff --git a/base/android/jni_generator/golden/testFromJavaP.golden b/base/android/jni_generator/golden/testFromJavaP.golden
deleted file mode 100644
index aba554d2..0000000
--- a/base/android/jni_generator/golden/testFromJavaP.golden
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     java/io/InputStream
-
-#ifndef java_io_InputStream_JNI
-#define java_io_InputStream_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_java_io_InputStream[];
-const char kClassPath_java_io_InputStream[] = "java/io/InputStream";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_java_io_InputStream_clazz(nullptr);
-#ifndef java_io_InputStream_clazz_defined
-#define java_io_InputStream_clazz_defined
-inline jclass java_io_InputStream_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_java_io_InputStream,
-      &g_java_io_InputStream_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-namespace JNI_InputStream {
-
-
-static std::atomic<jmethodID> g_java_io_InputStream_available(nullptr);
-[[maybe_unused]] static jint Java_InputStream_available(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_InputStream_available(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "available",
-          "()I",
-          &g_java_io_InputStream_available);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_close(nullptr);
-[[maybe_unused]] static void Java_InputStream_close(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static void Java_InputStream_close(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "close",
-          "()V",
-          &g_java_io_InputStream_close);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_mark(nullptr);
-[[maybe_unused]] static void Java_InputStream_mark(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
-static void Java_InputStream_mark(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    JniIntWrapper p0) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "mark",
-          "(I)V",
-          &g_java_io_InputStream_mark);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(p0));
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_markSupported(nullptr);
-[[maybe_unused]] static jboolean Java_InputStream_markSupported(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jboolean Java_InputStream_markSupported(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env), false);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "markSupported",
-          "()Z",
-          &g_java_io_InputStream_markSupported);
-
-  jboolean ret =
-      env->CallBooleanMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_readI(nullptr);
-[[maybe_unused]] static jint Java_InputStream_readI(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static jint Java_InputStream_readI(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "read",
-          "()I",
-          &g_java_io_InputStream_readI);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_readI_AB(nullptr);
-[[maybe_unused]] static jint Java_InputStream_readI_AB(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jbyteArray>& p0);
-static jint Java_InputStream_readI_AB(JNIEnv* env, const base::android::JavaRef<jobject>& obj, const
-    base::android::JavaRef<jbyteArray>& p0) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "read",
-          "([B)I",
-          &g_java_io_InputStream_readI_AB);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id, p0.obj());
-  return ret;
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_readI_AB_I_I(nullptr);
-[[maybe_unused]] static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jbyteArray>& p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2);
-static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
-    const base::android::JavaRef<jbyteArray>& p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "read",
-          "([BII)I",
-          &g_java_io_InputStream_readI_AB_I_I);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          call_context.base.method_id, p0.obj(), as_jint(p1), as_jint(p2));
-  return ret;
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_reset(nullptr);
-[[maybe_unused]] static void Java_InputStream_reset(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj);
-static void Java_InputStream_reset(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "reset",
-          "()V",
-          &g_java_io_InputStream_reset);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_skip(nullptr);
-[[maybe_unused]] static jlong Java_InputStream_skip(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, jlong p0);
-static jlong Java_InputStream_skip(JNIEnv* env, const base::android::JavaRef<jobject>& obj, jlong
-    p0) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_io_InputStream_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "skip",
-          "(J)J",
-          &g_java_io_InputStream_skip);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          call_context.base.method_id, p0);
-  return ret;
-}
-
-static std::atomic<jmethodID> g_java_io_InputStream_Constructor(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
-    Java_InputStream_Constructor(JNIEnv* env);
-static base::android::ScopedJavaLocalRef<jobject> Java_InputStream_Constructor(JNIEnv* env) {
-  jclass clazz = java_io_InputStream_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      java_io_InputStream_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "<init>",
-          "()V",
-          &g_java_io_InputStream_Constructor);
-
-  jobject ret =
-      env->NewObject(clazz,
-          call_context.base.method_id);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-}  // namespace JNI_InputStream
-
-#endif  // java_io_InputStream_JNI
diff --git a/base/android/jni_generator/golden/testFromJavaPGenerics.golden b/base/android/jni_generator/golden/testFromJavaPGenerics.golden
deleted file mode 100644
index c98bc40..0000000
--- a/base/android/jni_generator/golden/testFromJavaPGenerics.golden
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     java/util/HashSet
-
-#ifndef java_util_HashSet_JNI
-#define java_util_HashSet_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_java_util_HashSet[];
-const char kClassPath_java_util_HashSet[] = "java/util/HashSet";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_java_util_HashSet_clazz(nullptr);
-#ifndef java_util_HashSet_clazz_defined
-#define java_util_HashSet_clazz_defined
-inline jclass java_util_HashSet_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_java_util_HashSet, &g_java_util_HashSet_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-namespace JNI_HashSet {
-
-
-static std::atomic<jmethodID> g_java_util_HashSet_dummy(nullptr);
-[[maybe_unused]] static void Java_HashSet_dummy(JNIEnv* env, const base::android::JavaRef<jobject>&
-    obj);
-static void Java_HashSet_dummy(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = java_util_HashSet_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_util_HashSet_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "dummy",
-          "()V",
-          &g_java_util_HashSet_dummy);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-static std::atomic<jmethodID> g_java_util_HashSet_getClass(nullptr);
-[[maybe_unused]] static base::android::ScopedJavaLocalRef<jclass> Java_HashSet_getClass(JNIEnv* env,
-    const base::android::JavaRef<jobject>& obj);
-static base::android::ScopedJavaLocalRef<jclass> Java_HashSet_getClass(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj) {
-  jclass clazz = java_util_HashSet_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      java_util_HashSet_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "getClass",
-          "()Ljava/lang/Class<*>;",
-          &g_java_util_HashSet_getClass);
-
-  jclass ret =
-      static_cast<jclass>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jclass>(env, ret);
-}
-
-static std::atomic<jmethodID> g_java_util_HashSet_overloadWithVarargsV_LJLS(nullptr);
-[[maybe_unused]] static void Java_HashSet_overloadWithVarargsV_LJLS(JNIEnv* env, const
-    base::android::JavaRef<jobjectArray>& p0);
-static void Java_HashSet_overloadWithVarargsV_LJLS(JNIEnv* env, const
-    base::android::JavaRef<jobjectArray>& p0) {
-  jclass clazz = java_util_HashSet_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      java_util_HashSet_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "overloadWithVarargs",
-          "([Ljava/lang/String;)V",
-          &g_java_util_HashSet_overloadWithVarargsV_LJLS);
-
-     env->CallStaticVoidMethod(clazz,
-          call_context.base.method_id, p0.obj());
-}
-
-static std::atomic<jmethodID> g_java_util_HashSet_overloadWithVarargsV_LAITDC(nullptr);
-[[maybe_unused]] static void Java_HashSet_overloadWithVarargsV_LAITDC(JNIEnv* env, const
-    base::android::JavaRef<jobjectArray>& p0);
-static void Java_HashSet_overloadWithVarargsV_LAITDC(JNIEnv* env, const
-    base::android::JavaRef<jobjectArray>& p0) {
-  jclass clazz = java_util_HashSet_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      java_util_HashSet_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "overloadWithVarargs",
-          "([Landroid/icu/text/DisplayContext;)V",
-          &g_java_util_HashSet_overloadWithVarargsV_LAITDC);
-
-     env->CallStaticVoidMethod(clazz,
-          call_context.base.method_id, p0.obj());
-}
-
-}  // namespace JNI_HashSet
-
-#endif  // java_util_HashSet_JNI
diff --git a/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden b/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden
deleted file mode 100644
index efb1f72..0000000
--- a/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.natives;
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-public class GEN_JNI {
-    public static final boolean TESTING_ENABLED = false;
-    public static final boolean REQUIRE_MOCK = false;
-
-
-      // Hashed name: Java_J_N_MygCV2jQ
-      public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
-      // Hashed name: Java_J_N_MHuqnmXT
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
-      // Hashed name: Java_J_N_MM5Xkwyy
-      public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
-      // Hashed name: Java_J_N_MAC2QhR9
-      public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
-      // Hashed name: Java_J_N_MGhRh4Nd
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
-      // Hashed name: Java_J_N_MW0aEs4h
-      public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
-      // Hashed name: Java_J_N_MlVFI4RX
-      public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
-      // Hashed name: Java_J_N_MqOnlud7
-      public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
-      // Hashed name: Java_J_N_MuZc76Vt
-      public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
-      // Hashed name: Java_J_N_MAD53J7V
-      public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
-      // Hashed name: Java_J_N_M$ZgOi4g
-      public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
-      // Hashed name: Java_J_N_M$hL1577
-      public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
-      // Hashed name: Java_J_N_M0k1OjBK
-      public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
-      // Hashed name: Java_J_N_Mssfs54E
-      public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
-      // Hashed name: Java_J_N_MSzcel_H
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
-      // Hashed name: Java_J_N_MIBrQLK4
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
-      // Hashed name: Java_J_N_M$hPywjv
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
-      // Hashed name: Java_J_N_MPpCU1l5
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
-}
diff --git a/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden b/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden
deleted file mode 100644
index 385c302..0000000
--- a/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.natives;
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-public class GEN_JNI {
-    public static final boolean TESTING_ENABLED = true;
-    public static final boolean REQUIRE_MOCK = false;
-
-
-      // Hashed name: Java_J_N_MygCV2jQ
-      public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
-      // Hashed name: Java_J_N_MHuqnmXT
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
-      // Hashed name: Java_J_N_MM5Xkwyy
-      public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
-      // Hashed name: Java_J_N_MAC2QhR9
-      public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
-      // Hashed name: Java_J_N_MGhRh4Nd
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
-      // Hashed name: Java_J_N_MW0aEs4h
-      public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
-      // Hashed name: Java_J_N_MlVFI4RX
-      public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
-      // Hashed name: Java_J_N_MqOnlud7
-      public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
-      // Hashed name: Java_J_N_MuZc76Vt
-      public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
-      // Hashed name: Java_J_N_MAD53J7V
-      public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
-      // Hashed name: Java_J_N_M$ZgOi4g
-      public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
-      // Hashed name: Java_J_N_M$hL1577
-      public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
-      // Hashed name: Java_J_N_M0k1OjBK
-      public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
-      // Hashed name: Java_J_N_Mssfs54E
-      public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
-      // Hashed name: Java_J_N_MSzcel_H
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
-      // Hashed name: Java_J_N_MIBrQLK4
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
-      // Hashed name: Java_J_N_M$hPywjv
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
-      // Hashed name: Java_J_N_MPpCU1l5
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
-}
diff --git a/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden b/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden
deleted file mode 100644
index 468359a..0000000
--- a/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.natives;
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-public class GEN_JNI {
-    public static final boolean TESTING_ENABLED = true;
-    public static final boolean REQUIRE_MOCK = true;
-
-
-      // Hashed name: Java_J_N_MygCV2jQ
-      public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
-      // Hashed name: Java_J_N_MHuqnmXT
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
-      // Hashed name: Java_J_N_MM5Xkwyy
-      public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
-      // Hashed name: Java_J_N_MAC2QhR9
-      public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
-      // Hashed name: Java_J_N_MGhRh4Nd
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
-      // Hashed name: Java_J_N_MW0aEs4h
-      public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
-      // Hashed name: Java_J_N_MlVFI4RX
-      public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
-      // Hashed name: Java_J_N_MqOnlud7
-      public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
-      // Hashed name: Java_J_N_MuZc76Vt
-      public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
-      // Hashed name: Java_J_N_MAD53J7V
-      public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
-      // Hashed name: Java_J_N_M$ZgOi4g
-      public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
-      // Hashed name: Java_J_N_M$hL1577
-      public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
-      // Hashed name: Java_J_N_M0k1OjBK
-      public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
-      // Hashed name: Java_J_N_Mssfs54E
-      public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
-      // Hashed name: Java_J_N_MSzcel_H
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
-      // Hashed name: Java_J_N_MIBrQLK4
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
-      // Hashed name: Java_J_N_M$hPywjv
-      public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
-      // Hashed name: Java_J_N_MPpCU1l5
-      public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
-}
diff --git a/base/android/jni_generator/golden/testInnerClassNatives.golden b/base/android/jni_generator/golden/testInnerClassNatives.golden
deleted file mode 100644
index 454f030b..0000000
--- a/base/android/jni_generator/golden/testInnerClassNatives.golden
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
-const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyInnerClass[];
-const char kClassPath_org_chromium_TestJni_00024MyInnerClass[] =
-    "org/chromium/TestJni$MyInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_00024MyInnerClass_clazz(nullptr);
-#ifndef org_chromium_TestJni_00024MyInnerClass_clazz_defined
-#define org_chromium_TestJni_00024MyInnerClass_clazz_defined
-inline jclass org_chromium_TestJni_00024MyInnerClass_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyInnerClass,
-      &g_org_chromium_TestJni_00024MyInnerClass_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static jint JNI_MyInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_MyInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden b/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden
deleted file mode 100644
index 06195da..0000000
--- a/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
-const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[];
-const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[] =
-    "org/chromium/TestJni$MyOtherInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_TestJni_00024MyOtherInnerClass_clazz(nullptr);
-#ifndef org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
-#define org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
-inline jclass org_chromium_TestJni_00024MyOtherInnerClass_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyOtherInnerClass,
-      &g_org_chromium_TestJni_00024MyOtherInnerClass_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static jint JNI_TestJni_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_TestJni_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint JNI_MyOtherInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_MyOtherInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden b/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden
deleted file mode 100644
index e831212..0000000
--- a/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-#ifndef HEADER_GUARD
-#define HEADER_GUARD
-
-#include <jni.h>
-
-#include <iterator>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-#include "base/android/jni_int_wrapper.h"
-
-
-// Step 1: Forward declarations (classes).
-
-extern const char kClassPath_org_chromium_TestJni[];
-
-extern const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[];
-extern std::atomic<jclass> g_org_chromium_TestJni_clazz;
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-extern std::atomic<jclass> g_org_chromium_TestJni_00024MyOtherInnerClass_clazz;
-#ifndef org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
-#define org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
-inline jclass org_chromium_TestJni_00024MyOtherInnerClass_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyOtherInnerClass,
-      &g_org_chromium_TestJni_00024MyOtherInnerClass_clazz);
-}
-#endif
-
-
-// Step 2: Forward declarations (methods).
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
-    JNIEnv* env,
-    jobject jcaller);
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller);
-
-
-// Step 3: Method declarations.
-
-static const JNINativeMethod kMethods_org_chromium_TestJni[] = {
-    { "nativeInit", "()I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
-};
-
-
-static const JNINativeMethod kMethods_org_chromium_TestJni_00024MyOtherInnerClass[] = {
-    { "nativeInit", "()I",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit) },
-};
-
-
-JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_TestJni(JNIEnv* env) {
-  const int kMethods_org_chromium_TestJniSize =
-      std::size(kMethods_org_chromium_TestJni);
-  if (env->RegisterNatives(
-      org_chromium_TestJni_clazz(env),
-      kMethods_org_chromium_TestJni,
-      kMethods_org_chromium_TestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(env,
-        org_chromium_TestJni_clazz(env),
-        __FILE__);
-    return false;
-  }
-
-
-  const int kMethods_org_chromium_TestJni_00024MyOtherInnerClassSize =
-      std::size(kMethods_org_chromium_TestJni_00024MyOtherInnerClass);
-  if (env->RegisterNatives(
-      org_chromium_TestJni_00024MyOtherInnerClass_clazz(env),
-      kMethods_org_chromium_TestJni_00024MyOtherInnerClass,
-      kMethods_org_chromium_TestJni_00024MyOtherInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(env,
-        org_chromium_TestJni_00024MyOtherInnerClass_clazz(env),
-        __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-
-// Step 4: Registration function.
-
-namespace test {
-
-bool RegisterNatives(JNIEnv* env) {
-
-  return true;
-}
-
-}  // namespace test
-
-#endif  // HEADER_GUARD
diff --git a/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden b/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden
deleted file mode 100644
index de0a7217..0000000
--- a/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
-const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyInnerClass[];
-const char kClassPath_org_chromium_TestJni_00024MyInnerClass[] =
-    "org/chromium/TestJni$MyInnerClass";
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[];
-const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[] =
-    "org/chromium/TestJni$MyOtherInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_00024MyInnerClass_clazz(nullptr);
-#ifndef org_chromium_TestJni_00024MyInnerClass_clazz_defined
-#define org_chromium_TestJni_00024MyInnerClass_clazz_defined
-inline jclass org_chromium_TestJni_00024MyInnerClass_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyInnerClass,
-      &g_org_chromium_TestJni_00024MyInnerClass_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_TestJni_00024MyOtherInnerClass_clazz(nullptr);
-#ifndef org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
-#define org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
-inline jclass org_chromium_TestJni_00024MyOtherInnerClass_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyOtherInnerClass,
-      &g_org_chromium_TestJni_00024MyOtherInnerClass_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static jint JNI_MyInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_MyInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint JNI_MyOtherInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_MyOtherInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/golden/testInputStream.javap b/base/android/jni_generator/golden/testInputStream.javap
deleted file mode 100644
index 50ab617..0000000
--- a/base/android/jni_generator/golden/testInputStream.javap
+++ /dev/null
@@ -1,228 +0,0 @@
-Compiled from "InputStream.java"
-public abstract class java.io.InputStream extends java.lang.Object implements java.io.Closeable
-  SourceFile: "InputStream.java"
-  minor version: 0
-  major version: 49
-  Constant pool:
-const #1 = Method #6.#39; //  java/lang/Object."<init>":()V
-const #2 = class  #40;  //  java/lang/RuntimeException
-const #3 = String #41;  //  Stub!
-const #4 = Method #2.#42; //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-const #5 = class  #43;  //  java/io/InputStream
-const #6 = class  #44;  //  java/lang/Object
-const #7 = class  #45;  //  java/io/Closeable
-const #8 = Asciz  <init>;
-const #9 = Asciz  ()V;
-const #10 = Asciz Code;
-const #11 = Asciz LineNumberTable;
-const #12 = Asciz LocalVariableTable;
-const #13 = Asciz this;
-const #14 = Asciz Ljava/io/InputStream;;
-const #15 = Asciz available;
-const #16 = Asciz ()I;
-const #17 = Asciz Exceptions;
-const #18 = class #46;  //  java/io/IOException
-const #19 = Asciz close;
-const #20 = Asciz mark;
-const #21 = Asciz (I)V;
-const #22 = Asciz readlimit;
-const #23 = Asciz I;
-const #24 = Asciz markSupported;
-const #25 = Asciz ()Z;
-const #26 = Asciz read;
-const #27 = Asciz ([B)I;
-const #28 = Asciz buffer;
-const #29 = Asciz [B;
-const #30 = Asciz ([BII)I;
-const #31 = Asciz byteOffset;
-const #32 = Asciz byteCount;
-const #33 = Asciz reset;
-const #34 = Asciz skip;
-const #35 = Asciz (J)J;
-const #36 = Asciz J;
-const #37 = Asciz SourceFile;
-const #38 = Asciz InputStream.java;
-const #39 = NameAndType #8:#9;//  "<init>":()V
-const #40 = Asciz java/lang/RuntimeException;
-const #41 = Asciz Stub!;
-const #42 = NameAndType #8:#47;//  "<init>":(Ljava/lang/String;)V
-const #43 = Asciz java/io/InputStream;
-const #44 = Asciz java/lang/Object;
-const #45 = Asciz java/io/Closeable;
-const #46 = Asciz java/io/IOException;
-const #47 = Asciz (Ljava/lang/String;)V;
-
-{
-public java.io.InputStream();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: aload_0
-   1: invokespecial #1; //Method java/lang/Object."<init>":()V
-   4: new #2; //class java/lang/RuntimeException
-   7: dup
-   8: ldc #3; //String Stub!
-   10:  invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   13:  athrow
-  LineNumberTable:
-   line 5: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      14      0    this       Ljava/io/InputStream;
-
-
-public int available()   throws java.io.IOException;
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 6: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public void close()   throws java.io.IOException;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 7: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public void mark(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 8: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    readlimit       I
-
-
-public boolean markSupported();
-  Signature: ()Z
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 9: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-
-public abstract int read()   throws java.io.IOException;
-  Signature: ()I
-  Exceptions:
-   throws java.io.IOException
-public int read(byte[])   throws java.io.IOException;
-  Signature: ([B)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 11: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    buffer       [B
-
-  Exceptions:
-   throws java.io.IOException
-public int read(byte[], int, int)   throws java.io.IOException;
-  Signature: ([BII)I
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 12: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    buffer       [B
-   0      10      2    byteOffset       I
-   0      10      3    byteCount       I
-
-  Exceptions:
-   throws java.io.IOException
-public synchronized void reset()   throws java.io.IOException;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 13: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public long skip(long)   throws java.io.IOException;
-  Signature: (J)J
-  Code:
-   Stack=3, Locals=3, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 14: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    byteCount       J
-
-  Exceptions:
-   throws java.io.IOException
-}
-
diff --git a/base/android/jni_generator/golden/testMotionEvent.javap b/base/android/jni_generator/golden/testMotionEvent.javap
deleted file mode 100644
index 0746943..0000000
--- a/base/android/jni_generator/golden/testMotionEvent.javap
+++ /dev/null
@@ -1,2295 +0,0 @@
-Compiled from "MotionEvent.java"
-public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
-  SourceFile: "MotionEvent.java"
-  InnerClass:
-   public final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
-   public final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
-   public abstract #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
-  minor version: 0
-  major version: 49
-  Constant pool:
-const #1 = Method #7.#293;  //  android/view/InputEvent."<init>":()V
-const #2 = class  #294; //  java/lang/RuntimeException
-const #3 = String #295; //  Stub!
-const #4 = Method #2.#296;  //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-const #5 = Field  #6.#297;  //  android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
-const #6 = class  #298; //  android/view/MotionEvent
-const #7 = class  #299; //  android/view/InputEvent
-const #8 = class  #300; //  android/os/Parcelable
-const #9 = class  #301; //  android/view/MotionEvent$PointerProperties
-const #10 = Asciz PointerProperties;
-const #11 = Asciz InnerClasses;
-const #12 = class #302; //  android/view/MotionEvent$PointerCoords
-const #13 = Asciz PointerCoords;
-const #14 = Asciz INVALID_POINTER_ID;
-const #15 = Asciz I;
-const #16 = Asciz ConstantValue;
-const #17 = int -1;
-const #18 = Asciz ACTION_MASK;
-const #19 = int 255;
-const #20 = Asciz ACTION_DOWN;
-const #21 = int 0;
-const #22 = Asciz ACTION_UP;
-const #23 = int 1;
-const #24 = Asciz ACTION_MOVE;
-const #25 = int 2;
-const #26 = Asciz ACTION_CANCEL;
-const #27 = int 3;
-const #28 = Asciz ACTION_OUTSIDE;
-const #29 = int 4;
-const #30 = Asciz ACTION_POINTER_DOWN;
-const #31 = int 5;
-const #32 = Asciz ACTION_POINTER_UP;
-const #33 = int 6;
-const #34 = Asciz ACTION_HOVER_MOVE;
-const #35 = int 7;
-const #36 = Asciz ACTION_SCROLL;
-const #37 = int 8;
-const #38 = Asciz ACTION_HOVER_ENTER;
-const #39 = int 9;
-const #40 = Asciz ACTION_HOVER_EXIT;
-const #41 = int 10;
-const #42 = Asciz ACTION_POINTER_INDEX_MASK;
-const #43 = int 65280;
-const #44 = Asciz ACTION_POINTER_INDEX_SHIFT;
-const #45 = Asciz ACTION_POINTER_1_DOWN;
-const #46 = Asciz Deprecated;
-const #47 = Asciz RuntimeVisibleAnnotations;
-const #48 = Asciz Ljava/lang/Deprecated;;
-const #49 = Asciz ACTION_POINTER_2_DOWN;
-const #50 = int 261;
-const #51 = Asciz ACTION_POINTER_3_DOWN;
-const #52 = int 517;
-const #53 = Asciz ACTION_POINTER_1_UP;
-const #54 = Asciz ACTION_POINTER_2_UP;
-const #55 = int 262;
-const #56 = Asciz ACTION_POINTER_3_UP;
-const #57 = int 518;
-const #58 = Asciz ACTION_POINTER_ID_MASK;
-const #59 = Asciz ACTION_POINTER_ID_SHIFT;
-const #60 = Asciz FLAG_WINDOW_IS_OBSCURED;
-const #61 = Asciz EDGE_TOP;
-const #62 = Asciz EDGE_BOTTOM;
-const #63 = Asciz EDGE_LEFT;
-const #64 = Asciz EDGE_RIGHT;
-const #65 = Asciz AXIS_X;
-const #66 = Asciz AXIS_Y;
-const #67 = Asciz AXIS_PRESSURE;
-const #68 = Asciz AXIS_SIZE;
-const #69 = Asciz AXIS_TOUCH_MAJOR;
-const #70 = Asciz AXIS_TOUCH_MINOR;
-const #71 = Asciz AXIS_TOOL_MAJOR;
-const #72 = Asciz AXIS_TOOL_MINOR;
-const #73 = Asciz AXIS_ORIENTATION;
-const #74 = Asciz AXIS_VSCROLL;
-const #75 = Asciz AXIS_HSCROLL;
-const #76 = Asciz AXIS_Z;
-const #77 = int 11;
-const #78 = Asciz AXIS_RX;
-const #79 = int 12;
-const #80 = Asciz AXIS_RY;
-const #81 = int 13;
-const #82 = Asciz AXIS_RZ;
-const #83 = int 14;
-const #84 = Asciz AXIS_HAT_X;
-const #85 = int 15;
-const #86 = Asciz AXIS_HAT_Y;
-const #87 = int 16;
-const #88 = Asciz AXIS_LTRIGGER;
-const #89 = int 17;
-const #90 = Asciz AXIS_RTRIGGER;
-const #91 = int 18;
-const #92 = Asciz AXIS_THROTTLE;
-const #93 = int 19;
-const #94 = Asciz AXIS_RUDDER;
-const #95 = int 20;
-const #96 = Asciz AXIS_WHEEL;
-const #97 = int 21;
-const #98 = Asciz AXIS_GAS;
-const #99 = int 22;
-const #100 = Asciz  AXIS_BRAKE;
-const #101 = int  23;
-const #102 = Asciz  AXIS_DISTANCE;
-const #103 = int  24;
-const #104 = Asciz  AXIS_TILT;
-const #105 = int  25;
-const #106 = Asciz  AXIS_GENERIC_1;
-const #107 = int  32;
-const #108 = Asciz  AXIS_GENERIC_2;
-const #109 = int  33;
-const #110 = Asciz  AXIS_GENERIC_3;
-const #111 = int  34;
-const #112 = Asciz  AXIS_GENERIC_4;
-const #113 = int  35;
-const #114 = Asciz  AXIS_GENERIC_5;
-const #115 = int  36;
-const #116 = Asciz  AXIS_GENERIC_6;
-const #117 = int  37;
-const #118 = Asciz  AXIS_GENERIC_7;
-const #119 = int  38;
-const #120 = Asciz  AXIS_GENERIC_8;
-const #121 = int  39;
-const #122 = Asciz  AXIS_GENERIC_9;
-const #123 = int  40;
-const #124 = Asciz  AXIS_GENERIC_10;
-const #125 = int  41;
-const #126 = Asciz  AXIS_GENERIC_11;
-const #127 = int  42;
-const #128 = Asciz  AXIS_GENERIC_12;
-const #129 = int  43;
-const #130 = Asciz  AXIS_GENERIC_13;
-const #131 = int  44;
-const #132 = Asciz  AXIS_GENERIC_14;
-const #133 = int  45;
-const #134 = Asciz  AXIS_GENERIC_15;
-const #135 = int  46;
-const #136 = Asciz  AXIS_GENERIC_16;
-const #137 = int  47;
-const #138 = Asciz  BUTTON_PRIMARY;
-const #139 = Asciz  BUTTON_SECONDARY;
-const #140 = Asciz  BUTTON_TERTIARY;
-const #141 = Asciz  BUTTON_BACK;
-const #142 = Asciz  BUTTON_FORWARD;
-const #143 = Asciz  TOOL_TYPE_UNKNOWN;
-const #144 = Asciz  TOOL_TYPE_FINGER;
-const #145 = Asciz  TOOL_TYPE_STYLUS;
-const #146 = Asciz  TOOL_TYPE_MOUSE;
-const #147 = Asciz  TOOL_TYPE_ERASER;
-const #148 = Asciz  CREATOR;
-const #149 = class  #303; //  android/os/Parcelable$Creator
-const #150 = Asciz  Creator;
-const #151 = Asciz  Landroid/os/Parcelable$Creator;;
-const #152 = Asciz  Signature;
-const #153 = Asciz  Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;;
-const #154 = Asciz  <init>;
-const #155 = Asciz  ()V;
-const #156 = Asciz  Code;
-const #157 = Asciz  LineNumberTable;
-const #158 = Asciz  LocalVariableTable;
-const #159 = Asciz  this;
-const #160 = Asciz  Landroid/view/MotionEvent;;
-const #161 = Asciz  finalize;
-const #162 = Asciz  Exceptions;
-const #163 = class  #304; //  java/lang/Throwable
-const #164 = Asciz  obtain;
-const #165 = Asciz  (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;;
-const #166 = Asciz  downTime;
-const #167 = Asciz  J;
-const #168 = Asciz  eventTime;
-const #169 = Asciz  action;
-const #170 = Asciz  pointerCount;
-const #171 = Asciz  pointerProperties;
-const #172 = Asciz  [Landroid/view/MotionEvent$PointerProperties;;
-const #173 = Asciz  pointerCoords;
-const #174 = Asciz  [Landroid/view/MotionEvent$PointerCoords;;
-const #175 = Asciz  metaState;
-const #176 = Asciz  buttonState;
-const #177 = Asciz  xPrecision;
-const #178 = Asciz  F;
-const #179 = Asciz  yPrecision;
-const #180 = Asciz  deviceId;
-const #181 = Asciz  edgeFlags;
-const #182 = Asciz  source;
-const #183 = Asciz  flags;
-const #184 = Asciz  (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;;
-const #185 = Asciz  pointerIds;
-const #186 = Asciz  [I;
-const #187 = Asciz  (JJIFFFFIFFII)Landroid/view/MotionEvent;;
-const #188 = Asciz  x;
-const #189 = Asciz  y;
-const #190 = Asciz  pressure;
-const #191 = Asciz  size;
-const #192 = Asciz  (JJIIFFFFIFFII)Landroid/view/MotionEvent;;
-const #193 = Asciz  (JJIFFI)Landroid/view/MotionEvent;;
-const #194 = Asciz  (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;;
-const #195 = Asciz  other;
-const #196 = Asciz  obtainNoHistory;
-const #197 = Asciz  recycle;
-const #198 = Asciz  getDeviceId;
-const #199 = Asciz  ()I;
-const #200 = Asciz  getSource;
-const #201 = Asciz  setSource;
-const #202 = Asciz  (I)V;
-const #203 = Asciz  getAction;
-const #204 = Asciz  getActionMasked;
-const #205 = Asciz  getActionIndex;
-const #206 = Asciz  getFlags;
-const #207 = Asciz  getDownTime;
-const #208 = Asciz  ()J;
-const #209 = Asciz  getEventTime;
-const #210 = Asciz  getX;
-const #211 = Asciz  ()F;
-const #212 = Asciz  getY;
-const #213 = Asciz  getPressure;
-const #214 = Asciz  getSize;
-const #215 = Asciz  getTouchMajor;
-const #216 = Asciz  getTouchMinor;
-const #217 = Asciz  getToolMajor;
-const #218 = Asciz  getToolMinor;
-const #219 = Asciz  getOrientation;
-const #220 = Asciz  getAxisValue;
-const #221 = Asciz  (I)F;
-const #222 = Asciz  axis;
-const #223 = Asciz  getPointerCount;
-const #224 = Asciz  getPointerId;
-const #225 = Asciz  (I)I;
-const #226 = Asciz  pointerIndex;
-const #227 = Asciz  getToolType;
-const #228 = Asciz  findPointerIndex;
-const #229 = Asciz  pointerId;
-const #230 = Asciz  (II)F;
-const #231 = Asciz  getPointerCoords;
-const #232 = Asciz  (ILandroid/view/MotionEvent$PointerCoords;)V;
-const #233 = Asciz  outPointerCoords;
-const #234 = Asciz  Landroid/view/MotionEvent$PointerCoords;;
-const #235 = Asciz  getPointerProperties;
-const #236 = Asciz  (ILandroid/view/MotionEvent$PointerProperties;)V;
-const #237 = Asciz  outPointerProperties;
-const #238 = Asciz  Landroid/view/MotionEvent$PointerProperties;;
-const #239 = Asciz  getMetaState;
-const #240 = Asciz  getButtonState;
-const #241 = Asciz  getRawX;
-const #242 = Asciz  getRawY;
-const #243 = Asciz  getXPrecision;
-const #244 = Asciz  getYPrecision;
-const #245 = Asciz  getHistorySize;
-const #246 = Asciz  getHistoricalEventTime;
-const #247 = Asciz  (I)J;
-const #248 = Asciz  pos;
-const #249 = Asciz  getHistoricalX;
-const #250 = Asciz  getHistoricalY;
-const #251 = Asciz  getHistoricalPressure;
-const #252 = Asciz  getHistoricalSize;
-const #253 = Asciz  getHistoricalTouchMajor;
-const #254 = Asciz  getHistoricalTouchMinor;
-const #255 = Asciz  getHistoricalToolMajor;
-const #256 = Asciz  getHistoricalToolMinor;
-const #257 = Asciz  getHistoricalOrientation;
-const #258 = Asciz  getHistoricalAxisValue;
-const #259 = Asciz  (III)F;
-const #260 = Asciz  getHistoricalPointerCoords;
-const #261 = Asciz  (IILandroid/view/MotionEvent$PointerCoords;)V;
-const #262 = Asciz  getEdgeFlags;
-const #263 = Asciz  setEdgeFlags;
-const #264 = Asciz  setAction;
-const #265 = Asciz  offsetLocation;
-const #266 = Asciz  (FF)V;
-const #267 = Asciz  deltaX;
-const #268 = Asciz  deltaY;
-const #269 = Asciz  setLocation;
-const #270 = Asciz  transform;
-const #271 = Asciz  (Landroid/graphics/Matrix;)V;
-const #272 = Asciz  matrix;
-const #273 = Asciz  Landroid/graphics/Matrix;;
-const #274 = Asciz  addBatch;
-const #275 = Asciz  (JFFFFI)V;
-const #276 = Asciz  (J[Landroid/view/MotionEvent$PointerCoords;I)V;
-const #277 = Asciz  toString;
-const #278 = Asciz  ()Ljava/lang/String;;
-const #279 = Asciz  actionToString;
-const #280 = Asciz  (I)Ljava/lang/String;;
-const #281 = Asciz  axisToString;
-const #282 = Asciz  axisFromString;
-const #283 = Asciz  (Ljava/lang/String;)I;
-const #284 = Asciz  symbolicName;
-const #285 = Asciz  Ljava/lang/String;;
-const #286 = Asciz  writeToParcel;
-const #287 = Asciz  (Landroid/os/Parcel;I)V;
-const #288 = Asciz  out;
-const #289 = Asciz  Landroid/os/Parcel;;
-const #290 = Asciz  <clinit>;
-const #291 = Asciz  SourceFile;
-const #292 = Asciz  MotionEvent.java;
-const #293 = NameAndType  #154:#155;//  "<init>":()V
-const #294 = Asciz  java/lang/RuntimeException;
-const #295 = Asciz  Stub!;
-const #296 = NameAndType  #154:#305;//  "<init>":(Ljava/lang/String;)V
-const #297 = NameAndType  #148:#151;//  CREATOR:Landroid/os/Parcelable$Creator;
-const #298 = Asciz  android/view/MotionEvent;
-const #299 = Asciz  android/view/InputEvent;
-const #300 = Asciz  android/os/Parcelable;
-const #301 = Asciz  android/view/MotionEvent$PointerProperties;
-const #302 = Asciz  android/view/MotionEvent$PointerCoords;
-const #303 = Asciz  android/os/Parcelable$Creator;
-const #304 = Asciz  java/lang/Throwable;
-const #305 = Asciz  (Ljava/lang/String;)V;
-
-{
-public static final int INVALID_POINTER_ID;
-  Signature: I
-  Constant value: int -1
-
-public static final int ACTION_MASK;
-  Signature: I
-  Constant value: int 255
-
-public static final int ACTION_DOWN;
-  Signature: I
-  Constant value: int 0
-
-public static final int ACTION_UP;
-  Signature: I
-  Constant value: int 1
-
-public static final int ACTION_MOVE;
-  Signature: I
-  Constant value: int 2
-
-public static final int ACTION_CANCEL;
-  Signature: I
-  Constant value: int 3
-
-public static final int ACTION_OUTSIDE;
-  Signature: I
-  Constant value: int 4
-
-public static final int ACTION_POINTER_DOWN;
-  Signature: I
-  Constant value: int 5
-
-public static final int ACTION_POINTER_UP;
-  Signature: I
-  Constant value: int 6
-
-public static final int ACTION_HOVER_MOVE;
-  Signature: I
-  Constant value: int 7
-
-public static final int ACTION_SCROLL;
-  Signature: I
-  Constant value: int 8
-
-public static final int ACTION_HOVER_ENTER;
-  Signature: I
-  Constant value: int 9
-
-public static final int ACTION_HOVER_EXIT;
-  Signature: I
-  Constant value: int 10
-
-public static final int ACTION_POINTER_INDEX_MASK;
-  Signature: I
-  Constant value: int 65280
-
-public static final int ACTION_POINTER_INDEX_SHIFT;
-  Signature: I
-  Constant value: int 8
-
-public static final int ACTION_POINTER_1_DOWN;
-  Signature: I
-  Constant value: int 5Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_2_DOWN;
-  Signature: I
-  Constant value: int 261Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_3_DOWN;
-  Signature: I
-  Constant value: int 517Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_1_UP;
-  Signature: I
-  Constant value: int 6Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_2_UP;
-  Signature: I
-  Constant value: int 262Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_3_UP;
-  Signature: I
-  Constant value: int 518Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_ID_MASK;
-  Signature: I
-  Constant value: int 65280Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_ID_SHIFT;
-  Signature: I
-  Constant value: int 8Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int FLAG_WINDOW_IS_OBSCURED;
-  Signature: I
-  Constant value: int 1
-
-public static final int EDGE_TOP;
-  Signature: I
-  Constant value: int 1
-
-public static final int EDGE_BOTTOM;
-  Signature: I
-  Constant value: int 2
-
-public static final int EDGE_LEFT;
-  Signature: I
-  Constant value: int 4
-
-public static final int EDGE_RIGHT;
-  Signature: I
-  Constant value: int 8
-
-public static final int AXIS_X;
-  Signature: I
-  Constant value: int 0
-
-public static final int AXIS_Y;
-  Signature: I
-  Constant value: int 1
-
-public static final int AXIS_PRESSURE;
-  Signature: I
-  Constant value: int 2
-
-public static final int AXIS_SIZE;
-  Signature: I
-  Constant value: int 3
-
-public static final int AXIS_TOUCH_MAJOR;
-  Signature: I
-  Constant value: int 4
-
-public static final int AXIS_TOUCH_MINOR;
-  Signature: I
-  Constant value: int 5
-
-public static final int AXIS_TOOL_MAJOR;
-  Signature: I
-  Constant value: int 6
-
-public static final int AXIS_TOOL_MINOR;
-  Signature: I
-  Constant value: int 7
-
-public static final int AXIS_ORIENTATION;
-  Signature: I
-  Constant value: int 8
-
-public static final int AXIS_VSCROLL;
-  Signature: I
-  Constant value: int 9
-
-public static final int AXIS_HSCROLL;
-  Signature: I
-  Constant value: int 10
-
-public static final int AXIS_Z;
-  Signature: I
-  Constant value: int 11
-
-public static final int AXIS_RX;
-  Signature: I
-  Constant value: int 12
-
-public static final int AXIS_RY;
-  Signature: I
-  Constant value: int 13
-
-public static final int AXIS_RZ;
-  Signature: I
-  Constant value: int 14
-
-public static final int AXIS_HAT_X;
-  Signature: I
-  Constant value: int 15
-
-public static final int AXIS_HAT_Y;
-  Signature: I
-  Constant value: int 16
-
-public static final int AXIS_LTRIGGER;
-  Signature: I
-  Constant value: int 17
-
-public static final int AXIS_RTRIGGER;
-  Signature: I
-  Constant value: int 18
-
-public static final int AXIS_THROTTLE;
-  Signature: I
-  Constant value: int 19
-
-public static final int AXIS_RUDDER;
-  Signature: I
-  Constant value: int 20
-
-public static final int AXIS_WHEEL;
-  Signature: I
-  Constant value: int 21
-
-public static final int AXIS_GAS;
-  Signature: I
-  Constant value: int 22
-
-public static final int AXIS_BRAKE;
-  Signature: I
-  Constant value: int 23
-
-public static final int AXIS_DISTANCE;
-  Signature: I
-  Constant value: int 24
-
-public static final int AXIS_TILT;
-  Signature: I
-  Constant value: int 25
-
-public static final int AXIS_GENERIC_1;
-  Signature: I
-  Constant value: int 32
-
-public static final int AXIS_GENERIC_2;
-  Signature: I
-  Constant value: int 33
-
-public static final int AXIS_GENERIC_3;
-  Signature: I
-  Constant value: int 34
-
-public static final int AXIS_GENERIC_4;
-  Signature: I
-  Constant value: int 35
-
-public static final int AXIS_GENERIC_5;
-  Signature: I
-  Constant value: int 36
-
-public static final int AXIS_GENERIC_6;
-  Signature: I
-  Constant value: int 37
-
-public static final int AXIS_GENERIC_7;
-  Signature: I
-  Constant value: int 38
-
-public static final int AXIS_GENERIC_8;
-  Signature: I
-  Constant value: int 39
-
-public static final int AXIS_GENERIC_9;
-  Signature: I
-  Constant value: int 40
-
-public static final int AXIS_GENERIC_10;
-  Signature: I
-  Constant value: int 41
-
-public static final int AXIS_GENERIC_11;
-  Signature: I
-  Constant value: int 42
-
-public static final int AXIS_GENERIC_12;
-  Signature: I
-  Constant value: int 43
-
-public static final int AXIS_GENERIC_13;
-  Signature: I
-  Constant value: int 44
-
-public static final int AXIS_GENERIC_14;
-  Signature: I
-  Constant value: int 45
-
-public static final int AXIS_GENERIC_15;
-  Signature: I
-  Constant value: int 46
-
-public static final int AXIS_GENERIC_16;
-  Signature: I
-  Constant value: int 47
-
-public static final int BUTTON_PRIMARY;
-  Signature: I
-  Constant value: int 1
-
-public static final int BUTTON_SECONDARY;
-  Signature: I
-  Constant value: int 2
-
-public static final int BUTTON_TERTIARY;
-  Signature: I
-  Constant value: int 4
-
-public static final int BUTTON_BACK;
-  Signature: I
-  Constant value: int 8
-
-public static final int BUTTON_FORWARD;
-  Signature: I
-  Constant value: int 16
-
-public static final int TOOL_TYPE_UNKNOWN;
-  Signature: I
-  Constant value: int 0
-
-public static final int TOOL_TYPE_FINGER;
-  Signature: I
-  Constant value: int 1
-
-public static final int TOOL_TYPE_STYLUS;
-  Signature: I
-  Constant value: int 2
-
-public static final int TOOL_TYPE_MOUSE;
-  Signature: I
-  Constant value: int 3
-
-public static final int TOOL_TYPE_ERASER;
-  Signature: I
-  Constant value: int 4
-
-public static final android.os.Parcelable$Creator CREATOR;
-  Signature: Landroid/os/Parcelable$Creator;
-  Signature: length = 0x2
-   00 FFFFFF99
-
-
-android.view.MotionEvent();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: aload_0
-   1: invokespecial #1; //Method android/view/InputEvent."<init>":()V
-   4: new #2; //class java/lang/RuntimeException
-   7: dup
-   8: ldc #3; //String Stub!
-   10:  invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   13:  athrow
-  LineNumberTable:
-   line 35: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      14      0    this       Landroid/view/MotionEvent;
-
-
-protected void finalize()   throws java.lang.Throwable;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 36: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-  Exceptions:
-   throws java.lang.Throwable
-public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
-  Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=16, Args_size=14
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 37: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    pointerProperties       [Landroid/view/MotionEvent$PointerProperties;
-   0      10      7    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      8    metaState       I
-   0      10      9    buttonState       I
-   0      10      10    xPrecision       F
-   0      10      11    yPrecision       F
-   0      10      12    deviceId       I
-   0      10      13    edgeFlags       I
-   0      10      14    source       I
-   0      10      15    flags       I
-
-
-public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
-  Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=15, Args_size=13
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 39: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    pointerIds       [I
-   0      10      7    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      8    metaState       I
-   0      10      9    xPrecision       F
-   0      10      10    yPrecision       F
-   0      10      11    deviceId       I
-   0      10      12    edgeFlags       I
-   0      10      13    source       I
-   0      10      14    flags       I
-
-  Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
-  Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=14, Args_size=12
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 40: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    x       F
-   0      10      6    y       F
-   0      10      7    pressure       F
-   0      10      8    size       F
-   0      10      9    metaState       I
-   0      10      10    xPrecision       F
-   0      10      11    yPrecision       F
-   0      10      12    deviceId       I
-   0      10      13    edgeFlags       I
-
-
-public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
-  Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=15, Args_size=13
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 42: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    x       F
-   0      10      7    y       F
-   0      10      8    pressure       F
-   0      10      9    size       F
-   0      10      10    metaState       I
-   0      10      11    xPrecision       F
-   0      10      12    yPrecision       F
-   0      10      13    deviceId       I
-   0      10      14    edgeFlags       I
-
-  Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-public static android.view.MotionEvent obtain(long, long, int, float, float, int);
-  Signature: (JJIFFI)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=8, Args_size=6
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 43: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    x       F
-   0      10      6    y       F
-   0      10      7    metaState       I
-
-
-public static android.view.MotionEvent obtain(android.view.MotionEvent);
-  Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 44: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    other       Landroid/view/MotionEvent;
-
-
-public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
-  Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 45: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    other       Landroid/view/MotionEvent;
-
-
-public final void recycle();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 46: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getDeviceId();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 47: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getSource();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 48: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final void setSource(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 49: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    source       I
-
-
-public final int getAction();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 50: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getActionMasked();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 51: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getActionIndex();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 52: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getFlags();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 53: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getDownTime();
-  Signature: ()J
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 54: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getEventTime();
-  Signature: ()J
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 55: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getX();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 56: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getY();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 57: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getPressure();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 58: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getSize();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 59: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getTouchMajor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 60: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getTouchMinor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 61: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getToolMajor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 62: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getToolMinor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 63: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getOrientation();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 64: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getAxisValue(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 65: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-
-
-public final int getPointerCount();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 66: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getPointerId(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 67: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final int getToolType(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 68: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final int findPointerIndex(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 69: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerId       I
-
-
-public final float getX(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 70: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getY(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 71: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getPressure(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 72: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getSize(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 73: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getTouchMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 74: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getTouchMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 75: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getToolMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 76: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getToolMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 77: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getOrientation(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 78: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getAxisValue(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 79: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pointerIndex       I
-
-
-public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
-  Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 80: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    outPointerCoords       Landroid/view/MotionEvent$PointerCoords;
-
-
-public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
-  Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 81: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    outPointerProperties       Landroid/view/MotionEvent$PointerProperties;
-
-
-public final int getMetaState();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 82: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getButtonState();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 83: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getRawX();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 84: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getRawY();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 85: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getXPrecision();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 86: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getYPrecision();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 87: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getHistorySize();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 88: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getHistoricalEventTime(int);
-  Signature: (I)J
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 89: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalX(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 90: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalY(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 91: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalPressure(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 92: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalSize(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 93: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalTouchMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 94: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalTouchMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 95: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalToolMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 96: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalToolMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 97: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalOrientation(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 98: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalAxisValue(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 99: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalX(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 100: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalY(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 101: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalPressure(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 102: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalSize(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 103: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalTouchMajor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 104: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalTouchMinor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 105: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalToolMajor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 106: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalToolMinor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 107: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalOrientation(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 108: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalAxisValue(int, int, int);
-  Signature: (III)F
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 109: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pointerIndex       I
-   0      10      3    pos       I
-
-
-public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
-  Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 110: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-   0      10      3    outPointerCoords       Landroid/view/MotionEvent$PointerCoords;
-
-
-public final int getEdgeFlags();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 111: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final void setEdgeFlags(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 112: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    flags       I
-
-
-public final void setAction(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 113: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    action       I
-
-
-public final void offsetLocation(float, float);
-  Signature: (FF)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 114: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    deltaX       F
-   0      10      2    deltaY       F
-
-
-public final void setLocation(float, float);
-  Signature: (FF)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 115: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    x       F
-   0      10      2    y       F
-
-
-public final void transform(android.graphics.Matrix);
-  Signature: (Landroid/graphics/Matrix;)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 116: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    matrix       Landroid/graphics/Matrix;
-
-
-public final void addBatch(long, float, float, float, float, int);
-  Signature: (JFFFFI)V
-  Code:
-   Stack=3, Locals=8, Args_size=7
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 117: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    eventTime       J
-   0      10      3    x       F
-   0      10      4    y       F
-   0      10      5    pressure       F
-   0      10      6    size       F
-   0      10      7    metaState       I
-
-
-public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
-  Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
-  Code:
-   Stack=3, Locals=5, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 118: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    eventTime       J
-   0      10      3    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      4    metaState       I
-
-
-public java.lang.String toString();
-  Signature: ()Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 119: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public static java.lang.String actionToString(int);
-  Signature: (I)Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 120: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    action       I
-
-
-public static java.lang.String axisToString(int);
-  Signature: (I)Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 121: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    axis       I
-
-
-public static int axisFromString(java.lang.String);
-  Signature: (Ljava/lang/String;)I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 122: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    symbolicName       Ljava/lang/String;
-
-
-public void writeToParcel(android.os.Parcel, int);
-  Signature: (Landroid/os/Parcel;I)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 123: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    out       Landroid/os/Parcel;
-   0      10      2    flags       I
-
-
-static {};
-  Signature: ()V
-  Code:
-   Stack=1, Locals=0, Args_size=0
-   0: aconst_null
-   1: putstatic #5; //Field CREATOR:Landroid/os/Parcelable$Creator;
-   4: return
-  LineNumberTable:
-   line 213: 0
-
-
-}
-
diff --git a/base/android/jni_generator/golden/testMotionEvent.javap7 b/base/android/jni_generator/golden/testMotionEvent.javap7
deleted file mode 100644
index f4f5444..0000000
--- a/base/android/jni_generator/golden/testMotionEvent.javap7
+++ /dev/null
@@ -1,2370 +0,0 @@
-Classfile out_android/Debug/gen/content/jni/android/view/MotionEvent.class
-  Last modified Feb 27, 2014; size 13369 bytes
-  MD5 checksum 3718d77a994cb8aceb7b35c5df3c4dd1
-  Compiled from "MotionEvent.java"
-public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
-  SourceFile: "MotionEvent.java"
-  InnerClasses:
-       public static final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
-       public static final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
-       public static #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
-  minor version: 0
-  major version: 49
-  flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
-Constant pool:
-    #1 = Methodref          #7.#293       //  android/view/InputEvent."<init>":()V
-    #2 = Class              #294          //  java/lang/RuntimeException
-    #3 = String             #295          //  Stub!
-    #4 = Methodref          #2.#296       //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-    #5 = Fieldref           #6.#297       //  android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
-    #6 = Class              #298          //  android/view/MotionEvent
-    #7 = Class              #299          //  android/view/InputEvent
-    #8 = Class              #300          //  android/os/Parcelable
-    #9 = Class              #301          //  android/view/MotionEvent$PointerProperties
-   #10 = Utf8               PointerProperties
-   #11 = Utf8               InnerClasses
-   #12 = Class              #302          //  android/view/MotionEvent$PointerCoords
-   #13 = Utf8               PointerCoords
-   #14 = Utf8               INVALID_POINTER_ID
-   #15 = Utf8               I
-   #16 = Utf8               ConstantValue
-   #17 = Integer            -1
-   #18 = Utf8               ACTION_MASK
-   #19 = Integer            255
-   #20 = Utf8               ACTION_DOWN
-   #21 = Integer            0
-   #22 = Utf8               ACTION_UP
-   #23 = Integer            1
-   #24 = Utf8               ACTION_MOVE
-   #25 = Integer            2
-   #26 = Utf8               ACTION_CANCEL
-   #27 = Integer            3
-   #28 = Utf8               ACTION_OUTSIDE
-   #29 = Integer            4
-   #30 = Utf8               ACTION_POINTER_DOWN
-   #31 = Integer            5
-   #32 = Utf8               ACTION_POINTER_UP
-   #33 = Integer            6
-   #34 = Utf8               ACTION_HOVER_MOVE
-   #35 = Integer            7
-   #36 = Utf8               ACTION_SCROLL
-   #37 = Integer            8
-   #38 = Utf8               ACTION_HOVER_ENTER
-   #39 = Integer            9
-   #40 = Utf8               ACTION_HOVER_EXIT
-   #41 = Integer            10
-   #42 = Utf8               ACTION_POINTER_INDEX_MASK
-   #43 = Integer            65280
-   #44 = Utf8               ACTION_POINTER_INDEX_SHIFT
-   #45 = Utf8               ACTION_POINTER_1_DOWN
-   #46 = Utf8               Deprecated
-   #47 = Utf8               RuntimeVisibleAnnotations
-   #48 = Utf8               Ljava/lang/Deprecated;
-   #49 = Utf8               ACTION_POINTER_2_DOWN
-   #50 = Integer            261
-   #51 = Utf8               ACTION_POINTER_3_DOWN
-   #52 = Integer            517
-   #53 = Utf8               ACTION_POINTER_1_UP
-   #54 = Utf8               ACTION_POINTER_2_UP
-   #55 = Integer            262
-   #56 = Utf8               ACTION_POINTER_3_UP
-   #57 = Integer            518
-   #58 = Utf8               ACTION_POINTER_ID_MASK
-   #59 = Utf8               ACTION_POINTER_ID_SHIFT
-   #60 = Utf8               FLAG_WINDOW_IS_OBSCURED
-   #61 = Utf8               EDGE_TOP
-   #62 = Utf8               EDGE_BOTTOM
-   #63 = Utf8               EDGE_LEFT
-   #64 = Utf8               EDGE_RIGHT
-   #65 = Utf8               AXIS_X
-   #66 = Utf8               AXIS_Y
-   #67 = Utf8               AXIS_PRESSURE
-   #68 = Utf8               AXIS_SIZE
-   #69 = Utf8               AXIS_TOUCH_MAJOR
-   #70 = Utf8               AXIS_TOUCH_MINOR
-   #71 = Utf8               AXIS_TOOL_MAJOR
-   #72 = Utf8               AXIS_TOOL_MINOR
-   #73 = Utf8               AXIS_ORIENTATION
-   #74 = Utf8               AXIS_VSCROLL
-   #75 = Utf8               AXIS_HSCROLL
-   #76 = Utf8               AXIS_Z
-   #77 = Integer            11
-   #78 = Utf8               AXIS_RX
-   #79 = Integer            12
-   #80 = Utf8               AXIS_RY
-   #81 = Integer            13
-   #82 = Utf8               AXIS_RZ
-   #83 = Integer            14
-   #84 = Utf8               AXIS_HAT_X
-   #85 = Integer            15
-   #86 = Utf8               AXIS_HAT_Y
-   #87 = Integer            16
-   #88 = Utf8               AXIS_LTRIGGER
-   #89 = Integer            17
-   #90 = Utf8               AXIS_RTRIGGER
-   #91 = Integer            18
-   #92 = Utf8               AXIS_THROTTLE
-   #93 = Integer            19
-   #94 = Utf8               AXIS_RUDDER
-   #95 = Integer            20
-   #96 = Utf8               AXIS_WHEEL
-   #97 = Integer            21
-   #98 = Utf8               AXIS_GAS
-   #99 = Integer            22
-  #100 = Utf8               AXIS_BRAKE
-  #101 = Integer            23
-  #102 = Utf8               AXIS_DISTANCE
-  #103 = Integer            24
-  #104 = Utf8               AXIS_TILT
-  #105 = Integer            25
-  #106 = Utf8               AXIS_GENERIC_1
-  #107 = Integer            32
-  #108 = Utf8               AXIS_GENERIC_2
-  #109 = Integer            33
-  #110 = Utf8               AXIS_GENERIC_3
-  #111 = Integer            34
-  #112 = Utf8               AXIS_GENERIC_4
-  #113 = Integer            35
-  #114 = Utf8               AXIS_GENERIC_5
-  #115 = Integer            36
-  #116 = Utf8               AXIS_GENERIC_6
-  #117 = Integer            37
-  #118 = Utf8               AXIS_GENERIC_7
-  #119 = Integer            38
-  #120 = Utf8               AXIS_GENERIC_8
-  #121 = Integer            39
-  #122 = Utf8               AXIS_GENERIC_9
-  #123 = Integer            40
-  #124 = Utf8               AXIS_GENERIC_10
-  #125 = Integer            41
-  #126 = Utf8               AXIS_GENERIC_11
-  #127 = Integer            42
-  #128 = Utf8               AXIS_GENERIC_12
-  #129 = Integer            43
-  #130 = Utf8               AXIS_GENERIC_13
-  #131 = Integer            44
-  #132 = Utf8               AXIS_GENERIC_14
-  #133 = Integer            45
-  #134 = Utf8               AXIS_GENERIC_15
-  #135 = Integer            46
-  #136 = Utf8               AXIS_GENERIC_16
-  #137 = Integer            47
-  #138 = Utf8               BUTTON_PRIMARY
-  #139 = Utf8               BUTTON_SECONDARY
-  #140 = Utf8               BUTTON_TERTIARY
-  #141 = Utf8               BUTTON_BACK
-  #142 = Utf8               BUTTON_FORWARD
-  #143 = Utf8               TOOL_TYPE_UNKNOWN
-  #144 = Utf8               TOOL_TYPE_FINGER
-  #145 = Utf8               TOOL_TYPE_STYLUS
-  #146 = Utf8               TOOL_TYPE_MOUSE
-  #147 = Utf8               TOOL_TYPE_ERASER
-  #148 = Utf8               CREATOR
-  #149 = Class              #303          //  android/os/Parcelable$Creator
-  #150 = Utf8               Creator
-  #151 = Utf8               Landroid/os/Parcelable$Creator;
-  #152 = Utf8               Signature
-  #153 = Utf8               Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
-  #154 = Utf8               <init>
-  #155 = Utf8               ()V
-  #156 = Utf8               Code
-  #157 = Utf8               LineNumberTable
-  #158 = Utf8               LocalVariableTable
-  #159 = Utf8               this
-  #160 = Utf8               Landroid/view/MotionEvent;
-  #161 = Utf8               finalize
-  #162 = Utf8               Exceptions
-  #163 = Class              #304          //  java/lang/Throwable
-  #164 = Utf8               obtain
-  #165 = Utf8               (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-  #166 = Utf8               downTime
-  #167 = Utf8               J
-  #168 = Utf8               eventTime
-  #169 = Utf8               action
-  #170 = Utf8               pointerCount
-  #171 = Utf8               pointerProperties
-  #172 = Utf8               [Landroid/view/MotionEvent$PointerProperties;
-  #173 = Utf8               pointerCoords
-  #174 = Utf8               [Landroid/view/MotionEvent$PointerCoords;
-  #175 = Utf8               metaState
-  #176 = Utf8               buttonState
-  #177 = Utf8               xPrecision
-  #178 = Utf8               F
-  #179 = Utf8               yPrecision
-  #180 = Utf8               deviceId
-  #181 = Utf8               edgeFlags
-  #182 = Utf8               source
-  #183 = Utf8               flags
-  #184 = Utf8               (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-  #185 = Utf8               pointerIds
-  #186 = Utf8               [I
-  #187 = Utf8               (JJIFFFFIFFII)Landroid/view/MotionEvent;
-  #188 = Utf8               x
-  #189 = Utf8               y
-  #190 = Utf8               pressure
-  #191 = Utf8               size
-  #192 = Utf8               (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-  #193 = Utf8               (JJIFFI)Landroid/view/MotionEvent;
-  #194 = Utf8               (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  #195 = Utf8               other
-  #196 = Utf8               obtainNoHistory
-  #197 = Utf8               recycle
-  #198 = Utf8               getDeviceId
-  #199 = Utf8               ()I
-  #200 = Utf8               getSource
-  #201 = Utf8               setSource
-  #202 = Utf8               (I)V
-  #203 = Utf8               getAction
-  #204 = Utf8               getActionMasked
-  #205 = Utf8               getActionIndex
-  #206 = Utf8               getFlags
-  #207 = Utf8               getDownTime
-  #208 = Utf8               ()J
-  #209 = Utf8               getEventTime
-  #210 = Utf8               getX
-  #211 = Utf8               ()F
-  #212 = Utf8               getY
-  #213 = Utf8               getPressure
-  #214 = Utf8               getSize
-  #215 = Utf8               getTouchMajor
-  #216 = Utf8               getTouchMinor
-  #217 = Utf8               getToolMajor
-  #218 = Utf8               getToolMinor
-  #219 = Utf8               getOrientation
-  #220 = Utf8               getAxisValue
-  #221 = Utf8               (I)F
-  #222 = Utf8               axis
-  #223 = Utf8               getPointerCount
-  #224 = Utf8               getPointerId
-  #225 = Utf8               (I)I
-  #226 = Utf8               pointerIndex
-  #227 = Utf8               getToolType
-  #228 = Utf8               findPointerIndex
-  #229 = Utf8               pointerId
-  #230 = Utf8               (II)F
-  #231 = Utf8               getPointerCoords
-  #232 = Utf8               (ILandroid/view/MotionEvent$PointerCoords;)V
-  #233 = Utf8               outPointerCoords
-  #234 = Utf8               Landroid/view/MotionEvent$PointerCoords;
-  #235 = Utf8               getPointerProperties
-  #236 = Utf8               (ILandroid/view/MotionEvent$PointerProperties;)V
-  #237 = Utf8               outPointerProperties
-  #238 = Utf8               Landroid/view/MotionEvent$PointerProperties;
-  #239 = Utf8               getMetaState
-  #240 = Utf8               getButtonState
-  #241 = Utf8               getRawX
-  #242 = Utf8               getRawY
-  #243 = Utf8               getXPrecision
-  #244 = Utf8               getYPrecision
-  #245 = Utf8               getHistorySize
-  #246 = Utf8               getHistoricalEventTime
-  #247 = Utf8               (I)J
-  #248 = Utf8               pos
-  #249 = Utf8               getHistoricalX
-  #250 = Utf8               getHistoricalY
-  #251 = Utf8               getHistoricalPressure
-  #252 = Utf8               getHistoricalSize
-  #253 = Utf8               getHistoricalTouchMajor
-  #254 = Utf8               getHistoricalTouchMinor
-  #255 = Utf8               getHistoricalToolMajor
-  #256 = Utf8               getHistoricalToolMinor
-  #257 = Utf8               getHistoricalOrientation
-  #258 = Utf8               getHistoricalAxisValue
-  #259 = Utf8               (III)F
-  #260 = Utf8               getHistoricalPointerCoords
-  #261 = Utf8               (IILandroid/view/MotionEvent$PointerCoords;)V
-  #262 = Utf8               getEdgeFlags
-  #263 = Utf8               setEdgeFlags
-  #264 = Utf8               setAction
-  #265 = Utf8               offsetLocation
-  #266 = Utf8               (FF)V
-  #267 = Utf8               deltaX
-  #268 = Utf8               deltaY
-  #269 = Utf8               setLocation
-  #270 = Utf8               transform
-  #271 = Utf8               (Landroid/graphics/Matrix;)V
-  #272 = Utf8               matrix
-  #273 = Utf8               Landroid/graphics/Matrix;
-  #274 = Utf8               addBatch
-  #275 = Utf8               (JFFFFI)V
-  #276 = Utf8               (J[Landroid/view/MotionEvent$PointerCoords;I)V
-  #277 = Utf8               toString
-  #278 = Utf8               ()Ljava/lang/String;
-  #279 = Utf8               actionToString
-  #280 = Utf8               (I)Ljava/lang/String;
-  #281 = Utf8               axisToString
-  #282 = Utf8               axisFromString
-  #283 = Utf8               (Ljava/lang/String;)I
-  #284 = Utf8               symbolicName
-  #285 = Utf8               Ljava/lang/String;
-  #286 = Utf8               writeToParcel
-  #287 = Utf8               (Landroid/os/Parcel;I)V
-  #288 = Utf8               out
-  #289 = Utf8               Landroid/os/Parcel;
-  #290 = Utf8               <clinit>
-  #291 = Utf8               SourceFile
-  #292 = Utf8               MotionEvent.java
-  #293 = NameAndType        #154:#155     //  "<init>":()V
-  #294 = Utf8               java/lang/RuntimeException
-  #295 = Utf8               Stub!
-  #296 = NameAndType        #154:#305     //  "<init>":(Ljava/lang/String;)V
-  #297 = NameAndType        #148:#151     //  CREATOR:Landroid/os/Parcelable$Creator;
-  #298 = Utf8               android/view/MotionEvent
-  #299 = Utf8               android/view/InputEvent
-  #300 = Utf8               android/os/Parcelable
-  #301 = Utf8               android/view/MotionEvent$PointerProperties
-  #302 = Utf8               android/view/MotionEvent$PointerCoords
-  #303 = Utf8               android/os/Parcelable$Creator
-  #304 = Utf8               java/lang/Throwable
-  #305 = Utf8               (Ljava/lang/String;)V
-{
-  public static final int INVALID_POINTER_ID;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int -1
-
-
-  public static final int ACTION_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 255
-
-
-  public static final int ACTION_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int ACTION_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int ACTION_MOVE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int ACTION_CANCEL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int ACTION_OUTSIDE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int ACTION_POINTER_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-
-
-  public static final int ACTION_POINTER_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-
-
-  public static final int ACTION_HOVER_MOVE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 7
-
-
-  public static final int ACTION_SCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int ACTION_HOVER_ENTER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 9
-
-
-  public static final int ACTION_HOVER_EXIT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 10
-
-
-  public static final int ACTION_POINTER_INDEX_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 65280
-
-
-  public static final int ACTION_POINTER_INDEX_SHIFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int ACTION_POINTER_1_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_2_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 261
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_3_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 517
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_1_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_2_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 262
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_3_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 518
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_ID_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 65280
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_ID_SHIFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int FLAG_WINDOW_IS_OBSCURED;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int EDGE_TOP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int EDGE_BOTTOM;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int EDGE_LEFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int EDGE_RIGHT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int AXIS_X;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int AXIS_Y;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int AXIS_PRESSURE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int AXIS_SIZE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int AXIS_TOUCH_MAJOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int AXIS_TOUCH_MINOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-
-
-  public static final int AXIS_TOOL_MAJOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-
-
-  public static final int AXIS_TOOL_MINOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 7
-
-
-  public static final int AXIS_ORIENTATION;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int AXIS_VSCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 9
-
-
-  public static final int AXIS_HSCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 10
-
-
-  public static final int AXIS_Z;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 11
-
-
-  public static final int AXIS_RX;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 12
-
-
-  public static final int AXIS_RY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 13
-
-
-  public static final int AXIS_RZ;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 14
-
-
-  public static final int AXIS_HAT_X;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 15
-
-
-  public static final int AXIS_HAT_Y;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 16
-
-
-  public static final int AXIS_LTRIGGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 17
-
-
-  public static final int AXIS_RTRIGGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 18
-
-
-  public static final int AXIS_THROTTLE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 19
-
-
-  public static final int AXIS_RUDDER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 20
-
-
-  public static final int AXIS_WHEEL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 21
-
-
-  public static final int AXIS_GAS;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 22
-
-
-  public static final int AXIS_BRAKE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 23
-
-
-  public static final int AXIS_DISTANCE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 24
-
-
-  public static final int AXIS_TILT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 25
-
-
-  public static final int AXIS_GENERIC_1;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 32
-
-
-  public static final int AXIS_GENERIC_2;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 33
-
-
-  public static final int AXIS_GENERIC_3;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 34
-
-
-  public static final int AXIS_GENERIC_4;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 35
-
-
-  public static final int AXIS_GENERIC_5;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 36
-
-
-  public static final int AXIS_GENERIC_6;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 37
-
-
-  public static final int AXIS_GENERIC_7;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 38
-
-
-  public static final int AXIS_GENERIC_8;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 39
-
-
-  public static final int AXIS_GENERIC_9;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 40
-
-
-  public static final int AXIS_GENERIC_10;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 41
-
-
-  public static final int AXIS_GENERIC_11;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 42
-
-
-  public static final int AXIS_GENERIC_12;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 43
-
-
-  public static final int AXIS_GENERIC_13;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 44
-
-
-  public static final int AXIS_GENERIC_14;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 45
-
-
-  public static final int AXIS_GENERIC_15;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 46
-
-
-  public static final int AXIS_GENERIC_16;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 47
-
-
-  public static final int BUTTON_PRIMARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int BUTTON_SECONDARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int BUTTON_TERTIARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int BUTTON_BACK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int BUTTON_FORWARD;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 16
-
-
-  public static final int TOOL_TYPE_UNKNOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int TOOL_TYPE_FINGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int TOOL_TYPE_STYLUS;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int TOOL_TYPE_MOUSE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int TOOL_TYPE_ERASER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final android.os.Parcelable$Creator<android.view.MotionEvent> CREATOR;
-    Signature: Landroid/os/Parcelable$Creator;
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    Signature: #153                         // Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
-
-
-  android.view.MotionEvent();
-    Signature: ()V
-    flags:
-    Code:
-      stack=3, locals=1, args_size=1
-         0: aload_0
-         1: invokespecial #1                  // Method android/view/InputEvent."<init>":()V
-         4: new           #2                  // class java/lang/RuntimeException
-         7: dup
-         8: ldc           #3                  // String Stub!
-        10: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-        13: athrow
-      LineNumberTable:
-        line 35: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      14     0  this   Landroid/view/MotionEvent;
-
-  protected void finalize() throws java.lang.Throwable;
-    Signature: ()V
-    flags: ACC_PROTECTED
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 36: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-    Exceptions:
-      throws java.lang.Throwable
-
-  public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
-    Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=16, args_size=14
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 37: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6 pointerProperties   [Landroid/view/MotionEvent$PointerProperties;
-               0      10     7 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     8 metaState   I
-               0      10     9 buttonState   I
-               0      10    10 xPrecision   F
-               0      10    11 yPrecision   F
-               0      10    12 deviceId   I
-               0      10    13 edgeFlags   I
-               0      10    14 source   I
-               0      10    15 flags   I
-
-  public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
-    Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=15, args_size=13
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 39: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6 pointerIds   [I
-               0      10     7 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     8 metaState   I
-               0      10     9 xPrecision   F
-               0      10    10 yPrecision   F
-               0      10    11 deviceId   I
-               0      10    12 edgeFlags   I
-               0      10    13 source   I
-               0      10    14 flags   I
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-  public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
-    Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=14, args_size=12
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 40: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5     x   F
-               0      10     6     y   F
-               0      10     7 pressure   F
-               0      10     8  size   F
-               0      10     9 metaState   I
-               0      10    10 xPrecision   F
-               0      10    11 yPrecision   F
-               0      10    12 deviceId   I
-               0      10    13 edgeFlags   I
-
-  public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
-    Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=15, args_size=13
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 42: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6     x   F
-               0      10     7     y   F
-               0      10     8 pressure   F
-               0      10     9  size   F
-               0      10    10 metaState   I
-               0      10    11 xPrecision   F
-               0      10    12 yPrecision   F
-               0      10    13 deviceId   I
-               0      10    14 edgeFlags   I
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-  public static android.view.MotionEvent obtain(long, long, int, float, float, int);
-    Signature: (JJIFFI)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=8, args_size=6
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 43: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5     x   F
-               0      10     6     y   F
-               0      10     7 metaState   I
-
-  public static android.view.MotionEvent obtain(android.view.MotionEvent);
-    Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 44: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 other   Landroid/view/MotionEvent;
-
-  public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
-    Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 45: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 other   Landroid/view/MotionEvent;
-
-  public final void recycle();
-    Signature: ()V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 46: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getDeviceId();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 47: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getSource();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 48: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final void setSource(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 49: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 source   I
-
-  public final int getAction();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 50: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getActionMasked();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 51: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getActionIndex();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 52: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getFlags();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 53: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getDownTime();
-    Signature: ()J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 54: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getEventTime();
-    Signature: ()J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 55: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getX();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 56: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getY();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 57: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getPressure();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 58: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getSize();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 59: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getTouchMajor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 60: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getTouchMinor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 61: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getToolMajor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 62: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getToolMinor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 63: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getOrientation();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 64: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getAxisValue(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 65: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-
-  public final int getPointerCount();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 66: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getPointerId(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 67: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final int getToolType(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 68: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final int findPointerIndex(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 69: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerId   I
-
-  public final float getX(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 70: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getY(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 71: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getPressure(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 72: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getSize(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 73: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getTouchMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 74: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getTouchMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 75: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getToolMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 76: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getToolMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 77: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getOrientation(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 78: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getAxisValue(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 79: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2 pointerIndex   I
-
-  public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
-    Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 80: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2 outPointerCoords   Landroid/view/MotionEvent$PointerCoords;
-
-  public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
-    Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 81: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2 outPointerProperties   Landroid/view/MotionEvent$PointerProperties;
-
-  public final int getMetaState();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 82: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getButtonState();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 83: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getRawX();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 84: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getRawY();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 85: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getXPrecision();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 86: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getYPrecision();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 87: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getHistorySize();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 88: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getHistoricalEventTime(int);
-    Signature: (I)J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 89: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalX(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 90: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalY(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 91: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalPressure(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 92: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalSize(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 93: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalTouchMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 94: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalTouchMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 95: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalToolMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 96: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalToolMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 97: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalOrientation(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 98: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalAxisValue(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 99: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2   pos   I
-
-  public final float getHistoricalX(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 100: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalY(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 101: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalPressure(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 102: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalSize(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 103: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalTouchMajor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 104: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalTouchMinor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 105: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalToolMajor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 106: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalToolMinor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 107: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalOrientation(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 108: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalAxisValue(int, int, int);
-    Signature: (III)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=4, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 109: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2 pointerIndex   I
-               0      10     3   pos   I
-
-  public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
-    Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=4, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 110: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-               0      10     3 outPointerCoords   Landroid/view/MotionEvent$PointerCoords;
-
-  public final int getEdgeFlags();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 111: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final void setEdgeFlags(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 112: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 flags   I
-
-  public final void setAction(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 113: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 action   I
-
-  public final void offsetLocation(float, float);
-    Signature: (FF)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 114: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 deltaX   F
-               0      10     2 deltaY   F
-
-  public final void setLocation(float, float);
-    Signature: (FF)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 115: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1     x   F
-               0      10     2     y   F
-
-  public final void transform(android.graphics.Matrix);
-    Signature: (Landroid/graphics/Matrix;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 116: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 matrix   Landroid/graphics/Matrix;
-
-  public final void addBatch(long, float, float, float, float, int);
-    Signature: (JFFFFI)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=8, args_size=7
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 117: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 eventTime   J
-               0      10     3     x   F
-               0      10     4     y   F
-               0      10     5 pressure   F
-               0      10     6  size   F
-               0      10     7 metaState   I
-
-  public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
-    Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=5, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 118: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 eventTime   J
-               0      10     3 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     4 metaState   I
-
-  public java.lang.String toString();
-    Signature: ()Ljava/lang/String;
-    flags: ACC_PUBLIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 119: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public static java.lang.String actionToString(int);
-    Signature: (I)Ljava/lang/String;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 120: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 action   I
-
-  public static java.lang.String axisToString(int);
-    Signature: (I)Ljava/lang/String;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 121: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  axis   I
-
-  public static int axisFromString(java.lang.String);
-    Signature: (Ljava/lang/String;)I
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 122: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 symbolicName   Ljava/lang/String;
-
-  public void writeToParcel(android.os.Parcel, int);
-    Signature: (Landroid/os/Parcel;I)V
-    flags: ACC_PUBLIC
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 123: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   out   Landroid/os/Parcel;
-               0      10     2 flags   I
-
-  static {};
-    Signature: ()V
-    flags: ACC_STATIC
-    Code:
-      stack=1, locals=0, args_size=0
-         0: aconst_null
-         1: putstatic     #5                  // Field CREATOR:Landroid/os/Parcelable$Creator;
-         4: return
-      LineNumberTable:
-        line 213: 0
-}
diff --git a/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden b/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden
deleted file mode 100644
index 5398b32..0000000
--- a/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
-const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
-#ifndef org_chromium_foo_Foo_clazz_defined
-#define org_chromium_foo_Foo_clazz_defined
-inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
-      &g_org_chromium_foo_Foo_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_Foo_DoSomething(JNIEnv* env, const base::android::JavaParamRef<jobject>& callback1,
-    const base::android::JavaParamRef<jobject>& callback2);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject callback1,
-    jobject callback2) {
-  return JNI_Foo_DoSomething(env, base::android::JavaParamRef<jobject>(env, callback1),
-      base::android::JavaParamRef<jobject>(env, callback2));
-}
-
-
-static std::atomic<jmethodID> g_org_chromium_foo_Foo_calledByNative(nullptr);
-static void Java_Foo_calledByNative(JNIEnv* env, const base::android::JavaRef<jobject>& callback1,
-    const base::android::JavaRef<jobject>& callback2) {
-  jclass clazz = org_chromium_foo_Foo_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_foo_Foo_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "calledByNative",
-          "(Lorg/chromium/foo/Bar1$Callback;Lorg/chromium/foo/Bar2$Callback;)V",
-          &g_org_chromium_foo_Foo_calledByNative);
-
-     env->CallStaticVoidMethod(clazz,
-          call_context.base.method_id, callback1.obj(), callback2.obj());
-}
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden b/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
deleted file mode 100644
index 08b6ec4e..0000000
--- a/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/example/jni_generator/SampleForTests
-
-#ifndef org_chromium_example_jni_generator_SampleForTests_JNI
-#define org_chromium_example_jni_generator_SampleForTests_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char
-    kClassPath_org_chromium_example_jni_1generator_SampleForTests[];
-const char kClassPath_org_chromium_example_jni_1generator_SampleForTests[] =
-    "org/chromium/example/jni_generator/SampleForTests";
-
-JNI_REGISTRATION_EXPORT extern const char
-    kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass[];
-const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass[] =
-    "org/chromium/example/jni_generator/SampleForTests$MyInnerClass";
-
-JNI_REGISTRATION_EXPORT extern const char
-    kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass[];
-const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass[] =
-    "org/chromium/example/jni_generator/SampleForTests$MyOtherInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_example_jni_1generator_SampleForTests_clazz(nullptr);
-#ifndef org_chromium_example_jni_1generator_SampleForTests_clazz_defined
-#define org_chromium_example_jni_1generator_SampleForTests_clazz_defined
-inline jclass org_chromium_example_jni_1generator_SampleForTests_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env,
-      kClassPath_org_chromium_example_jni_1generator_SampleForTests,
-      &g_org_chromium_example_jni_1generator_SampleForTests_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz(nullptr);
-#ifndef org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz_defined
-#define org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz_defined
-inline jclass org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz(JNIEnv*
-    env) {
-  return base::android::LazyGetClass(env,
-      kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass,
-      &g_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz);
-}
-#endif
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass>
-    g_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz(nullptr);
-#ifndef org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz_defined
-#define org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz_defined
-inline jclass
-    org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env,
-      kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass,
-      &g_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_example_jni_1generator_SampleForTests_nativeStaticMethod(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeTest,
-    jint arg1) {
-  Test* native = reinterpret_cast<Test*>(nativeTest);
-  CHECK_NATIVE_PTR(env, jcaller, native, "StaticMethod", 0);
-  return native->StaticMethod(env, arg1);
-}
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_example_jni_1generator_SampleForTests_nativeMethod(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativeTest,
-    jint arg1) {
-  Test* native = reinterpret_cast<Test*>(nativeTest);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
-  return native->Method(env, base::android::JavaParamRef<jobject>(env, jcaller), arg1);
-}
-
-static jint JNI_MyInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_MyInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint JNI_MyOtherInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_MyOtherInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParam(nullptr);
-static void Java_SampleForTests_testMethodWithParam(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper iParam) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "testMethodWithParam",
-          "(I)V",
-          &g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParam);
-
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id, as_jint(iParam));
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParamAndReturn(nullptr);
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_SampleForTests_testMethodWithParamAndReturn(JNIEnv* env, const
-    base::android::JavaRef<jobject>& obj, JniIntWrapper iParam) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "testMethodWithParamAndReturn",
-          "(I)Ljava/lang/String;",
-          &g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParamAndReturn);
-
-  jstring ret =
-      static_cast<jstring>(env->CallObjectMethod(obj.obj(),
-          call_context.base.method_id, as_jint(iParam)));
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithParam(nullptr);
-static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env, JniIntWrapper iParam) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "testStaticMethodWithParam",
-          "(I)I",
-          &g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithParam);
-
-  jint ret =
-      env->CallStaticIntMethod(clazz,
-          call_context.base.method_id, as_jint(iParam));
-  return ret;
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithNoParam(nullptr);
-static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "testMethodWithNoParam",
-          "()D",
-          &g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithNoParam);
-
-  jdouble ret =
-      env->CallStaticDoubleMethod(clazz,
-          call_context.base.method_id);
-  return ret;
-}
-
-static std::atomic<jmethodID>
-    g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithNoParam(nullptr);
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_SampleForTests_testStaticMethodWithNoParam(JNIEnv* env) {
-  jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "testStaticMethodWithNoParam",
-          "()Ljava/lang/String;",
-          &g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithNoParam);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(clazz,
-          call_context.base.method_id));
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-#endif  // org_chromium_example_jni_generator_SampleForTests_JNI
diff --git a/base/android/jni_generator/golden/testNatives.golden b/base/android/jni_generator/golden/testNatives.golden
deleted file mode 100644
index 23629f1..0000000
--- a/base/android/jni_generator/golden/testNatives.golden
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
-const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static jint JNI_TestJni_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
-    JNIEnv* env,
-    jobject jcaller) {
-  return JNI_TestJni_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmark(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jstring title,
-    jboolean isFolder,
-    jlong parentId) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmark", 0);
-  return native->AddBookmark(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, url), base::android::JavaParamRef<jstring>(env,
-      title), isFolder, parentId);
-}
-
-static base::android::ScopedJavaLocalRef<jstring> JNI_TestJni_GetDomainAndRegistry(JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& url);
-
-JNI_GENERATOR_EXPORT jstring Java_org_chromium_TestJni_nativeGetDomainAndRegistry(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring url) {
-  return JNI_TestJni_GetDomainAndRegistry(env, base::android::JavaParamRef<jstring>(env,
-      url)).Release();
-}
-
-static void JNI_TestJni_CreateHistoricalTabFromState(JNIEnv* env, const
-    base::android::JavaParamRef<jbyteArray>& state,
-    jint tab_index);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState(
-    JNIEnv* env,
-    jclass jcaller,
-    jbyteArray state,
-    jint tab_index) {
-  return JNI_TestJni_CreateHistoricalTabFromState(env, base::android::JavaParamRef<jbyteArray>(env,
-      state), tab_index);
-}
-
-static base::android::ScopedJavaLocalRef<jbyteArray> JNI_TestJni_GetStateAsByteArray(JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller,
-    const base::android::JavaParamRef<jobject>& view);
-
-JNI_GENERATOR_EXPORT jbyteArray Java_org_chromium_TestJni_nativeGetStateAsByteArray(
-    JNIEnv* env,
-    jobject jcaller,
-    jobject view) {
-  return JNI_TestJni_GetStateAsByteArray(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jobject>(env, view)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray> JNI_TestJni_GetAutofillProfileGUIDs(JNIEnv*
-    env);
-
-JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_TestJni_GetAutofillProfileGUIDs(env).Release();
-}
-
-static void JNI_TestJni_SetRecognitionResults(JNIEnv* env, const
-    base::android::JavaParamRef<jobject>& jcaller,
-    jint sessionId,
-    const base::android::JavaParamRef<jobjectArray>& results);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeSetRecognitionResults(
-    JNIEnv* env,
-    jobject jcaller,
-    jint sessionId,
-    jobjectArray results) {
-  return JNI_TestJni_SetRecognitionResults(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      sessionId, base::android::JavaParamRef<jobjectArray>(env, results));
-}
-
-JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmarkFromAPI(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jobject created,
-    jobject isBookmark,
-    jobject date,
-    jbyteArray favicon,
-    jstring title,
-    jobject visits) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmarkFromAPI", 0);
-  return native->AddBookmarkFromAPI(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, url), base::android::JavaParamRef<jobject>(env,
-      created), base::android::JavaParamRef<jobject>(env, isBookmark),
-      base::android::JavaParamRef<jobject>(env, date), base::android::JavaParamRef<jbyteArray>(env,
-      favicon), base::android::JavaParamRef<jstring>(env, title),
-      base::android::JavaParamRef<jobject>(env, visits));
-}
-
-static jint JNI_TestJni_FindAll(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller,
-    const base::android::JavaParamRef<jstring>& find);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(
-    JNIEnv* env,
-    jobject jcaller,
-    jstring find) {
-  return JNI_TestJni_FindAll(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, find));
-}
-
-static base::android::ScopedJavaLocalRef<jobject> JNI_TestJni_GetInnerClass(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeGetInnerClass(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_TestJni_GetInnerClass(env).Release();
-}
-
-JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeQueryBitmap(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jobjectArray projection,
-    jstring selection,
-    jobjectArray selectionArgs,
-    jstring sortOrder) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "QueryBitmap", NULL);
-  return native->QueryBitmap(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jobjectArray>(env, projection),
-      base::android::JavaParamRef<jstring>(env, selection),
-      base::android::JavaParamRef<jobjectArray>(env, selectionArgs),
-      base::android::JavaParamRef<jstring>(env, sortOrder)).Release();
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeGotOrientation(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeDataFetcherImplAndroid,
-    jdouble alpha,
-    jdouble beta,
-    jdouble gamma) {
-  DataFetcherImplAndroid* native =
-      reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid);
-  CHECK_NATIVE_PTR(env, jcaller, native, "GotOrientation");
-  return native->GotOrientation(env, base::android::JavaParamRef<jobject>(env, jcaller), alpha,
-      beta, gamma);
-}
-
-static base::android::ScopedJavaLocalRef<jthrowable> JNI_TestJni_MessWithJavaException(JNIEnv* env,
-    const base::android::JavaParamRef<jthrowable>& e);
-
-JNI_GENERATOR_EXPORT jthrowable Java_org_chromium_TestJni_nativeMessWithJavaException(
-    JNIEnv* env,
-    jclass jcaller,
-    jthrowable e) {
-  return JNI_TestJni_MessWithJavaException(env, base::android::JavaParamRef<jthrowable>(env,
-      e)).Release();
-}
-
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/golden/testNativesLong.golden b/base/android/jni_generator/golden/testNativesLong.golden
deleted file mode 100644
index 81be022..0000000
--- a/base/android/jni_generator/golden/testNativesLong.golden
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
-const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativeChromeBrowserProvider) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/golden/testNativesRegistrations.golden b/base/android/jni_generator/golden/testNativesRegistrations.golden
deleted file mode 100644
index de98b51..0000000
--- a/base/android/jni_generator/golden/testNativesRegistrations.golden
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-#ifndef HEADER_GUARD
-#define HEADER_GUARD
-
-#include <jni.h>
-
-#include <iterator>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-#include "base/android/jni_int_wrapper.h"
-
-
-// Step 1: Forward declarations (classes).
-
-extern const char kClassPath_org_chromium_TestJni[];
-extern std::atomic<jclass> g_org_chromium_TestJni_clazz;
-#ifndef org_chromium_TestJni_clazz_defined
-#define org_chromium_TestJni_clazz_defined
-inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
-      &g_org_chromium_TestJni_clazz);
-}
-#endif
-
-
-// Step 2: Forward declarations (methods).
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
-    JNIEnv* env,
-    jobject jcaller);
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider);
-JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmark(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jstring title,
-    jboolean isFolder,
-    jlong parentId);
-JNI_GENERATOR_EXPORT jstring Java_org_chromium_TestJni_nativeGetDomainAndRegistry(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring url);
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState(
-    JNIEnv* env,
-    jclass jcaller,
-    jbyteArray state,
-    jint tab_index);
-JNI_GENERATOR_EXPORT jbyteArray Java_org_chromium_TestJni_nativeGetStateAsByteArray(
-    JNIEnv* env,
-    jobject jcaller,
-    jobject view);
-JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeSetRecognitionResults(
-    JNIEnv* env,
-    jobject jcaller,
-    jint sessionId,
-    jobjectArray results);
-JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmarkFromAPI(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jobject created,
-    jobject isBookmark,
-    jobject date,
-    jbyteArray favicon,
-    jstring title,
-    jobject visits);
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(
-    JNIEnv* env,
-    jobject jcaller,
-    jstring find);
-JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeGetInnerClass(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeQueryBitmap(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jobjectArray projection,
-    jstring selection,
-    jobjectArray selectionArgs,
-    jstring sortOrder);
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeGotOrientation(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeDataFetcherImplAndroid,
-    jdouble alpha,
-    jdouble beta,
-    jdouble gamma);
-JNI_GENERATOR_EXPORT jthrowable Java_org_chromium_TestJni_nativeMessWithJavaException(
-    JNIEnv* env,
-    jclass jcaller,
-    jthrowable e);
-
-
-// Step 3: Method declarations.
-
-static const JNINativeMethod kMethods_org_chromium_TestJni[] = {
-    { "nativeInit", "()I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
-    { "nativeDestroy", "(I)V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeDestroy) },
-    { "nativeAddBookmark", "(ILjava/lang/String;Ljava/lang/String;ZJ)J",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmark) },
-    { "nativeGetDomainAndRegistry", "(Ljava/lang/String;)Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetDomainAndRegistry) },
-    { "nativeCreateHistoricalTabFromState", "([BI)V",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState) },
-    { "nativeGetStateAsByteArray", "(Landroid/view/View;)[B",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetStateAsByteArray) },
-    { "nativeGetAutofillProfileGUIDs", "()[Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs) },
-    { "nativeSetRecognitionResults", "(I[Ljava/lang/String;)V",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeSetRecognitionResults) },
-    { "nativeAddBookmarkFromAPI",
-        "(ILjava/lang/String;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Long;[BLjava/lang/String;Ljava/lang/Integer;)J",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmarkFromAPI) },
-    { "nativeFindAll", "(Ljava/lang/String;)I",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeFindAll) },
-    { "nativeGetInnerClass",
-        "()Lorg/chromium/example/jni_generator/SampleForTests$OnFrameAvailableListener;",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetInnerClass) },
-    { "nativeQueryBitmap",
-        "(I[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/graphics/Bitmap;",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeQueryBitmap) },
-    { "nativeGotOrientation", "(IDDD)V",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGotOrientation) },
-    { "nativeMessWithJavaException", "(Ljava/lang/Throwable;)Ljava/lang/Throwable;",
-        reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeMessWithJavaException) },
-};
-
-
-JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_TestJni(JNIEnv* env) {
-  const int kMethods_org_chromium_TestJniSize =
-      std::size(kMethods_org_chromium_TestJni);
-  if (env->RegisterNatives(
-      org_chromium_TestJni_clazz(env),
-      kMethods_org_chromium_TestJni,
-      kMethods_org_chromium_TestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(env,
-        org_chromium_TestJni_clazz(env),
-        __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-
-// Step 4: Registration function.
-
-namespace test {
-
-bool RegisterNatives(JNIEnv* env) {
-
-  return true;
-}
-
-}  // namespace test
-
-#endif  // HEADER_GUARD
diff --git a/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden b/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden
deleted file mode 100644
index ac7d5fb..0000000
--- a/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden
+++ /dev/null
@@ -1,435 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-#ifndef HEADER_GUARD
-#define HEADER_GUARD
-
-#include <jni.h>
-
-#include <iterator>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-#include "base/android/jni_int_wrapper.h"
-
-
-// Step 1: Forward declarations (classes).
-
-
-// Step 2: Forward declarations (methods).
-
-JNI_GENERATOR_EXPORT void
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject sample);
-JNI_GENERATOR_EXPORT jstring
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring stringToReverse);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs);
-JNI_GENERATOR_EXPORT jboolean
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jintArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
-    JNIEnv* env,
-    jclass jcaller,
-    jint zint,
-    jintArray ints,
-    jlong zlong,
-    jlongArray longs,
-    jshort zshort,
-    jshortArray shorts,
-    jchar zchar,
-    jcharArray chars,
-    jbyte zbyte,
-    jbyteArray bytes,
-    jdouble zdouble,
-    jdoubleArray doubles,
-    jfloat zfloat,
-    jfloatArray floats,
-    jboolean zbool,
-    jbooleanArray bools);
-JNI_GENERATOR_EXPORT void
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
-    JNIEnv* env,
-    jclass jcaller,
-    jclass clazz,
-    jobjectArray classes,
-    jthrowable throwable,
-    jobjectArray throwables,
-    jstring string,
-    jobjectArray strings,
-    jobject tStruct,
-    jobjectArray structs,
-    jobject obj,
-    jobjectArray objects);
-JNI_GENERATOR_EXPORT jthrowable
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jclass
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jstring
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
-    JNIEnv* env,
-    jclass jcaller);
-
-
-JNI_GENERATOR_EXPORT jclass Java_J_N_resolve_1for_1class(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case -461602969360398827:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1class_1array(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case -427008638958312484:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class_1array was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobject Java_J_N_resolve_1for_1object(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case 5419834314509580268:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(env, jcaller);
-          
-          case -426730623629742951:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobject Java_J_N_resolve_1for_1object_1O(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num, jobject object_param1) {
-        switch (switch_num) {
-          
-          case 2227777243221232668:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(env, jcaller, object_param1);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1O was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1object_1array(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case 2313390248928530514:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(env, jcaller);
-          
-          case 4508266875426191279:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1object_1array_1OA(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num, jobjectArray object_array_param1) {
-        switch (switch_num) {
-          
-          case 1879234562834588228:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(env, jcaller, object_array_param1);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array_1OA was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jstring Java_J_N_resolve_1for_1string(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case -3292889389021976364:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jstring Java_J_N_resolve_1for_1string_1R(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num, jstring string_param1) {
-        switch (switch_num) {
-          
-          case 3717128594383367634:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(env, jcaller, string_param1);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1R was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1string_1array(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case -5564218335546380707:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1string_1array_1RA(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num, jobjectArray string_array_param1) {
-        switch (switch_num) {
-          
-          case 12825275381484104:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(env, jcaller, string_array_param1);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array_1RA was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jthrowable Java_J_N_resolve_1for_1throwable(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case -5073520581764159162:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1throwable_1array(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case 17582460986153510:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable_1array was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jboolean Java_J_N_resolve_1for_1boolean(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case 6577090212445038314:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1boolean was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT jintArray Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num, jint int_param1, jintArray int_array_param1, jlong long_param1, jlongArray long_array_param1, jshort short_param1, jshortArray short_array_param1, jchar char_param1, jcharArray char_array_param1, jbyte byte_param1, jbyteArray byte_array_param1, jdouble double_param1, jdoubleArray double_array_param1, jfloat float_param1, jfloatArray float_array_param1, jboolean boolean_param1, jbooleanArray boolean_array_param1) {
-        switch (switch_num) {
-          
-          case -7687282957371512872:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(env, jcaller, int_param1, int_array_param1, long_param1, long_array_param1, short_param1, short_array_param1, char_param1, char_array_param1, byte_param1, byte_array_param1, double_param1, double_array_param1, float_param1, float_array_param1, boolean_param1, boolean_array_param1);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA was called with an invalid switch number: " << switch_num;
-            return {};
-        }
-}
-JNI_GENERATOR_EXPORT void Java_J_N_resolve_1for_1void(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num) {
-        switch (switch_num) {
-          
-          case -3890945313637314700:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(env, jcaller);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void was called with an invalid switch number: " << switch_num;
-            return;
-        }
-}
-JNI_GENERATOR_EXPORT void Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong switch_num, jclass class_param1, jobjectArray class_array_param1, jthrowable throwable_param1, jobjectArray throwable_array_param1, jstring string_param1, jobjectArray string_array_param1, jobject object_param1, jobjectArray object_array_param1, jobject object_param2, jobjectArray object_array_param2) {
-        switch (switch_num) {
-          
-          case -6275232019293411879:
-            return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(env, jcaller, class_param1, class_array_param1, throwable_param1, throwable_array_param1, string_param1, string_array_param1, object_param1, object_array_param1, object_param2, object_array_param2);
-          
-          default:
-            CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA was called with an invalid switch number: " << switch_num;
-            return;
-        }
-}
-// Step 3: Method declarations.
-
-
-static const JNINativeMethod kMethods_J_N[] = {
-    { "resolve_for_boolean", "(J)Z", reinterpret_cast<void*>(Java_J_N_resolve_1for_1boolean) },
-    { "resolve_for_class", "(J)Ljava/lang/Class;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1class) },
-    { "resolve_for_class_array", "(J)[Ljava/lang/Class;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1class_1array) },
-    { "resolve_for_int_array_IIAJJASSACCABBADDAFFAZZA", "(JI[IJ[JS[SC[CB[BD[DF[FZ[Z)[I",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA) },
-    { "resolve_for_object", "(J)Ljava/lang/Object;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1object) },
-    { "resolve_for_object_O", "(JLjava/lang/Object;)Ljava/lang/Object;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1object_1O) },
-    { "resolve_for_object_array", "(J)[Ljava/lang/Object;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1object_1array) },
-    { "resolve_for_object_array_OA", "(J[Ljava/lang/Object;)[Ljava/lang/Object;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1object_1array_1OA) },
-    { "resolve_for_string", "(J)Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1string) },
-    { "resolve_for_string_R", "(JLjava/lang/String;)Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1string_1R) },
-    { "resolve_for_string_array", "(J)[Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1string_1array) },
-    { "resolve_for_string_array_RA", "(J[Ljava/lang/String;)[Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1string_1array_1RA) },
-    { "resolve_for_throwable", "(J)Ljava/lang/Throwable;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1throwable) },
-    { "resolve_for_throwable_array", "(J)[Ljava/lang/Throwable;",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1throwable_1array) },
-    { "resolve_for_void", "(J)V", reinterpret_cast<void*>(Java_J_N_resolve_1for_1void) },
-    { "resolve_for_void_LLATTARRAOOAOOA",
-        "(JLjava/lang/Class;[Ljava/lang/Class;Ljava/lang/Throwable;[Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)V",
-        reinterpret_cast<void*>(Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA) }
-};
-
-namespace {
-
-JNI_REGISTRATION_EXPORT bool RegisterNative_J_N(JNIEnv* env) {
-  const int number_of_methods = std::size(kMethods_J_N);
-
-  base::android::ScopedJavaLocalRef<jclass> native_clazz =
-      base::android::GetClass(env, "J/N");
-  if (env->RegisterNatives(
-      native_clazz.obj(),
-      kMethods_J_N,
-      number_of_methods) < 0) {
-
-    jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-
-// Step 4: Registration function.
-
-namespace test {
-
-bool RegisterNatives(JNIEnv* env) {
-  // Register natives in a proxy.
-  if (!RegisterNative_J_N(env)) {
-    return false;
-  }
-
-
-  return true;
-}
-
-}  // namespace test
-
-#endif  // HEADER_GUARD
diff --git a/base/android/jni_generator/golden/testProxyNatives.golden b/base/android/jni_generator/golden/testProxyNatives.golden
deleted file mode 100644
index f9675053..0000000
--- a/base/android/jni_generator/golden/testProxyNatives.golden
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/example/SampleProxyJni
-
-#ifndef org_chromium_example_SampleProxyJni_JNI
-#define org_chromium_example_SampleProxyJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foo(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativePtr) {
-  FooAndroid::BarDelegate* native = reinterpret_cast<FooAndroid::BarDelegate*>(nativePtr);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
-  return native->Foo(env);
-}
-
-static jint JNI_SampleProxyJni_Bar(JNIEnv* env, jint x,
-    jint y);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1bar(
-    JNIEnv* env,
-    jclass jcaller,
-    jint x,
-    jint y) {
-  return JNI_SampleProxyJni_Bar(env, x, y);
-}
-
-static base::android::ScopedJavaLocalRef<jstring> JNI_SampleProxyJni_Foobar(JNIEnv* env, const
-    base::android::JavaParamRef<jstring>& x,
-    const base::android::JavaParamRef<jstring>& y);
-
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foobar(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring x,
-    jstring y) {
-  return JNI_SampleProxyJni_Foobar(env, base::android::JavaParamRef<jstring>(env, x),
-      base::android::JavaParamRef<jstring>(env, y)).Release();
-}
-
-
-#endif  // org_chromium_example_SampleProxyJni_JNI
diff --git a/base/android/jni_generator/golden/testProxyNativesJava.golden b/base/android/jni_generator/golden/testProxyNativesJava.golden
deleted file mode 100644
index a40f9859..0000000
--- a/base/android/jni_generator/golden/testProxyNativesJava.golden
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.natives;
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-public class GEN_JNI {
-    public static final boolean TESTING_ENABLED = false;
-    public static final boolean REQUIRE_MOCK = false;
-
-
-      // Hashed name: Java_J_N_MfuvK7$r
-      public static native void org_chromium_example_SampleProxyJni_foo(long nativePtr);
-      // Hashed name: Java_J_N_MB1mTV9a
-      public static native int org_chromium_example_SampleProxyJni_bar(int x, int y);
-      // Hashed name: Java_J_N_Me7X4JzV
-      public static native String org_chromium_example_SampleProxyJni_foobar(String x, String y);
-}
diff --git a/base/android/jni_generator/golden/testProxyNativesRegistrations.golden b/base/android/jni_generator/golden/testProxyNativesRegistrations.golden
deleted file mode 100644
index 334d022..0000000
--- a/base/android/jni_generator/golden/testProxyNativesRegistrations.golden
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-#ifndef HEADER_GUARD
-#define HEADER_GUARD
-
-#include <jni.h>
-
-#include <iterator>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-#include "base/android/jni_int_wrapper.h"
-
-
-// Step 1: Forward declarations (classes).
-
-
-// Step 2: Forward declarations (methods).
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foo(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativePtr);
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1bar(
-    JNIEnv* env,
-    jclass jcaller,
-    jint x,
-    jint y);
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foobar(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring x,
-    jstring y);
-
-
-// Step 3: Method declarations.
-
-
-static const JNINativeMethod kMethods_org_chromium_base_natives_GEN_1JNI[] = {
-    { "org_chromium_example_SampleProxyJni_foo", "(J)V",
-        reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foo)
-        },
-    { "org_chromium_example_SampleProxyJni_bar", "(II)I",
-        reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1bar)
-        },
-    { "org_chromium_example_SampleProxyJni_foobar",
-        "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
-        reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foobar)
-        },
-
-};
-
-namespace {
-
-JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_base_natives_GEN_1JNI(JNIEnv* env) {
-  const int number_of_methods = std::size(kMethods_org_chromium_base_natives_GEN_1JNI);
-
-  base::android::ScopedJavaLocalRef<jclass> native_clazz =
-      base::android::GetClass(env, "org/chromium/base/natives/GEN_JNI");
-  if (env->RegisterNatives(
-      native_clazz.obj(),
-      kMethods_org_chromium_base_natives_GEN_1JNI,
-      number_of_methods) < 0) {
-
-    jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-
-// Step 4: Registration function.
-
-namespace test {
-
-bool RegisterNatives(JNIEnv* env) {
-  // Register natives in a proxy.
-  if (!RegisterNative_org_chromium_base_natives_GEN_1JNI(env)) {
-    return false;
-  }
-
-
-  return true;
-}
-
-}  // namespace test
-
-#endif  // HEADER_GUARD
diff --git a/base/android/jni_generator/golden/testProxyNativesWithNatives.golden b/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
deleted file mode 100644
index 0ae45c2..0000000
--- a/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
-const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
-#ifndef org_chromium_foo_Foo_clazz_defined
-#define org_chromium_foo_Foo_clazz_defined
-inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
-      &g_org_chromium_foo_Foo_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_Foo_Foo(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1foo(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_Foo_Foo(env);
-}
-
-static base::android::ScopedJavaLocalRef<jstring> JNI_Foo_Bar(JNIEnv* env, const
-    base::android::JavaParamRef<jstring>& s,
-    jint y,
-    jchar x,
-    jshort z);
-
-JNI_GENERATOR_EXPORT jstring Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1bar(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring s,
-    jint y,
-    jchar x,
-    jshort z) {
-  return JNI_Foo_Bar(env, base::android::JavaParamRef<jstring>(env, s), y, x, z).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray> JNI_Foo_Foobar(JNIEnv* env, const
-    base::android::JavaParamRef<jobjectArray>& a);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1foobar(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray a) {
-  return JNI_Foo_Foobar(env, base::android::JavaParamRef<jobjectArray>(env, a)).Release();
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1baz(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativePtr,
-    jobject caller) {
-  Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Baz");
-  return native->Baz(env, base::android::JavaParamRef<jobject>(env, caller));
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1fooBar(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativePtr) {
-  Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
-  CHECK_NATIVE_PTR(env, jcaller, native, "FooBar");
-  return native->FooBar(env);
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeInstanceMethod(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativeInstance) {
-  Instance* native = reinterpret_cast<Instance*>(nativeInstance);
-  CHECK_NATIVE_PTR(env, jcaller, native, "InstanceMethod");
-  return native->InstanceMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static void JNI_Foo_StaticMethod(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeStaticMethod(
-    JNIEnv* env,
-    jclass jcaller) {
-  return JNI_Foo_StaticMethod(env);
-}
-
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.2.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.2.golden
deleted file mode 100644
index 5ed4615..0000000
--- a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.2.golden
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package this.is.a.package.prefix.org.chromium.base.natives;
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-public class GEN_JNI {
-    public static final boolean TESTING_ENABLED = false;
-    public static final boolean REQUIRE_MOCK = false;
-
-
-    public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo() {
-        this.is.a.package.prefix.J.N.MGfHLNVl();
-    }
-
-    public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample) {
-        return this.is.a.package.prefix.J.N.M5EfCheU(sample);
-    }
-
-    public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse) {
-        return this.is.a.package.prefix.J.N.MXQefv1w(stringToReverse);
-    }
-
-    public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs) {
-        return this.is.a.package.prefix.J.N.MSYtnUBS(strs);
-    }
-
-    public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs) {
-        return this.is.a.package.prefix.J.N.MaV5G8K8(strs);
-    }
-
-    public static boolean this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange() {
-        return this.is.a.package.prefix.J.N.MM2Yz6XD();
-    }
-
-    public static int[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools) {
-        return this.is.a.package.prefix.J.N.MMy4dcxH(zint, ints, zlong, longs, zshort, shorts, zchar, chars, zbyte, bytes, zdouble, doubles, zfloat, floats, zbool, bools);
-    }
-
-    public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects) {
-        this.is.a.package.prefix.J.N.MSslZIsy(clazz, classes, throwable, throwables, string, strings, tStruct, structs, obj, objects);
-    }
-
-    public static Throwable this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable() {
-        return this.is.a.package.prefix.J.N.Mehs9t7u();
-    }
-
-    public static Throwable[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables() {
-        return this.is.a.package.prefix.J.N.MQH82FhP();
-    }
-
-    public static Class this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass() {
-        return this.is.a.package.prefix.J.N.MyxAHj2Y();
-    }
-
-    public static Class[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses() {
-        return this.is.a.package.prefix.J.N.MNGv55Cm();
-    }
-
-    public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString() {
-        return this.is.a.package.prefix.J.N.Mysjo$pl();
-    }
-
-    public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings() {
-        return this.is.a.package.prefix.J.N.M3B287zk();
-    }
-
-    public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct() {
-        return this.is.a.package.prefix.J.N.M8UGsyhL();
-    }
-
-    public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs() {
-        return this.is.a.package.prefix.J.N.MtYMX5wX();
-    }
-
-    public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject() {
-        return this.is.a.package.prefix.J.N.MIs8T9aQ();
-    }
-
-    public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects() {
-        return this.is.a.package.prefix.J.N.MtkQGyRy();
-    }
-}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.golden
deleted file mode 100644
index d30733e..0000000
--- a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.golden
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package this.is.a.package.prefix.J;
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-public class N {
-
-
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo
-      public static native void MGfHLNVl();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar
-      public static native Object M5EfCheU(Object sample);
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString
-      public static native String MXQefv1w(String stringToReverse);
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative
-      public static native String[] MSYtnUBS(String[] strs);
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative
-      public static native Object[] MaV5G8K8(Object[] strs);
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange
-      public static native boolean MM2Yz6XD();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives
-      public static native int[] MMy4dcxH(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes
-      public static native void MSslZIsy(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable
-      public static native Throwable Mehs9t7u();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables
-      public static native Throwable[] MQH82FhP();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass
-      public static native Class MyxAHj2Y();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses
-      public static native Class[] MNGv55Cm();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString
-      public static native String Mysjo$pl();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings
-      public static native String[] M3B287zk();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct
-      public static native Object M8UGsyhL();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs
-      public static native Object[] MtYMX5wX();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject
-      public static native Object MIs8T9aQ();
-      // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects
-      public static native Object[] MtkQGyRy();
-}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHashHeader.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHashHeader.golden
deleted file mode 100644
index c92b36ef..0000000
--- a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHashHeader.golden
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_registration_generator.py
-// Please do not change its content.
-
-#ifndef TEMP_DIR_HEADER_
-#define TEMP_DIR_HEADER_
-
-#include <jni.h>
-
-#include <iterator>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-#include "base/android/jni_int_wrapper.h"
-
-
-// Step 1: Forward declarations (classes).
-
-
-// Step 2: Forward declarations (methods).
-
-JNI_GENERATOR_EXPORT void Java_this_is_a_package_prefix_J_N_MGfHLNVl(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_M5EfCheU(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject sample);
-JNI_GENERATOR_EXPORT jstring Java_this_is_a_package_prefix_J_N_MXQefv1w(
-    JNIEnv* env,
-    jclass jcaller,
-    jstring stringToReverse);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MSYtnUBS(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MaV5G8K8(
-    JNIEnv* env,
-    jclass jcaller,
-    jobjectArray strs);
-JNI_GENERATOR_EXPORT jboolean Java_this_is_a_package_prefix_J_N_MM2Yz6XD(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jintArray Java_this_is_a_package_prefix_J_N_MMy4dcxH(
-    JNIEnv* env,
-    jclass jcaller,
-    jint zint,
-    jintArray ints,
-    jlong zlong,
-    jlongArray longs,
-    jshort zshort,
-    jshortArray shorts,
-    jchar zchar,
-    jcharArray chars,
-    jbyte zbyte,
-    jbyteArray bytes,
-    jdouble zdouble,
-    jdoubleArray doubles,
-    jfloat zfloat,
-    jfloatArray floats,
-    jboolean zbool,
-    jbooleanArray bools);
-JNI_GENERATOR_EXPORT void Java_this_is_a_package_prefix_J_N_MSslZIsy(
-    JNIEnv* env,
-    jclass jcaller,
-    jclass clazz,
-    jobjectArray classes,
-    jthrowable throwable,
-    jobjectArray throwables,
-    jstring string,
-    jobjectArray strings,
-    jobject tStruct,
-    jobjectArray structs,
-    jobject obj,
-    jobjectArray objects);
-JNI_GENERATOR_EXPORT jthrowable Java_this_is_a_package_prefix_J_N_Mehs9t7u(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MQH82FhP(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jclass Java_this_is_a_package_prefix_J_N_MyxAHj2Y(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MNGv55Cm(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jstring Java_this_is_a_package_prefix_J_N_Mysjo_00024pl(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_M3B287zk(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_M8UGsyhL(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MtYMX5wX(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_MIs8T9aQ(
-    JNIEnv* env,
-    jclass jcaller);
-JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MtkQGyRy(
-    JNIEnv* env,
-    jclass jcaller);
-
-
-
-#endif  // TEMP_DIR_HEADER_
diff --git a/base/android/jni_generator/golden/testREForNatives.golden b/base/android/jni_generator/golden/testREForNatives.golden
deleted file mode 100644
index b9efc59..0000000
--- a/base/android/jni_generator/golden/testREForNatives.golden
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     foo/bar
-
-#ifndef foo_bar_JNI
-#define foo_bar_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_foo_bar[];
-const char kClassPath_foo_bar[] = "foo/bar";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_foo_bar_clazz(nullptr);
-#ifndef foo_bar_clazz_defined
-#define foo_bar_clazz_defined
-inline jclass foo_bar_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_foo_bar, &g_foo_bar_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_bar_SyncSetupEnded(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller,
-    jint nativeAndroidSyncSetupFlowHandler);
-
-JNI_GENERATOR_EXPORT void Java_foo_bar_nativeSyncSetupEnded(
-    JNIEnv* env,
-    jobject jcaller,
-    jint nativeAndroidSyncSetupFlowHandler) {
-  return JNI_bar_SyncSetupEnded(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      nativeAndroidSyncSetupFlowHandler);
-}
-
-
-#endif  // foo_bar_JNI
diff --git a/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden b/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden
deleted file mode 100644
index bfcd98c..0000000
--- a/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
-const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
-#ifndef org_chromium_foo_Foo_clazz_defined
-#define org_chromium_foo_Foo_clazz_defined
-inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
-      &g_org_chromium_foo_Foo_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_Foo_DoSomething(JNIEnv* env, const base::android::JavaParamRef<jobject>& callback);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject callback) {
-  return JNI_Foo_DoSomething(env, base::android::JavaParamRef<jobject>(env, callback));
-}
-
-
-static std::atomic<jmethodID> g_org_chromium_foo_Foo_calledByNative(nullptr);
-static void Java_Foo_calledByNative(JNIEnv* env, const base::android::JavaRef<jobject>& callback) {
-  jclass clazz = org_chromium_foo_Foo_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_foo_Foo_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_STATIC>(
-          env,
-          clazz,
-          "calledByNative",
-          "(Lorg/chromium/foo/Bar$Callback;)V",
-          &g_org_chromium_foo_Foo_calledByNative);
-
-     env->CallStaticVoidMethod(clazz,
-          call_context.base.method_id, callback.obj());
-}
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/golden/testStaticBindingCaller.golden b/base/android/jni_generator/golden/testStaticBindingCaller.golden
deleted file mode 100644
index 413ee09f..0000000
--- a/base/android/jni_generator/golden/testStaticBindingCaller.golden
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
-const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
-#ifndef org_chromium_foo_Foo_clazz_defined
-#define org_chromium_foo_Foo_clazz_defined
-inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
-      &g_org_chromium_foo_Foo_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-static void JNI_Foo_ShouldBindCaller(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    caller);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeShouldBindCaller(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject caller) {
-  return JNI_Foo_ShouldBindCaller(env, base::android::JavaParamRef<jobject>(env, caller));
-}
-
-static void JNI_Foo_ShouldBindCaller(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    caller,
-    jint a);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeShouldBindCaller(
-    JNIEnv* env,
-    jclass jcaller,
-    jobject caller,
-    jint a) {
-  return JNI_Foo_ShouldBindCaller(env, base::android::JavaParamRef<jobject>(env, caller), a);
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeFoo(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeNativeObject,
-    jobject caller) {
-  NativeObject* native = reinterpret_cast<NativeObject*>(nativeNativeObject);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
-  return native->Foo(env, base::android::JavaParamRef<jobject>(env, caller));
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeFoo(
-    JNIEnv* env,
-    jclass jcaller,
-    jlong nativeNativeObject,
-    jobject caller,
-    jint a) {
-  NativeObject* native = reinterpret_cast<NativeObject*>(nativeNativeObject);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
-  return native->Foo(env, base::android::JavaParamRef<jobject>(env, caller), a);
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeCallNativeMethod(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativePtr) {
-  Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
-  CHECK_NATIVE_PTR(env, jcaller, native, "CallNativeMethod");
-  return native->CallNativeMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeCallWithQualifiedObject(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativePtr) {
-  Foo::Bar* native = reinterpret_cast<Foo::Bar*>(nativePtr);
-  CHECK_NATIVE_PTR(env, jcaller, native, "CallWithQualifiedObject");
-  return native->CallWithQualifiedObject(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/golden/testTracing.golden b/base/android/jni_generator/golden/testTracing.golden
deleted file mode 100644
index 63136a30..0000000
--- a/base/android/jni_generator/golden/testTracing.golden
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-
-// Step 1: Forward declarations.
-
-JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
-const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
-#ifndef org_chromium_foo_Foo_clazz_defined
-#define org_chromium_foo_Foo_clazz_defined
-inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
-  return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
-      &g_org_chromium_foo_Foo_clazz);
-}
-#endif
-
-
-// Step 2: Constants (optional).
-
-
-// Step 3: Method stubs.
-namespace org {
-namespace chromium_foo {
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeInstanceMethod(
-    JNIEnv* env,
-    jobject jcaller,
-    jlong nativeInstance) {
-  TRACE_EVENT0("jni", "org::chromium_foo::Instance::InstanceMethod");
-  Instance* native = reinterpret_cast<Instance*>(nativeInstance);
-  CHECK_NATIVE_PTR(env, jcaller, native, "InstanceMethod");
-  return native->InstanceMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static void JNI_Foo_StaticMethod(JNIEnv* env);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeStaticMethod(
-    JNIEnv* env,
-    jclass jcaller) {
-  TRACE_EVENT0("jni", "org::chromium_foo::JNI_Foo_StaticMethod");
-  return JNI_Foo_StaticMethod(env);
-}
-
-
-static std::atomic<jmethodID> g_org_chromium_foo_Foo_Constructor(nullptr);
-static base::android::ScopedJavaLocalRef<jobject> Java_Foo_Constructor(JNIEnv* env) {
-  jclass clazz = org_chromium_foo_Foo_clazz(env);
-  CHECK_CLAZZ(env, clazz,
-      org_chromium_foo_Foo_clazz(env), NULL);
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "<init>",
-          "()V",
-          &g_org_chromium_foo_Foo_Constructor);
-
-  TRACE_EVENT0("jni", "org.chromium.foo.Foo.<init>");
-  jobject ret =
-      env->NewObject(clazz,
-          call_context.base.method_id);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static std::atomic<jmethodID> g_org_chromium_foo_Foo_callbackFromNative(nullptr);
-static void Java_Foo_callbackFromNative(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
-  jclass clazz = org_chromium_foo_Foo_clazz(env);
-  CHECK_CLAZZ(env, obj.obj(),
-      org_chromium_foo_Foo_clazz(env));
-
-  jni_generator::JniJavaCallContextChecked call_context;
-  call_context.Init<
-      base::android::MethodID::TYPE_INSTANCE>(
-          env,
-          clazz,
-          "callbackFromNative",
-          "()V",
-          &g_org_chromium_foo_Foo_callbackFromNative);
-
-  TRACE_EVENT0("jni", "org.chromium.foo.Foo.callbackFromNative");
-     env->CallVoidMethod(obj.obj(),
-          call_context.base.method_id);
-}
-
-}  // namespace chromium_foo
-}  // namespace org
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/.gitignore b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/.gitignore
new file mode 100644
index 0000000..a3f6283
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/.gitignore
@@ -0,0 +1 @@
+!/*.class
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleBidirectionalNonProxy.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleBidirectionalNonProxy.java
new file mode 100644
index 0000000..6c7721c
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleBidirectionalNonProxy.java
@@ -0,0 +1,31 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+class SampleBidirectionalNonProxy {
+    /** The pointer to the native Test. */
+    public long nativeTest;
+    private static native int nativeStaticMethod(long nativeTest, int arg1);
+    private native int nativeMethod(long nativeTest, int arg1);
+    @CalledByNative
+    private void testMethodWithParam(int iParam);
+    @CalledByNative
+    private String testMethodWithParamAndReturn(int iParam);
+    @CalledByNative
+    private static int testStaticMethodWithParam(int iParam);
+    @CalledByNative
+    private static double testMethodWithNoParam();
+    @CalledByNative
+    private static String testStaticMethodWithNoParam();
+
+    class MyInnerClass {
+        @NativeCall("MyInnerClass")
+        private native int nativeInit();
+    }
+    class MyOtherInnerClass {
+        @NativeCall("MyOtherInnerClass")
+        private native int nativeInit();
+    }
+}
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
index 9deddf8..30cc9c5 100644
--- a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
@@ -58,6 +58,9 @@
         SampleForTestsJni.get().method(mNativeCPPObject, this);
     }
 
+    // Just a comment to ensure we aren't reading comments:
+    // private native void thisShouldNotExist();
+
     public void finishExample() {
         // We're done, so let's destroy nativePtr object.
         SampleForTestsJni.get().destroy(mNativeCPPObject, this);
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleNonProxy.class b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleNonProxy.class
new file mode 100644
index 0000000..f2bd504
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleNonProxy.class
Binary files differ
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleNonProxy.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleNonProxy.java
new file mode 100644
index 0000000..e91ef4f6
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleNonProxy.java
@@ -0,0 +1,34 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+import android.graphics.Bitmap;
+import android.view.View;
+
+public class SampleNonProxy {
+    interface OnFrameAvailableListener {}
+    private native int nativeInit();
+    private native void nativeDestroy(int nativeChromeBrowserProvider);
+    private native long nativeAddBookmark(int nativeChromeBrowserProvider, String url, String title,
+            boolean isFolder, long parentId);
+    private static native String nativeGetDomainAndRegistry(String url);
+    private static native void nativeCreateHistoricalTabFromState(byte[] state, int tabIndex);
+    private native byte[] nativeGetStateAsByteArray(View view);
+    private static native String[] nativeGetAutofillProfileGUIDs();
+    private native void nativeSetRecognitionResults(int sessionId, String[] results);
+    private native long nativeAddBookmarkFromAPI(int nativeChromeBrowserProvider, String url,
+            Long created, Boolean isBookmark, Long date, byte[] favicon, String title,
+            Integer visits);
+    native int nativeFindAll(String find);
+    private static native OnFrameAvailableListener nativeGetInnerClass();
+    private native Bitmap nativeQueryBitmap(int nativeChromeBrowserProvider, String[] projection,
+            String selection, String[] selectionArgs, String sortOrder);
+    private native void nativeGotOrientation(
+            int nativeDataFetcherImplAndroid, double alpha, double beta, double gamma);
+    private static native Throwable nativeMessWithJavaException(Throwable e);
+    class MyInnerClass {
+        private native int nativeInit();
+    }
+}
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleProxyEdgeCases.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleProxyEdgeCases.java
new file mode 100644
index 0000000..6d1f8a5
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleProxyEdgeCases.java
@@ -0,0 +1,19 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+class SampleProxyEdgeCases {
+    @NativeMethods
+    interface Natives {
+        void foo__weirdly__escaped_name1();
+        String[][] crazyTypes(int[] a, Object[][] b);
+        void fooForTest();
+        void fooForTesting();
+    }
+
+    // Non-proxy natives in same file.
+    native void nativeInstanceMethod(long nativeInstance);
+    static native void nativeStaticMethod();
+}
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleUniqueAnnotations.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleUniqueAnnotations.java
new file mode 100644
index 0000000..257359f
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleUniqueAnnotations.java
@@ -0,0 +1,26 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+@JNIAdditionalImport({Bar1.class, Bar2.class})
+class SampleUniqueAnnotations {
+    // Poorly spaced intentionally
+    private void do_not_match();
+    @VisibleForTesting
+    @NativeMethods
+
+    @Generated("Test")
+    interface Natives {
+        @NativeClassQualifiedName("FooAndroid::BarDelegate")
+
+        void foo(long nativePtr);
+        int bar(int x, int y);
+    }
+
+    @CalledByNative
+    static void useBar1(Bar1.Inner inner) {}
+    @NativeClassQualifiedName("Foo::Bar")
+    native void nativeCallWithQualifiedObject(long nativePtr);
+}
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/TinySample.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/TinySample.java
new file mode 100644
index 0000000..2018d76
--- /dev/null
+++ b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/TinySample.java
@@ -0,0 +1,15 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+import org.chromium.base.annotations.NativeMethods;
+
+class TinySample {
+    @NativeMethods()
+    interface Natives {
+        void foo();
+        boolean bar(int a);
+    }
+}
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 57c8d0a7..d08f38d 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -38,8 +38,7 @@
 
 _EXTRACT_NATIVES_REGEX = re.compile(
     r'(@NativeClassQualifiedName'
-    r'\(\"(?P<native_class_name>.*?)\"\)\s+)?'
-    r'(@NativeCall(\(\"(?P<java_class_name>.*?)\"\))\s+)?'
+    r'\(\"(?P<native_class_name>\S*?)\"\)\s+)?'
     r'(?P<qualifiers>\w+\s\w+|\w+|\s+)\s*native '
     r'(?P<return_type>\S*) '
     r'(?P<name>native\w+)\((?P<params>.*?)\);')
@@ -51,8 +50,7 @@
 # doesn't require name to be prefixed with native, and does not
 # require a native qualifier.
 _EXTRACT_METHODS_REGEX = re.compile(
-    r'(@NativeClassQualifiedName'
-    r'\(\"(?P<native_class_name>.*?)\"\)\s*)?'
+    r'(@NativeClassQualifiedName\(\"(?P<native_class_name>\S*?)\"\)\s*)?'
     r'(?P<qualifiers>'
     r'((public|private|static|final|abstract|protected|native)\s*)*)\s+'
     r'(?P<return_type>\S*)\s+'
@@ -124,7 +122,6 @@
 
   def __init__(self, **kwargs):
     self.static = kwargs['static']
-    self.java_class_name = kwargs['java_class_name']
     self.return_type = kwargs['return_type']
     self.params = kwargs['params']
     self.is_proxy = kwargs.get('is_proxy', False)
@@ -547,7 +544,6 @@
   for match in _EXTRACT_NATIVES_REGEX.finditer(contents):
     native = NativeMethod(
         static='static' in match.group('qualifiers'),
-        java_class_name=match.group('java_class_name'),
         native_class_name=match.group('native_class_name'),
         return_type=match.group('return_type'),
         name=match.group('name').replace('native', ''),
@@ -970,7 +966,6 @@
             fully_qualified_class, name, use_hash=True)
         native = NativeMethod(
             static=True,
-            java_class_name=None,
             return_type=return_type,
             name=name,
             native_class_name=method.group('native_class_name'),
@@ -1064,8 +1059,6 @@
     template = Template('Java_${JAVA_NAME}_native${NAME}')
 
     java_name = self.fully_qualified_class
-    if native.java_class_name:
-      java_name += '$' + native.java_class_name
 
     values = {'NAME': native.name, 'JAVA_NAME': EscapeClassName(java_name)}
     return template.substitute(values)
@@ -1082,7 +1075,7 @@
 
       class_name = self.class_name
       jni_class_path = self.fully_qualified_class
-      if entry.java_class_name:
+      if isinstance(entry, CalledByNative) and entry.java_class_name:
         class_name = entry.java_class_name
         jni_class_path = self.fully_qualified_class + '$' + class_name
       ret[class_name] = jni_class_path
@@ -1206,7 +1199,7 @@
 #endif  // ${HEADER_GUARD}
 """)
     values = {
-        'SCRIPT_NAME': self.options.script_name,
+        'SCRIPT_NAME': GetScriptName(),
         'FULLY_QUALIFIED_CLASS': self.fully_qualified_class,
         'CLASS_PATH_DEFINITIONS': self.GetClassPathDefinitionsString(),
         'CONSTANT_FIELDS': self.GetConstantFieldsString(),
@@ -1294,12 +1287,7 @@
         })
 
   def GetImplementationMethodName(self, native):
-    class_name = self.class_name
-    if native.java_class_name is not None:
-      # Inner class
-      class_name = native.java_class_name
-
-    return 'JNI_%s_%s' % (class_name, native.name)
+    return 'JNI_%s_%s' % (self.class_name, native.name)
 
   def GetNativeStub(self, native):
     is_method = native.type == 'method'
@@ -1628,11 +1616,6 @@
                       dest='output_names',
                       help='Output filenames within output directory.')
   parser.add_argument(
-      '--script_name',
-      default=GetScriptName(),
-      help='The name of this script in the generated '
-      'header.')
-  parser.add_argument(
       '--includes',
       help='The comma-separated list of header files to '
       'include in the generated header.')
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py
index 84952e5..e2f9c1d 100755
--- a/base/android/jni_generator/jni_generator_tests.py
+++ b/base/android/jni_generator/jni_generator_tests.py
@@ -23,12 +23,8 @@
 import jni_generator
 import jni_registration_generator
 import zipfile
-from jni_generator import CalledByNative
-from jni_generator import NativeMethod
-from jni_generator import Param
-from jni_generator import ProxyHelpers
+from util import build_utils
 
-_SCRIPT_NAME = 'base/android/jni_generator/jni_generator.py'
 _INCLUDES = ('base/android/jni_generator/jni_generator_helper.h')
 _JAVA_SRC_DIR = os.path.join('java', 'src', 'org', 'chromium', 'example',
                              'jni_generator')
@@ -38,24 +34,15 @@
 _REBASELINE_ENV = 'REBASELINE'
 
 
-def _RemoveHashedNames(natives):
-  ret = []
-  for n in natives:
-    ret.append(jni_generator.NativeMethod(**n.__dict__))
-    ret[-1].hashed_proxy_name = None
-  return ret
-
-
 class JniGeneratorOptions(object):
   """The mock options object which is passed to the jni_generator.py script."""
 
   def __init__(self):
     self.namespace = None
-    self.script_name = _SCRIPT_NAME
     self.includes = _INCLUDES
     self.ptr_type = 'long'
     self.cpp = 'cpp'
-    self.javap = 'mock-javap'
+    self.javap = build_utils.JAVAP_PATH
     self.enable_profiling = False
     self.use_proxy_hash = False
     self.enable_jni_multiplexing = False
@@ -84,41 +71,15 @@
 
 class BaseTest(unittest.TestCase):
 
-  @staticmethod
-  def _MergeRegistrationForTests(results,
-                                 header_guard='HEADER_GUARD',
-                                 namespace='test',
-                                 enable_jni_multiplexing=False):
-
-    results.sort(key=lambda d: d['FULL_CLASS_NAME'])
-
-    combined_dict = {}
-    for key in jni_registration_generator.MERGEABLE_KEYS:
-      combined_dict[key] = ''.join(d.get(key, '') for d in results)
-
-    combined_dict['HEADER_GUARD'] = header_guard
-    combined_dict['NAMESPACE'] = namespace
-
-    if enable_jni_multiplexing:
-      proxy_signatures_list = sorted(
-          set(combined_dict['PROXY_NATIVE_SIGNATURES'].split('\n')))
-      combined_dict['PROXY_NATIVE_SIGNATURES'] = '\n'.join(
-          signature for signature in proxy_signatures_list)
-
-      proxy_native_array_list = sorted(
-          set(combined_dict['PROXY_NATIVE_METHOD_ARRAY'].split('},\n')))
-      combined_dict['PROXY_NATIVE_METHOD_ARRAY'] = '},\n'.join(
-          p for p in proxy_native_array_list if p != '') + '}'
-
-      signature_to_cases = collections.defaultdict(list)
-      for d in results:
-        for signature, cases in d['SIGNATURE_TO_CASES'].items():
-          signature_to_cases[signature].extend(cases)
-      combined_dict[
-          'FORWARDING_CALLS'] = jni_registration_generator._AddForwardingCalls(
-              signature_to_cases, '', '')
-
-    return combined_dict
+  def _TestEndToEndGeneration(self, input_java, options, golden):
+    input_java_path = self._JoinScriptDir(
+        os.path.join(_JAVA_SRC_DIR, input_java))
+    with tempfile.TemporaryDirectory() as tdir:
+      output_path = os.path.join(tdir, 'output.h')
+      jni_generator.GenerateJNIHeader(input_java_path, output_path, options)
+      with open(output_path, 'r') as f:
+        contents = f.read()
+      self.AssertGoldenTextEquals(contents, golden)
 
   def _TestEndToEndRegistration(self,
                                 input_java_src_files,
@@ -142,15 +103,14 @@
               name in name_to_goldens,
               f'Found {name} output, but not present in name_to_goldens map.')
           contents = srcjar.read(name).decode('utf-8')
-          self.AssertGoldenTextEquals(contents,
-                                      golden_file=name_to_goldens[name])
+          self.AssertGoldenTextEquals(contents, name_to_goldens[name])
       if header_golden:
         with open(options.header_path, 'r') as f:
           # Temp directory will cause some diffs each time we run if we don't
           # normalize.
           contents = f.read().replace(
               tdir.replace('/', '_').upper(), 'TEMP_DIR')
-          self.AssertGoldenTextEquals(contents, golden_file=header_golden)
+          self.AssertGoldenTextEquals(contents, header_golden)
 
   def _JoinScriptDir(self, path):
     script_dir = os.path.dirname(sys.argv[0])
@@ -166,40 +126,6 @@
     with open(golden_file_name, 'r') as f:
       return f.read()
 
-  def _CreateJniHeaderFromFile(self, fname, qualified_clazz, options=None):
-    with open(self._JoinScriptDir(fname)) as f:
-      content = f.read()
-    opts = options
-    if opts is None:
-      opts = JniGeneratorOptions()
-
-    jni_from_java = jni_generator.JNIFromJavaSource(content, qualified_clazz,
-                                                    opts)
-    return jni_from_java.GetContent()
-
-  def AssertObjEquals(self, first, second):
-    if isinstance(first, str):
-      return self.assertEqual(first, second)
-    dict_first = first.__dict__
-    dict_second = second.__dict__
-    self.assertEqual(dict_first.keys(), dict_second.keys())
-    for key, value in dict_first.items():
-      if (type(value) is list and len(value)
-          and isinstance(type(value[0]), object)):
-        self.AssertListEquals(value, second.__getattribute__(key))
-      else:
-        actual = second.__getattribute__(key)
-        self.assertEqual(value, actual,
-                         'Key ' + key + ': ' + str(value) + '!=' + str(actual))
-
-  def AssertListEquals(self, first, second):
-    self.assertEqual(len(first), len(second))
-    for i in range(len(first)):
-      if isinstance(first[i], object):
-        self.AssertObjEquals(first[i], second[i])
-      else:
-        self.assertEqual(first[i], second[i])
-
   def AssertTextEquals(self, golden_text, generated_text):
     if not self.CompareText(golden_text, generated_text):
       self.fail('Golden text mismatch.')
@@ -227,22 +153,14 @@
     print('REBASELINE=1', sys.argv[0])
     print('to regenerate the data files.')
 
-  def AssertGoldenTextEquals(self, generated_text, suffix='', golden_file=None):
+  def AssertGoldenTextEquals(self, generated_text, golden_file):
     """Compares generated text with the corresponding golden_file
 
-    By default compares generated_text with the file at
-    script_dir/golden/{caller_name}[suffix].golden. If the parameter
-    golden_file is provided it will instead compare the generated text with
+    It will instead compare the generated text with
     script_dir/golden/golden_file."""
     # This is the caller test method.
     caller = inspect.stack()[1][3]
 
-    if golden_file is None:
-      self.assertTrue(
-          caller.startswith('test'),
-          'AssertGoldenTextEquals can only be called without at golden file '
-          'from a test* method, not %s' % caller)
-      golden_file = '%s%s.golden' % (caller, suffix)
     golden_text = self._ReadGoldenFile(golden_file)
     if os.environ.get(_REBASELINE_ENV):
       if golden_text != generated_text:
@@ -258,1043 +176,37 @@
 
 
 @unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
-class TestGenerator(BaseTest):
+class Tests(BaseTest):
+  def testNonProxy(self):
+    self._TestEndToEndGeneration('SampleNonProxy.java', JniGeneratorOptions(),
+                                 'SampleNonProxy_jni.h.golden')
 
-  def testInspectCaller(self):
+  def testBirectionalNonProxy(self):
+    self._TestEndToEndGeneration('SampleBidirectionalNonProxy.java',
+                                 JniGeneratorOptions(),
+                                 'SampleBidirectionalNonProxy_jni.h.golden')
 
-    def willRaise():
-      # This function can only be called from a test* method.
-      self.AssertGoldenTextEquals('')
+  def testBidirectionalClass(self):
+    self._TestEndToEndGeneration('SampleForTests.java', JniGeneratorOptions(),
+                                 'SampleForTests_jni.h.golden')
+    self._TestEndToEndRegistration(
+        ['SampleForTests.java'], JniRegistrationGeneratorOptions(), {
+            'org/chromium/base/natives/GEN_JNI.java':
+            'SampleForTestsGenJni.java.golden'
+        })
 
-    self.assertRaises(AssertionError, willRaise)
+  def testFromClassFile(self):
+    self._TestEndToEndGeneration('SampleNonProxy.class', JniGeneratorOptions(),
+                                 'SampleNonProxy_class_file_jni.h.golden')
 
-  def testNatives(self):
-    test_data = """"
-    import android.graphics.Bitmap;
-    import android.view.View;
-
-    interface OnFrameAvailableListener {}
-    private native int nativeInit();
-    private native void nativeDestroy(int nativeChromeBrowserProvider);
-    private native long nativeAddBookmark(
-            int nativeChromeBrowserProvider,
-            String url, String title, boolean isFolder, long parentId);
-    private static native String nativeGetDomainAndRegistry(String url);
-    private static native void nativeCreateHistoricalTabFromState(
-            byte[] state, int tab_index);
-    private native byte[] nativeGetStateAsByteArray(View view);
-    private static native String[] nativeGetAutofillProfileGUIDs();
-    private native void nativeSetRecognitionResults(
-            int sessionId, String[] results);
-    private native long nativeAddBookmarkFromAPI(
-            int nativeChromeBrowserProvider,
-            String url, Long created, Boolean isBookmark,
-            Long date, byte[] favicon, String title, Integer visits);
-    native int nativeFindAll(String find);
-    private static native OnFrameAvailableListener nativeGetInnerClass();
-    private native Bitmap nativeQueryBitmap(
-            int nativeChromeBrowserProvider,
-            String[] projection, String selection,
-            String[] selectionArgs, String sortOrder);
-    private native void nativeGotOrientation(
-            int nativeDataFetcherImplAndroid,
-            double alpha, double beta, double gamma);
-    private static native Throwable nativeMessWithJavaException(Throwable e);
-    """
-    jni_params = jni_generator.JniParams(
-        'org/chromium/example/jni_generator/SampleForTests')
-    jni_params.ExtractImportsAndInnerClasses(test_data)
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='Init',
-            params=[],
-            java_class_name=None),
-        NativeMethod(
-            return_type='void',
-            static=False,
-            name='Destroy',
-            params=[Param(datatype='int', name='nativeChromeBrowserProvider')],
-            java_class_name=None),
-        NativeMethod(
-            return_type='long',
-            static=False,
-            name='AddBookmark',
-            params=[
-                Param(datatype='int', name='nativeChromeBrowserProvider'),
-                Param(datatype='String', name='url'),
-                Param(datatype='String', name='title'),
-                Param(datatype='boolean', name='isFolder'),
-                Param(datatype='long', name='parentId')
-            ],
-            java_class_name=None),
-        NativeMethod(
-            return_type='String',
-            static=True,
-            name='GetDomainAndRegistry',
-            params=[Param(datatype='String', name='url')],
-            java_class_name=None),
-        NativeMethod(
-            return_type='void',
-            static=True,
-            name='CreateHistoricalTabFromState',
-            params=[
-                Param(datatype='byte[]', name='state'),
-                Param(datatype='int', name='tab_index')
-            ],
-            java_class_name=None),
-        NativeMethod(
-            return_type='byte[]',
-            static=False,
-            name='GetStateAsByteArray',
-            params=[Param(datatype='View', name='view')],
-            java_class_name=None),
-        NativeMethod(
-            return_type='String[]',
-            static=True,
-            name='GetAutofillProfileGUIDs',
-            params=[],
-            java_class_name=None),
-        NativeMethod(
-            return_type='void',
-            static=False,
-            name='SetRecognitionResults',
-            params=[
-                Param(datatype='int', name='sessionId'),
-                Param(datatype='String[]', name='results')
-            ],
-            java_class_name=None),
-        NativeMethod(
-            return_type='long',
-            static=False,
-            name='AddBookmarkFromAPI',
-            params=[
-                Param(datatype='int', name='nativeChromeBrowserProvider'),
-                Param(datatype='String', name='url'),
-                Param(datatype='Long', name='created'),
-                Param(datatype='Boolean', name='isBookmark'),
-                Param(datatype='Long', name='date'),
-                Param(datatype='byte[]', name='favicon'),
-                Param(datatype='String', name='title'),
-                Param(datatype='Integer', name='visits')
-            ],
-            java_class_name=None),
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='FindAll',
-            params=[Param(datatype='String', name='find')],
-            java_class_name=None),
-        NativeMethod(
-            return_type='OnFrameAvailableListener',
-            static=True,
-            name='GetInnerClass',
-            params=[],
-            java_class_name=None),
-        NativeMethod(
-            return_type='Bitmap',
-            static=False,
-            name='QueryBitmap',
-            params=[
-                Param(datatype='int', name='nativeChromeBrowserProvider'),
-                Param(datatype='String[]', name='projection'),
-                Param(datatype='String', name='selection'),
-                Param(datatype='String[]', name='selectionArgs'),
-                Param(datatype='String', name='sortOrder'),
-            ],
-            java_class_name=None),
-        NativeMethod(
-            return_type='void',
-            static=False,
-            name='GotOrientation',
-            params=[
-                Param(datatype='int', name='nativeDataFetcherImplAndroid'),
-                Param(datatype='double', name='alpha'),
-                Param(datatype='double', name='beta'),
-                Param(datatype='double', name='gamma'),
-            ],
-            java_class_name=None),
-        NativeMethod(
-            return_type='Throwable',
-            static=True,
-            name='MessWithJavaException',
-            params=[Param(datatype='Throwable', name='e')],
-            java_class_name=None)
-    ]
-    self.AssertListEquals(golden_natives, natives)
-    h1 = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
-                                              natives, [], [], jni_params,
-                                              JniGeneratorOptions())
-    self.AssertGoldenTextEquals(h1.GetContent())
-    h2 = jni_registration_generator.DictionaryGenerator(JniGeneratorOptions(),
-                                                        '', '',
-                                                        'org/chromium/TestJni',
-                                                        natives, jni_params)
-    content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
-
-    reg_options = JniRegistrationGeneratorOptions()
-    reg_options.manual_jni_registration = True
-    self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
-        reg_options, '', content),
-                                suffix='Registrations')
-
-  def testInnerClassNatives(self):
-    test_data = """
-    class MyInnerClass {
-      @NativeCall("MyInnerClass")
-      private native int nativeInit();
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='Init',
-            params=[],
-            java_class_name='MyInnerClass')
-    ]
-    self.AssertListEquals(golden_natives, natives)
-    jni_params = jni_generator.JniParams('')
-    h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
-                                             natives, [], [], jni_params,
-                                             JniGeneratorOptions())
-    self.AssertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNativesMultiple(self):
-    test_data = """
-    class MyInnerClass {
-      @NativeCall("MyInnerClass")
-      private native int nativeInit();
-    }
-    class MyOtherInnerClass {
-      @NativeCall("MyOtherInnerClass")
-      private native int nativeInit();
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='Init',
-            params=[],
-            java_class_name='MyInnerClass'),
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='Init',
-            params=[],
-            java_class_name='MyOtherInnerClass')
-    ]
-    self.AssertListEquals(golden_natives, natives)
-    jni_params = jni_generator.JniParams('')
-    h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
-                                             natives, [], [], jni_params,
-                                             JniGeneratorOptions())
-    self.AssertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNativesBothInnerAndOuter(self):
-    test_data = """
-    class MyOuterClass {
-      private native int nativeInit();
-      class MyOtherInnerClass {
-        @NativeCall("MyOtherInnerClass")
-        private native int nativeInit();
-      }
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='Init',
-            params=[],
-            java_class_name=None),
-        NativeMethod(
-            return_type='int',
-            static=False,
-            name='Init',
-            params=[],
-            java_class_name='MyOtherInnerClass')
-    ]
-    self.AssertListEquals(golden_natives, natives)
-    jni_params = jni_generator.JniParams('')
-    h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
-                                             natives, [], [], jni_params,
-                                             JniGeneratorOptions())
-    self.AssertGoldenTextEquals(h.GetContent())
-
-    h2 = jni_registration_generator.DictionaryGenerator(JniGeneratorOptions(),
-                                                        '', '',
-                                                        'org/chromium/TestJni',
-                                                        natives, jni_params)
-    content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
-
-    reg_options = JniRegistrationGeneratorOptions()
-    reg_options.manual_jni_registration = True
-    self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
-        reg_options, '', content),
-                                suffix='Registrations')
-
-  def testCalledByNatives(self):
-    test_data = """"
-    import android.graphics.Bitmap;
-    import android.view.View;
-    import java.io.InputStream;
-    import java.util.List;
-
-    class InnerClass {}
-
-    @CalledByNative
-    @SomeOtherA
-    @SomeOtherB
-    public InnerClass showConfirmInfoBar(int nativeInfoBar,
-            String buttonOk, String buttonCancel, String title, Bitmap icon) {
-        InfoBar infobar = new ConfirmInfoBar(nativeInfoBar, mContext,
-                                             buttonOk, buttonCancel,
-                                             title, icon);
-        return infobar;
-    }
-    @CalledByNative
-    InnerClass showAutoLoginInfoBar(int nativeInfoBar,
-            String realm, String account, String args) {
-        AutoLoginInfoBar infobar = new AutoLoginInfoBar(nativeInfoBar, mContext,
-                realm, account, args);
-        if (infobar.displayedAccountCount() == 0)
-            infobar = null;
-        return infobar;
-    }
-    @CalledByNative("InfoBar")
-    void dismiss();
-    @SuppressWarnings("unused")
-    @CalledByNative
-    private static boolean shouldShowAutoLogin(View view,
-            String realm, String account, String args) {
-        AccountManagerContainer accountManagerContainer =
-            new AccountManagerContainer((Activity)contentView.getContext(),
-            realm, account, args);
-        String[] logins = accountManagerContainer.getAccountLogins(null);
-        return logins.length != 0;
-    }
-    @CalledByNative
-    static InputStream openUrl(String url) {
-        return null;
-    }
-    @CalledByNative
-    private void activateHardwareAcceleration(final boolean activated,
-            final int iPid, final int iType,
-            final int iPrimaryID, final int iSecondaryID) {
-      if (!activated) {
-          return
-      }
-    }
-    @CalledByNative
-    public static @Status int updateStatus(@Status int status) {
-        return getAndUpdateStatus(status);
-    }
-    @CalledByNativeUnchecked
-    private void uncheckedCall(int iParam);
-
-    @CalledByNative
-    public byte[] returnByteArray();
-
-    @CalledByNative
-    public boolean[] returnBooleanArray();
-
-    @CalledByNative
-    public char[] returnCharArray();
-
-    @CalledByNative
-    public short[] returnShortArray();
-
-    @CalledByNative
-    public int[] returnIntArray();
-
-    @CalledByNative
-    public long[] returnLongArray();
-
-    @CalledByNative
-    public double[] returnDoubleArray();
-
-    @CalledByNative
-    public Object[] returnObjectArray();
-
-    @CalledByNative
-    public byte[][] returnArrayOfByteArray();
-
-    @CalledByNative
-    public Bitmap.CompressFormat getCompressFormat();
-
-    @CalledByNative
-    public List<Bitmap.CompressFormat> getCompressFormatList();
-
-    @CalledByNativeForTesting
-    public int[] returnIntArrayForTesting();
-    """
-    jni_params = jni_generator.JniParams('org/chromium/Foo')
-    jni_params.ExtractImportsAndInnerClasses(test_data)
-    called_by_natives = jni_generator.ExtractCalledByNatives(
-        jni_params, test_data)
-    golden_called_by_natives = [
-        CalledByNative(
-            return_type='InnerClass',
-            system_class=False,
-            static=False,
-            name='showConfirmInfoBar',
-            method_id_var_name='showConfirmInfoBar',
-            java_class_name='',
-            params=[
-                Param(datatype='int', name='nativeInfoBar'),
-                Param(datatype='String', name='buttonOk'),
-                Param(datatype='String', name='buttonCancel'),
-                Param(datatype='String', name='title'),
-                Param(datatype='Bitmap', name='icon')
-            ],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='InnerClass',
-            system_class=False,
-            static=False,
-            name='showAutoLoginInfoBar',
-            method_id_var_name='showAutoLoginInfoBar',
-            java_class_name='',
-            params=[
-                Param(datatype='int', name='nativeInfoBar'),
-                Param(datatype='String', name='realm'),
-                Param(datatype='String', name='account'),
-                Param(datatype='String', name='args')
-            ],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='dismiss',
-            method_id_var_name='dismiss',
-            java_class_name='InfoBar',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='boolean',
-            system_class=False,
-            static=True,
-            name='shouldShowAutoLogin',
-            method_id_var_name='shouldShowAutoLogin',
-            java_class_name='',
-            params=[
-                Param(datatype='View', name='view'),
-                Param(datatype='String', name='realm'),
-                Param(datatype='String', name='account'),
-                Param(datatype='String', name='args')
-            ],
-            env_call=('Boolean', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='InputStream',
-            system_class=False,
-            static=True,
-            name='openUrl',
-            method_id_var_name='openUrl',
-            java_class_name='',
-            params=[Param(datatype='String', name='url')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='activateHardwareAcceleration',
-            method_id_var_name='activateHardwareAcceleration',
-            java_class_name='',
-            params=[
-                Param(datatype='boolean', name='activated'),
-                Param(datatype='int', name='iPid'),
-                Param(datatype='int', name='iType'),
-                Param(datatype='int', name='iPrimaryID'),
-                Param(datatype='int', name='iSecondaryID'),
-            ],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='int',
-            system_class=False,
-            static=True,
-            name='updateStatus',
-            method_id_var_name='updateStatus',
-            java_class_name='',
-            params=[
-                Param(annotations=['@Status'], datatype='int', name='status')
-            ],
-            env_call=('Integer', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='uncheckedCall',
-            method_id_var_name='uncheckedCall',
-            java_class_name='',
-            params=[Param(datatype='int', name='iParam')],
-            env_call=('Void', ''),
-            unchecked=True,
-        ),
-        CalledByNative(
-            return_type='byte[]',
-            system_class=False,
-            static=False,
-            name='returnByteArray',
-            method_id_var_name='returnByteArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='boolean[]',
-            system_class=False,
-            static=False,
-            name='returnBooleanArray',
-            method_id_var_name='returnBooleanArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='char[]',
-            system_class=False,
-            static=False,
-            name='returnCharArray',
-            method_id_var_name='returnCharArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='short[]',
-            system_class=False,
-            static=False,
-            name='returnShortArray',
-            method_id_var_name='returnShortArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='int[]',
-            system_class=False,
-            static=False,
-            name='returnIntArray',
-            method_id_var_name='returnIntArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='long[]',
-            system_class=False,
-            static=False,
-            name='returnLongArray',
-            method_id_var_name='returnLongArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='double[]',
-            system_class=False,
-            static=False,
-            name='returnDoubleArray',
-            method_id_var_name='returnDoubleArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='Object[]',
-            system_class=False,
-            static=False,
-            name='returnObjectArray',
-            method_id_var_name='returnObjectArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='byte[][]',
-            system_class=False,
-            static=False,
-            name='returnArrayOfByteArray',
-            method_id_var_name='returnArrayOfByteArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='Bitmap.CompressFormat',
-            system_class=False,
-            static=False,
-            name='getCompressFormat',
-            method_id_var_name='getCompressFormat',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='List<Bitmap.CompressFormat>',
-            system_class=False,
-            static=False,
-            name='getCompressFormatList',
-            method_id_var_name='getCompressFormatList',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='int[]',
-            system_class=False,
-            static=False,
-            name='returnIntArrayForTesting',
-            method_id_var_name='returnIntArrayForTesting',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-    ]
-    self.AssertListEquals(golden_called_by_natives, called_by_natives)
-    h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni', [],
-                                             called_by_natives, [], jni_params,
-                                             JniGeneratorOptions())
-    self.AssertGoldenTextEquals(h.GetContent())
-
-  def testCalledByNativeParseError(self):
-    try:
-      jni_params = jni_generator.JniParams('')
-      jni_generator.ExtractCalledByNatives(
-          jni_params, """
-@CalledByNative
-public static int foo(); // This one is fine
-
-@CalledByNative
-scooby doo
-""")
-      self.fail('Expected a ParseError')
-    except jni_generator.ParseError as e:
-      self.assertEqual(('@CalledByNative', 'scooby doo'), e.context_lines)
-
-  def testFullyQualifiedClassName(self):
-    contents = """
-// Copyright 2010 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.browser;
-
-import org.chromium.base.BuildInfo;
-"""
-    self.assertEqual(
-        'org/chromium/content/browser/Foo',
-        jni_generator.ExtractFullyQualifiedJavaClassName(
-            'org/chromium/content/browser/Foo.java', contents))
-    self.assertEqual(
-        'org/chromium/content/browser/Foo',
-        jni_generator.ExtractFullyQualifiedJavaClassName(
-            'frameworks/Foo.java', contents))
-    self.assertRaises(SyntaxError,
-                      jni_generator.ExtractFullyQualifiedJavaClassName,
-                      'com/foo/Bar', 'no PACKAGE line')
-    self.assertRaises(AssertionError,
-                      jni_generator.ExtractFullyQualifiedJavaClassName,
-                      'com/foo/Bar.kt', 'Kotlin not supported')
-
-  def testMethodNameMangling(self):
-    jni_params = jni_generator.JniParams('')
-    self.assertEqual(
-        'closeV',
-        jni_generator.GetMangledMethodName(jni_params, 'close', [], 'void'))
-    self.assertEqual(
-        'readI_AB_I_I',
-        jni_generator.GetMangledMethodName(jni_params, 'read', [
-            Param(name='p1', datatype='byte[]'),
-            Param(name='p2', datatype='int'),
-            Param(name='p3', datatype='int'),
-        ], 'int'))
-    self.assertEqual(
-        'openJIIS_JLS',
-        jni_generator.GetMangledMethodName(jni_params, 'open', [
-            Param(name='p1', datatype='java/lang/String'),
-        ], 'java/io/InputStream'))
-
-  def testFromJavaPGenerics(self):
-    contents = """
-public abstract class java.util.HashSet<T> extends java.util.AbstractSet<E>
-      implements java.util.Set<E>, java.lang.Cloneable, java.io.Serializable {
-    public void dummy();
-      Signature: ()V
-    public java.lang.Class<?> getClass();
-      Signature: ()Ljava/lang/Class<*>;
-    public static void overloadWithVarargs(java.lang.String...);
-      Signature: ([Ljava/lang/String;)V
-    public static void overloadWithVarargs(android.icu.text.DisplayContext...);
-      Signature: ([Landroid/icu/text/DisplayContext;)V
-}
-"""
-    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                JniGeneratorOptions())
-    self.AssertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testSnippnetJavap6_7_8(self):
-    content_javap6 = """
-public class java.util.HashSet {
-public boolean add(java.lang.Object);
- Signature: (Ljava/lang/Object;)Z
-}
-"""
-
-    content_javap7 = """
-public class java.util.HashSet {
-public boolean add(E);
-  Signature: (Ljava/lang/Object;)Z
-}
-"""
-
-    content_javap8 = """
-public class java.util.HashSet {
-  public boolean add(E);
-    descriptor: (Ljava/lang/Object;)Z
-}
-"""
-
-    jni_from_javap6 = jni_generator.JNIFromJavaP(content_javap6.split('\n'),
-                                                 JniGeneratorOptions())
-    jni_from_javap7 = jni_generator.JNIFromJavaP(content_javap7.split('\n'),
-                                                 JniGeneratorOptions())
-    jni_from_javap8 = jni_generator.JNIFromJavaP(content_javap8.split('\n'),
-                                                 JniGeneratorOptions())
-    self.assertTrue(jni_from_javap6.GetContent())
-    self.assertTrue(jni_from_javap7.GetContent())
-    self.assertTrue(jni_from_javap8.GetContent())
-    # Ensure the javap7 is correctly parsed and uses the Signature field rather
-    # than the "E" parameter.
-    self.AssertTextEquals(jni_from_javap6.GetContent(),
-                          jni_from_javap7.GetContent())
-    # Ensure the javap8 is correctly parsed and uses the descriptor field.
-    self.AssertTextEquals(jni_from_javap7.GetContent(),
-                          jni_from_javap8.GetContent())
-
-  def testFromJavaP(self):
-    contents = self._ReadGoldenFile('testInputStream.javap')
-    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                JniGeneratorOptions())
-    self.assertEqual(10, len(jni_from_javap.called_by_natives))
-    self.AssertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testConstantsFromJavaP(self):
-    for f in ['testMotionEvent.javap', 'testMotionEvent.javap7']:
-      contents = self._ReadGoldenFile(f)
-      jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                  JniGeneratorOptions())
-      self.assertEqual(86, len(jni_from_javap.called_by_natives))
-      self.AssertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testREForNatives(self):
-    # We should not match "native SyncSetupFlow" inside the comment.
-    test_data = """
-    /**
-     * Invoked when the setup process is complete so we can disconnect from the
-     * private native void nativeSyncSetupFlowHandler();.
-     */
-    public void destroy() {
-        Log.v(TAG, "Destroying native SyncSetupFlow");
-        if (mNativeSyncSetupFlow != 0) {
-            nativeSyncSetupEnded(mNativeSyncSetupFlow);
-            mNativeSyncSetupFlow = 0;
-        }
-    }
-    private native void nativeSyncSetupEnded(
-        int nativeAndroidSyncSetupFlowHandler);
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data, 'foo/bar',
-                                                    JniGeneratorOptions())
-    self.AssertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testRaisesOnNonJNIMethod(self):
-    test_data = """
-    class MyInnerClass {
-      private int Foo(int p0) {
-      }
-    }
-    """
-    self.assertRaises(SyntaxError, jni_generator.JNIFromJavaSource, test_data,
-                      'foo/bar', JniGeneratorOptions())
-
-  def testJniSelfDocumentingExample(self):
-    generated_text = self._CreateJniHeaderFromFile(
-        os.path.join(_JAVA_SRC_DIR, 'SampleForTests.java'),
-        'org/chromium/example/jni_generator/SampleForTests')
-    self.AssertGoldenTextEquals(
-        generated_text, golden_file='SampleForTests_jni.golden')
-
-  def testNoWrappingPreprocessorLines(self):
-    test_data = """
-    package com.google.lookhowextremelylongiam.snarf.icankeepthisupallday;
-
-    class ReallyLongClassNamesAreAllTheRage {
-        private static native int nativeTest();
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, ('com/google/lookhowextremelylongiam/snarf/'
-                    'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'),
-        JniGeneratorOptions())
-    jni_lines = jni_from_java.GetContent().split('\n')
-    line = next(
-        line for line in jni_lines if line.lstrip().startswith('#ifndef'))
-    self.assertTrue(
-        len(line) > 80, ('Expected #ifndef line to be > 80 chars: ', line))
-
-  def testImports(self):
-    import_header = """
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.app;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.SurfaceTexture;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Surface;
-
-import java.util.ArrayList;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.content.app.ContentMain;
-import org.chromium.content.browser.SandboxedProcessConnection;
-import org.chromium.content.common.ISandboxedProcessCallback;
-import org.chromium.content.common.ISandboxedProcessService;
-import org.chromium.content.common.WillNotRaise.AnException;
-import org.chromium.content.common.WillRaise.AnException;
-
-import static org.chromium.Bar.Zoo;
-
-class Foo {
-  public static class BookmarkNode implements Parcelable {
-  }
-  public interface PasswordListObserver {
-  }
-}
-    """
-    jni_params = jni_generator.JniParams('org/chromium/content/app/Foo')
-    jni_params.ExtractImportsAndInnerClasses(import_header)
-    self.assertTrue('Lorg/chromium/content/common/ISandboxedProcessService' in
-                    jni_params._imports)
-    self.assertTrue('Lorg/chromium/Bar/Zoo' in jni_params._imports)
-    self.assertTrue('Lorg/chromium/content/app/Foo$BookmarkNode' in jni_params.
-                    _inner_classes)
-    self.assertTrue('Lorg/chromium/content/app/Foo$PasswordListObserver' in
-                    jni_params._inner_classes)
-    self.assertEqual('Lorg/chromium/content/app/ContentMain$Inner;',
-                     jni_params.JavaToJni('ContentMain.Inner'))
-    self.assertRaises(SyntaxError, jni_params.JavaToJni, 'AnException')
-
-  def testJniParamsJavaToJni(self):
-    jni_params = jni_generator.JniParams('')
-    self.AssertTextEquals('I', jni_params.JavaToJni('int'))
-    self.AssertTextEquals('[B', jni_params.JavaToJni('byte[]'))
-    self.AssertTextEquals('[Ljava/nio/ByteBuffer;',
-                          jni_params.JavaToJni('java/nio/ByteBuffer[]'))
-
-  def testNativesLong(self):
-    test_options = JniGeneratorOptions()
-    test_options.ptr_type = 'long'
-    test_data = """"
-    private native void nativeDestroy(long nativeChromeBrowserProvider);
-    """
-    jni_params = jni_generator.JniParams('')
-    jni_params.ExtractImportsAndInnerClasses(test_data)
-    natives = jni_generator.ExtractNatives(test_data, test_options.ptr_type)
-    golden_natives = [
-        NativeMethod(
-            return_type='void',
-            static=False,
-            name='Destroy',
-            params=[Param(datatype='long', name='nativeChromeBrowserProvider')],
-            java_class_name=None,
-            ptr_type=test_options.ptr_type),
-    ]
-    self.AssertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
-                                             natives, [], [], jni_params,
-                                             test_options)
-    self.AssertGoldenTextEquals(h.GetContent())
-
-  def testNativeExportsOnlyOption(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    /** The pointer to the native Test. */
-    long nativeTest;
-
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-        private native int nativeMethod(long nativeTest, int arg1);
-        @CalledByNative
-        private void testMethodWithParam(int iParam);
-        @CalledByNative
-        private String testMethodWithParamAndReturn(int iParam);
-        @CalledByNative
-        private static int testStaticMethodWithParam(int iParam);
-        @CalledByNative
-        private static double testMethodWithNoParam();
-        @CalledByNative
-        private static String testStaticMethodWithNoParam();
-
-        class MyInnerClass {
-          @NativeCall("MyInnerClass")
-          private native int nativeInit();
-        }
-        class MyOtherInnerClass {
-          @NativeCall("MyOtherInnerClass")
-          private native int nativeInit();
-        }
-    }
-    """
-    options = JniGeneratorOptions()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, 'org/chromium/example/jni_generator/SampleForTests', options)
-    self.AssertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testOuterInnerRaises(self):
-    test_data = """
-    package org.chromium.media;
-
-    @CalledByNative
-    static int getCaptureFormatWidth(VideoCapture.CaptureFormat format) {
-        return format.getWidth();
-    }
-    """
-
-    def willRaise():
-      jni_generator.JNIFromJavaSource(test_data,
-                                      'org/chromium/media/VideoCaptureFactory',
-                                      JniGeneratorOptions())
-
-    self.assertRaises(SyntaxError, willRaise)
-
-  def testSingleJNIAdditionalImport(self):
-    test_data = """
-    package org.chromium.foo;
-
-    @JNIAdditionalImport(Bar.class)
-    class Foo {
-
-    @CalledByNative
-    private static void calledByNative(Bar.Callback callback) {
-    }
-
-    private static native void nativeDoSomething(Bar.Callback callback);
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    JniGeneratorOptions())
-    self.AssertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testMultipleJNIAdditionalImport(self):
-    test_data = """
-    package org.chromium.foo;
-
-    @JNIAdditionalImport({Bar1.class, Bar2.class})
-    class Foo {
-
-    @CalledByNative
-    private static void calledByNative(Bar1.Callback callback1,
-                                       Bar2.Callback callback2) {
-    }
-
-    private static native void nativeDoSomething(Bar1.Callback callback1,
-                                                 Bar2.Callback callback2);
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    JniGeneratorOptions())
-    self.AssertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testStaticBindingCaller(self):
-    test_data = """
-    package org.chromium.foo;
-
-    class Bar {
-      static native void nativeShouldBindCaller(Object caller);
-      static native void nativeShouldBindCaller(Object caller, int a);
-      static native void nativeFoo(long nativeNativeObject, Bar caller);
-      static native void nativeFoo(long nativeNativeObject, Bar caller, int a);
-      native void nativeCallNativeMethod(long nativePtr);
-      @NativeClassQualifiedName("Foo::Bar")
-      native void nativeCallWithQualifiedObject(long nativePtr);
-    }
-    """
-
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    JniGeneratorOptions())
-    self.AssertGoldenTextEquals(jni_from_java.GetContent())
+  def testUniqueAnnotations(self):
+    self._TestEndToEndGeneration('SampleUniqueAnnotations.java',
+                                 JniGeneratorOptions(),
+                                 'SampleUniqueAnnotations_jni.h.golden')
 
   def testSplitNameExample(self):
-    opts = JniGeneratorOptions()
-    opts.split_name = "sample"
-    generated_text = self._CreateJniHeaderFromFile(
-        os.path.join(_JAVA_SRC_DIR, 'SampleForTests.java'),
-        'org/chromium/example/jni_generator/SampleForTests', opts)
-    self.AssertGoldenTextEquals(
-        generated_text, golden_file='SampleForTestsWithSplit_jni.golden')
-
-
-@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
-class ProxyTestGenerator(BaseTest):
-
-  def _BuildRegDictFromSample(self):
-    path = self._JoinScriptDir(
-        os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java'))
-    reg_dict = jni_registration_generator._DictForPath(
-        JniRegistrationGeneratorOptions(), path)
-    reg_dict = self._MergeRegistrationForTests([reg_dict])
-
-    return reg_dict
+    self._TestEndToEndGeneration('SampleForTests.java', JniGeneratorOptions(),
+                                 'SampleForTestsWithSplit_jni.h.golden')
 
   def testEndToEndProxyHashed(self):
     input_java_files = ['SampleForAnnotationProcessor.java']
@@ -1302,8 +214,8 @@
     options.use_proxy_hash = True
     name_to_goldens = {
         'org/chromium/base/natives/GEN_JNI.java':
-        'HashedSampleForAnnotationProcessorGenJni.2.golden',
-        'J/N.java': 'HashedSampleForAnnotationProcessorGenJni.golden'
+        'SampleForAnnotationProcessor_proxy_GenJni.java.golden',
+        'J/N.java': 'SampleForAnnotationProcessor_proxy_JN.java.golden'
     }
     self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
 
@@ -1319,7 +231,7 @@
         input_java_files,
         options,
         name_to_goldens,
-        header_golden='SampleForAnnotationProcessorManualJni.golden')
+        header_golden='SampleForAnnotationProcessor_manual.h.golden')
 
   def testEndToEndProxyJniWithModules(self):
     input_java_files = [
@@ -1330,436 +242,130 @@
     options.module_name = 'module'
     name_to_goldens = {
         'org/chromium/base/natives/GEN_JNI.java':
-        'HashedSampleForAnnotationProcessorGenJni.2.golden',
-        'J/N.java': 'HashedSampleForAnnotationProcessorGenJni.golden',
-        'org/chromium/base/natives/module_GEN_JNI.java': 'ModuleGenJni.golden',
-        'J/module_N.java': 'ModuleJN.golden'
+        'SampleForAnnotationProcessor_proxy_GenJni.java.golden',
+        'J/N.java': 'SampleForAnnotationProcessor_proxy_JN.java.golden',
+        'org/chromium/base/natives/module_GEN_JNI.java':
+        'SampleModuleGenJni.golden',
+        'J/module_N.java': 'SampleModuleJN.golden'
     }
     self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
 
-  def testProxyNativesWithNatives(self):
-    test_data = """
-    package org.chromium.foo;
-
-    class Foo {
-
-    @NativeMethods
-    interface Natives {
-       void foo();
-       String bar(String s, int y, char x, short z);
-       String[] foobar(String[] a);
-       void baz(long nativePtr, BazClass caller);
-       void fooBar(long nativePtr);
-    }
-
-    void justARegularFunction();
-
-    native void nativeInstanceMethod(long nativeInstance);
-    static native void nativeStaticMethod();
-
-    }
-    """
-    options_with_tracing = JniGeneratorOptions()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, 'org/chromium/foo/Foo', options_with_tracing)
-    self.AssertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testEscapingProxyNatives(self):
-    test_data = """
-    class SampleProxyJni {
-      @NativeMethods
-      interface Natives {
-        void foo_bar();
-        void foo__bar();
-      }
-    }
-    """
-    qualified_clazz = 'org/chromium/example/SampleProxyJni'
-
-    natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
-        qualified_clazz, test_data, 'long')
-
-    golden_natives = [
-        NativeMethod(
-            return_type='void',
-            static=True,
-            name='foo_bar',
-            params=[],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_foo_1bar'),
-        NativeMethod(
-            return_type='void',
-            static=True,
-            name='foo__bar',
-            params=[],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_foo_1_1bar'),
-    ]
-
-    self.AssertListEquals(_RemoveHashedNames(natives), golden_natives)
-
   def testForTestingKept(self):
-    test_data = """
-    class SampleProxyJni {
-      @NativeMethods
-      interface Natives {
-        void fooForTesting();
-        void fooForTest();
-      }
+    input_java_file = 'SampleProxyEdgeCases.java'
+    gen_options = JniGeneratorOptions()
+    gen_options.include_test_only = True
+    self._TestEndToEndGeneration(
+        input_java_file, gen_options,
+        'SampleForProxyEdgeCases_test_kept_jni.h.golden')
+    options = JniRegistrationGeneratorOptions()
+    options.use_proxy_hash = True
+    options.include_test_only = True
+    name_to_goldens = {
+        'org/chromium/base/natives/GEN_JNI.java':
+        'SampleForProxyEdgeCases_test_kept_GenJni.java.golden',
+        'J/N.java': 'SampleForProxyEdgeCases_test_kept_JN.java.golden'
     }
-    """
-    qualified_clazz = 'org/chromium/example/SampleProxyJni'
-
-    natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
-        qualified_clazz, test_data, 'long', True)
-
-    golden_natives = [
-        NativeMethod(
-            return_type='void',
-            static=True,
-            name='fooForTesting',
-            params=[],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_fooForTesting'),
-        NativeMethod(
-            return_type='void',
-            static=True,
-            name='fooForTest',
-            params=[],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_fooForTest'),
-    ]
-
-    self.AssertListEquals(_RemoveHashedNames(natives), golden_natives)
+    self._TestEndToEndRegistration([input_java_file], options, name_to_goldens)
 
   def testForTestingRemoved(self):
-    test_data = """
-    class SampleProxyJni {
-      @NativeMethods
-      interface Natives {
-        void fooForTesting();
-        void fooForTest();
-      }
-    }
-    """
-    qualified_clazz = 'org/chromium/example/SampleProxyJni'
-
-    natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
-        qualified_clazz, test_data, 'long', False)
-
-    self.AssertListEquals(_RemoveHashedNames(natives), [])
-
-  def testProxyNatives(self):
-    test_data = """
-    class SampleProxyJni {
-      private void do_not_match();
-      @VisibleForTesting
-      @NativeMethods
-      @Generated("Test")
-      interface Natives {
-        @NativeClassQualifiedName("FooAndroid::BarDelegate")
-        void foo(long nativePtr);
-        int bar(int x, int y);
-        String foobar(String x, String y);
-      }
-      void dontmatchme();
-      public static void metoo();
-      public static native void this_is_a_non_proxy_native();
-    }
-    """
-
-    bad_spaced_test_data = """
-    class SampleProxyJni{
-      @NativeMethods interface
-      Natives
-
-
-      { @NativeClassQualifiedName("FooAndroid::BarDelegate") void
-    foo(long nativePtr);
-      int              bar(int
-      x,  int y); String
-        foobar(String x, String y);
-      }
-
-    }
-    """
-
-    qualified_clazz = 'org/chromium/example/SampleProxyJni'
-
-    natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
-        qualified_clazz, test_data, 'long')
-    bad_spacing_natives, _ = jni_generator.ProxyHelpers \
-      .ExtractStaticProxyNatives(qualified_clazz, bad_spaced_test_data, 'long')
-    golden_natives = [
-        NativeMethod(
-            return_type='void',
-            static=True,
-            name='foo',
-            native_class_name='FooAndroid::BarDelegate',
-            params=[Param(datatype='long', name='nativePtr')],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_foo',
-            ptr_type='long'),
-        NativeMethod(
-            return_type='int',
-            static=True,
-            name='bar',
-            params=[
-                Param(datatype='int', name='x'),
-                Param(datatype='int', name='y')
-            ],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_bar'),
-        NativeMethod(
-            return_type='String',
-            static=True,
-            name='foobar',
-            params=[
-                Param(datatype='String', name='x'),
-                Param(datatype='String', name='y')
-            ],
-            java_class_name=None,
-            is_proxy=True,
-            proxy_name='org_chromium_example_SampleProxyJni_foobar'),
-    ]
-    self.AssertListEquals(golden_natives, _RemoveHashedNames(natives))
-    self.AssertListEquals(golden_natives,
-                          _RemoveHashedNames(bad_spacing_natives))
-    options = JniGeneratorOptions()
-    reg_options = JniRegistrationGeneratorOptions()
-    reg_options.manual_jni_registration = True
-
-    jni_params = jni_generator.JniParams(qualified_clazz)
-    h1 = jni_generator.InlHeaderFileGenerator('', '', qualified_clazz, natives,
-                                              [], [], jni_params, options)
-    self.AssertGoldenTextEquals(h1.GetContent())
-    h2 = jni_registration_generator.DictionaryGenerator(reg_options, '', '',
-                                                        qualified_clazz,
-                                                        natives, jni_params)
-    content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
-
-
-    self.AssertGoldenTextEquals(
-        jni_registration_generator.CreateProxyJavaFromDict(
-            reg_options, '', content),
-        suffix='Java')
-
-    self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
-        reg_options, '', content),
-                                suffix='Registrations')
-
-  def testProxyHashedExample(self):
-    opts = JniGeneratorOptions()
-    opts.use_proxy_hash = True
-    path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
-
-    generated_text = self._CreateJniHeaderFromFile(
-        path, 'org/chromium/example/jni_generator/SampleForAnnotationProcessor',
-        opts)
-    self.AssertGoldenTextEquals(
-        generated_text,
-        golden_file='HashedSampleForAnnotationProcessor_jni.golden')
-
-  def testProxyJniExample(self):
-    generated_text = self._CreateJniHeaderFromFile(
-        os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java'),
-        'org/chromium/example/jni_generator/SampleForAnnotationProcessor')
-    self.AssertGoldenTextEquals(
-        generated_text, golden_file='SampleForAnnotationProcessor_jni.golden')
-
-  def testGenJniFlags(self):
+    input_java_file = 'SampleProxyEdgeCases.java'
+    gen_options = JniGeneratorOptions()
+    gen_options.include_test_only = False
+    self._TestEndToEndGeneration(
+        input_java_file, gen_options,
+        'SampleForProxyEdgeCases_test_removed_jni.h.golden')
     options = JniRegistrationGeneratorOptions()
-    reg_dict = self._BuildRegDictFromSample()
-    content = jni_registration_generator.CreateProxyJavaFromDict(
-        options, '', reg_dict)
-    self.AssertGoldenTextEquals(content, 'Disabled')
+    options.use_proxy_hash = True
+    options.include_test_only = False
+    name_to_goldens = {
+        'org/chromium/base/natives/GEN_JNI.java':
+        'SampleForProxyEdgeCases_test_removed_GenJni.java.golden',
+        'J/N.java': 'SampleForProxyEdgeCases_test_removed_JN.java.golden'
+    }
+    self._TestEndToEndRegistration([input_java_file], options, name_to_goldens)
 
+  def testProxyMocks(self):
+    input_java_files = ['TinySample.java']
+    options = JniRegistrationGeneratorOptions()
     options.enable_proxy_mocks = True
-    content = jni_registration_generator.CreateProxyJavaFromDict(
-        options, '', reg_dict)
-    self.AssertGoldenTextEquals(content, 'MocksEnabled')
-
-    options.require_mocks = True
-    content = jni_registration_generator.CreateProxyJavaFromDict(
-        options, '', reg_dict)
-    self.AssertGoldenTextEquals(content, 'MocksRequired')
-
-  def testProxyTypeInfoPreserved(self):
-    test_data = """
-    package org.chromium.foo;
-
-    class Foo {
-
-    @NativeMethods
-    interface Natives {
-      char[][] fooProxy(byte[][] b);
-      SomeJavaType[][] barProxy(String[][] s, short z);
-      String[] foobarProxy(String[] a, int[][] b);
-      byte[][] bazProxy(long nativePtr, BazClass caller,
-          SomeJavaType[][] someObjects);
+    name_to_goldens = {
+        'org/chromium/base/natives/GEN_JNI.java':
+        'TinySample_enable_mocks_GenJni.java.golden',
     }
-    """
-    natives, _ = ProxyHelpers.ExtractStaticProxyNatives(
-        'org/chromium/foo/FooJni', test_data, 'long')
-    golden_natives = [
-        NativeMethod(
-            static=True,
-            java_class_name=None,
-            return_type='char[][]',
-            name='fooProxy',
-            params=[Param(datatype='byte[][]', name='b')],
-            is_proxy=True,
-            proxy_name='org_chromium_foo_FooJni_fooProxy'),
-        NativeMethod(
-            static=True,
-            java_class_name=None,
-            return_type='Object[][]',
-            name='barProxy',
-            params=[
-                Param(datatype='String[][]', name='s'),
-                Param(datatype='short', name='z')
-            ],
-            is_proxy=True,
-            proxy_name='org_chromium_foo_FooJni_barProxy'),
-        NativeMethod(
-            static=True,
-            java_class_name=None,
-            return_type='String[]',
-            name='foobarProxy',
-            params=[
-                Param(datatype='String[]', name='a'),
-                Param(datatype='int[][]', name='b')
-            ],
-            is_proxy=True,
-            proxy_name='org_chromium_foo_FooJni_foobarProxy'),
-        NativeMethod(
-            static=True,
-            java_class_name=None,
-            return_type='byte[][]',
-            name='bazProxy',
-            params=[
-                Param(datatype='long', name='nativePtr'),
-                Param(datatype='Object', name='caller'),
-                Param(datatype='Object[][]', name='someObjects')
-            ],
-            is_proxy=True,
-            proxy_name='org_chromium_foo_FooJni_bazProxy',
-            ptr_type='long')
-    ]
-    self.AssertListEquals(golden_natives, _RemoveHashedNames(natives))
+    self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
 
+  def testRequireProxyMocks(self):
+    input_java_files = ['TinySample.java']
+    options = JniRegistrationGeneratorOptions()
+    options.enable_proxy_mocks = True
+    options.require_mocks = True
+    name_to_goldens = {
+        'org/chromium/base/natives/GEN_JNI.java':
+        'TinySample_require_mocks_GenJni.java.golden',
+    }
+    self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
 
-@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
-class PackagePrefixTestGenerator(BaseTest):
-  def testJniSelfDocumentingExampleWithPackagePrefix(self):
+  def testPackagePrefixGenerator(self):
     options = JniGeneratorOptions()
     options.package_prefix = 'this.is.a.package.prefix'
-    generated_text = self._CreateJniHeaderFromFile(
-        os.path.join(_JAVA_SRC_DIR, 'SampleForTests.java'),
-        'org/chromium/example/jni_generator/SampleForTests', options)
-    self.AssertGoldenTextEquals(
-        generated_text,
-        golden_file='SampleForTestsWithPackagePrefix_jni.golden')
+    self._TestEndToEndGeneration('SampleForTests.java', options,
+                                 'SampleForTests_package_prefix_jni.h.golden')
 
-  def testProxyPackagePrefixWithManualRegistration(self):
+  def testPackagePrefixWithManualRegistration(self):
     input_java_files = ['SampleForAnnotationProcessor.java']
     options = JniRegistrationGeneratorOptions()
     options.package_prefix = 'this.is.a.package.prefix'
     options.manual_jni_registration = True
     name_to_goldens = {
         'this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI.java':
-        'testProxyPackagePrefixWithManualRegistration.2.golden',
+        'SampleForAnnotationProcessor_package_prefix_manual_GenJni.java.golden',
     }
     self._TestEndToEndRegistration(
         input_java_files, options, name_to_goldens,
-        'testProxyPackagePrefixWithManualRegistrationHeader.golden')
+        'SampleForAnnotationProcessor_package_prefix_manual.h.golden')
 
-  def testProxyPackagePrefixWithProxyHash(self):
+  def testPackagePrefixWithProxyHash(self):
     input_java_files = ['SampleForAnnotationProcessor.java']
     options = JniRegistrationGeneratorOptions()
     options.package_prefix = 'this.is.a.package.prefix'
     options.use_proxy_hash = True
     name_to_goldens = {
         'this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI.java':
-        'testProxyPackagePrefixWithProxyHash.2.golden',
+        'SampleForAnnotationProcessor_package_prefix_proxy_GenJni.java.golden',
         'this/is/a/package/prefix/J/N.java':
-        'testProxyPackagePrefixWithProxyHash.golden',
+        'SampleForAnnotationProcessor_package_prefix_proxy_JN.java.golden',
     }
-    self._TestEndToEndRegistration(
-        input_java_files, options, name_to_goldens,
-        'testProxyPackagePrefixWithProxyHashHeader.golden')
+    self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
 
-  def testProxyPackagePrefixWithManualRegistrationWithProxyHash(self):
+  def testPackagePrefixWithManualRegistrationWithProxyHash(self):
     input_java_files = ['SampleForAnnotationProcessor.java']
     options = JniRegistrationGeneratorOptions()
     options.package_prefix = 'this.is.a.package.prefix'
+    options.use_proxy_hash = True
     options.manual_jni_registration = True
-    options.use_proxy_hash = True
     name_to_goldens = {
         'this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI.java':
-        'testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden',
+        'SampleForAnnotationProcessor_package_prefix_proxy_manual_GenJni.java.golden',
         'this/is/a/package/prefix/J/N.java':
-        'testProxyPackagePrefixWithManualRegistrationProxyHash.golden',
+        'SampleForAnnotationProcessor_package_prefix_proxy_manual_JN.java.golden',
     }
     self._TestEndToEndRegistration(
         input_java_files, options, name_to_goldens,
-        'testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden')
+        'SampleForAnnotationProcessor_package_prefix_proxy_manual.h.golden')
 
-
-@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
-class MultiplexTestGenerator(BaseTest):
-  options = JniRegistrationGeneratorOptions()
-  options.enable_jni_multiplexing = True
-
-  def testProxyMultiplexGenJni(self):
-    path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
-    reg_dict = jni_registration_generator._DictForPath(
-        self.options, self._JoinScriptDir(path))
-    reg_dict = self._MergeRegistrationForTests([reg_dict],
-                                               enable_jni_multiplexing=True)
-
-    self.AssertGoldenTextEquals(
-        jni_registration_generator.CreateProxyJavaFromDict(
-            self.options, '', reg_dict),
-        golden_file='testProxyMultiplexGenJni.golden')
-
-    self.AssertGoldenTextEquals(
-        jni_registration_generator.CreateProxyJavaFromDict(self.options,
-                                                           '',
-                                                           reg_dict,
-                                                           forwarding=True),
-        golden_file='testProxyMultiplexGenJni.2.golden')
-
-  def testProxyMultiplexNatives(self):
-    path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
-    reg_dict = jni_registration_generator._DictForPath(
-        self.options, self._JoinScriptDir(path))
-    reg_dict = self._MergeRegistrationForTests([reg_dict],
-                                               enable_jni_multiplexing=True)
-
-    self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
-        self.options, '', reg_dict),
-                                golden_file='testProxyMultiplexNatives.golden')
-
-  def testProxyMultiplexNativesRegistration(self):
-    path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
-    reg_dict_for_registration = jni_registration_generator._DictForPath(
-        self.options, self._JoinScriptDir(path))
-    reg_dict_for_registration = self._MergeRegistrationForTests(
-        [reg_dict_for_registration], enable_jni_multiplexing=True)
-
-    new_options = copy.copy(self.options)
-    new_options.manual_jni_registration = True
-    self.AssertGoldenTextEquals(
-        jni_registration_generator.CreateFromDict(new_options, '',
-                                                  reg_dict_for_registration),
-        golden_file='testProxyMultiplexNativesRegistration.golden')
+  def testMultiplexing(self):
+    input_java_files = ['SampleForAnnotationProcessor.java']
+    options = JniRegistrationGeneratorOptions()
+    options.enable_jni_multiplexing = True
+    options.use_proxy_hash = True
+    name_to_goldens = {
+        'org/chromium/base/natives/GEN_JNI.java':
+        'SampleForAnnotationProcessor_multiplexing_GenJni.java.golden',
+        'J/N.java': 'SampleForAnnotationProcessor_multiplexing_JN.java.golden',
+    }
+    self._TestEndToEndRegistration(
+        input_java_files, options, name_to_goldens,
+        'SampleForAnnotationProcessor_multiplexing.h.golden')
 
 
 def TouchStamp(stamp_path):
diff --git a/base/android/jni_generator/jni_registration_generator.py b/base/android/jni_generator/jni_registration_generator.py
index 4cb51c2e..4ce3e4e 100755
--- a/base/android/jni_generator/jni_registration_generator.py
+++ b/base/android/jni_generator/jni_registration_generator.py
@@ -534,11 +534,9 @@
           (open_namespace, body, close_namespace)))
 
   def _GetKMethodsString(self, clazz):
-    ret = []
-    for native in self.non_proxy_natives:
-      if (native.java_class_name == clazz
-          or (not native.java_class_name and clazz == self.class_name)):
-        ret += [self._GetKMethodArrayEntry(native)]
+    if clazz != self.class_name:
+      return ''
+    ret = [self._GetKMethodArrayEntry(n) for n in self.non_proxy_natives]
     return '\n'.join(ret)
 
   def _GetKMethodArrayEntry(self, native):
@@ -887,9 +885,8 @@
                           help='Whether to maintain ForTesting JNI methods.')
   arg_parser.add_argument(
       '--package_prefix',
-      help=
-      'Adds a prefix to the classes fully qualified-name. Effectively changing a class name from'
-      'foo.bar -> prefix.foo.bar')
+      help='Adds a prefix to the classes fully qualified-name. Effectively '
+      'changing a class name from foo.bar -> prefix.foo.bar')
   args = arg_parser.parse_args(build_utils.ExpandFileArgs(argv[1:]))
 
   if not args.enable_proxy_mocks and args.require_mocks:
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc
index d74ba605..2732d799 100644
--- a/base/containers/span_unittest.cc
+++ b/base/containers/span_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <stdint.h>
 
+#include <algorithm>
 #include <iterator>
 #include <memory>
 #include <string>
@@ -14,7 +15,6 @@
 
 #include "base/containers/adapters.h"
 #include "base/containers/checked_iterators.h"
-#include "base/cxx17_backports.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_piece.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/base/debug/stack_trace_posix.cc b/base/debug/stack_trace_posix.cc
index 0eaad5c..d39fc492 100644
--- a/base/debug/stack_trace_posix.cc
+++ b/base/debug/stack_trace_posix.cc
@@ -64,7 +64,6 @@
 #endif
 
 #include "base/cfi_buildflags.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/debugger.h"
 #include "base/debug/stack_trace.h"
 #include "base/files/scoped_file.h"
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc
index f46c03e..e1ac670 100644
--- a/base/message_loop/message_pump_win.cc
+++ b/base/message_loop/message_pump_win.cc
@@ -9,7 +9,6 @@
 #include <type_traits>
 
 #include "base/auto_reset.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/alias.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
@@ -415,8 +414,8 @@
   } else {
     // TODO(gab): ::SetTimer()'s documentation claims it does this for us.
     // Consider removing this safety net.
-    delay_msec =
-        clamp(delay_msec, UINT(USER_TIMER_MINIMUM), UINT(USER_TIMER_MAXIMUM));
+    delay_msec = std::clamp(delay_msec, static_cast<UINT>(USER_TIMER_MINIMUM),
+                            static_cast<UINT>(USER_TIMER_MAXIMUM));
 
     // Tell the optimizer to retain the delay to simplify analyzing hangs.
     base::debug::Alias(&delay_msec);
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index 88d1dc4..b1d2c57 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -13,12 +13,12 @@
 #include <limits.h>
 #include <math.h>
 
+#include <algorithm>
 #include <memory>
 #include <string>
 #include <utility>
 
 #include "base/compiler_specific.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/alias.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -953,7 +953,7 @@
   DCHECK_EQ(histogram_->GetHistogramType(), LINEAR_HISTOGRAM);
   LinearHistogram* histogram = static_cast<LinearHistogram*>(histogram_);
   const auto max_value = static_cast<Sample>(histogram->bucket_count() - 1);
-  value = base::clamp(value, 0, max_value);
+  value = std::clamp(value, 0, max_value);
 
   int64_t scaled_count = count / scale_;
   subtle::Atomic32 remainder = static_cast<int>(count - scaled_count * scale_);
diff --git a/base/metrics/histogram_functions.h b/base/metrics/histogram_functions.h
index 22b7ea2..2717fbc 100644
--- a/base/metrics/histogram_functions.h
+++ b/base/metrics/histogram_functions.h
@@ -259,7 +259,7 @@
 // many distinct values to the server (across all users). Concretely, keep the
 // number of distinct values <= 100 ideally, definitely <= 1000. If you have no
 // guarantees on the range of your data, use clamping, e.g.:
-//   UmaHistogramSparse("My.Histogram", base::clamp(value, 0, 200));
+//   UmaHistogramSparse("My.Histogram", std::clamp(value, 0, 200));
 BASE_EXPORT void UmaHistogramSparse(const std::string& name, int sample);
 BASE_EXPORT void UmaHistogramSparse(const char* name, int sample);
 
diff --git a/base/process/memory.cc b/base/process/memory.cc
index 8f0ed9f..b3ebf32 100644
--- a/base/process/memory.cc
+++ b/base/process/memory.cc
@@ -8,7 +8,6 @@
 
 #include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc_buildflags.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/alias.h"
 #include "base/immediate_crash.h"
 #include "base/logging.h"
diff --git a/base/process/process_mac.cc b/base/process/process_mac.cc
index b551ec2..ce1a977 100644
--- a/base/process/process_mac.cc
+++ b/base/process/process_mac.cc
@@ -14,7 +14,6 @@
 #include <iterator>
 #include <memory>
 
-#include "base/cxx17_backports.h"
 #include "base/feature_list.h"
 #include "base/mac/mach_logging.h"
 #include "base/memory/free_deleter.h"
diff --git a/base/profiler/DIR_METADATA b/base/profiler/DIR_METADATA
new file mode 100644
index 0000000..659a446
--- /dev/null
+++ b/base/profiler/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+    component: "Internals>Metrics>SamplingProfiler"
+}
\ No newline at end of file
diff --git a/base/sequence_checker_impl.cc b/base/sequence_checker_impl.cc
index d1c9a84..0824af5 100644
--- a/base/sequence_checker_impl.cc
+++ b/base/sequence_checker_impl.cc
@@ -68,8 +68,7 @@
 
   // SequenceChecker behaves as a ThreadChecker when it is not bound to a
   // valid sequence token.
-  return thread_checker_.CalledOnValidThreadInternal(
-      bound_at, ThreadLocalStorage::HasBeenDestroyed());
+  return thread_checker_.CalledOnValidThreadInternal(bound_at);
 }
 
 void SequenceCheckerImpl::DetachFromSequence() {
diff --git a/base/task/thread_pool/initialization_util.cc b/base/task/thread_pool/initialization_util.cc
index 9a8658a..edf29c9 100644
--- a/base/task/thread_pool/initialization_util.cc
+++ b/base/task/thread_pool/initialization_util.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <cmath>
 
-#include "base/cxx17_backports.h"
 #include "base/system/sys_info.h"
 
 namespace base {
@@ -19,7 +18,7 @@
   const auto num_of_cores = static_cast<size_t>(SysInfo::NumberOfProcessors());
   const size_t threads =
       std::ceil<size_t>(num_of_cores * cores_multiplier) + offset;
-  return clamp(threads, min, max);
+  return std::clamp(threads, min, max);
 }
 
 }  // namespace base
diff --git a/base/task/thread_pool/thread_pool_instance.cc b/base/task/thread_pool/thread_pool_instance.cc
index cd0b13d..d11c385 100644
--- a/base/task/thread_pool/thread_pool_instance.cc
+++ b/base/task/thread_pool/thread_pool_instance.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/check.h"
-#include "base/cxx17_backports.h"
 #include "base/memory/ptr_util.h"
 #include "base/system/sys_info.h"
 #include "base/task/thread_pool/thread_pool_impl.h"
diff --git a/base/threading/thread_checker_impl.cc b/base/threading/thread_checker_impl.cc
index 1d59088..eac7b4b 100644
--- a/base/threading/thread_checker_impl.cc
+++ b/base/threading/thread_checker_impl.cc
@@ -70,50 +70,42 @@
 
 bool ThreadCheckerImpl::CalledOnValidThread(
     std::unique_ptr<debug::StackTrace>* out_bound_at) const {
-  const bool has_thread_been_destroyed = ThreadLocalStorage::HasBeenDestroyed();
-
   AutoLock auto_lock(lock_);
-  return CalledOnValidThreadInternal(out_bound_at, has_thread_been_destroyed);
+  return CalledOnValidThreadInternal(out_bound_at);
 }
 
 bool ThreadCheckerImpl::CalledOnValidThreadInternal(
-    std::unique_ptr<debug::StackTrace>* out_bound_at,
-    bool has_thread_been_destroyed) const {
-  // TaskToken/SequenceToken access thread-local storage. During destruction
-  // the state of thread-local storage is not guaranteed to be in a consistent
-  // state. Further, task-runner only installs the tokens when running a task.
-  if (!has_thread_been_destroyed) {
-    EnsureAssigned();
+    std::unique_ptr<debug::StackTrace>* out_bound_at) const {
+  // If we're detached, bind to current state.
+  EnsureAssigned();
 
-    // Always return true when called from the task from which this
-    // ThreadCheckerImpl was assigned to a thread.
-    if (task_token_ == TaskToken::GetForCurrentThread())
-      return true;
-
-    // If this ThreadCheckerImpl is bound to a valid SequenceToken, it must be
-    // equal to the current SequenceToken and there must be a registered
-    // SingleThreadTaskRunner::CurrentDefaultHandle. Otherwise, the fact that
-    // the current task runs on the thread to which this ThreadCheckerImpl is
-    // bound is fortuitous.
-    if (sequence_token_.IsValid() &&
-        (sequence_token_ != SequenceToken::GetForCurrentThread() ||
-         !SingleThreadTaskRunner::HasCurrentDefault())) {
-      if (out_bound_at && bound_at_) {
-        *out_bound_at = std::make_unique<debug::StackTrace>(*bound_at_);
-      }
-      return false;
-    }
-  } else if (thread_id_.is_null()) {
-    // We're in tls destruction but the |thread_id_| hasn't been assigned yet.
-    // Assign it now. This doesn't call EnsureAssigned() as to do so while in
-    // tls destruction may result in the wrong TaskToken/SequenceToken.
-    if (g_log_thread_and_sequence_checker_binding)
-      bound_at_ = std::make_unique<debug::StackTrace>(size_t{10});
-    thread_id_ = PlatformThread::CurrentRef();
+  // Always return true when called from the task from which this
+  // ThreadCheckerImpl was assigned to a thread.
+  if (task_token_.IsValid() &&
+      task_token_ == TaskToken::GetForCurrentThread()) {
     return true;
   }
 
-  if (thread_id_ != PlatformThread::CurrentRef()) {
+  // If this ThreadCheckerImpl is bound to a valid SequenceToken, it must be
+  // equal to the current SequenceToken and there must be a registered
+  // SingleThreadTaskRunner::CurrentDefaultHandle. Otherwise, the fact that
+  // the current task runs on the thread to which this ThreadCheckerImpl is
+  // bound is fortuitous.
+  //
+  // TODO(pbos): This preserves existing behavior that `sequence_token_` is
+  // ignored after TLS shutdown. It should either be documented here why that is
+  // necessary (shouldn't this destroy on sequence?) or
+  // SequenceCheckerTest.CalledOnValidSequenceFromThreadDestruction should be
+  // updated to reflect the expected behavior.
+  //
+  // See SequenceCheckerImpl::CalledOnValidSequence for additional context.
+  const bool sequence_is_invalid =
+      sequence_token_.IsValid() &&
+      (sequence_token_ != SequenceToken::GetForCurrentThread() ||
+       !SingleThreadTaskRunner::HasCurrentDefault()) &&
+      !ThreadLocalStorage::HasBeenDestroyed();
+
+  if (sequence_is_invalid || thread_id_ != PlatformThread::CurrentRef()) {
     if (out_bound_at && bound_at_) {
       *out_bound_at = std::make_unique<debug::StackTrace>(*bound_at_);
     }
diff --git a/base/threading/thread_checker_impl.h b/base/threading/thread_checker_impl.h
index 0d1d011e..b84b66e 100644
--- a/base/threading/thread_checker_impl.h
+++ b/base/threading/thread_checker_impl.h
@@ -62,8 +62,8 @@
   friend class SequenceCheckerImpl;
 
   [[nodiscard]] bool CalledOnValidThreadInternal(
-      std::unique_ptr<debug::StackTrace>* out_bound_at,
-      bool has_thread_been_destroyed) const EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      std::unique_ptr<debug::StackTrace>* out_bound_at) const
+      EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   // Returns ownership of a pointer to StackTrace where the ThreadCheckerImpl
   // was bound for debug logs, or nullptr if such logging was not enabled at
diff --git a/base/timer/mock_timer.cc b/base/timer/mock_timer.cc
index 1dd9d67..d15a605 100644
--- a/base/timer/mock_timer.cc
+++ b/base/timer/mock_timer.cc
@@ -43,6 +43,11 @@
   FlushPendingTasks(test_task_runner_.get());
 }
 
+void MockOneShotTimer::FireNow() {
+  DCHECK(IsRunning());
+  FlushPendingTasks(test_task_runner_.get());
+}
+
 MockRepeatingTimer::MockRepeatingTimer()
     : RepeatingTimer(&clock_),
       test_task_runner_(MakeRefCounted<TestSimpleTaskRunner>()) {
diff --git a/base/timer/mock_timer.h b/base/timer/mock_timer.h
index 6d07e62..d9b7d7e 100644
--- a/base/timer/mock_timer.h
+++ b/base/timer/mock_timer.h
@@ -24,6 +24,10 @@
   // Testing method.
   void Fire();
 
+  // OneShotTimer::FireNow requires no task runner is set. Override FireNow to
+  // bypass the check.
+  void FireNow() override;
+
  private:
   // Timer implementation.
   // MockOneShotTimer doesn't support SetTaskRunner. Do not use this.
diff --git a/base/timer/mock_timer_unittest.cc b/base/timer/mock_timer_unittest.cc
index 8524cd6..1c05bd3 100644
--- a/base/timer/mock_timer_unittest.cc
+++ b/base/timer/mock_timer_unittest.cc
@@ -51,6 +51,19 @@
   EXPECT_FALSE(timer.IsRunning());
 }
 
+TEST(MockOneShotTimerTest, FireNow) {
+  int calls = 0;
+  base::MockOneShotTimer timer;
+  base::TimeDelta delay = base::Seconds(2);
+  timer.Start(FROM_HERE, delay,
+              base::BindOnce(&CallMeMaybe, base::Unretained(&calls)));
+  EXPECT_EQ(delay, timer.GetCurrentDelay());
+  EXPECT_TRUE(timer.IsRunning());
+  timer.FireNow();
+  EXPECT_FALSE(timer.IsRunning());
+  EXPECT_EQ(1, calls);
+}
+
 class HasWeakPtr : public base::SupportsWeakPtr<HasWeakPtr> {
  public:
   HasWeakPtr() = default;
diff --git a/base/timer/timer.h b/base/timer/timer.h
index afe8302a..b34be71 100644
--- a/base/timer/timer.h
+++ b/base/timer/timer.h
@@ -250,7 +250,7 @@
 
   // Run the scheduled task immediately, and stop the timer. The timer needs to
   // be running.
-  void FireNow();
+  virtual void FireNow();
 
  private:
   void OnStop() final;
diff --git a/base/values.cc b/base/values.cc
index 8b338e33..62dfcdf0 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -14,7 +14,6 @@
 #include "base/check_op.h"
 #include "base/containers/checked_iterators.h"
 #include "base/containers/cxx20_erase_vector.h"
-#include "base/cxx17_backports.h"
 #include "base/cxx20_to_address.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
diff --git a/build/android/gyp/create_app_bundle.py b/build/android/gyp/create_app_bundle.py
index f34f968..12826086 100755
--- a/build/android/gyp/create_app_bundle.py
+++ b/build/android/gyp/create_app_bundle.py
@@ -421,10 +421,14 @@
 
 
 def _GetManifestForModule(bundle_path, module_name):
-  return ElementTree.fromstring(
-      bundletool.RunBundleTool([
-          'dump', 'manifest', '--bundle', bundle_path, '--module', module_name
-      ]))
+  data = bundletool.RunBundleTool(
+      ['dump', 'manifest', '--bundle', bundle_path, '--module', module_name])
+  try:
+    return ElementTree.fromstring(data)
+  except ElementTree.ParseError:
+    sys.stderr.write('Failed to parse:\n')
+    sys.stderr.write(data)
+    raise
 
 
 def _GetComponentNames(manifest, tag_name):
diff --git a/build/android/java/src/org/chromium/build/annotations/MainDex.java b/build/android/java/src/org/chromium/build/annotations/MainDex.java
index 5eedb0b..9bb49f8 100644
--- a/build/android/java/src/org/chromium/build/annotations/MainDex.java
+++ b/build/android/java/src/org/chromium/build/annotations/MainDex.java
@@ -10,12 +10,7 @@
 import java.lang.annotation.Target;
 
 /**
- * Classes with native methods (contain @NativeMethods interfaces) that are used within renderer
- * processes must be annotated with with @MainDex in order for their native methods work.
- *
- * Applies only for Chrome/ChromeModern (not needed for Monochrome+).
- *
- * For Cronet builds, which use a default_min_sdk_version of less than 21, this annotation also
+ * For Cronet builds, which use a default_min_sdk_version of less than 21, this annotation
  * causes classes to appear in the main dex file (for "Legacy multidex").
  */
 @Target(ElementType.TYPE)
diff --git a/build/fuchsia/test/compatible_utils.py b/build/fuchsia/test/compatible_utils.py
index 1351513..d20b419e 100644
--- a/build/fuchsia/test/compatible_utils.py
+++ b/build/fuchsia/test/compatible_utils.py
@@ -171,11 +171,8 @@
     """Get the prefix of a barebone ssh command."""
 
     ssh_addr, ssh_port = parse_host_port(host_port_pair)
-    ssh_config_dir = os.path.expanduser('~/.fuchsia')
-    ssh_config = os.path.join(ssh_config_dir, 'sshconfig')
+    ssh_config = os.path.expanduser('~/.fuchsia/sshconfig')
     if not os.path.isfile(ssh_config):
-        if not os.path.isdir(ssh_config_dir):
-            os.makedirs(ssh_config_dir)
         with open(ssh_config, "w") as f:
             f.write(_SSH_CONFIG)
     return ['ssh', '-F', ssh_config, ssh_addr, '-p', str(ssh_port)]
diff --git a/build/fuchsia/test/test_server_unittests.py b/build/fuchsia/test/test_server_unittests.py
index bba26e7..4874da6 100755
--- a/build/fuchsia/test/test_server_unittests.py
+++ b/build/fuchsia/test/test_server_unittests.py
@@ -58,18 +58,15 @@
             forwarder.Unmap(port_pair[0])
             self.assertEqual(self._subprocess_mock.call_count, 1)
 
-    @mock.patch('os.path.isdir')
     @mock.patch('os.path.isfile')
-    def test_port_forward_exception(self, isfile_mock, isdir_mock) -> None:
+    def test_port_forward_exception(self, isfile_mock) -> None:
         """Tests that exception is raised if |port_forward| command fails."""
 
         cmd_mock = mock.Mock()
         cmd_mock.returncode = 1
         isfile_mock.return_value = False
-        isdir_mock.return_value = False
         self._subprocess_mock.return_value = cmd_mock
         with mock.patch('compatible_utils.open', mock.mock_open()), \
-             mock.patch('os.makedirs'), \
              self.assertRaises(Exception):
             test_server.port_forward(_HOST_PORT_PAIR, _HOST_PORT)
 
diff --git a/build/install-build-deps.py b/build/install-build-deps.py
index 9409a8f..bbe3093 100755
--- a/build/install-build-deps.py
+++ b/build/install-build-deps.py
@@ -146,7 +146,7 @@
     return
 
   distro_id = subprocess.check_output(["lsb_release", "--id",
-                                       "--short"].decode().strip())
+                                       "--short"]).decode().strip()
 
   supported_codenames = ["bionic", "focal", "jammy"]
   supported_ids = ["Debian"]
diff --git a/cc/paint/paint_record.cc b/cc/paint/paint_record.cc
index 0c2c4d67..7fe25474 100644
--- a/cc/paint/paint_record.cc
+++ b/cc/paint/paint_record.cc
@@ -29,7 +29,7 @@
 
 PaintRecord::PaintRecord(sk_sp<PaintOpBuffer> buffer)
     : buffer_(std::move(buffer)) {
-  DCHECK(buffer_);
+  CHECK(buffer_);
 }
 
 // static
diff --git a/chrome/VERSION b/chrome/VERSION
index b170810f..22130ab 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=115
 MINOR=0
-BUILD=5759
+BUILD=5760
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 5b4f0d9..eff92014 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1020,6 +1020,7 @@
       "//chrome/browser/xsurface:java",
       "//chrome/test:sync_integration_test_support_java",
       "//chrome/test/android:chrome_java_unit_test_support",
+      "//components/autofill/android:autofill_features_java",
       "//components/autofill/android:main_autofill_java",
       "//components/autofill/android:prefeditor_autofill_java",
       "//components/background_task_scheduler:background_task_scheduler_java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
index e74319e..16e0c0b4 100644
--- a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
+++ b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
@@ -919,21 +919,6 @@
   java.util.logging.Logger * return _NONNULL_;
 }
 
-# File: ../../third_party/android_deps/libs/com_android_support_support_annotations/support-annotations-28.0.0.jar:META-INF/proguard/androidx-annotations.pro
--keep @android.support.annotation.Keep class * {*;}
-
--keepclasseswithmembers class * {
-    @android.support.annotation.Keep <methods>;
-}
-
--keepclasseswithmembers class * {
-    @android.support.annotation.Keep <fields>;
-}
-
--keepclasseswithmembers class * {
-    @android.support.annotation.Keep <init>(...);
-}
-
 # File: ../../third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/kotlinx-coroutines-android-1.6.4.jar:META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro
 # Allow R8 to optimize away the FastServiceLoader.
 # Together with ServiceLoader optimization in R8
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceOnTabletTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceOnTabletTest.java
index 6995fb2..75746bc 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceOnTabletTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceOnTabletTest.java
@@ -6,7 +6,10 @@
 
 import static org.chromium.chrome.features.start_surface.StartSurfaceTestUtils.START_SURFACE_ON_TABLET_TEST_PARAMS;
 
+import android.content.pm.ActivityInfo;
+import android.content.res.Resources;
 import android.text.TextUtils;
+import android.view.View;
 import android.view.ViewGroup;
 
 import androidx.test.filters.MediumTest;
@@ -20,6 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.CriteriaNotSatisfiedException;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
@@ -27,6 +31,7 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.NewTabPage;
+import org.chromium.chrome.browser.ntp.NewTabPageLayout;
 import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesCarouselLayout;
 import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesGridLayout;
 import org.chromium.chrome.browser.tab.Tab;
@@ -36,10 +41,12 @@
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.embedder_support.util.UrlUtilities;
+import org.chromium.content_public.browser.test.util.JavaScriptUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
 
 import java.io.IOException;
+import java.util.concurrent.TimeoutException;
 
 /**
  * Integration tests of showing a NTP with Start surface UI at startup.
@@ -187,6 +194,128 @@
         Assert.assertFalse(ntp.isSingleTabCardVisibleForTesting());
     }
 
+    @Test
+    @MediumTest
+    @Feature({"StartSurface"})
+    @EnableFeatures({ChromeFeatureList.SHOW_SCROLLABLE_MVT_ON_NTP_ANDROID,
+            ChromeFeatureList.FEED_MULTI_COLUMN, ChromeFeatureList.START_SURFACE_ON_TABLET})
+    // clang-format off
+    public void testFakeSearchBoxWidthShortenedWith1RowMvTitlesAndMultiColumnFeeds() {
+        // clang-format on
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
+        ChromeTabbedActivity cta = mActivityTestRule.getActivity();
+        StartSurfaceTestUtils.waitForTabModel(cta);
+        waitForNtpLoaded(cta.getActivityTab());
+
+        NewTabPage ntp = (NewTabPage) cta.getActivityTab().getNativePage();
+        ViewGroup mvTilesLayout =
+                ntp.getView().findViewById(org.chromium.chrome.test.R.id.mv_tiles_layout);
+        // Verifies that 1 row MV tiles are shown when "Start surface on tablet" flag is enabled.
+        Assert.assertTrue(mvTilesLayout instanceof MostVisitedTilesCarouselLayout);
+
+        Resources res = cta.getResources();
+        int expectedTwoSideMarginPortrait =
+                res.getDimensionPixelSize(org.chromium.chrome.R.dimen.tile_grid_layout_bleed);
+        int expectedTwoSideMarginLandscape =
+                res.getDimensionPixelSize(org.chromium.chrome.R.dimen.ntp_search_box_start_margin)
+                        * 2
+                + expectedTwoSideMarginPortrait;
+
+        // Verifies there is additional margin added for the fake search box in landscape mode,
+        // but not in the portrait mode.
+        verifyFakeSearchBoxWidth(
+                expectedTwoSideMarginLandscape, expectedTwoSideMarginPortrait, ntp);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"StartSurface"})
+    @EnableFeatures({ChromeFeatureList.SHOW_SCROLLABLE_MVT_ON_NTP_ANDROID,
+            ChromeFeatureList.START_SURFACE_ON_TABLET})
+    @DisableFeatures({ChromeFeatureList.FEED_MULTI_COLUMN})
+    // clang-format off
+    public void testFakeSearchBoxWidthNotChangeWith1RowMvTitlesAndMultiColumnFeedsDisabled() {
+        // clang-format on
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
+        ChromeTabbedActivity cta = mActivityTestRule.getActivity();
+        StartSurfaceTestUtils.waitForTabModel(cta);
+        waitForNtpLoaded(cta.getActivityTab());
+
+        NewTabPage ntp = (NewTabPage) cta.getActivityTab().getNativePage();
+        ViewGroup mvTilesLayout =
+                ntp.getView().findViewById(org.chromium.chrome.test.R.id.mv_tiles_layout);
+        // Verifies that 1 row MV tiles are shown when "Start surface on tablet" flag is enabled.
+        Assert.assertTrue(mvTilesLayout instanceof MostVisitedTilesCarouselLayout);
+
+        Resources res = cta.getResources();
+        int expectedMargin =
+                res.getDimensionPixelSize(org.chromium.chrome.R.dimen.tile_grid_layout_bleed);
+
+        // Verifies there isn't additional margin added for the fake search box in bot landscape and
+        // portrait mode when multiple Column Feeds is disabled.
+        verifyFakeSearchBoxWidth(expectedMargin, expectedMargin, ntp);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"StartSurface"})
+    @DisableFeatures({ChromeFeatureList.SHOW_SCROLLABLE_MVT_ON_NTP_ANDROID})
+    @EnableFeatures(
+            {ChromeFeatureList.START_SURFACE_ON_TABLET, ChromeFeatureList.FEED_MULTI_COLUMN})
+    // clang-format off
+    public void testFakeSearchBoxWidthShortenedWith2RowMvTitlesAndMultiColumnFeeds() {
+        // clang-format on
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
+        ChromeTabbedActivity cta = mActivityTestRule.getActivity();
+        StartSurfaceTestUtils.waitForTabModel(cta);
+        waitForNtpLoaded(cta.getActivityTab());
+
+        NewTabPage ntp = (NewTabPage) cta.getActivityTab().getNativePage();
+        ViewGroup mvTilesLayout =
+                ntp.getView().findViewById(org.chromium.chrome.test.R.id.mv_tiles_layout);
+        // Verifies that 2 row MV tiles are shown when "Start surface on tablet" flag is disabled.
+        Assert.assertTrue(mvTilesLayout instanceof MostVisitedTilesGridLayout);
+
+        Resources res = cta.getResources();
+        int expectedTwoSideMargin =
+                res.getDimensionPixelSize(org.chromium.chrome.R.dimen.ntp_search_box_start_margin)
+                        * 2
+                + res.getDimensionPixelSize(org.chromium.chrome.R.dimen.tile_grid_layout_bleed);
+
+        // Verifies there is additional margin added for the fake search box in both landscape
+        // and portrait modes.
+        verifyFakeSearchBoxWidth(expectedTwoSideMargin, expectedTwoSideMargin, ntp);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"StartSurface"})
+    @DisableFeatures({ChromeFeatureList.SHOW_SCROLLABLE_MVT_ON_NTP_ANDROID,
+            ChromeFeatureList.FEED_MULTI_COLUMN})
+    @EnableFeatures({ChromeFeatureList.START_SURFACE_ON_TABLET})
+    // clang-format off
+    public void testFakeSearchBoxWidthNotChangeWith2RowMvTitlesAndMultiColumnFeedsDisabled() {
+        // clang-format on
+        mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL);
+        ChromeTabbedActivity cta = mActivityTestRule.getActivity();
+        StartSurfaceTestUtils.waitForTabModel(cta);
+        waitForNtpLoaded(cta.getActivityTab());
+
+        NewTabPage ntp = (NewTabPage) cta.getActivityTab().getNativePage();
+        ViewGroup mvTilesLayout =
+                ntp.getView().findViewById(org.chromium.chrome.test.R.id.mv_tiles_layout);
+        // Verifies that 2 row MV tiles are shown when "Start surface on tablet" flag is disabled.
+        Assert.assertTrue(mvTilesLayout instanceof MostVisitedTilesGridLayout);
+
+        Resources res = cta.getResources();
+        int expectedMargin =
+                res.getDimensionPixelSize(org.chromium.chrome.R.dimen.tile_grid_layout_bleed);
+
+        // Verifies there isn't additional margin added for the fake search box in bot landscape and
+        // portrait mode when multiple Column Feeds is disabled.
+        verifyFakeSearchBoxWidth(expectedMargin, expectedMargin, ntp);
+    }
+
     private void verifyTabCountAndActiveTabUrl(
             ChromeTabbedActivity cta, int tabCount, String url, Boolean expectHomeSurfaceUiShown) {
         Assert.assertEquals(tabCount, cta.getCurrentTabModel().getCount());
@@ -207,4 +336,42 @@
                     ((NewTabPage) tab.getNativePage()).isLoadedForTests(), Matchers.is(true));
         });
     }
+
+    private void verifyFakeSearchBoxWidth(
+            int expectedLandScapeWidth, int expectedPortraitWidth, NewTabPage ntp) {
+        NewTabPageLayout ntpLayout = ntp.getNewTabPageLayout();
+        View searchBoxLayout = ntpLayout.findViewById(org.chromium.chrome.test.R.id.search_box);
+
+        // Start off in landscape screen orientation.
+        mActivityTestRule.getActivity().setRequestedOrientation(
+                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+        waitForScreenOrientation("\"landscape\"");
+        // Verifies there is additional margins added for the fake search box.
+        Assert.assertEquals(
+                expectedLandScapeWidth, ntpLayout.getWidth() - searchBoxLayout.getWidth());
+
+        // Start off in portrait screen orientation.
+        mActivityTestRule.getActivity().setRequestedOrientation(
+                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        waitForScreenOrientation("\"portrait\"");
+        // Verifies there is additional margins added for the fake search box.
+        Assert.assertEquals(
+                expectedPortraitWidth, ntpLayout.getWidth() - searchBoxLayout.getWidth());
+    }
+
+    private void waitForScreenOrientation(String orientationValue) {
+        CriteriaHelper.pollInstrumentationThread(() -> {
+            try {
+                Criteria.checkThat(screenOrientation(), Matchers.is(orientationValue));
+            } catch (TimeoutException ex) {
+                throw new CriteriaNotSatisfiedException(ex);
+            }
+        });
+    }
+
+    private String screenOrientation() throws TimeoutException {
+        // Returns "\"portrait\"" or "\"landscape\"" (strips the "-primary" or "-secondary" suffix).
+        return JavaScriptUtils.executeJavaScriptAndWaitForResult(
+                mActivityTestRule.getWebContents(), "screen.orientation.type.split('-')[0]");
+    }
 }
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 44a534f..8956a7a0 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -166,6 +166,7 @@
     <dimen name="ntp_logo_margin_bottom">23dp</dimen>
     <dimen name="ntp_search_box_height">48dp</dimen>
     <dimen name="ntp_search_box_bottom_margin">1dp</dimen>
+    <dimen name="ntp_search_box_start_margin">44dp</dimen>
     <dimen name="ntp_search_box_transition_length">16dp</dimen>
     <dimen name="snippets_article_header_height">40dp</dimen>
     <dimen name="snippets_article_header_menu_size">48dp</dimen>
@@ -402,6 +403,8 @@
     <dimen name="virtual_card_enrollment_dialog_google_issuer_message_margin_top">8dp</dimen>
     <dimen name="virtual_card_enrollment_dialog_card_art_width">32dp</dimen>
     <dimen name="virtual_card_enrollment_dialog_card_art_height">20dp</dimen>
+    <dimen name="virtual_card_enrollment_dialog_card_art_width_new">40dp</dimen>
+    <dimen name="virtual_card_enrollment_dialog_card_art_height_new">24dp</dimen>
 
     <!-- Section tab dimensions -->
     <dimen name="section_tab_background_corner_radius">60dp</dimen>
diff --git a/chrome/android/java/res_app/layout/main.xml b/chrome/android/java/res_app/layout/main.xml
index 59e797b..28305a6 100644
--- a/chrome/android/java/res_app/layout/main.xml
+++ b/chrome/android/java/res_app/layout/main.xml
@@ -173,6 +173,13 @@
             android:inflatedId="@+id/page_zoom_layout"
             android:layout="@layout/page_zoom_view" />
 
+        <ViewStub
+            android:id="@+id/quick_delete_animation_stub"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout="@layout/quick_delete_animation_view"
+            android:inflatedId="@+id/quick_delete_animation_layout"/>
+
     </org.chromium.components.browser_ui.widget.CoordinatorLayoutForPointer>
 
     <!-- This empty view is used as the anchor for custom menu -->
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BrowserRestartActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/BrowserRestartActivity.java
index c1d9447..d21ff2c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/BrowserRestartActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/BrowserRestartActivity.java
@@ -12,7 +12,6 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Kills and (optionally) restarts the main Chrome process, then immediately kills itself.
@@ -25,7 +24,6 @@
  * process' Activities.  It works around an Android framework issue for alarms set via the
  * AlarmManager, which requires a minimum alarm duration of 5 seconds: https://crbug.com/515919.
  */
-@MainDex // Runs in a separate process.
 public class BrowserRestartActivity extends Activity {
     public static final String EXTRA_MAIN_PID =
             "org.chromium.chrome.browser.BrowserRestartActivity.main_pid";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index c1460a0..d174bc53 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2269,9 +2269,12 @@
             QuickDeleteMetricsDelegate.recordHistogram(
                     QuickDeleteMetricsDelegate.QuickDeleteAction.MENU_ITEM_CLICKED);
 
+            ViewStub animationStub = findViewById(R.id.quick_delete_animation_stub);
             QuickDeleteController quickDeleteController = new QuickDeleteController(this,
                     new QuickDeleteDelegateImpl(), getModalDialogManager(), getSnackbarManager(),
-                    getLayoutManager(), mTabModelSelector);
+                    getLayoutManager(), mTabModelSelector,
+                    animationStub != null ? animationStub.inflate()
+                                          : findViewById(R.id.quick_delete_animation_layout));
             quickDeleteController.triggerQuickDeleteFlow();
         } else {
             return super.onMenuOrKeyboardAction(id, fromMenu);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialog.java
index d3011f0..bddf9ec7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialog.java
@@ -123,8 +123,8 @@
                         R.string.autofill_virtual_card_enrollment_dialog_card_container_title),
                 mVirtualCardEnrollmentFields.getCardArtUrl(),
                 mVirtualCardEnrollmentFields.getNetworkIconId(),
-                R.dimen.virtual_card_enrollment_dialog_card_art_width,
-                R.dimen.virtual_card_enrollment_dialog_card_art_height,
+                AutofillUiUtils.getVirtualCardEnrollmentDialogIconWidthId(),
+                AutofillUiUtils.getVirtualCardEnrollmentDialogIconHeightId(),
                 R.dimen.virtual_card_enrollment_dialog_card_container_issuer_icon_margin_end,
                 /* cardNameAndNumberTextAppearance= */ R.style.TextAppearance_TextLarge_Primary,
                 /* cardLabelTextAppearance= */ R.style.TextAppearance_TextMedium_Secondary,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
index 25356e5..2a23ef0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
@@ -10,6 +10,7 @@
 
 import androidx.annotation.IdRes;
 import androidx.annotation.Nullable;
+import androidx.core.content.res.ResourcesCompat;
 
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
@@ -18,6 +19,7 @@
 import org.chromium.chrome.browser.app.bookmarks.BookmarkAddEditFolderActivity;
 import org.chromium.chrome.browser.app.bookmarks.BookmarkFolderSelectActivity;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
+import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowSortOrder;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiState.BookmarkUiMode;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkItem;
@@ -63,10 +65,14 @@
         mBookmarkOpener = bookmarkOpener;
         mBookmarkUiPrefs = bookmarkUiPrefs;
 
-        final @BookmarkRowDisplayPref int pref = mBookmarkUiPrefs.getBookmarkRowDisplayPref();
         if (BookmarkFeatures.isAndroidImprovedBookmarksEnabled()) {
             mModel.set(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID,
-                    pref == BookmarkRowDisplayPref.COMPACT ? R.id.compact_view : R.id.visual_view);
+                    getMenuIdFromSortOrder(mBookmarkUiPrefs.getBookmarkRowSortOrder()));
+            final @BookmarkRowDisplayPref int displayPref =
+                    mBookmarkUiPrefs.getBookmarkRowDisplayPref();
+            mModel.set(BookmarkToolbarProperties.CHECKED_VIEW_MENU_ID,
+                    displayPref == BookmarkRowDisplayPref.COMPACT ? R.id.compact_view
+                                                                  : R.id.visual_view);
         }
         bookmarkDelegateSupplier.onAvailable((bookmarkDelegate) -> {
             mBookmarkDelegate = bookmarkDelegate;
@@ -87,15 +93,19 @@
         } else if (id == R.id.normal_options_submenu) {
             return true;
         } else if (id == R.id.sort_by_newest) {
+            mBookmarkUiPrefs.setBookmarkRowSortOrder(BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL);
             mModel.set(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID, id);
             return true;
         } else if (id == R.id.sort_by_oldest) {
+            mBookmarkUiPrefs.setBookmarkRowSortOrder(BookmarkRowSortOrder.CHRONOLOGICAL);
             mModel.set(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID, id);
             return true;
         } else if (id == R.id.sort_by_alpha) {
+            mBookmarkUiPrefs.setBookmarkRowSortOrder(BookmarkRowSortOrder.ALPHABETICAL);
             mModel.set(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID, id);
             return true;
         } else if (id == R.id.sort_by_reverse_alpha) {
+            mBookmarkUiPrefs.setBookmarkRowSortOrder(BookmarkRowSortOrder.REVERSE_ALPHABETICAL);
             mModel.set(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID, id);
             return true;
         } else if (id == R.id.visual_view) {
@@ -269,4 +279,18 @@
             onFolderStateSet(mCurrentFolder);
         }
     }
+
+    private @IdRes int getMenuIdFromSortOrder(@BookmarkRowSortOrder int sortOrder) {
+        switch (sortOrder) {
+            case BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL:
+                return R.id.sort_by_newest;
+            case BookmarkRowSortOrder.CHRONOLOGICAL:
+                return R.id.sort_by_oldest;
+            case BookmarkRowSortOrder.ALPHABETICAL:
+                return R.id.sort_by_alpha;
+            case BookmarkRowSortOrder.REVERSE_ALPHABETICAL:
+                return R.id.sort_by_reverse_alpha;
+        }
+        return ResourcesCompat.ID_NULL;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
index 9d79bf9..02cb24e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
@@ -19,6 +19,8 @@
 public class BookmarkUiPrefs {
     private static final @BookmarkRowDisplayPref int INITIAL_BOOKMARK_ROW_DISPLAY_PREF =
             BookmarkRowDisplayPref.COMPACT;
+    private static final @BookmarkRowSortOrder int INITIAL_BOOKMARK_ROW_SORT_ORDER =
+            BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL;
 
     // This is persisted to preferences, entries shouldn't be reordered or removed.
     @IntDef({BookmarkRowDisplayPref.COMPACT, BookmarkRowDisplayPref.VISUAL})
@@ -28,10 +30,24 @@
         int VISUAL = 1;
     }
 
+    // This is persisted to preferences, entries shouldn't be reordered or removed.
+    @IntDef({BookmarkRowSortOrder.CHRONOLOGICAL, BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL,
+            BookmarkRowSortOrder.ALPHABETICAL, BookmarkRowSortOrder.REVERSE_ALPHABETICAL})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface BookmarkRowSortOrder {
+        int CHRONOLOGICAL = 0;
+        int REVERSE_CHRONOLOGICAL = 1;
+        int ALPHABETICAL = 2;
+        int REVERSE_ALPHABETICAL = 3;
+    }
+
     /** Observer for changes to prefs. */
     public interface Observer {
         /** Called when the current {@link BookmarkRowDisplayPref} changes. */
-        void onBookmarkRowDisplayPrefChanged(@BookmarkRowDisplayPref int displayPref);
+        default void onBookmarkRowDisplayPrefChanged(@BookmarkRowDisplayPref int displayPref) {}
+
+        // Called when the current {@link BookmarkRowSortOrder} changes. */
+        default void onBookmarkRowSortOrderChanged(@BookmarkRowSortOrder int sortOrder) {}
     }
 
     private final SharedPreferencesManager mPrefsManager;
@@ -75,6 +91,18 @@
         for (Observer obs : mObservers) obs.onBookmarkRowDisplayPrefChanged(displayPref);
     }
 
+    /** Returns the order bookmark rows are displayed when not showing order in parent. */
+    public @BookmarkRowSortOrder int getBookmarkRowSortOrder() {
+        return mPrefsManager.readInt(
+                ChromePreferenceKeys.BOOKMARKS_SORT_ORDER, INITIAL_BOOKMARK_ROW_SORT_ORDER);
+    }
+
+    /** Sets the order to sort bookmark rows. */
+    public void setBookmarkRowSortOrder(@BookmarkRowSortOrder int sortOrder) {
+        mPrefsManager.writeInt(ChromePreferenceKeys.BOOKMARKS_SORT_ORDER, sortOrder);
+        for (Observer obs : mObservers) obs.onBookmarkRowSortOrderChanged(sortOrder);
+    }
+
     /**
      * Some places use {@link BookmarkRowDisplayPref} even for legacy handling. This converts to the
      * new display pref from feature flags.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
index 875c645..5ae4aec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.crash;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.build.annotations.UsedByReflection;
 import org.chromium.components.crash.NativeAndJavaSmartExceptionReporter;
 import org.chromium.components.crash.PureJavaExceptionReporter;
@@ -15,7 +14,6 @@
 /**
  * A custom PureJavaExceptionReporter for Android Chrome's browser.
  */
-@MainDex
 @UsedByReflection("SplitCompatApplication.java")
 public class ChromePureJavaExceptionReporter extends PureJavaExceptionReporter {
     private static final String CHROME_CRASH_PRODUCT_NAME = "Chrome_Android";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java
index e276e9e..0a590b1e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java
@@ -213,9 +213,9 @@
         // Get and resize the issuer icon.
         Bitmap scaledIssuerIcon = Bitmap.createScaledBitmap(mIssuerIcon,
                 layout.getResources().getDimensionPixelSize(
-                        R.dimen.virtual_card_enrollment_dialog_card_art_width),
+                        AutofillUiUtils.getVirtualCardEnrollmentDialogIconWidthId()),
                 layout.getResources().getDimensionPixelSize(
-                        R.dimen.virtual_card_enrollment_dialog_card_art_height),
+                        AutofillUiUtils.getVirtualCardEnrollmentDialogIconHeightId()),
                 true);
 
         // Add the issuer icon and the card container text.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
index b449aa6..f51a7f6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -40,6 +40,7 @@
 import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationUtils;
 import org.chromium.chrome.browser.feature_guide.notifications.FeatureType;
 import org.chromium.chrome.browser.feed.FeedActionDelegate;
+import org.chromium.chrome.browser.feed.FeedFeatures;
 import org.chromium.chrome.browser.feed.FeedReliabilityLogger;
 import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator;
 import org.chromium.chrome.browser.feed.FeedSurfaceDelegate;
@@ -85,6 +86,7 @@
 import org.chromium.chrome.browser.ui.native_page.NativePageHost;
 import org.chromium.chrome.browser.util.BrowserUiUtils;
 import org.chromium.chrome.browser.xsurface.FeedLaunchReliabilityLogger.SurfaceType;
+import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration;
 import org.chromium.chrome.features.tasks.SingleTabSwitcherCoordinator;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.settings.SettingsLauncher;
@@ -482,7 +484,9 @@
                 mSearchProviderHasLogo, mTemplateUrlService.isDefaultSearchEngineGoogle(),
                 mFeedSurfaceProvider.getScrollDelegate(),
                 mFeedSurfaceProvider.getTouchEnabledDelegate(), mFeedSurfaceProvider.getUiConfig(),
-                lifecycleDispatcher, uma, mTab.isIncognito(), windowAndroid);
+                lifecycleDispatcher, uma, mTab.isIncognito(), windowAndroid,
+                StartSurfaceConfiguration.isNtpAsHomeSurfaceEnabled(mIsTablet),
+                FeedFeatures.isMultiColumnFeedEnabled(mContext));
 
         // If new NewTabPage is created via back operations, re-show the single Tab card with the
         // previously tracked Tab.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
index 1dca2643..644b9e2a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -7,6 +7,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -47,6 +48,7 @@
 import org.chromium.chrome.browser.query_tiles.QueryTileUtils;
 import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesCoordinator;
 import org.chromium.chrome.browser.suggestions.tile.TileGroup;
+import org.chromium.chrome.browser.suggestions.tile.TileGroup.Delegate;
 import org.chromium.chrome.browser.ui.native_page.TouchEnabledDelegate;
 import org.chromium.chrome.browser.user_education.IPHCommandBuilder;
 import org.chromium.chrome.browser.user_education.UserEducationHelper;
@@ -77,6 +79,7 @@
     private static final int UNSET_RESOURCE_FLAG = -1;
 
     private final int mTileGridLayoutBleed;
+    private int mSearchBoxTwoSideMargin;
     private final Context mContext;
     private int mSearchBoxEndPadding = UNSET_RESOURCE_FLAG;
 
@@ -124,6 +127,7 @@
     private boolean mSnapshotTileGridChanged;
     private boolean mIsIncognito;
     private WindowAndroid mWindowAndroid;
+    private boolean mIsNtpAsHomeSurfaceEnabled;
 
     /**
      * Vertical inset to add to the top and bottom of the search box bounds. May be 0 if no inset
@@ -172,12 +176,12 @@
      * @param isIncognito Whether the new tab page is in incognito mode.
      * @param windowAndroid An instance of a {@link WindowAndroid}
      */
-    public void initialize(NewTabPageManager manager, Activity activity,
-            TileGroup.Delegate tileGroupDelegate, boolean searchProviderHasLogo,
-            boolean searchProviderIsGoogle, FeedSurfaceScrollDelegate scrollDelegate,
-            TouchEnabledDelegate touchEnabledDelegate, UiConfig uiConfig,
-            ActivityLifecycleDispatcher lifecycleDispatcher, NewTabPageUma uma, boolean isIncognito,
-            WindowAndroid windowAndroid) {
+    public void initialize(NewTabPageManager manager, Activity activity, Delegate tileGroupDelegate,
+            boolean searchProviderHasLogo, boolean searchProviderIsGoogle,
+            FeedSurfaceScrollDelegate scrollDelegate, TouchEnabledDelegate touchEnabledDelegate,
+            UiConfig uiConfig, ActivityLifecycleDispatcher lifecycleDispatcher, NewTabPageUma uma,
+            boolean isIncognito, WindowAndroid windowAndroid, boolean isNtpAsHomeSurfaceEnabled,
+            boolean isMultiColumnFeedEnabled) {
         TraceEvent.begin(TAG + ".initialize()");
         mScrollDelegate = scrollDelegate;
         mManager = manager;
@@ -186,6 +190,7 @@
         mNewTabPageUma = uma;
         mIsIncognito = isIncognito;
         mWindowAndroid = windowAndroid;
+        mIsNtpAsHomeSurfaceEnabled = isNtpAsHomeSurfaceEnabled;
         Profile profile = Profile.getLastUsedRegularProfile();
 
         mSearchBoxCoordinator = new SearchBoxCoordinator(getContext(), this);
@@ -195,6 +200,13 @@
                     R.dimen.ntp_search_box_bounds_vertical_inset_modern);
         }
 
+        if (isMultiColumnFeedEnabled && mIsNtpAsHomeSurfaceEnabled) {
+            // We add extra side margins to the fake search box when multiple column Feeds are
+            // shown. There is only one exception that we don't shorten the width of the fake search
+            // box: one row of MV tiles in portrait mode.
+            mSearchBoxTwoSideMargin =
+                    getResources().getDimensionPixelSize(R.dimen.ntp_search_box_start_margin) * 2;
+        }
         initializeLogoCoordinator(searchProviderHasLogo, searchProviderIsGoogle);
         initializeMostVisitedTilesCoordinator(profile, lifecycleDispatcher, tileGroupDelegate,
                 touchEnabledDelegate, isScrollableMvtEnabled(), searchProviderIsGoogle);
@@ -852,11 +864,23 @@
         if (mMvTilesContainerLayout.getVisibility() != GONE) {
             if (!isScrollableMvtEnabled()) {
                 final int width = mMvTilesContainerLayout.getMeasuredWidth() - mTileGridLayoutBleed;
-                measureExactly(searchBoxView, width, searchBoxView.getMeasuredHeight());
+                measureExactly(searchBoxView, width - mSearchBoxTwoSideMargin,
+                        searchBoxView.getMeasuredHeight());
                 mLogoCoordinator.measureExactlyLogoView(width);
             } else {
                 final int width = getMeasuredWidth() - mTileGridLayoutBleed;
-                measureExactly(searchBoxView, width, searchBoxView.getMeasuredHeight());
+
+                // We reset the extra margins of the fake search box if the scrollable MV tiles are
+                // showing in the portrait mode with multiple column Feeds.
+                int searchBoxTwoSideMargin = mSearchBoxTwoSideMargin;
+                if (mSearchBoxTwoSideMargin != 0
+                        && getResources().getConfiguration().orientation
+                                == Configuration.ORIENTATION_PORTRAIT) {
+                    searchBoxTwoSideMargin = 0;
+                }
+
+                measureExactly(searchBoxView, width - searchBoxTwoSideMargin,
+                        searchBoxView.getMeasuredHeight());
                 mLogoCoordinator.measureExactlyLogoView(width);
             }
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java
index a8ce179..4fb3381 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java
@@ -13,14 +13,12 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.chrome.browser.base.SplitCompatApplication;
 import org.chromium.components.browser_ui.photo_picker.ImageDecoder;
 
 /**
  * A service to accept requests to take image file contents and decode them.
  */
-@MainDex
 public class DecoderServiceImpl extends DecoderService.Impl {
     private static final String TAG = "DecoderService";
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentActivity.java
index 8db31be61..1a99fb7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentActivity.java
@@ -8,13 +8,18 @@
 import android.content.Intent;
 import android.os.Bundle;
 
+import androidx.annotation.CallSuper;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.SynchronousInitializationActivity;
+import org.chromium.chrome.browser.ui.signin.SyncConsentDelegate;
 import org.chromium.chrome.browser.ui.signin.SyncConsentFragmentBase;
 import org.chromium.components.browser_ui.modaldialog.AppModalPresenter;
+import org.chromium.ui.base.ActivityWindowAndroid;
+import org.chromium.ui.base.IntentRequestTracker;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 
@@ -22,9 +27,12 @@
  * Allows the user to pick an account, sign in and enable sync. Started from Settings and various
  * sign-in promos. For more details see {@link SyncConsentFragmentBase}.
  */
-public class SyncConsentActivity extends SynchronousInitializationActivity {
+public class SyncConsentActivity
+        extends SynchronousInitializationActivity implements SyncConsentDelegate {
     private static final String ARGUMENT_FRAGMENT_ARGS = "SigninActivity.FragmentArgs";
 
+    private WindowAndroid mWindowAndroid;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -41,6 +49,25 @@
     }
 
     @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (mWindowAndroid != null) {
+            mWindowAndroid.getIntentRequestTracker().onActivityResult(
+                    requestCode, resultCode, data);
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    @CallSuper
+    @Override
+    protected void onDestroy() {
+        if (mWindowAndroid != null) {
+            mWindowAndroid.destroy();
+            mWindowAndroid = null;
+        }
+        super.onDestroy();
+    }
+
+    @Override
     protected ModalDialogManager createModalDialogManager() {
         return new ModalDialogManager(new AppModalPresenter(this), ModalDialogType.APP);
     }
@@ -55,4 +82,17 @@
         intent.putExtra(ARGUMENT_FRAGMENT_ARGS, fragmentArgs);
         return intent;
     }
+
+    /**
+     * @return A {@link WindowAndroid} instance.  Will create one if none was previously
+     * created.
+     */
+    @Override
+    public WindowAndroid getWindowAndroid() {
+        if (mWindowAndroid == null) {
+            mWindowAndroid = new ActivityWindowAndroid(this, /* listenToActivityState= */ true,
+                    IntentRequestTracker.createFromActivity(this));
+        }
+        return mWindowAndroid;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java
index 977b2b5..3db5db3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 package org.chromium.chrome.browser.sync.settings;
 
-import static org.chromium.chrome.browser.flags.ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES;
-
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -47,9 +45,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
-/**
- * Helper methods for sync settings.
- */
+/** Helper methods for sync settings. */
 public class SyncSettingsUtils {
     private static final String DASHBOARD_URL = "https://www.google.com/settings/chrome/sync";
     private static final String MY_ACCOUNT_URL = "https://myaccount.google.com/smartlink/home";
@@ -82,9 +78,7 @@
         int OTHER_ERRORS = 128;
     }
 
-    /**
-     * Returns the type of the sync error.
-     */
+    /** Returns the type of the sync error. */
     @SyncError
     public static int getSyncError() {
         SyncService syncService = SyncService.get();
@@ -137,15 +131,14 @@
 
     /**
      * Gets hint message to resolve sync error.
+     *
      * @param context The application context.
      * @param error The sync error.
      */
     public static String getSyncErrorHint(Context context, @SyncError int error) {
         switch (error) {
             case SyncError.AUTH_ERROR:
-                return ChromeFeatureList.isEnabled(UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
-                        ? context.getString(R.string.hint_sync_auth_error_modern)
-                        : context.getString(R.string.hint_sync_auth_error);
+                return context.getString(R.string.hint_sync_auth_error_modern);
             case SyncError.CLIENT_OUT_OF_DATE:
                 return context.getString(
                         R.string.hint_client_out_of_date, BuildInfo.getInstance().hostPackageLabel);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
index 971f928..7e70741 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.sync.ui;
 
 import static org.chromium.base.ContextUtils.getApplicationContext;
-import static org.chromium.chrome.browser.flags.ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES;
 
 import android.app.Activity;
 import android.content.Context;
@@ -23,7 +22,6 @@
 import org.chromium.base.UnownedUserDataKey;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
@@ -52,10 +50,9 @@
 
 /**
  * A message UI that informs the current sync error and contains a button to take action to resolve
- * it.
- * This class is tied to a window and at most one instance per window can exist at a time.
- * In practice however, because the time limit imposed between 2 displays is global,
- * only one instance in the whole application will exist at a time.
+ * it. This class is tied to a window and at most one instance per window can exist at a time. In
+ * practice however, because the time limit imposed between 2 displays is global, only one instance
+ * in the whole application will exist at a time.
  */
 public class SyncErrorMessage implements SyncStateChangedListener, UnownedUserData {
     @VisibleForTesting
@@ -187,11 +184,7 @@
                 assert false;
                 break;
             case MessageType.AUTH_ERROR:
-                if (ChromeFeatureList.isEnabled(UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)) {
-                    startUpdateCredentialsFlow(mActivity);
-                } else {
-                    openSyncSettings();
-                }
+                startUpdateCredentialsFlow(mActivity);
                 break;
             case MessageType.PASSPHRASE_REQUIRED:
             case MessageType.SYNC_SETUP_INCOMPLETE:
@@ -268,9 +261,7 @@
     private static String getPrimaryButtonText(Context context, @SyncError int error) {
         switch (error) {
             case SyncError.AUTH_ERROR:
-                return ChromeFeatureList.isEnabled(UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
-                        ? context.getString(R.string.password_error_sign_in_button_title)
-                        : context.getString(R.string.open_settings_button);
+                return context.getString(R.string.password_error_sign_in_button_title);
             case SyncError.TRUSTED_VAULT_KEY_REQUIRED_FOR_EVERYTHING:
             case SyncError.TRUSTED_VAULT_KEY_REQUIRED_FOR_PASSWORDS:
             case SyncError.TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_EVERYTHING:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTracker.java
index 6919e79..1fd941b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTracker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTracker.java
@@ -4,13 +4,11 @@
 
 package org.chromium.chrome.browser.sync.ui;
 
-import static org.chromium.chrome.browser.flags.ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES;
 import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.SYNC_ERROR_MESSAGE_SHOWN_AT_TIME;
 
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.TimeUtils;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -36,19 +34,16 @@
         long lastShownTime = SharedPreferencesManager.getInstance().readLong(
                 SYNC_ERROR_MESSAGE_SHOWN_AT_TIME, 0);
 
-        if (ChromeFeatureList.isEnabled(UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)) {
-            // Since the password manager error and the sync error can be related,
-            // the sync error should be shown only if at least MINIMAL_DURATION_TO_PWM_ERROR_UI_MS
-            // have passed since the last password manager error. This condition is mirrored
-            // for the password manager error.
-            long currentTime = TimeUtils.currentTimeMillis();
-            PrefService prefService = UserPrefs.get(Profile.getLastUsedRegularProfile());
-            long upmErrorShownTime =
-                    Long.valueOf(prefService.getString(Pref.UPM_ERROR_UI_SHOWN_TIMESTAMP));
-            return currentTime - lastShownTime > MINIMAL_DURATION_BETWEEN_UI_MS
-                    && currentTime - upmErrorShownTime > MINIMAL_DURATION_TO_PWM_ERROR_UI_MS;
-        }
-        return TimeUtils.currentTimeMillis() - lastShownTime > MINIMAL_DURATION_BETWEEN_UI_MS;
+        // Since the password manager error and the sync error can be related,
+        // the sync error should be shown only if at least MINIMAL_DURATION_TO_PWM_ERROR_UI_MS
+        // have passed since the last password manager error. This condition is mirrored
+        // for the password manager error.
+        long currentTime = TimeUtils.currentTimeMillis();
+        PrefService prefService = UserPrefs.get(Profile.getLastUsedRegularProfile());
+        long upmErrorShownTime =
+                Long.valueOf(prefService.getString(Pref.UPM_ERROR_UI_SHOWN_TIMESTAMP));
+        return currentTime - lastShownTime > MINIMAL_DURATION_BETWEEN_UI_MS
+                && currentTime - upmErrorShownTime > MINIMAL_DURATION_TO_PWM_ERROR_UI_MS;
     }
 
     public static void updateLastShownTime() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
index 8ba9e31..aacac437 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
@@ -16,6 +16,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
@@ -57,6 +58,7 @@
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.services.SigninMetricsUtils.State;
 import org.chromium.chrome.browser.sync.SyncService;
+import org.chromium.chrome.test.AutomotiveContextWrapperTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
@@ -131,6 +133,9 @@
     public final SigninTestRule mSigninTestRule = new SigninTestRule();
 
     @Rule
+    public AutomotiveContextWrapperTestRule mAutoTestRule = new AutomotiveContextWrapperTestRule();
+
+    @Rule
     public final ChromeTabbedActivityTestRule mChromeActivityTestRule =
             new ChromeTabbedActivityTestRule();
 
@@ -974,6 +979,94 @@
         addAccountStateHistogram.assertExpected();
     }
 
+    @Test
+    @LargeTest
+    @DisableFeatures({ChromeFeatureList.TANGIBLE_SYNC})
+    public void testAutomotiveDevice_deviceLockCreated_syncAcceptedSuccessfully()
+            throws IOException {
+        mAutoTestRule.setIsAutomotive(true);
+        CoreAccountInfo accountInfo =
+                mSigninTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL);
+        mSyncConsentActivity = ActivityTestUtils.waitForActivity(
+                InstrumentationRegistry.getInstrumentation(), SyncConsentActivity.class, () -> {
+                    SyncConsentActivityLauncherImpl.get().launchActivityForPromoDefaultFlow(
+                            mChromeActivityTestRule.getActivity(),
+                            SigninAccessPoint.BOOKMARK_MANAGER, accountInfo.getEmail());
+                });
+
+        // Should display the sync page.
+        onView(withText(R.string.signin_accept_button)).check(matches(isDisplayed()));
+        onView(withText(R.string.signin_accept_button)).perform(click());
+
+        // Accepting the sync on an automotive device should take the user to the device lock page.
+        onView(withId(R.id.device_lock_title)).check(matches(isDisplayed()));
+        onView(withText(R.string.signin_accept_button)).check(doesNotExist());
+
+        // Mimic a successful device lock creation.
+        SyncConsentFragment syncConsentFragment =
+                (SyncConsentFragment) mSyncConsentActivity.getSupportFragmentManager()
+                        .findFragmentById(R.id.fragment_container);
+        assertNotNull("The SyncConsentActivity should contain the SyncConsentFragment!",
+                syncConsentFragment);
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            syncConsentFragment.onDeviceLockReady();
+        });
+
+        // Wait for the sync consent to be set and the activity has finished.
+        CriteriaHelper.pollUiThread(() -> {
+            return IdentityServicesProvider.get()
+                    .getSigninManager(Profile.getLastUsedRegularProfile())
+                    .getIdentityManager()
+                    .hasPrimaryAccount(ConsentLevel.SYNC);
+        });
+        onView(withId(R.id.device_lock_title)).check(doesNotExist());
+        ApplicationTestUtils.waitForActivityState(mSyncConsentActivity, Stage.DESTROYED);
+    }
+
+    @Test
+    @LargeTest
+    @DisableFeatures({ChromeFeatureList.TANGIBLE_SYNC})
+    public void testAutomotiveDevice_deviceLockRefused_syncRefused() throws IOException {
+        mAutoTestRule.setIsAutomotive(true);
+        CoreAccountInfo accountInfo =
+                mSigninTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL);
+        mSyncConsentActivity = ActivityTestUtils.waitForActivity(
+                InstrumentationRegistry.getInstrumentation(), SyncConsentActivity.class, () -> {
+                    SyncConsentActivityLauncherImpl.get().launchActivityForPromoDefaultFlow(
+                            mChromeActivityTestRule.getActivity(),
+                            SigninAccessPoint.BOOKMARK_MANAGER, accountInfo.getEmail());
+                });
+
+        // Should display the sync page.
+        onView(withText(R.string.signin_accept_button)).check(matches(isDisplayed()));
+        onView(withText(R.string.signin_accept_button)).perform(click());
+
+        // Accepting the sync on an automotive device should take the user to the device lock page.
+        onView(withId(R.id.device_lock_title)).check(matches(isDisplayed()));
+        onView(withText(R.string.signin_accept_button)).check(doesNotExist());
+
+        // Mimic a refusal of the device lock.
+        SyncConsentFragment syncConsentFragment =
+                (SyncConsentFragment) mSyncConsentActivity.getSupportFragmentManager()
+                        .findFragmentById(R.id.fragment_container);
+        assertNotNull("The SyncConsentActivity should contain the SyncConsentFragment!",
+                syncConsentFragment);
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            syncConsentFragment.onDeviceLockRefused();
+            assertFalse(syncConsentFragment.getDeviceLockReadyForTesting());
+        });
+
+        // Check that the user is not consented to sync and the activity has finished.
+        CriteriaHelper.pollUiThread(() -> {
+            return !IdentityServicesProvider.get()
+                            .getSigninManager(Profile.getLastUsedRegularProfile())
+                            .getIdentityManager()
+                            .hasPrimaryAccount(ConsentLevel.SYNC);
+        });
+        onView(withId(R.id.device_lock_title)).check(doesNotExist());
+        ApplicationTestUtils.waitForActivityState(mSyncConsentActivity, Stage.DESTROYED);
+    }
+
     private void launchActivityWithFragment(Fragment fragment) {
         mActivityTestRule.launchActivity(null);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
index 32104422..2da05f6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
@@ -23,7 +23,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
@@ -33,8 +32,6 @@
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
-import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.signin.SigninTestRule;
 import org.chromium.components.signin.base.GoogleServiceAuthError;
 import org.chromium.components.signin.identitymanager.AccountInfoServiceProvider;
@@ -109,7 +106,6 @@
     @Test
     @LargeTest
     @Feature("RenderTest")
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
     @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class)
     public void testSyncErrorCardForAuthErrorWithUpmEnabled(boolean nightModeEnabled)
             throws Exception {
@@ -129,26 +125,6 @@
     @Test
     @LargeTest
     @Feature("RenderTest")
-    @DisableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
-    @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class)
-    public void testSyncErrorCardForAuthErrorWithUpmDisabled(boolean nightModeEnabled)
-            throws Exception {
-        mFakeSyncServiceImpl.setAuthError(GoogleServiceAuthError.State.INVALID_GAIA_CREDENTIALS);
-        mSigninTestRule.addTestAccountThenSigninAndEnableSync(mFakeSyncServiceImpl);
-        TestThreadUtils.runOnUiThreadBlocking(
-                ()
-                        -> Assert.assertEquals("AUTH_ERROR SyncError should be set",
-                                SyncSettingsUtils.SyncError.AUTH_ERROR,
-                                SyncSettingsUtils.getSyncError()));
-
-        mSettingsActivityTestRule.startSettingsActivity();
-        mRenderTestRule.render(
-                getPersonalizedSyncPromoView(), "sync_error_card_auth_error_with_new_title");
-    }
-
-    @Test
-    @LargeTest
-    @Feature("RenderTest")
     @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class)
     public void testSyncErrorCardForClientOutOfDate(boolean nightModeEnabled) throws Exception {
         mFakeSyncServiceImpl.setRequiresClientUpgrade(true);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java
index 1e48a08..9b04e667 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java
@@ -42,7 +42,6 @@
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.sync.SyncTestUtil;
 import org.chromium.components.embedder_support.util.UrlConstants;
@@ -202,22 +201,6 @@
     @Test
     @LargeTest
     @Feature("RenderTest")
-    @DisableFeatures({ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES})
-    public void testSyncErrorMessageForAuthErrorView() throws IOException {
-        SyncErrorMessage.setMessageDispatcherForTesting(null);
-        mSyncTestRule.setUpAccountAndEnableSyncForTesting();
-        mFakeSyncServiceImpl.setAuthError(GoogleServiceAuthError.State.INVALID_GAIA_CREDENTIALS);
-        mSyncTestRule.loadUrl(UrlConstants.VERSION_URL);
-        ViewGroup view = mSyncTestRule.getActivity().findViewById(R.id.message_container);
-        // Wait until the message ui is shown.
-        CriteriaHelper.pollUiThread(() -> Criteria.checkThat(view.getChildCount(), Matchers.is(1)));
-        mRenderTestRule.render(view, "sync_error_message_auth_error");
-    }
-
-    @Test
-    @LargeTest
-    @Feature("RenderTest")
-    @EnableFeatures({ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES})
     public void testSyncErrorMessageForAuthErrorViewModern() throws IOException {
         SyncErrorMessage.setMessageDispatcherForTesting(null);
         mSyncTestRule.setUpAccountAndEnableSyncForTesting();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialogTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialogTest.java
index 32eedb6..418db4f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialogTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialogTest.java
@@ -21,6 +21,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
@@ -32,6 +33,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeStringConstants;
 import org.chromium.chrome.browser.autofill.LegalMessageLine;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.components.autofill.AutofillFeatures;
 import org.chromium.components.autofill.VirtualCardEnrollmentLinkType;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
@@ -45,6 +48,7 @@
 
 /** Unit tests for {@link AutofillVirtualCardEnrollmentDialog}. */
 @RunWith(BaseRobolectricTestRunner.class)
+@Features.EnableFeatures({AutofillFeatures.AUTOFILL_ENABLE_NEW_CARD_ART_AND_NETWORK_IMAGES})
 public class AutofillVirtualCardEnrollmentDialogTest {
     private static final String LEGAL_MESSAGE_URL = "http://www.google.com";
     private static final String ACCEPT_BUTTON_TEXT = "Yes";
@@ -53,6 +57,9 @@
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
 
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
     @Mock
     private Callback<Integer> mResultHandlerMock;
     @Mock
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java
index 2af82b2..dbef902 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java
@@ -21,6 +21,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
@@ -40,7 +41,11 @@
 import org.chromium.chrome.browser.app.bookmarks.BookmarkEditActivity;
 import org.chromium.chrome.browser.app.bookmarks.BookmarkFolderSelectActivity;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
+import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowSortOrder;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiState.BookmarkUiMode;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkItem;
 import org.chromium.components.browser_ui.widget.dragreorder.DragReorderableRecyclerViewAdapter;
@@ -59,10 +64,12 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 @LooperMode(LooperMode.Mode.LEGACY)
+@EnableFeatures(ChromeFeatureList.ANDROID_IMPROVED_BOOKMARKS)
 public class BookmarkToolbarMediatorTest {
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
-
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
     @Rule
     public ActivityScenarioRule<TestActivity> mActivityScenarios =
             new ActivityScenarioRule<>(TestActivity.class);
@@ -91,7 +98,7 @@
 
     BookmarkToolbarMediator mMediator;
     PropertyModel mModel;
-    OneshotSupplierImpl<BookmarkDelegate> mBookmarkDelegateSupplier = new OneshotSupplierImpl<>();
+    OneshotSupplierImpl<BookmarkDelegate> mBookmarkDelegateSupplier;
 
     @Before
     public void setUp() {
@@ -104,6 +111,10 @@
         doReturn(mBookmarkItem).when(mBookmarkModel).getBookmarkById(any());
         doReturn(mBookmarkId).when(mBookmarkItem).getId();
 
+        initModelAndMediator();
+    }
+
+    private void initModelAndMediator() {
         mModel = new PropertyModel.Builder(BookmarkToolbarProperties.ALL_KEYS)
                          .with(BookmarkToolbarProperties.BOOKMARK_MODEL, mBookmarkModel)
                          .with(BookmarkToolbarProperties.BOOKMARK_OPENER, mBookmarkOpener)
@@ -115,7 +126,7 @@
                                  mOpenSearchUiRunnable)
                          .with(BookmarkToolbarProperties.OPEN_FOLDER_CALLBACK, mOpenFolderCallback)
                          .build();
-
+        mBookmarkDelegateSupplier = new OneshotSupplierImpl<>();
         mMediator = new BookmarkToolbarMediator(mContext, mModel,
                 mDragReorderableRecyclerViewAdapter, mBookmarkDelegateSupplier, mSelectionDelegate,
                 mBookmarkModel, mBookmarkOpener, mBookmarkUiPrefs);
@@ -336,4 +347,72 @@
                 R.id.compact_view, mModel.get(BookmarkToolbarProperties.CHECKED_VIEW_MENU_ID));
         verify(mBookmarkUiPrefs).setBookmarkRowDisplayPref(BookmarkRowDisplayPref.COMPACT);
     }
+
+    @Test
+    public void testInitialization_viewOptions() {
+        doReturn(BookmarkRowDisplayPref.COMPACT).when(mBookmarkUiPrefs).getBookmarkRowDisplayPref();
+        initModelAndMediator();
+        Assert.assertEquals(
+                R.id.compact_view, mModel.get(BookmarkToolbarProperties.CHECKED_VIEW_MENU_ID));
+
+        doReturn(BookmarkRowDisplayPref.VISUAL).when(mBookmarkUiPrefs).getBookmarkRowDisplayPref();
+        initModelAndMediator();
+        Assert.assertEquals(
+                R.id.visual_view, mModel.get(BookmarkToolbarProperties.CHECKED_VIEW_MENU_ID));
+    }
+
+    @Test
+    public void testOnMenuItemClick_sortOrder() {
+        Assert.assertTrue(mMediator.onMenuIdClick(R.id.sort_by_newest));
+        Assert.assertEquals(
+                R.id.sort_by_newest, mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+        verify(mBookmarkUiPrefs)
+                .setBookmarkRowSortOrder(BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL);
+
+        Assert.assertTrue(mMediator.onMenuIdClick(R.id.sort_by_oldest));
+        Assert.assertEquals(
+                R.id.sort_by_oldest, mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+        verify(mBookmarkUiPrefs).setBookmarkRowSortOrder(BookmarkRowSortOrder.CHRONOLOGICAL);
+
+        Assert.assertTrue(mMediator.onMenuIdClick(R.id.sort_by_alpha));
+        Assert.assertEquals(
+                R.id.sort_by_alpha, mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+        verify(mBookmarkUiPrefs).setBookmarkRowSortOrder(BookmarkRowSortOrder.ALPHABETICAL);
+
+        Assert.assertTrue(mMediator.onMenuIdClick(R.id.sort_by_reverse_alpha));
+        Assert.assertEquals(R.id.sort_by_reverse_alpha,
+                mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+        verify(mBookmarkUiPrefs).setBookmarkRowSortOrder(BookmarkRowSortOrder.REVERSE_ALPHABETICAL);
+    }
+
+    @Test
+    public void testInitialization_sortOrder() {
+        doReturn(BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL)
+                .when(mBookmarkUiPrefs)
+                .getBookmarkRowSortOrder();
+        initModelAndMediator();
+        Assert.assertEquals(
+                R.id.sort_by_newest, mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+
+        doReturn(BookmarkRowSortOrder.CHRONOLOGICAL)
+                .when(mBookmarkUiPrefs)
+                .getBookmarkRowSortOrder();
+        initModelAndMediator();
+        Assert.assertEquals(
+                R.id.sort_by_oldest, mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+
+        doReturn(BookmarkRowSortOrder.ALPHABETICAL)
+                .when(mBookmarkUiPrefs)
+                .getBookmarkRowSortOrder();
+        initModelAndMediator();
+        Assert.assertEquals(
+                R.id.sort_by_alpha, mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+
+        doReturn(BookmarkRowSortOrder.REVERSE_ALPHABETICAL)
+                .when(mBookmarkUiPrefs)
+                .getBookmarkRowSortOrder();
+        initModelAndMediator();
+        Assert.assertEquals(R.id.sort_by_reverse_alpha,
+                mModel.get(BookmarkToolbarProperties.CHECKED_SORT_MENU_ID));
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java
index 98f0b72..9d7a2e1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Batch;
 import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowDisplayPref;
+import org.chromium.chrome.browser.bookmarks.BookmarkUiPrefs.BookmarkRowSortOrder;
 import org.chromium.chrome.browser.commerce.ShoppingFeatures;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
@@ -110,4 +111,24 @@
         mBookmarkUiPrefs.setBookmarkRowDisplayPref(BookmarkRowDisplayPref.COMPACT);
         verifyNoInteractions(mObserver);
     }
+
+    @Test
+    public void testSortOrder() {
+        // Default should be REVERSE_CHRONOLOGICAL.
+        Assert.assertEquals(BookmarkRowSortOrder.REVERSE_CHRONOLOGICAL,
+                mBookmarkUiPrefs.getBookmarkRowSortOrder());
+
+        mBookmarkUiPrefs.addObserver(mObserver);
+        mBookmarkUiPrefs.setBookmarkRowSortOrder(BookmarkRowSortOrder.ALPHABETICAL);
+        verify(mObserver).onBookmarkRowSortOrderChanged(BookmarkRowSortOrder.ALPHABETICAL);
+        Assert.assertEquals(
+                BookmarkRowSortOrder.ALPHABETICAL, mBookmarkUiPrefs.getBookmarkRowSortOrder());
+
+        reset(mObserver);
+        mBookmarkUiPrefs.removeObserver(mObserver);
+        mBookmarkUiPrefs.setBookmarkRowSortOrder(BookmarkRowSortOrder.CHRONOLOGICAL);
+        verifyNoInteractions(mObserver);
+        Assert.assertEquals(
+                BookmarkRowSortOrder.CHRONOLOGICAL, mBookmarkUiPrefs.getBookmarkRowSortOrder());
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/gsa/GSAStateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/gsa/GSAStateUnitTest.java
index d2259ee9..b72b647a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/gsa/GSAStateUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/gsa/GSAStateUnitTest.java
@@ -46,11 +46,7 @@
             pm.addActivityIfNotPresent(componentName);
             IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SEARCH);
             intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
-            try {
-                pm.addIntentFilterForActivity(componentName, intentFilter);
-            } catch (NameNotFoundException e) {
-                throw new RuntimeException(e);
-            }
+            pm.addIntentFilterForActivity(componentName, intentFilter);
         }
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java
index ccabe972..0c2335a1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java
@@ -30,17 +30,17 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
 import org.chromium.chrome.browser.settings.SettingsActivityUnitTest.ShadowProfileManagerUtils;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
 import org.chromium.components.browser_ui.settings.PaddedDividerItemDecoration;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
-import java.util.Map;
 import java.util.concurrent.TimeoutException;
 
 /**
@@ -57,6 +57,8 @@
     }
 
     @Rule
+    public Features.JUnitProcessor featuresRule = new Features.JUnitProcessor();
+    @Rule
     public MockitoRule mockitoRule = MockitoJUnit.rule();
 
     private ActivityScenario<SettingsActivity> mActivityScenario;
@@ -93,9 +95,8 @@
     }
 
     @Test
+    @EnableFeatures(ChromeFeatureList.BACK_GESTURE_REFACTOR_ACTIVITY)
     public void testBackPress() throws TimeoutException {
-        CachedFeatureFlags.setFeaturesForTesting(
-                Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR_ACTIVITY, true));
         launchSettingsActivity(TestSettingsFragment.class.getName());
         assertTrue("SettingsActivity is using a wrong fragment.",
                 mSettingsActivity.getMainFragment() instanceof TestSettingsFragment);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTrackerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTrackerTest.java
index 35ec806c..79023fac 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTrackerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageImpressionTrackerTest.java
@@ -22,10 +22,7 @@
 import org.chromium.base.TimeUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Features;
-import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
@@ -34,9 +31,7 @@
 import org.chromium.components.user_prefs.UserPrefs;
 import org.chromium.components.user_prefs.UserPrefsJni;
 
-/**
- * Unit tests for SyncErrorMessageImpressionTracker.
- * */
+/** Unit tests for SyncErrorMessageImpressionTracker. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class SyncErrorMessageImpressionTrackerTest {
@@ -76,29 +71,6 @@
     }
 
     @Test
-    @DisableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
-    public void testNotEnoughTimeSinceLastSyncErrorUINoPwm() {
-        final long timeOfFirstSyncMessage = TimeUtils.currentTimeMillis();
-        mSharedPrefsManager.writeLong(
-                ChromePreferenceKeys.SYNC_ERROR_MESSAGE_SHOWN_AT_TIME, timeOfFirstSyncMessage);
-        mFakeTimeTestRule.advanceMillis(
-                SyncErrorMessageImpressionTracker.MINIMAL_DURATION_BETWEEN_UI_MS);
-        assertFalse(SyncErrorMessageImpressionTracker.canShowNow());
-    }
-
-    @Test
-    @DisableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
-    public void testEnoughTimeSinceLastSyncErrorUINoPwm() {
-        final long timeOfFirstSyncMessage = TimeUtils.currentTimeMillis();
-        mSharedPrefsManager.writeLong(
-                ChromePreferenceKeys.SYNC_ERROR_MESSAGE_SHOWN_AT_TIME, timeOfFirstSyncMessage);
-        mFakeTimeTestRule.advanceMillis(
-                SyncErrorMessageImpressionTracker.MINIMAL_DURATION_BETWEEN_UI_MS + 1);
-        assertTrue(SyncErrorMessageImpressionTracker.canShowNow());
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
     public void testNotEnoughTimeSinceLastSyncErrorUI() {
         final long timeOfFirstSyncMessage = TimeUtils.currentTimeMillis();
         mSharedPrefsManager.writeLong(
@@ -117,7 +89,6 @@
     }
 
     @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
     public void testNotEnoughTimeSinceLastPwmUI() {
         final long timeOfFirstSyncMessage = TimeUtils.currentTimeMillis();
         mSharedPrefsManager.writeLong(
@@ -136,7 +107,6 @@
     }
 
     @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES)
     public void testEnoughTimeSinceBothUis() {
         final long timeOfFirstSyncMessage = TimeUtils.currentTimeMillis();
         mSharedPrefsManager.writeLong(
diff --git a/chrome/android/modules/stack_unwinder/internal/java/src/org/chromium/chrome/modules/stack_unwinder/StackUnwinderModuleContentsImpl.java b/chrome/android/modules/stack_unwinder/internal/java/src/org/chromium/chrome/modules/stack_unwinder/StackUnwinderModuleContentsImpl.java
index fb22c6a..09682697 100644
--- a/chrome/android/modules/stack_unwinder/internal/java/src/org/chromium/chrome/modules/stack_unwinder/StackUnwinderModuleContentsImpl.java
+++ b/chrome/android/modules/stack_unwinder/internal/java/src/org/chromium/chrome/modules/stack_unwinder/StackUnwinderModuleContentsImpl.java
@@ -5,12 +5,10 @@
 package org.chromium.chrome.modules.stack_unwinder;
 
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides access to the stack unwinder native code functions within the dynamic feature module.
  */
-@MainDex
 public class StackUnwinderModuleContentsImpl implements StackUnwinderModuleContents {
     /**
      * Returns the pointer to the CreateMemoryRegionsMap native function within the module, encoded
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt
index ab0b9af..7fa64eb 100644
--- a/chrome/android/profiles/arm.newest.txt
+++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-115.0.5757.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-arm-115.0.5758.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index b7e5578..d5aa863 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-115.0.5755.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-115.0.5758.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index c7d6d48..df79435 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3400,6 +3400,9 @@
   <message name="IDS_NETWORK_UI_RESET_EUICC_LABEL" desc="Label and button text for section of the debug networking page which allows developers and QA testers to reset Euicc.">
     Reset eSIM
   </message>
+  <message name="IDS_NETWORK_UI_RESET_APN_MIGRATOR_LABEL" desc="Label and button text for section of the debug networking page which allows developers and QA testers to reset ApnMigrator.">
+    Reset ApnMigrator
+  </message>
   <message name="IDS_NETWORK_UI_ADD_NEW_WIFI_LABEL" desc="Label for section dealing with showing the 'Add new Wi-Fi network' dialog.">
     New Wi-Fi Network Dialog
   </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_NETWORK_UI_RESET_APN_MIGRATOR_LABEL.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_NETWORK_UI_RESET_APN_MIGRATOR_LABEL.png.sha1
new file mode 100644
index 0000000..9d365e6
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_NETWORK_UI_RESET_APN_MIGRATOR_LABEL.png.sha1
@@ -0,0 +1 @@
+e5fe5270ac2fa72a01edc510118d8be59633e275
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 3827b0f..b87b68f 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7534,14 +7534,20 @@
       <message name="IDS_SIDE_PANEL_COMPANION_TITLE" desc="The name of the companion feature in the side panel combo box.">
         Google
       </message>
+      <message name="IDS_SIDE_PANEL_COMPANION_TOOLBAR_TOOLTIP" desc="The tooltip for the companion feature toolbar button.">
+        Google Search side panel
+      </message>
       <message name="IDS_SIDE_PANEL_CUSTOMIZE_CHROME_TITLE" desc="The name of the Customize Chrome feature in the side panel combo box.">
         Customize Chrome
       </message>
       <message name="IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_UNPIN" desc="The label of the context menu item for unpinning a side panel toolbar button.">
         Unpin
       </message>
-      <message name="IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_PIN" desc="The label of the context menu item for pinning a side panel toolbar button.">
-        Pin
+      <message name="IDS_SIDE_PANEL_HEADER_UNPIN_BUTTON_TOOLTIP" desc="The tooltip for unpinning a side panel toolbar button.">
+        Unpin from toolbar
+      </message>
+      <message name="IDS_SIDE_PANEL_HEADER_PIN_BUTTON_TOOLTIP" desc="The tooltip for pinning a side panel toolbar button.">
+        Pin to toolbar
       </message>
 
       <!-- Bookmarks strings -->
@@ -7878,6 +7884,9 @@
       <message name="IDS_TOOLTIP_SIDE_PANEL_HIDE" desc="The tooltip for the side panel button, when open">
         Hide side panel
       </message>
+      <message name="IDS_TOOLTIP_SIDE_PANEL" desc="The tooltip for the side panel button">
+        Side panel
+      </message>
       <if expr="is_macosx">
         <message name="IDS_TOOLTIP_CLOSE_TAB" desc="The tooltip for the close tab button">
           Close
diff --git a/chrome/app/generated_resources_grd/IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_PIN.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_PIN.png.sha1
deleted file mode 100644
index faf37f9a..0000000
--- a/chrome/app/generated_resources_grd/IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_PIN.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-7ec2feb11fdba17c5bc24e23469fb4c31936ede5
\ No newline at end of file
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index 5e0653e..eb275cc 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -145,9 +145,11 @@
     "read_later_add.icon",
     "reader_mode.icon",
     "reader_mode_disabled.icon",
+    "release_alert.icon",
     "reload_touch.icon",
     "remove.icon",
     "remove_box.icon",
+    "report.icon",
     "resize_handle.icon",
     "sad_tab.icon",
     "safety_check.icon",
diff --git a/chrome/app/vector_icons/release_alert.icon b/chrome/app/vector_icons/release_alert.icon
new file mode 100644
index 0000000..22b0e346
--- /dev/null
+++ b/chrome/app/vector_icons/release_alert.icon
@@ -0,0 +1,64 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+R_MOVE_TO, 5.73f, 14.97f,
+R_LINE_TO, -1.28f, -2.12f,
+R_LINE_TO, -2.41f, -0.54f,
+R_LINE_TO, 0.23f, -2.46f,
+LINE_TO, 0.63f, 8,
+R_LINE_TO, 1.64f, -1.84f,
+R_LINE_TO, -0.23f, -2.46f,
+R_LINE_TO, 2.41f, -0.54f,
+R_LINE_TO, 1.28f, -2.12f,
+LINE_TO, 8, 2,
+R_LINE_TO, 2.27f, -0.98f,
+R_LINE_TO, 1.28f, 2.13f,
+R_LINE_TO, 2.41f, 0.54f,
+R_LINE_TO, -0.23f, 2.46f,
+LINE_TO, 15.38f, 8,
+R_LINE_TO, -1.64f, 1.84f,
+R_LINE_TO, 0.23f, 2.46f,
+R_LINE_TO, -2.41f, 0.54f,
+R_LINE_TO, -1.28f, 2.13f,
+LINE_TO, 8, 14,
+CLOSE,
+R_MOVE_TO, 0.56f, -1.75f,
+LINE_TO, 8, 12.5f,
+R_LINE_TO, 1.72f, 0.73f,
+R_LINE_TO, 0.95f, -1.6f,
+R_LINE_TO, 1.81f, -0.41f,
+R_LINE_TO, -0.16f, -1.84f,
+LINE_TO, 13.53f, 8,
+R_LINE_TO, -1.21f, -1.38f,
+R_LINE_TO, 0.16f, -1.84f,
+R_LINE_TO, -1.81f, -0.41f,
+R_LINE_TO, -0.95f, -1.6f,
+LINE_TO, 8, 3.5f,
+R_LINE_TO, -1.71f, -0.73f,
+R_LINE_TO, -0.95f, 1.6f,
+R_LINE_TO, -1.81f, 0.39f,
+R_LINE_TO, 0.16f, 1.85f,
+LINE_TO, 2.47f, 8,
+R_LINE_TO, 1.23f, 1.38f,
+R_LINE_TO, -0.18f, 1.85f,
+R_LINE_TO, 1.81f, 0.41f,
+CLOSE,
+MOVE_TO, 8, 8,
+CLOSE,
+R_MOVE_TO, 0, 3.34f,
+R_CUBIC_TO, 0.2f, 0, 0.37f, -0.07f, 0.51f, -0.21f,
+R_ARC_TO, 0.69f, 0.69f, 0, 0, 0, 0.21f, -0.5f,
+R_ARC_TO, 0.71f, 0.71f, 0, 0, 0, -0.21f, -0.51f,
+ARC_TO, 0.69f, 0.69f, 0, 0, 0, 8, 9.9f,
+R_ARC_TO, 0.69f, 0.69f, 0, 0, 0, -0.51f, 0.21f,
+R_ARC_TO, 0.71f, 0.71f, 0, 0, 0, -0.21f, 0.51f,
+R_CUBIC_TO, 0, 0.2f, 0.07f, 0.37f, 0.21f, 0.5f,
+R_CUBIC_TO, 0.14f, 0.14f, 0.31f, 0.21f, 0.51f, 0.21f,
+CLOSE,
+R_MOVE_TO, -0.69f, -2.53f,
+H_LINE_TO, 8.69f,
+V_LINE_TO, 4.72f,
+H_LINE_TO, 7.31f,
+CLOSE
diff --git a/chrome/app/vector_icons/report.icon b/chrome/app/vector_icons/report.icon
new file mode 100644
index 0000000..e6246ae4
--- /dev/null
+++ b/chrome/app/vector_icons/report.icon
@@ -0,0 +1,38 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8, 11.09f,
+R_CUBIC_TO, 0.18f, 0, 0.34f, -0.06f, 0.47f, -0.19f,
+R_ARC_TO, 0.63f, 0.63f, 0, 0, 0, 0.19f, -0.46f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, -0.19f, -0.47f,
+ARC_TO, 0.63f, 0.63f, 0, 0, 0, 8, 9.77f,
+R_ARC_TO, 0.63f, 0.63f, 0, 0, 0, -0.47f, 0.2f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, -0.19f, 0.47f,
+R_CUBIC_TO, 0, 0.18f, 0.06f, 0.34f, 0.19f, 0.46f,
+ARC_TO, 0.64f, 0.64f, 0, 0, 0, 8, 11.09f,
+CLOSE,
+R_MOVE_TO, -0.63f, -2.18f,
+R_H_LINE_TO, 1.27f,
+V_LINE_TO, 4.73f,
+H_LINE_TO, 7.37f,
+CLOSE,
+MOVE_TO, 5.63f, 13.73f,
+R_LINE_TO, -3.36f, -3.38f,
+V_LINE_TO, 5.63f,
+R_LINE_TO, 3.36f, -3.36f,
+R_H_LINE_TO, 4.75f,
+R_LINE_TO, 3.36f, 3.36f,
+R_V_LINE_TO, 4.75f,
+R_LINE_TO, -3.38f, 3.36f,
+CLOSE,
+R_MOVE_TO, 0.57f, -1.38f,
+R_H_LINE_TO, 3.59f,
+R_LINE_TO, 2.56f, -2.56f,
+V_LINE_TO, 6.2f,
+R_LINE_TO, -2.57f, -2.56f,
+H_LINE_TO, 6.2f,
+LINE_TO, 3.65f, 6.2f,
+R_V_LINE_TO, 3.59f,
+CLOSE
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 7cc0bedc..2a68faf 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -487,6 +487,8 @@
     "enterprise/connectors/interstitials/enterprise_warn_controller_client.h",
     "enterprise/connectors/interstitials/enterprise_warn_page.cc",
     "enterprise/connectors/interstitials/enterprise_warn_page.h",
+    "enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.cc",
+    "enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.h",
     "enterprise/reporting/prefs.cc",
     "enterprise/reporting/prefs.h",
     "enterprise/reporting/profile_report_generator_delegate_base.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index f0fe52f..aa3c201 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3107,13 +3107,6 @@
          std::size(kUpmAndroidEnableForAllUsers), nullptr},
 };
 
-constexpr FeatureEntry::FeatureParam kIgnoreUPMAuthErrorMessageTimeouts[] = {
-    {"ignore_auth_error_message_timeouts", "true"}};
-constexpr FeatureEntry::FeatureVariation
-    kUnifiedPasswordManagerErrorMessagesVariations[] = {
-        {"Ignore timeouts", kIgnoreUPMAuthErrorMessageTimeouts,
-         std::size(kIgnoreUPMAuthErrorMessageTimeouts), nullptr}};
-
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if !BUILDFLAG(IS_ANDROID) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
@@ -8221,7 +8214,7 @@
 #if BUILDFLAG(ENABLE_PDF)
 
 #if !BUILDFLAG(IS_ANDROID)
-    // TODO(https://crbug.com/1278249): Add Windows once library supports it.
+    // TODO(https://crbug.com/1443341): Add Windows once library supports it.
     {"pdf-ocr", flag_descriptions::kPdfOcrName,
      flag_descriptions::kPdfOcrDescription,
      kOsMac | kOsLinux | kOsCrOS | kOsLacros,
@@ -8679,15 +8672,6 @@
          password_manager::features::kUnifiedPasswordManagerAndroid,
          kUnifiedPasswordManagerAndroidVariations,
          "UnifiedPasswordManagerAndroid")},
-
-    {"google-mobile-services-passwords-error-messages",
-     flag_descriptions::kUnifiedPasswordManagerErrorMessagesName,
-     flag_descriptions::kUnifiedPasswordManagerErrorMessagesDescription,
-     kOsAndroid,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(
-         password_manager::features::kUnifiedPasswordManagerErrorMessages,
-         kUnifiedPasswordManagerErrorMessagesVariations,
-         "UnifiedPasswordManagerErrorMessages")},
 #endif
 
     {"tab-search-fuzzy-search", flag_descriptions::kTabSearchFuzzySearchName,
@@ -9045,7 +9029,7 @@
 #endif
 
 #if !BUILDFLAG(IS_ANDROID)
-    // TODO(https://crbug.com/1278249): Add Windows once library supports it.
+    // TODO(https://crbug.com/1443349): Add Windows once library supports it.
     {"layout-extraction", flag_descriptions::kLayoutExtractionName,
      flag_descriptions::kLayoutExtractionDescription,
      kOsMac | kOsLinux | kOsCrOS | kOsLacros,
diff --git a/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc b/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc
index 90859e1..3ff7c70 100644
--- a/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc
+++ b/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc
@@ -335,10 +335,10 @@
   ash::AcceleratorAction accelerator_action;
   switch (params->accelerator_action) {
     case accessibility_private::ACCELERATOR_ACTION_FOCUSPREVIOUSPANE:
-      accelerator_action = ash::FOCUS_PREVIOUS_PANE;
+      accelerator_action = ash::AcceleratorAction::kFocusPreviousPane;
       break;
     case accessibility_private::ACCELERATOR_ACTION_FOCUSNEXTPANE:
-      accelerator_action = ash::FOCUS_NEXT_PANE;
+      accelerator_action = ash::AcceleratorAction::kFocusNextPane;
       break;
     case accessibility_private::ACCELERATOR_ACTION_NONE:
       NOTREACHED();
diff --git a/chrome/browser/accessibility/ax_screen_ai_annotator.cc b/chrome/browser/accessibility/ax_screen_ai_annotator.cc
index 1964155f..79cfa6b0 100644
--- a/chrome/browser/accessibility/ax_screen_ai_annotator.cc
+++ b/chrome/browser/accessibility/ax_screen_ai_annotator.cc
@@ -92,7 +92,7 @@
 
   base::TimeTicks start_time = base::TimeTicks::Now();
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-  // TODO(https://crbug.com/1278249): Need to run GrabViewSnapshot() in a
+  // TODO(https://crbug.com/1443349): Need to run GrabViewSnapshot() in a
   // thread that is not the main UI thread.
   base::SequencedTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
       FROM_HERE, base::BindOnce(&GrabViewSnapshot, web_contents->GetWeakPtr()),
@@ -137,7 +137,7 @@
   VLOG(2) << base::StrCat({"AXScreenAIAnnotator received tree ids: parent: ",
                            parent_tree_id.ToString().c_str(), ", ScreenAI: ",
                            screen_ai_tree_id.ToString().c_str()});
-  // TODO(https://crbug.com/1278249): Use!
+  // TODO(https://crbug.com/1443349): Use!
   NOTIMPLEMENTED();
 }
 
diff --git a/chrome/browser/accessibility/screen_ai_service_browsertest.cc b/chrome/browser/accessibility/screen_ai_service_browsertest.cc
index 963b66b..e362265c 100644
--- a/chrome/browser/accessibility/screen_ai_service_browsertest.cc
+++ b/chrome/browser/accessibility/screen_ai_service_browsertest.cc
@@ -21,7 +21,7 @@
   explicit MockAXScreenAIAnnotator(content::BrowserContext* context)
       : AXScreenAIAnnotator(context) {}
 
-  // TODO(https://1278249): Consider making Screen AI component available for
+  // TODO(crbug.com/1443345): Consider making Screen AI component available for
   // tests. The test should refrain from trying to bind to it while it is not
   // available.
   MOCK_METHOD(void,
@@ -41,14 +41,14 @@
 
 using ScreenAIServiceTest = InProcessBrowserTest;
 
-// TODO(https://crbug.com/1278249): Test is disabled as it requires delayed
+// TODO(crbug.com/1443345): Test is disabled as it requires delayed
 // connection to the service, but for PDF use case we need immediate connection
 // or adding extra boilerplate code to trigger it. Since PDF is the primary
 // goal, the test is disabled until the issue is fixed.
 IN_PROC_BROWSER_TEST_F(ScreenAIServiceTest, DISABLED_ScreenshotTest) {
   MockAXScreenAIAnnotator* annotator =
       new MockAXScreenAIAnnotator(browser()->profile());
-  // TODO(https://crbug.com/1278249): Pass |annotator| to
+  // TODO(crbug.com/1443345): Pass |annotator| to
   // AXScreenAIAnnotatorFactory to be used for test.
 
   base::RunLoop run_loop;
@@ -67,7 +67,7 @@
   browser()->RunScreenAIAnnotator();
   run_loop.Run();
 
-  // TODO(https://crbug.com/1278249): Add a test that mocks
+  // TODO(crbug.com/1443345): Add a test that mocks
   // |OnScreenshotReceived| and returns the expected proto, and observe its
   // application on the accessibility tree(s).
 }
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
index 0644f11..ae7b2361 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
+++ b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
@@ -205,7 +205,7 @@
   int MoveToFirstTestApp() {
     // Focus the shelf. This selects the launcher button.
     sm_.Call([this]() {
-      EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+      EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
     });
     sm_.ExpectSpeechPattern("Launcher");
     sm_.ExpectSpeech("Button");
@@ -340,7 +340,7 @@
     } else {
       // Focus the home button and press it to open the bubble launcher.
       sm_.Call([this]() {
-        EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+        EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
       });
       sm_.ExpectSpeechPattern("Launcher");
       sm_.ExpectSpeech("Button");
@@ -381,7 +381,7 @@
 
   // Focus the shelf. This selects the launcher button.
   sm_.Call([this]() {
-    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
   });
   sm_.ExpectSpeechPattern("Launcher");
   sm_.ExpectSpeech("Button");
@@ -420,7 +420,7 @@
 
   // Focus the shelf. This selects the launcher button.
   sm_.Call([this]() {
-    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
   });
   sm_.ExpectSpeechPattern("Launcher");
   sm_.ExpectSpeech("Button");
@@ -460,7 +460,7 @@
 
   // Focus the shelf. This selects the launcher button.
   sm_.Call([this]() {
-    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
   });
   sm_.ExpectSpeechPattern("Launcher");
   sm_.ExpectSpeech("Button");
@@ -541,7 +541,7 @@
 
   // Focus the shelf. This selects the launcher button.
   sm_.Call([this]() {
-    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
   });
   sm_.ExpectSpeechPattern("Launcher");
   sm_.ExpectSpeech("Button");
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
index 67aa2387..f718b0d 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
+++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -387,7 +387,7 @@
     // Press the accelerator that toggles the notification center.
     sm_.Call([this]() {
       EXPECT_TRUE(PerformAcceleratorAction(
-          AcceleratorAction::TOGGLE_MESSAGE_CENTER_BUBBLE));
+          AcceleratorAction::kToggleMessageCenterBubble));
     });
 
     // Verify the spoken feedback text.
@@ -398,7 +398,7 @@
 
   sm_.Call([this]() {
     EXPECT_TRUE(PerformAcceleratorAction(
-        AcceleratorAction::TOGGLE_MESSAGE_CENTER_BUBBLE));
+        AcceleratorAction::kToggleMessageCenterBubble));
   });
   sm_.ExpectSpeech(
       "Quick Settings, Press search plus left to access the notification "
@@ -524,7 +524,7 @@
   EnableChromeVox();
 
   sm_.Call([this]() {
-    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
   });
   sm_.ExpectSpeechPattern("Launcher");
   sm_.ExpectSpeech("Button");
@@ -601,7 +601,7 @@
 
   // Focus on the shelf.
   sm_.Call(
-      [this]() { PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF); });
+      [this]() { PerformAcceleratorAction(AcceleratorAction::kFocusShelf); });
   sm_.ExpectSpeech("Launcher");
   sm_.ExpectSpeech("Button");
   sm_.ExpectSpeech("Shelf");
@@ -709,7 +709,7 @@
 
     // Focus on the Shelf because voice text for focusing on Shelf is fixed.
     // Wait until voice announcements are finished.
-    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF));
+    EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::kFocusShelf));
   });
   sm_.ExpectSpeechPattern("Launcher");
 
@@ -751,7 +751,7 @@
 
   // Focus on the shelf.
   sm_.Call(
-      [this]() { PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF); });
+      [this]() { PerformAcceleratorAction(AcceleratorAction::kFocusShelf); });
   sm_.ExpectSpeech("Launcher");
   sm_.ExpectSpeech("Button");
   sm_.ExpectSpeech("Shelf");
@@ -803,7 +803,7 @@
 
   // Focus on the shelf.
   sm_.Call(
-      [this]() { PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF); });
+      [this]() { PerformAcceleratorAction(AcceleratorAction::kFocusShelf); });
   sm_.ExpectSpeech("Launcher");
   sm_.ExpectSpeech("Button");
   sm_.ExpectSpeech("Shelf");
@@ -891,7 +891,7 @@
 
   // Focus on the shelf.
   sm_.Call(
-      [this]() { PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF); });
+      [this]() { PerformAcceleratorAction(AcceleratorAction::kFocusShelf); });
   sm_.ExpectSpeech("Launcher");
   sm_.ExpectSpeech("Button");
   sm_.ExpectSpeech("Shelf");
@@ -938,7 +938,7 @@
 
   sm_.Call([this]() {
     EXPECT_TRUE(
-        PerformAcceleratorAction(AcceleratorAction::TOGGLE_SYSTEM_TRAY_BUBBLE));
+        PerformAcceleratorAction(AcceleratorAction::kToggleSystemTrayBubble));
   });
   sm_.ExpectSpeech(
       "Quick Settings, Press search plus left to access the notification "
@@ -953,7 +953,7 @@
   EnableChromeVox();
 
   sm_.Call([this]() {
-    (PerformAcceleratorAction(AcceleratorAction::TOGGLE_SYSTEM_TRAY_BUBBLE));
+    (PerformAcceleratorAction(AcceleratorAction::kToggleSystemTrayBubble));
   });
   sm_.ExpectSpeech(
       "Quick Settings, Press search plus left to access the notification "
@@ -1009,12 +1009,12 @@
   EnableChromeVox();
 
   sm_.Call([this]() {
-    (PerformAcceleratorAction(AcceleratorAction::BRIGHTNESS_UP));
+    (PerformAcceleratorAction(AcceleratorAction::kBrightnessUp));
   });
   sm_.ExpectSpeechPattern("Brightness * percent");
 
   sm_.Call([this]() {
-    (PerformAcceleratorAction(AcceleratorAction::BRIGHTNESS_DOWN));
+    (PerformAcceleratorAction(AcceleratorAction::kBrightnessDown));
   });
   sm_.ExpectSpeechPattern("Brightness * percent");
 
@@ -1027,8 +1027,8 @@
   sm_.Call([this]() {
     // Volume slider does not fire valueChanged event on first key press because
     // it has no widget.
-    PerformAcceleratorAction(AcceleratorAction::VOLUME_UP);
-    PerformAcceleratorAction(AcceleratorAction::VOLUME_UP);
+    PerformAcceleratorAction(AcceleratorAction::kVolumeUp);
+    PerformAcceleratorAction(AcceleratorAction::kVolumeUp);
   });
   sm_.ExpectSpeechPattern("* percent*");
   sm_.Replay();
@@ -1121,7 +1121,7 @@
   sm_.ExpectSpeech("Click me");
 
   sm_.Call([this]() {
-    (PerformAcceleratorAction(AcceleratorAction::TOGGLE_OVERVIEW));
+    (PerformAcceleratorAction(AcceleratorAction::kToggleOverview));
   });
 
   sm_.ExpectSpeech(
@@ -1171,7 +1171,7 @@
   });
 
   sm_.Call([this]() {
-    (PerformAcceleratorAction(AcceleratorAction::TOGGLE_OVERVIEW));
+    (PerformAcceleratorAction(AcceleratorAction::kToggleOverview));
   });
 
   EnableChromeVox();
@@ -2186,7 +2186,7 @@
 
   // Enter overview first. This is how we reach the desk templates UI.
   sm_.Call([this]() {
-    (PerformAcceleratorAction(AcceleratorAction::TOGGLE_OVERVIEW));
+    (PerformAcceleratorAction(AcceleratorAction::kToggleOverview));
   });
 
   sm_.ExpectSpeech(
diff --git a/chrome/browser/ash/app_list/app_list_sort_browsertest.cc b/chrome/browser/ash/app_list/app_list_sort_browsertest.cc
index 9c612dc..55a30089 100644
--- a/chrome/browser/ash/app_list/app_list_sort_browsertest.cc
+++ b/chrome/browser/ash/app_list/app_list_sort_browsertest.cc
@@ -45,6 +45,7 @@
 
 namespace {
 
+using AcceleratorAction = ash::AcceleratorAction;
 using MenuType = ash::AppListTestApi::MenuType;
 using ReorderAnimationEndState = ash::AppListTestApi::ReorderAnimationEndState;
 
@@ -183,7 +184,7 @@
 
     // Shows the app list which is initially behind a window in tablet mode.
     ash::AcceleratorController::Get()->PerformActionIfEnabled(
-        ash::TOGGLE_APP_LIST, {});
+        AcceleratorAction::kToggleAppList, {});
 
     const int default_app_count = app_list_test_api_.GetTopListItemCount();
 
@@ -251,7 +252,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   base::HistogramTester histograms;
@@ -278,7 +279,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
   ReorderTopLevelAppsGridAndWaitForCompletion(
       ash::AppListSortOrder::kNameAlphabetical, MenuType::kAppListPageMenu);
@@ -315,7 +316,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Move apps to one folder.
@@ -343,7 +344,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   ReorderTopLevelAppsGridAndWaitForCompletion(
@@ -368,7 +369,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Move apps to one folder.
@@ -395,7 +396,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Move apps to one folder.
@@ -419,7 +420,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Create an app list folder.
@@ -458,7 +459,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Create an app list folder.
@@ -507,7 +508,7 @@
                        SortUsingContextMenuOnFolderChildViewTablet) {
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Create an app list folder.
@@ -545,7 +546,7 @@
                        FolderNotClosedIfTemporarySortIsCommittedTablet) {
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Create an app list folder.
@@ -600,7 +601,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -636,7 +637,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -682,7 +683,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -736,7 +737,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -789,7 +790,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -814,7 +815,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
   EXPECT_EQ(ash::AppListToastType::kNone, app_list_test_api_.GetToastType());
   EXPECT_EQ(GetAppIdsInOrdinalOrder(),
@@ -825,7 +826,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   EXPECT_EQ(ash::AppListToastType::kNone, app_list_test_api_.GetToastType());
@@ -838,7 +839,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -861,7 +862,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   EXPECT_EQ(ash::AppListToastType::kNone, app_list_test_api_.GetToastType());
@@ -872,7 +873,7 @@
   // toast is now hidden.
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   EXPECT_EQ(ash::AppListToastType::kNone, app_list_test_api_.GetToastType());
@@ -886,7 +887,7 @@
                        DISABLED_TransitionToTabletModeDuringFadeOutAnimation) {
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -902,7 +903,7 @@
       &actual_state);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify that the reorder animation is aborted.
@@ -932,7 +933,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -948,7 +949,7 @@
       &actual_state);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify that the reorder animation is aborted.
@@ -973,7 +974,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -995,7 +996,7 @@
 
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify that the reorder animation is aborted.
@@ -1020,7 +1021,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(false);
   WaitForAppListTransitionAnimation();
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -1055,7 +1056,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -1080,7 +1081,7 @@
   EXPECT_NE(ReorderAnimationEndState::kFadeOutAborted, actual_state);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // When switching out of the tablet mode, the tablet mode app list gets
@@ -1111,7 +1112,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -1139,7 +1140,7 @@
   EXPECT_EQ(ReorderAnimationEndState::kFadeInAborted, actual_state);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // When switching out of the tablet mode, the tablet mode app list gets
@@ -1161,7 +1162,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -1199,7 +1200,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -1238,7 +1239,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   // Verify the default app order.
@@ -1275,7 +1276,7 @@
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
 
   // Verify the default app order.
@@ -1311,7 +1312,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   ReorderTopLevelAppsGridAndWaitForCompletion(
@@ -1447,7 +1448,7 @@
   WaitForAppListTransitionAnimation();
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
 
   ReorderTopLevelAppsGridAndWaitForCompletion(
@@ -1524,7 +1525,7 @@
   LoginUser(account_id1_);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      AcceleratorAction::kToggleAppList, {});
   const bool is_in_tablet = GetParam();
   ash::AppListTestApi app_list_test_api;
   if (is_in_tablet)
diff --git a/chrome/browser/ash/app_list/app_service/app_service_app_item_browsertest.cc b/chrome/browser/ash/app_list/app_service/app_service_app_item_browsertest.cc
index 63d78b47..7ce3eb08 100644
--- a/chrome/browser/ash/app_list/app_service/app_service_app_item_browsertest.cc
+++ b/chrome/browser/ash/app_list/app_service/app_service_app_item_browsertest.cc
@@ -197,7 +197,7 @@
   ASSERT_TRUE(extension_app);
 
   ash::AcceleratorController::Get()->PerformActionIfEnabled(
-      ash::TOGGLE_APP_LIST, {});
+      ash::AcceleratorAction::kToggleAppList, {});
   ash::AppListTestApi app_list_test_api;
   app_list_test_api.WaitForBubbleWindow(/*wait_for_opening_animation=*/false);
 
diff --git a/chrome/browser/ash/app_list/chrome_app_list_item_browsertest.cc b/chrome/browser/ash/app_list/chrome_app_list_item_browsertest.cc
index 72eee2b..aa2b7e5 100644
--- a/chrome/browser/ash/app_list/chrome_app_list_item_browsertest.cc
+++ b/chrome/browser/ash/app_list/chrome_app_list_item_browsertest.cc
@@ -65,7 +65,7 @@
   void ShowLauncherAppsGrid() {
     EXPECT_FALSE(client_->GetAppListWindow());
     ash::AcceleratorController::Get()->PerformActionIfEnabled(
-        ash::TOGGLE_APP_LIST, {});
+        ash::AcceleratorAction::kToggleAppList, {});
     ash::AppListTestApi().WaitForBubbleWindow(
         /*wait_for_opening_animation=*/false);
     EXPECT_TRUE(client_->GetAppListWindow());
diff --git a/chrome/browser/ash/app_list/chrome_app_list_model_updater_browsertest.cc b/chrome/browser/ash/app_list/chrome_app_list_model_updater_browsertest.cc
index 5da3c31..400bf5f 100644
--- a/chrome/browser/ash/app_list/chrome_app_list_model_updater_browsertest.cc
+++ b/chrome/browser/ash/app_list/chrome_app_list_model_updater_browsertest.cc
@@ -115,7 +115,7 @@
 
   void ShowAppList() {
     ash::AcceleratorController::Get()->PerformActionIfEnabled(
-        ash::TOGGLE_APP_LIST, {});
+        ash::AcceleratorAction::kToggleAppList, {});
     app_list_test_api_.WaitForBubbleWindow(
         /*wait_for_opening_animation=*/false);
   }
diff --git a/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc b/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc
index 81d812c..4dadf9f9 100644
--- a/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc
+++ b/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc
@@ -166,7 +166,7 @@
           /*wait_for_opening_animation=*/true);
     } else {
       ash::AcceleratorController::Get()->PerformActionIfEnabled(
-          ash::TOGGLE_APP_LIST, {});
+          ash::AcceleratorAction::kToggleAppList, {});
 
       // We dispatch mouse events to interact with UI. Wait animation completion
       // to reliably dispatch those events.
diff --git a/chrome/browser/ash/app_restore/full_restore_service.cc b/chrome/browser/ash/app_restore/full_restore_service.cc
index 2c825a09..bb43d567 100644
--- a/chrome/browser/ash/app_restore/full_restore_service.cc
+++ b/chrome/browser/ash/app_restore/full_restore_service.cc
@@ -346,12 +346,12 @@
 
 void FullRestoreService::OnActionPerformed(AcceleratorAction action) {
   switch (action) {
-    case NEW_INCOGNITO_WINDOW:
-    case NEW_TAB:
-    case NEW_WINDOW:
-    case OPEN_CROSH:
-    case OPEN_DIAGNOSTICS:
-    case RESTORE_TAB:
+    case AcceleratorAction::kNewIncognitoWindow:
+    case AcceleratorAction::kNewTab:
+    case AcceleratorAction::kNewWindow:
+    case AcceleratorAction::kOpenCrosh:
+    case AcceleratorAction::kOpenDiagnostics:
+    case AcceleratorAction::kRestoreTab:
       MaybeCloseNotification();
       return;
     default:
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index f5d42da..63740c7 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -288,6 +288,7 @@
     "//chrome/common:channel_info",
     "//chrome/common:constants",
     "//chromeos/ash/components/account_manager",
+    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/dbus",
     "//chromeos/ash/components/dbus/cros_disks",
diff --git a/chrome/browser/ash/crosapi/network_settings_service_ash.cc b/chrome/browser/ash/crosapi/network_settings_service_ash.cc
index 9449e8c..b50a26f 100644
--- a/chrome/browser/ash/crosapi/network_settings_service_ash.cc
+++ b/chrome/browser/ash/crosapi/network_settings_service_ash.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_state.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
@@ -35,11 +36,21 @@
 PrefService* GetPrimaryLoggedInUserProfilePrefs() {
   // Check login state first.
   if (!user_manager::UserManager::IsInitialized() ||
-      !user_manager::UserManager::Get()->IsUserLoggedIn() ||
-      ProfileManager::GetPrimaryUserProfile() == nullptr) {
+      !user_manager::UserManager::Get()->IsUserLoggedIn()) {
     return nullptr;
   }
-  return ProfileManager::GetPrimaryUserProfile()->GetPrefs();
+
+  auto* primary_user = user_manager::UserManager::Get()->GetPrimaryUser();
+  if (!primary_user) {
+    return nullptr;
+  }
+
+  auto* profile = Profile::FromBrowserContext(
+      ash::BrowserContextHelper::Get()->GetBrowserContextByUser(primary_user));
+  if (!profile) {
+    return nullptr;
+  }
+  return profile->GetPrefs();
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
index 531c698..0a08dcf 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
@@ -92,8 +92,9 @@
   // Get the state of the connection (open, closing, or closed)
   State GetState();
 
-  // Close the connection.
-  void Close(TargetDeviceConnectionBroker::ConnectionClosedReason reason);
+  // TargetDeviceConnectionBroker::AuthenticatedConnection:
+  void Close(
+      TargetDeviceConnectionBroker::ConnectionClosedReason reason) override;
 
   // Changes the connection state to authenticated and invokes the
   // ConnectionAuthenticatedCallback. The caller must ensure that the connection
@@ -117,7 +118,7 @@
   using PayloadResponseCallback =
       base::OnceCallback<void(absl::optional<std::vector<uint8_t>>)>;
 
-  // TargetDeviceConnectionBroker::AuthenticatedConnection
+  // TargetDeviceConnectionBroker::AuthenticatedConnection:
   void RequestWifiCredentials(int32_t session_id,
                               RequestWifiCredentialsCallback callback) override;
   void NotifySourceOfUpdate(int32_t session_id,
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_target_device_connection_broker.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_target_device_connection_broker.cc
index f1638a0..ff7a868 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_target_device_connection_broker.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_target_device_connection_broker.cc
@@ -107,7 +107,8 @@
       nearby_connection, session_context,
       mojo::SharedRemote<ash::quick_start::mojom::QuickStartDecoder>(
           fake_quick_start_decoder_->GetRemote()),
-      base::DoNothing(),
+      base::BindOnce(&FakeTargetDeviceConnectionBroker::OnConnectionClosed,
+                     weak_ptr_factory_.GetWeakPtr()),
       base::BindOnce(
           &FakeTargetDeviceConnectionBroker::OnConnectionAuthenticated,
           weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h
index 28982fe..3e40346 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h
@@ -43,6 +43,7 @@
     kAuthenticationFailed,
     kConnectionLost,
     kRequestTimedOut,
+    kTargetDeviceUpdate,
     kUnknownError,
   };
 
@@ -58,6 +59,10 @@
     using RequestAccountTransferAssertionCallback =
         base::OnceCallback<void(absl::optional<FidoAssertionInfo>)>;
 
+    // Close the connection.
+    virtual void Close(
+        TargetDeviceConnectionBroker::ConnectionClosedReason reason) = 0;
+
     // Request wifi credentials from target Android device. The session_id is
     // used to identify this QuickStart session and is distinct from the
     // RandomSessionId.
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
index 241ce21c..44cf8ae 100644
--- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
@@ -106,20 +106,13 @@
     return;
   }
 
-  // TODO(b/280308026): Implement NotifySourceOfUpdateCallback and pass as
-  // argument here. This callback persists the connection info to local disk if
-  // the success param it receives is 'true' and then drops the connection.
-  authenticated_connection_->NotifySourceOfUpdate(session_id_,
-                                                  base::DoNothing());
-
-  // TODO(b/234655072): Implement timeout for connection to close.
-  // If the source device successfully receives this message, it drops the
-  // connection. The target device waits 1-3 seconds for the connection to close
-  // in order to confirm the source device is prepared to re-connect after the
-  // target device reboots. If the connection isn't closed within the timeout,
-  // the target device reboots like normal and will not automatically resume
-  // Quick Start after the update.
-  prepare_for_update_on_connection_closed_ = true;
+  // TODO(b/234655072): Implement 3 second timeout for invocation of
+  // OnNotifySourceOfUpdateResponse() callback.
+  authenticated_connection_->NotifySourceOfUpdate(
+      session_id_,
+      base::BindOnce(
+          &TargetDeviceBootstrapController::OnNotifySourceOfUpdateResponse,
+          weak_ptr_factory_.GetWeakPtr()));
 }
 
 void TargetDeviceBootstrapController::OnPinVerificationRequested(
@@ -175,13 +168,6 @@
   status_.step = Step::ERROR;
   status_.payload = ErrorCode::CONNECTION_CLOSED;
   NotifyObservers();
-
-  if (prepare_for_update_on_connection_closed_) {
-    PrefService* prefs = g_browser_process->local_state();
-    prefs->SetBoolean(prefs::kShouldResumeQuickStartAfterReboot, true);
-    base::Value::Dict info = connection_broker_->GetPrepareForUpdateInfo();
-    prefs->SetDict(prefs::kResumeQuickStartAfterRebootInfo, std::move(info));
-  }
 }
 
 void TargetDeviceBootstrapController::NotifyObservers() {
@@ -207,4 +193,20 @@
   NotifyObservers();
 }
 
+void TargetDeviceBootstrapController::OnNotifySourceOfUpdateResponse(
+    bool ack_successful) {
+  CHECK(authenticated_connection_);
+
+  if (ack_successful) {
+    PrefService* prefs = g_browser_process->local_state();
+    prefs->SetBoolean(prefs::kShouldResumeQuickStartAfterReboot, true);
+    base::Value::Dict info = connection_broker_->GetPrepareForUpdateInfo();
+    prefs->SetDict(prefs::kResumeQuickStartAfterRebootInfo, std::move(info));
+  }
+
+  authenticated_connection_->Close(
+      TargetDeviceConnectionBroker::ConnectionClosedReason::
+          kTargetDeviceUpdate);
+}
+
 }  // namespace ash::quick_start
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h
index 913758c..ae6991d 100644
--- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h
+++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h
@@ -97,15 +97,24 @@
       TargetDeviceConnectionBroker::ConnectionClosedReason reason) override;
 
  private:
+  friend class TargetDeviceBootstrapControllerTest;
+
   void NotifyObservers();
   void OnStartAdvertisingResult(bool success);
   void OnStopAdvertising();
+
+  // If the target device successfully receives an ack message within a
+  // specified timeout, it prepares to automatically resume Quick Start after
+  // the update and closes the connection. If ack_successful is 'false', it
+  // closes the connection without preparing to automatically resume Quick Start
+  // after the update.
+  void OnNotifySourceOfUpdateResponse(bool ack_successful);
+
   std::unique_ptr<TargetDeviceConnectionBroker> connection_broker_;
 
   std::string pin_;
   // TODO: Should we enforce one observer at a time here too?
   base::ObserverList<Observer> observers_;
-  bool prepare_for_update_on_connection_closed_ = false;
 
   Status status_;
 
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc
index 343d0d3..0a14d8c4 100644
--- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc
@@ -82,6 +82,10 @@
     bootstrap_controller_->AddObserver(fake_observer_.get());
   }
 
+  void NotifySourceOfUpdateResponse(bool ack_successful) {
+    bootstrap_controller_->OnNotifySourceOfUpdateResponse(ack_successful);
+  }
+
   PrefService* GetLocalState() { return local_state_.Get(); }
 
  protected:
@@ -235,29 +239,8 @@
   ASSERT_TRUE(bootstrap_controller_->GetPhoneInstanceId().empty());
 }
 
-TEST_F(TargetDeviceBootstrapControllerTest, PrepareForUpdate_NotConnected) {
-  ASSERT_FALSE(
-      GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
-  ASSERT_TRUE(GetLocalState()
-                  ->GetDict(prefs::kResumeQuickStartAfterRebootInfo)
-                  .empty());
-
-  // PrepareForUpdate() shouldn't do anything if the connection is not
-  // established.
-  bootstrap_controller_->StartAdvertising();
-  fake_target_device_connection_broker_->on_start_advertising_callback().Run(
-      /*success=*/true);
-  ASSERT_NE(fake_observer_->last_status.step, Step::CONNECTED);
-
-  bootstrap_controller_->PrepareForUpdate();
-  EXPECT_FALSE(
-      GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
-  EXPECT_TRUE(GetLocalState()
-                  ->GetDict(prefs::kResumeQuickStartAfterRebootInfo)
-                  .empty());
-}
-
-TEST_F(TargetDeviceBootstrapControllerTest, PrepareForUpdate) {
+TEST_F(TargetDeviceBootstrapControllerTest,
+       OnNotifySourceOfUpdateResponse_AckSuccessful) {
   ASSERT_FALSE(
       GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
   ASSERT_TRUE(GetLocalState()
@@ -272,22 +255,46 @@
       kSourceDeviceId);
   ASSERT_EQ(fake_observer_->last_status.step, Step::CONNECTED);
 
-  bootstrap_controller_->PrepareForUpdate();
-  // Pref shouldn't change until the connection is closed.
-  EXPECT_FALSE(
-      GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
-  EXPECT_TRUE(GetLocalState()
-                  ->GetDict(prefs::kResumeQuickStartAfterRebootInfo)
-                  .empty());
-  fake_target_device_connection_broker_->CloseConnection(
-      ConnectionClosedReason::kConnectionLost);
+  NotifySourceOfUpdateResponse(/*ack_successful=*/true);
+
+  ASSERT_TRUE(
+      absl::holds_alternative<ErrorCode>(fake_observer_->last_status.payload));
+  EXPECT_EQ(absl::get<ErrorCode>(fake_observer_->last_status.payload),
+            ErrorCode::CONNECTION_CLOSED);
   EXPECT_TRUE(
       GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
   EXPECT_FALSE(GetLocalState()
                    ->GetDict(prefs::kResumeQuickStartAfterRebootInfo)
                    .empty());
-  GetLocalState()->ClearPref(prefs::kShouldResumeQuickStartAfterReboot);
-  GetLocalState()->ClearPref(prefs::kResumeQuickStartAfterRebootInfo);
+}
+
+TEST_F(TargetDeviceBootstrapControllerTest,
+       OnNotifySourceOfUpdateResponse_AckUnsuccessful) {
+  ASSERT_FALSE(
+      GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
+  ASSERT_TRUE(GetLocalState()
+                  ->GetDict(prefs::kResumeQuickStartAfterRebootInfo)
+                  .empty());
+
+  bootstrap_controller_->StartAdvertising();
+  fake_target_device_connection_broker_->on_start_advertising_callback().Run(
+      /*success=*/true);
+  fake_target_device_connection_broker_->InitiateConnection(kSourceDeviceId);
+  fake_target_device_connection_broker_->AuthenticateConnection(
+      kSourceDeviceId);
+  ASSERT_EQ(fake_observer_->last_status.step, Step::CONNECTED);
+
+  NotifySourceOfUpdateResponse(/*ack_successful=*/false);
+
+  ASSERT_TRUE(
+      absl::holds_alternative<ErrorCode>(fake_observer_->last_status.payload));
+  EXPECT_EQ(absl::get<ErrorCode>(fake_observer_->last_status.payload),
+            ErrorCode::CONNECTION_CLOSED);
+  EXPECT_FALSE(
+      GetLocalState()->GetBoolean(prefs::kShouldResumeQuickStartAfterReboot));
+  EXPECT_TRUE(GetLocalState()
+                  ->GetDict(prefs::kResumeQuickStartAfterRebootInfo)
+                  .empty());
 }
 
 }  // namespace ash::quick_start
diff --git a/chrome/browser/ash/login/screens/device_disabled_screen.cc b/chrome/browser/ash/login/screens/device_disabled_screen.cc
index 6224faf4..d84eb18 100644
--- a/chrome/browser/ash/login/screens/device_disabled_screen.cc
+++ b/chrome/browser/ash/login/screens/device_disabled_screen.cc
@@ -36,13 +36,12 @@
     return;
   }
 
-  const bool is_disabled_ad_device =
-      InstallAttributes::Get()->IsActiveDirectoryManaged();
-
-  view_->Show(DeviceDisablingManager()->serial_number(),
-              DeviceDisablingManager()->enrollment_domain(),
-              DeviceDisablingManager()->disabled_message(),
-              is_disabled_ad_device);
+  view_->Show(
+      DeviceDisablingManager()->serial_number(),
+      DeviceDisablingManager()->enrollment_domain(),
+      DeviceDisablingManager()->disabled_message(),
+      // TODO() remove this parameter from DeviceDisabledScreenHandler::Show.
+      /*is_disabled_ad_device=*/false);
   DeviceDisablingManager()->AddObserver(this);
 }
 
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc
index 5330f08..645712b 100644
--- a/chrome/browser/ash/login/ui/login_display_host_common.cc
+++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -22,6 +22,7 @@
 #include "chrome/browser/ash/login/existing_user_controller.h"
 #include "chrome/browser/ash/login/lock_screen_utils.h"
 #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h"
+#include "chrome/browser/ash/login/oobe_quick_start/oobe_quick_start_pref_names.h"
 #include "chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h"
 #include "chrome/browser/ash/login/screens/encryption_migration_screen.h"
 #include "chrome/browser/ash/login/screens/gaia_screen.h"
@@ -721,11 +722,13 @@
             profile);
     DCHECK(service);
 
+    bool is_resume_after_update = g_browser_process->local_state()->GetBoolean(
+        quick_start::prefs::kShouldResumeQuickStartAfterReboot);
     bootstrap_controller_ =
         std::make_unique<ash::quick_start::TargetDeviceBootstrapController>(
             quick_start::TargetDeviceConnectionBrokerFactory::Create(
                 service->GetNearbyConnectionsManager(),
-                service->GetQuickStartDecoder(), false));
+                service->GetQuickStartDecoder(), is_resume_after_update));
   }
   return bootstrap_controller_->GetAsWeakPtrForClient();
 }
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
index ad1f543..8cc0579 100644
--- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
+++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
@@ -348,11 +348,10 @@
   return apps_util::IsSupportedAppTypePolicyId(policy_id);
 }
 
-void PinnedLauncherAppsPolicyHandler::ApplyList(base::Value filtered_list,
+void PinnedLauncherAppsPolicyHandler::ApplyList(base::Value::List filtered_list,
                                                 PrefValueMap* prefs) {
-  DCHECK(filtered_list.is_list());
   base::Value::List pinned_apps_list;
-  for (base::Value& entry : filtered_list.GetList()) {
+  for (base::Value& entry : filtered_list) {
     base::Value::Dict app_dict;
     app_dict.Set(ChromeShelfPrefs::kPinnedAppsPrefAppIDKey, std::move(entry));
     pinned_apps_list.Append(std::move(app_dict));
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
index 9996a9b..a1e7197 100644
--- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
+++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
@@ -105,7 +105,7 @@
 
   // Converts the list of strings |filtered_list| to a list of dictionaries and
   // sets the pref.
-  void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override;
+  void ApplyList(base::Value::List filtered_list, PrefValueMap* prefs) override;
 };
 
 // Maps the DefaultHandlersForFileExtensions policy to the corresponding pref.
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.cc
index c48510cf..8d22909 100644
--- a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.cc
@@ -54,7 +54,8 @@
 }
 
 void DeviceCommandResetEuiccJob::RunImpl(CallbackWithResult result_callback) {
-  absl::optional<dbus::ObjectPath> euicc_path = ash::GetCurrentEuiccPath();
+  absl::optional<dbus::ObjectPath> euicc_path =
+      ash::cellular_utils::GetCurrentEuiccPath();
   if (!euicc_path) {
     SYSLOG(ERROR) << "No current EUICC. Unable to reset EUICC";
     RunResultCallback(std::move(result_callback), ResultType::kFailure);
diff --git a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
index 31267b63..ae4a2db 100644
--- a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
+++ b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
@@ -315,7 +315,7 @@
     AppListClientImpl* client = AppListClientImpl::GetInstance();
     EXPECT_FALSE(client->GetAppListWindow());
     ash::AcceleratorController::Get()->PerformActionIfEnabled(
-        ash::TOGGLE_APP_LIST, {});
+        AcceleratorAction::kToggleAppList, {});
     ash::AppListTestApi().WaitForBubbleWindow(wait_for_opening_animation);
     EXPECT_TRUE(client->GetAppListWindow());
   }
diff --git a/chrome/browser/ash/system/device_disabling_manager.cc b/chrome/browser/ash/system/device_disabling_manager.cc
index ac0dd0a..d9e0c085 100644
--- a/chrome/browser/ash/system/device_disabling_manager.cc
+++ b/chrome/browser/ash/system/device_disabling_manager.cc
@@ -154,13 +154,6 @@
     return false;
   }
 
-  // If the device is AD managed, force disable the device (b/259180126).
-  if (g_browser_process->platform_part()
-          ->browser_policy_connector_ash()
-          ->IsActiveDirectoryManaged()) {
-    return true;
-  }
-
   bool device_disabled = false;
   CrosSettings::Get()->GetBoolean(kDeviceDisabled, &device_disabled);
   return device_disabled;
diff --git a/chrome/browser/ash/system/device_disabling_manager_unittest.cc b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
index ea629b4..13033f05 100644
--- a/chrome/browser/ash/system/device_disabling_manager_unittest.cc
+++ b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
@@ -79,7 +79,6 @@
   // Configure install attributes.
   void SetUnowned();
   void SetEnterpriseCloudOwned();
-  void SetEnterpriseActiveDirectoryOwned();
   void SetConsumerOwned();
 
  private:
@@ -121,11 +120,6 @@
       kEnrollmentDomain, kDeviceId);
 }
 
-void DeviceDisablingManagerTestBase::SetEnterpriseActiveDirectoryOwned() {
-  cros_settings_test_helper_.InstallAttributes()->SetActiveDirectoryManaged(
-      kEnrollmentDomain, kDeviceId);
-}
-
 void DeviceDisablingManagerTestBase::SetConsumerOwned() {
   cros_settings_test_helper_.InstallAttributes()->SetConsumerOwned();
 }
@@ -236,17 +230,6 @@
 }
 
 // Verifies that the device is not considered disabled during OOBE when it is
-// enrolled in AD mode, even if the device is marked as disabled.
-TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenAdOwned) {
-  SetEnterpriseActiveDirectoryOwned();
-  SetDeviceDisabled(true);
-
-  CheckWhetherDeviceDisabledDuringOOBE();
-
-  EXPECT_FALSE(device_disabled());
-}
-
-// Verifies that the device is not considered disabled during OOBE when it is
 // already owned by a consumer, even if the device is marked as disabled.
 TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenConsumerOwned) {
   SetConsumerOwned();
@@ -393,21 +376,6 @@
   CreateDeviceDisablingManager();
 }
 
-// Verifies that the device is not considered disabled when device disabling is
-// turned off by switch, even if the device is AD managed.
-TEST_F(DeviceDisablingManagerTest, NotDisabledWhenTurnedOffBySwitchAdManaged) {
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kDisableDeviceDisabling);
-  SetEnterpriseActiveDirectoryOwned();
-  MakeCrosSettingsTrusted();
-  SetDeviceDisabled(true);
-
-  EXPECT_CALL(*this, RestartToLoginScreen()).Times(0);
-  EXPECT_CALL(*this, ShowDeviceDisabledScreen()).Times(0);
-  EXPECT_CALL(*this, OnDisabledMessageChanged(_)).Times(0);
-  CreateDeviceDisablingManager();
-}
-
 // Verifies that the device is not considered disabled when it is owned by a
 // consumer, even if the device is marked as disabled.
 TEST_F(DeviceDisablingManagerTest, NotDisabledWhenConsumerOwned) {
@@ -421,21 +389,6 @@
   CreateDeviceDisablingManager();
 }
 
-// Verifies that AD device is considered disabled, even when it is explicitly
-// marked as not disabled (as per b/259180126).
-TEST_F(DeviceDisablingManagerTest, DisabledWhenAdManagedAndChromadDisabled) {
-  SetEnterpriseActiveDirectoryOwned();
-  MakeCrosSettingsTrusted();
-  SetDisabledMessage("");
-  SetDeviceDisabled(false);
-
-  EXPECT_CALL(*this, RestartToLoginScreen()).Times(0);
-  EXPECT_CALL(*this, ShowDeviceDisabledScreen()).Times(1);
-  EXPECT_CALL(*this, OnDisabledMessageChanged(_)).Times(0);
-  CreateDeviceDisablingManager();
-  EXPECT_TRUE(GetDeviceDisablingManager()->disabled_message().empty());
-}
-
 // Verifies that the device disabled screen is shown immediately when the device
 // is already marked as disabled on start-up.
 TEST_F(DeviceDisablingManagerTest, DisabledOnLoginScreen) {
@@ -562,10 +515,6 @@
   // Enterprise cloud owned.
   SetEnterpriseCloudOwned();
   EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation());
-
-  // Enterprise AD owned.
-  SetEnterpriseActiveDirectoryOwned();
-  EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation());
 }
 
 // Tests the IsDeviceDisabledDuringNormalOperation() method, when device
@@ -592,16 +541,5 @@
   EXPECT_TRUE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation());
 }
 
-// Tests that IsDeviceDisabledDuringNormalOperation() is always true, when
-// device is enterprise AD owned (as per b/259180126).
-TEST_F(DeviceDisablingManagerTest, IsDeviceDisabledAdOwner) {
-  // Enterprise AD owned.
-  SetEnterpriseActiveDirectoryOwned();
-  MakeCrosSettingsTrusted();
-  SetDeviceDisabled(false);
-
-  EXPECT_TRUE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation());
-}
-
 }  // namespace system
 }  // namespace ash
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillUiUtils.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillUiUtils.java
index 4663971..5a7d38d 100644
--- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillUiUtils.java
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillUiUtils.java
@@ -527,6 +527,22 @@
         return R.dimen.card_unmask_dialog_credit_card_icon_height;
     }
 
+    public static int getVirtualCardEnrollmentDialogIconWidthId() {
+        if (ChromeFeatureList.isEnabled(
+                    ChromeFeatureList.AUTOFILL_ENABLE_NEW_CARD_ART_AND_NETWORK_IMAGES)) {
+            return R.dimen.virtual_card_enrollment_dialog_card_art_width_new;
+        }
+        return R.dimen.virtual_card_enrollment_dialog_card_art_width;
+    }
+
+    public static int getVirtualCardEnrollmentDialogIconHeightId() {
+        if (ChromeFeatureList.isEnabled(
+                    ChromeFeatureList.AUTOFILL_ENABLE_NEW_CARD_ART_AND_NETWORK_IMAGES)) {
+            return R.dimen.virtual_card_enrollment_dialog_card_art_height_new;
+        }
+        return R.dimen.virtual_card_enrollment_dialog_card_art_height;
+    }
+
     /**
      * Resize the bitmap to the required specs, round corners, and add grey border.
      * @param bitmap to be updated.
diff --git a/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc b/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc
index f3012c5..9f97d162 100644
--- a/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc
@@ -15,6 +15,8 @@
 #include "extensions/common/switches.h"
 #include "extensions/test/result_catcher.h"
 #include "extensions/test/test_extension_dir.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 namespace scard_api = extensions::api::smart_card_provider_private;
 
@@ -24,6 +26,19 @@
 using device::mojom::SmartCardSuccess;
 using testing::ElementsAre;
 
+MATCHER_P(IsError, expected_error, "") {
+  if (!arg->is_error()) {
+    *result_listener << "is not an error";
+    return false;
+  }
+  if (arg->get_error() != expected_error) {
+    *result_listener << "expected " << expected_error << ", got "
+                     << arg->get_error();
+    return false;
+  }
+  return true;
+}
+
 namespace extensions {
 
 class SmartCardProviderPrivateApiTest : public ExtensionApiTest {
@@ -210,9 +225,7 @@
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest,
                        EstablishContextNoProvider) {
-  auto context_result = CreateContext();
-  ASSERT_TRUE(context_result->is_error());
-  EXPECT_EQ(context_result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(CreateContext(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest,
@@ -224,9 +237,7 @@
           function(requestId){});
     )");
 
-  auto context_result = CreateContext();
-  ASSERT_TRUE(context_result->is_error());
-  EXPECT_EQ(context_result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(CreateContext(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, CreateContext) {
@@ -246,9 +257,7 @@
       }
     )");
 
-  auto context_result = CreateContext();
-  ASSERT_TRUE(context_result->is_error());
-  EXPECT_EQ(context_result->get_error(), SmartCardError::kInternalError);
+  EXPECT_THAT(CreateContext(), IsError(SmartCardError::kInternalError));
 }
 
 // Tests that smartCardProviderPrivate.onReleaseContextRequested is emitted
@@ -356,9 +365,7 @@
       }
     )");
 
-  auto context_result = CreateContext();
-  ASSERT_TRUE(context_result->is_error());
-  EXPECT_EQ(context_result->get_error(), SmartCardError::kInternalError);
+  EXPECT_THAT(CreateContext(), IsError(SmartCardError::kInternalError));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, ListReaders) {
@@ -412,9 +419,7 @@
 
   context->ListReaders(result_future.GetCallback());
 
-  device::mojom::SmartCardListReadersResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest,
@@ -437,9 +442,7 @@
 
   context->ListReaders(result_future.GetCallback());
 
-  device::mojom::SmartCardListReadersResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, GetStatusChange) {
@@ -512,9 +515,7 @@
                        GetStatusChangeNoProvider) {
   LoadFakeProviderExtension(kEstablishContextJs);
 
-  device::mojom::SmartCardStatusChangeResultPtr result = GetStatusChange();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(GetStatusChange(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest,
@@ -527,9 +528,7 @@
         function (requestId, scardContext, timeout, readerStatesIn) {});
   )"});
 
-  device::mojom::SmartCardStatusChangeResultPtr result = GetStatusChange();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(GetStatusChange(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, Connect) {
@@ -601,9 +600,7 @@
   context->Connect("foo-reader", device::mojom::SmartCardShareMode::kShared,
                    std::move(preferred_protocols), result_future.GetCallback());
 
-  device::mojom::SmartCardConnectResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest,
@@ -631,9 +628,7 @@
   context->Connect("foo-reader", device::mojom::SmartCardShareMode::kShared,
                    std::move(preferred_protocols), result_future.GetCallback());
 
-  device::mojom::SmartCardConnectResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, Disconnect) {
@@ -689,9 +684,7 @@
   connection->Disconnect(device::mojom::SmartCardDisposition::kUnpower,
                          result_future.GetCallback());
 
-  SmartCardResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, DisconnectTimeout) {
@@ -719,9 +712,7 @@
   connection->Disconnect(device::mojom::SmartCardDisposition::kUnpower,
                          result_future.GetCallback());
 
-  SmartCardResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 // Tests that smartCardProviderPrivate.onDisconnectRequested is emitted
@@ -804,9 +795,7 @@
 
   context->Cancel(result_future.GetCallback());
 
-  device::mojom::SmartCardResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 IN_PROC_BROWSER_TEST_F(SmartCardProviderPrivateApiTest, CancelResponseTimeout) {
@@ -826,9 +815,7 @@
 
   context->Cancel(result_future.GetCallback());
 
-  device::mojom::SmartCardResultPtr result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 // A mojo::SmartCardContext receives a call while there's still another call
@@ -1147,9 +1134,7 @@
                        std::vector<uint8_t>({3u, 2u, 1u}),
                        result_future.GetCallback());
 
-  auto result = result_future.Take();
-  ASSERT_TRUE(result->is_error());
-  EXPECT_EQ(result->get_error(), SmartCardError::kNoService);
+  EXPECT_THAT(result_future.Take(), IsError(SmartCardError::kNoService));
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc b/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc
index 5cc5f48..8187a5f2 100644
--- a/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc
+++ b/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc
@@ -288,6 +288,9 @@
   base::test::TestFuture<base::expected<bool, Error>> does_key_exist_waiter;
   kcer->DoesPrivateKeyExist(PrivateKeyHandle(PublicKeySpki()),
                             does_key_exist_waiter.GetCallback());
+  base::test::TestFuture<base::expected<void, Error>> set_nickname_waiter;
+  kcer->SetKeyNickname(PrivateKeyHandle(PublicKeySpki()), "new_nickname",
+                       set_nickname_waiter.GetCallback());
   // Close the list with one more GenerateRsaKey, so all methods are tested
   // with other methods before and after them.
   base::test::TestFuture<base::expected<PublicKey, Error>>
@@ -322,6 +325,9 @@
   ASSERT_FALSE(does_key_exist_waiter.Get().has_value());
   EXPECT_EQ(does_key_exist_waiter.Get().error(),
             Error::kTokenInitializationFailed);
+  ASSERT_FALSE(set_nickname_waiter.Get().has_value());
+  EXPECT_EQ(set_nickname_waiter.Get().error(),
+            Error::kTokenInitializationFailed);
   ASSERT_FALSE(generate_rsa_waiter_2.Get().has_value());
   EXPECT_EQ(generate_rsa_waiter_2.Get().error(),
             Error::kTokenInitializationFailed);
diff --git a/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc b/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc
index e443965c..cbb688cc 100644
--- a/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc
+++ b/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc
@@ -295,6 +295,24 @@
   std::move(callback).Run({});
 }
 
+void SetKeyNicknameOnWorkerThread(crypto::ScopedPK11Slot slot,
+                                  PrivateKeyHandle key,
+                                  std::string nickname,
+                                  Kcer::StatusCallback callback) {
+  base::expected<crypto::ScopedSECKEYPrivateKey, Error> private_key =
+      GetSECKEYPrivateKey(slot, key);
+  if (!private_key.has_value()) {
+    return std::move(callback).Run(base::unexpected(private_key.error()));
+  }
+
+  if (PK11_SetPrivateKeyNickname(private_key.value().get(), nickname.c_str()) !=
+      SECSuccess) {
+    return std::move(callback).Run(
+        base::unexpected(Error::kFailedToWriteAttribute));
+  }
+  return std::move(callback).Run({});
+}
+
 scoped_refptr<const Cert> BuildKcerCert(
     Token token,
     const net::ScopedCERTCertificate& nss_cert) {
@@ -570,7 +588,25 @@
                                       std::string nickname,
                                       Kcer::StatusCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-  // TODO(244408716): Implement.
+
+  if (UNLIKELY(state_ == State::kInitializationFailed)) {
+    return HandleInitializationFailed(std::move(callback));
+  } else if (is_blocked_) {
+    return task_queue_.push(base::BindOnce(
+        &KcerTokenImplNss::SetKeyNickname, weak_factory_.GetWeakPtr(),
+        std::move(key), std::move(nickname), std::move(callback)));
+  }
+
+  // Block task queue, attach unblocking task to the callback.
+  auto unblocking_callback = std::move(callback).Then(BlockQueueGetUnblocker());
+
+  base::ThreadPool::PostTask(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+      base::BindOnce(&SetKeyNicknameOnWorkerThread,
+                     crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot_.get())),
+                     std::move(key), std::move(nickname),
+                     std::move(unblocking_callback)));
 }
 
 void KcerTokenImplNss::SetKeyPermissions(PrivateKeyHandle key,
diff --git a/chrome/browser/device_reauth/android/BUILD.gn b/chrome/browser/device_reauth/android/BUILD.gn
index 5a33660..3aed35e 100644
--- a/chrome/browser/device_reauth/android/BUILD.gn
+++ b/chrome/browser/device_reauth/android/BUILD.gn
@@ -14,7 +14,6 @@
     "//components/browser_ui/strings/android:browser_ui_strings_grd",
     "//components/device_reauth:device_reauth_java_enums",
     "//content/public/android:content_main_dex_java",
-    "//third_party/android_deps:com_android_support_support_annotations_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//ui/android:ui_no_recycler_view_java",
   ]
diff --git a/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/DeviceAuthenticatorBridge.java b/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/DeviceAuthenticatorBridge.java
index c1bb500..e9fd188 100644
--- a/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/DeviceAuthenticatorBridge.java
+++ b/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/DeviceAuthenticatorBridge.java
@@ -16,8 +16,8 @@
 import android.hardware.biometrics.BiometricPrompt;
 import android.os.Build;
 import android.os.CancellationSignal;
-import android.support.annotation.NonNull;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 
 import org.chromium.base.ContextUtils;
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc
index 7ce8d85a..451ce4e 100644
--- a/chrome/browser/devtools/devtools_browsertest.cc
+++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -2683,7 +2683,16 @@
 // This tests checks that window is correctly initialized when DevTools is
 // opened while navigation through history with forward and back actions.
 // (crbug.com/627407)
-IN_PROC_BROWSER_TEST_F(DevToolsTest, TestWindowInitializedOnNavigateBack) {
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS_LACROS)
+// Flaky on MAC and lacros https://crbug.com/1443360
+#define MAYBE_TestWindowInitializedOnNavigateBack \
+  DISABLED_TestWindowInitializedOnNavigateBack
+#else
+#define MAYBE_TestWindowInitializedOnNavigateBack \
+  TestWindowInitializedOnNavigateBack
+#endif
+IN_PROC_BROWSER_TEST_F(DevToolsTest,
+                       MAYBE_TestWindowInitializedOnNavigateBack) {
   TestChromeWebUIControllerFactory test_factory;
   content::ScopedWebUIControllerFactoryRegistration factory_registration(
       &test_factory);
diff --git a/chrome/browser/dips/dips_bounce_detector_unittest.cc b/chrome/browser/dips/dips_bounce_detector_unittest.cc
index b4836bf..77178ca 100644
--- a/chrome/browser/dips/dips_bounce_detector_unittest.cc
+++ b/chrome/browser/dips/dips_bounce_detector_unittest.cc
@@ -145,7 +145,11 @@
   const std::vector<std::string>& redirects() const { return redirects_; }
 
  private:
-  void RecordBounce(const GURL& url, base::Time time, bool stateful) {
+  void RecordBounce(const GURL& url,
+                    const GURL& initial_url,
+                    const GURL& final_url,
+                    base::Time time,
+                    bool stateful) {
     recorded_bounces_.insert(std::make_tuple(url, time, stateful));
   }
 
diff --git a/chrome/browser/dips/dips_helper_browsertest.cc b/chrome/browser/dips/dips_helper_browsertest.cc
index d2c3b3d..0e4e10b2 100644
--- a/chrome/browser/dips/dips_helper_browsertest.cc
+++ b/chrome/browser/dips/dips_helper_browsertest.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/dips/dips_utils.h"
 #include "chrome/test/base/chrome_test_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_contents.h"
@@ -95,6 +96,21 @@
     DIPSService* dips_service = DIPSServiceFactory::GetForBrowserContext(
         GetActiveWebContents()->GetBrowserContext());
     dips_service->WaitForInitCompleteForTesting();
+
+    // Initialize exceptions for 1P sites with embedded 3P cookies. Block 3PC by
+    // default on a.test and d.test, since those are used as the initial and
+    // final URL in the redirect chains. This avoids trimming bounces due to 1P
+    // exceptions (e.g. Chrome Guard).
+    map_ = HostContentSettingsMapFactory::GetForProfile(
+        chrome_test_utils::GetActiveWebContents(this)->GetBrowserContext());
+    map_->SetContentSettingCustomScope(
+        ContentSettingsPattern::Wildcard(),
+        ContentSettingsPattern::FromString("[*.]a.test"),
+        ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_BLOCK);
+    map_->SetContentSettingCustomScope(
+        ContentSettingsPattern::Wildcard(),
+        ContentSettingsPattern::FromString("[*.]d.test"),
+        ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_BLOCK);
   }
 
   WebContents* GetActiveWebContents() {
@@ -175,6 +191,7 @@
   raw_ptr<WebContents, DanglingUntriaged> web_contents_ = nullptr;
   base::SimpleTestClock test_clock_;
   base::test::ScopedFeatureList scoped_feature_list_;
+  raw_ptr<HostContentSettingsMap> map_;
 };
 
 IN_PROC_BROWSER_TEST_P(DIPSTabHelperBrowserTest,
@@ -385,7 +402,7 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DIPSTabHelperBrowserTest, MultipleSiteStoragesRecorded) {
-  GURL url = embedded_test_server()->GetURL("a.test", "/set-cookie?foo=bar");
+  GURL url = embedded_test_server()->GetURL("b.test", "/set-cookie?foo=bar");
   base::Time time = base::Time::FromDoubleT(1);
 
   SetDIPSTime(time);
@@ -418,7 +435,7 @@
 
 IN_PROC_BROWSER_TEST_P(DIPSTabHelperBrowserTest, Histograms_StorageThenClick) {
   base::HistogramTester histograms;
-  GURL url = embedded_test_server()->GetURL("a.test", "/set-cookie?foo=bar");
+  GURL url = embedded_test_server()->GetURL("b.test", "/set-cookie?foo=bar");
   base::Time time = base::Time::FromDoubleT(1);
   content::WebContents* web_contents = GetActiveWebContents();
 
@@ -450,7 +467,7 @@
 // create an Incognito browser without regard to platform is public.
 #if !BUILDFLAG(IS_ANDROID)
   base::HistogramTester histograms;
-  GURL url = embedded_test_server()->GetURL("a.test", "/set-cookie?foo=bar");
+  GURL url = embedded_test_server()->GetURL("b.test", "/set-cookie?foo=bar");
   base::Time time = base::Time::FromDoubleT(1);
   Browser* browser = CreateIncognitoBrowser();
   content::WebContents* web_contents =
@@ -492,7 +509,7 @@
   content::WebContents* web_contents = GetActiveWebContents();
 
   ASSERT_TRUE(content::NavigateToURL(
-      web_contents, embedded_test_server()->GetURL("a.test", "/title1.html")));
+      web_contents, embedded_test_server()->GetURL("b.test", "/title1.html")));
   content::RenderFrameHost* frame = web_contents->GetPrimaryMainFrame();
   content::WaitForHitTestData(frame);  // wait until we can click.
   SetDIPSTime(time);
@@ -521,7 +538,7 @@
 IN_PROC_BROWSER_TEST_P(DIPSTabHelperBrowserTest,
                        Histograms_MultipleStoragesThenClick) {
   base::HistogramTester histograms;
-  GURL url = embedded_test_server()->GetURL("a.test", "/set-cookie?foo=bar");
+  GURL url = embedded_test_server()->GetURL("b.test", "/set-cookie?foo=bar");
   base::Time time = base::Time::FromDoubleT(1);
   content::WebContents* web_contents = GetActiveWebContents();
 
@@ -568,7 +585,7 @@
 IN_PROC_BROWSER_TEST_P(DIPSTabHelperBrowserTest,
                        Histograms_MultipleClicksThenStorage) {
   base::HistogramTester histograms;
-  GURL url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  GURL url = embedded_test_server()->GetURL("b.test", "/title1.html");
   base::Time time = base::Time::FromDoubleT(1);
   content::WebContents* web_contents = GetActiveWebContents();
 
@@ -804,10 +821,10 @@
       "b.test/cross-site-with-cookie/b.test/cross-site-with-cookie/"
       "b.test/cross-site-with-cookie/b.test/cross-site-with-cookie/"
       "b.test/cross-site-with-cookie/b.test/cross-site-with-cookie/"
-      "b.test/cross-site-with-cookie/b.test/cross-site-with-cookie/c.test";
+      "b.test/cross-site-with-cookie/b.test/cross-site-with-cookie/d.test";
   redirect_path += final_dest;
   return std::make_pair(server->GetURL("b.test", redirect_path),
-                        server->GetURL("c.test", final_dest));
+                        server->GetURL("d.test", final_dest));
 }
 
 // Attempt to detect flakiness in waiting for DIPS storage by repeatedly
@@ -871,14 +888,14 @@
   base::Time recent_bounce_time = base::Time::Now() - base::Minutes(10);
 
   SetDIPSTime(old_bounce_time);
-  // Make b.test statefully bounce to c.test.
+  // Make b.test statefully bounce to d.test.
   ASSERT_TRUE(content::NavigateToURL(
       web_contents, embedded_test_server()->GetURL("a.test", "/title1.html")));
   ASSERT_TRUE(content::NavigateToURLFromRenderer(
       web_contents,
       embedded_test_server()->GetURL(
-          "b.test", "/cross-site-with-cookie/c.test/title1.html"),
-      embedded_test_server()->GetURL("c.test", "/title1.html")));
+          "b.test", "/cross-site-with-cookie/d.test/title1.html"),
+      embedded_test_server()->GetURL("d.test", "/title1.html")));
   // End the chain so the bounce is recorded.
   ASSERT_TRUE(content::NavigateToURL(
       web_contents, embedded_test_server()->GetURL("a.test", "/title1.html")));
diff --git a/chrome/browser/dips/dips_service.cc b/chrome/browser/dips/dips_service.cc
index f03ddc8c..cb260522 100644
--- a/chrome/browser/dips/dips_service.cc
+++ b/chrome/browser/dips/dips_service.cc
@@ -237,27 +237,20 @@
   return cookie_settings_->ShouldBlockThirdPartyCookies();
 }
 
-bool DIPSService::HasCookieException(const std::string& site) const {
+bool DIPSService::Has3PCExceptionAs3P(const std::string& site) const {
   DCHECK(!IsShuttingDown());
   GURL url("https://" + site);
 
-  // Checks whether there is an exception allowing all third-parties embedded
-  // under |site| to use cookies.
-  if (cookie_settings_->IsFullCookieAccessAllowed(
-          GURL(), net::SiteForCookies::FromUrl(url), url::Origin::Create(url),
-          net::CookieSettingOverrides())) {
-    return true;
-  }
+  return cookie_settings_->IsFullCookieAccessAllowed(
+      url, net::SiteForCookies(), absl::nullopt, net::CookieSettingOverrides());
+}
 
-  // Checks whether there is an exception allowing |site| to use cookies when
-  // embedded by any other site.
-  if (cookie_settings_->IsFullCookieAccessAllowed(
-          url, net::SiteForCookies(), absl::nullopt,
-          net::CookieSettingOverrides())) {
-    return true;
-  }
+bool DIPSService::Has3PCExceptionAs1P(const GURL& url) const {
+  DCHECK(!IsShuttingDown());
 
-  return false;
+  return cookie_settings_->IsFullCookieAccessAllowed(
+      GURL(), net::SiteForCookies::FromUrl(url), url::Origin::Create(url),
+      net::CookieSettingOverrides());
 }
 
 DIPSCookieMode DIPSService::GetCookieMode() const {
@@ -347,8 +340,24 @@
 }
 
 void DIPSService::RecordBounce(const GURL& url,
+                               const GURL& initial_url,
+                               const GURL& final_url,
                                base::Time time,
                                bool stateful) {
+  // If the initial or final URL has a 1P exception for all embedded 3PCs (e.g.
+  // Chrome Guard) then clear the tracking site from the DIPS DB, to avoid
+  // deleting its storage. The exemption overrides any bounces from non-exempted
+  // sites.
+  if (Has3PCExceptionAs1P(initial_url) || Has3PCExceptionAs1P(final_url)) {
+    const std::set<std::string> site_to_clear{GetSiteForDIPS(url)};
+    // Don't clear the row if the tracker has interaction history, since we
+    // should preserve that context for future bounces.
+    storage_.AsyncCall(&DIPSStorage::RemoveRowsWithoutInteraction)
+        .WithArgs(site_to_clear);
+
+    return;
+  }
+
   storage_.AsyncCall(&DIPSStorage::RecordBounce).WithArgs(url, time, stateful);
 }
 
@@ -386,7 +395,7 @@
   // Record this bounce in the DIPS database.
   if (redirect.access_type != SiteDataAccessType::kUnknown) {
     record_bounce.Run(
-        redirect.url, redirect.time,
+        redirect.url, chain.initial_url, chain.final_url, redirect.time,
         /*stateful=*/redirect.access_type > SiteDataAccessType::kRead);
   }
 
@@ -449,7 +458,7 @@
     std::vector<std::string> non_excepted_sites;
 
     for (const auto& site : sites_to_clear) {
-      if (HasCookieException(site)) {
+      if (Has3PCExceptionAs3P(site)) {
         excepted_sites.push_back(site);
       } else {
         non_excepted_sites.push_back(site);
diff --git a/chrome/browser/dips/dips_service.h b/chrome/browser/dips/dips_service.h
index 67a0abb..442a8da 100644
--- a/chrome/browser/dips/dips_service.h
+++ b/chrome/browser/dips/dips_service.h
@@ -36,8 +36,12 @@
 
 class DIPSService : public KeyedService {
  public:
-  using RecordBounceCallback = base::RepeatingCallback<
-      void(const GURL& url, base::Time time, bool stateful)>;
+  using RecordBounceCallback =
+      base::RepeatingCallback<void(const GURL& url,
+                                   const GURL& initial_url,
+                                   const GURL& final_url,
+                                   base::Time time,
+                                   bool stateful)>;
   using DeletedSitesCallback =
       base::OnceCallback<void(const std::vector<std::string>& sites)>;
 
@@ -51,6 +55,13 @@
   static DIPSService* Get(content::BrowserContext* context);
 
   base::SequenceBound<DIPSStorage>* storage() { return &storage_; }
+  void RecordBounceForTesting(const GURL& url,
+                              const GURL& initial_url,
+                              const GURL& final_url,
+                              base::Time time,
+                              bool stateful) {
+    RecordBounce(url, initial_url, final_url, time, stateful);
+  }
 
   DIPSCookieMode GetCookieMode() const;
 
@@ -101,7 +112,11 @@
                 DIPSRedirectChainInfoPtr chain,
                 size_t index,
                 const DIPSState url_state);
-  void RecordBounce(const GURL& url, base::Time time, bool stateful);
+  void RecordBounce(const GURL& url,
+                    const GURL& initial_url,
+                    const GURL& final_url,
+                    base::Time time,
+                    bool stateful);
   static void HandleRedirect(const DIPSRedirectInfo& redirect,
                              const DIPSRedirectChainInfo& chain,
                              RecordBounceCallback callback);
@@ -124,7 +139,13 @@
       base::OnceClosure callback);
 
   bool ShouldBlockThirdPartyCookies() const;
-  bool HasCookieException(const std::string& site) const;
+
+  // Checks whether there is an exception allowing |site| to use cookies when
+  // embedded by any other site.
+  bool Has3PCExceptionAs3P(const std::string& site) const;
+  // Checks whether there is an exception allowing all third-parties embedded
+  // under |url| to use cookies.
+  bool Has3PCExceptionAs1P(const GURL& url) const;
 
   base::RunLoop wait_for_file_deletion_;
   base::RunLoop wait_for_prepopulating_;
diff --git a/chrome/browser/dips/dips_service_unittest.cc b/chrome/browser/dips/dips_service_unittest.cc
index 81fad41..25a6eb08 100644
--- a/chrome/browser/dips/dips_service_unittest.cc
+++ b/chrome/browser/dips/dips_service_unittest.cc
@@ -242,10 +242,9 @@
   // Record a bounce.
   GURL url("https://example.com");
   base::Time bounce = base::Time::FromDoubleT(2);
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(url, bounce, false);
+  GetService()->RecordBounceForTesting(url, GURL("https://initial.com"),
+                                       GURL("https://final.com"), bounce,
+                                       false);
   WaitOnStorage();
   EXPECT_TRUE(GetDIPSState(url).has_value());
 
@@ -293,10 +292,9 @@
   // Record a bounce.
   GURL url("https://example.com");
   base::Time bounce = base::Time::FromDoubleT(2);
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(url, bounce, false);
+  GetService()->RecordBounceForTesting(url, GURL("https://initial.com"),
+                                       GURL("https://final.com"), bounce,
+                                       false);
   WaitOnStorage();
   EXPECT_TRUE(GetDIPSState(url).has_value());
 
@@ -326,14 +324,13 @@
 }
 
 TEST_F(DIPSServiceStateRemovalTest,
-       BrowsingDataDeletion_Respects3PCExceptions) {
+       BrowsingDataDeletion_Respects3PExceptionsFor3PC) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeatureWithParameters(
       dips::kFeature, {{"delete", "true"}, {"triggering_action", "bounce"}});
 
   GURL excepted_3p_url("https://excepted-as-3p.com");
-  GURL excepted_1p_url("https://excepted-as-1p.com");
   GURL non_excepted_url("https://not-excepted.com");
 
   HostContentSettingsMap* map =
@@ -346,13 +343,6 @@
       ContentSettingsPattern::Wildcard(), ContentSettingsType::COOKIES,
       ContentSetting::CONTENT_SETTING_ALLOW);
 
-  // Add exception to third-party cookie blocking rule for third-parties
-  // embedded by 'excepted_1p_url'.
-  map->SetContentSettingCustomScope(
-      ContentSettingsPattern::Wildcard(),
-      ContentSettingsPattern::FromString("[*.]" + excepted_1p_url.host()),
-      ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_ALLOW);
-
   // Verify settings.
   EXPECT_EQ(CONTENT_SETTING_ALLOW, GetCookieSettings()->GetCookieSetting(
                                        excepted_3p_url, GURL(),
@@ -361,30 +351,16 @@
                                        GURL(), excepted_3p_url,
                                        net::CookieSettingOverrides(), nullptr));
 
-  EXPECT_EQ(CONTENT_SETTING_BLOCK, GetCookieSettings()->GetCookieSetting(
-                                       excepted_1p_url, GURL(),
-                                       net::CookieSettingOverrides(), nullptr));
-  EXPECT_EQ(CONTENT_SETTING_ALLOW, GetCookieSettings()->GetCookieSetting(
-                                       GURL(), excepted_1p_url,
-                                       net::CookieSettingOverrides(), nullptr));
-
   // Record bounces for sites.
   base::Time bounce = base::Time::FromDoubleT(2);
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(excepted_3p_url, bounce, false);
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(excepted_1p_url, bounce, false);
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(non_excepted_url, bounce, false);
+  GetService()->RecordBounceForTesting(
+      excepted_3p_url, GURL("https://initial.com"), GURL("https://final.com"),
+      bounce, false);
+  GetService()->RecordBounceForTesting(
+      non_excepted_url, GURL("https://initial.com"), GURL("https://final.com"),
+      bounce, false);
   WaitOnStorage();
   EXPECT_TRUE(GetDIPSState(excepted_3p_url).has_value());
-  EXPECT_TRUE(GetDIPSState(excepted_1p_url).has_value());
   EXPECT_TRUE(GetDIPSState(non_excepted_url).has_value());
 
   auto filter_builder = content::BrowsingDataFilterBuilder::Create(
@@ -409,21 +385,92 @@
   // Because this test fixture uses a MockBrowsingDataRemoverDelegate the DIPS
   // entry should not actually be removed. However, in practice it would be.
   EXPECT_TRUE(GetDIPSState(non_excepted_url).has_value());
-  // The DIPS entries for 'excepted_3p_url' and 'excepted_1p_url' should be
+  // The DIPS entries for 'excepted_3p_url' should be
   // removed, since only DIPS state is cleared for sites with a cookie exception
   // and the BrowsingDataRemover(Delegate) isn't relied on for that kind of
   // deletion.
   EXPECT_FALSE(GetDIPSState(excepted_3p_url).has_value());
-  EXPECT_FALSE(GetDIPSState(excepted_1p_url).has_value());
 
   // All 3 sites should be reported to UKM. It doesn't matter whether the URL
   // was excepted or not.
   EXPECT_THAT(ukm_recorder,
               EntryUrlsAre("DIPS.Deletion", {"http://excepted-as-3p.com/",
-                                             "http://excepted-as-1p.com/",
                                              "http://not-excepted.com/"}));
 }
 
+TEST_F(DIPSServiceStateRemovalTest,
+       BrowsingDataDeletion_Respects1PExceptionsFor3PC) {
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeatureWithParameters(
+      dips::kFeature, {{"delete", "true"}, {"triggering_action", "bounce"}});
+
+  GURL excepted_1p_url("https://excepted-as-1p.com");
+  GURL non_excepted_url("https://not-excepted.com");
+  GURL redirect_url_1("https://redirect-1.com");
+  GURL redirect_url_2("https://redirect-2.com");
+  GURL redirect_url_3("https://redirect-3.com");
+
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(GetProfile());
+
+  // Add exception to third-party cookie blocking rule for third-parties
+  // embedded by 'excepted_1p_url'.
+  map->SetContentSettingCustomScope(
+      ContentSettingsPattern::Wildcard(),
+      ContentSettingsPattern::FromString("[*.]" + excepted_1p_url.host()),
+      ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_ALLOW);
+
+  EXPECT_EQ(CONTENT_SETTING_BLOCK, GetCookieSettings()->GetCookieSetting(
+                                       excepted_1p_url, GURL(),
+                                       net::CookieSettingOverrides(), nullptr));
+  EXPECT_EQ(CONTENT_SETTING_ALLOW, GetCookieSettings()->GetCookieSetting(
+                                       GURL(), excepted_1p_url,
+                                       net::CookieSettingOverrides(), nullptr));
+
+  base::Time bounce = base::Time::FromDoubleT(2);
+  // Record a bounce through redirect_url_1 that starts on an excepted
+  // URL.
+  GetService()->RecordBounceForTesting(redirect_url_1, excepted_1p_url,
+                                       non_excepted_url, bounce, false);
+  // Record a bounce through redirect_url_1 that ends on an excepted
+  // URL.
+  GetService()->RecordBounceForTesting(redirect_url_1, non_excepted_url,
+                                       excepted_1p_url, bounce, false);
+  // Record a bounce through redirect_url_2 that does not start or
+  // end on an excepted URL.
+  GetService()->RecordBounceForTesting(redirect_url_2, non_excepted_url,
+                                       non_excepted_url, bounce, false);
+  // Record a bounce through redirect_url_3 that does not start or
+  // end on an excepted URL. Record an interaction on this URL as well.
+  GetService()->RecordBounceForTesting(redirect_url_3, non_excepted_url,
+                                       non_excepted_url, bounce, false);
+  GetService()
+      ->storage()
+      ->AsyncCall(&DIPSStorage::RecordInteraction)
+      .WithArgs(redirect_url_3, bounce, GetService()->GetCookieMode());
+  WaitOnStorage();
+
+  // Expect no recorded DIPSState for redirect_url_1, since every
+  // recorded bounce started or ended on an excepted site.
+  EXPECT_FALSE(GetDIPSState(redirect_url_1).has_value());
+  EXPECT_TRUE(GetDIPSState(redirect_url_2).has_value());
+  EXPECT_TRUE(GetDIPSState(redirect_url_3).has_value());
+
+  // Record a bounce through redirect_url_2 that starts on an
+  // excepted URL. This should clear the DB entry for redirect_url_2.
+  GetService()->RecordBounceForTesting(redirect_url_2, excepted_1p_url,
+                                       non_excepted_url, bounce, false);
+  EXPECT_FALSE(GetDIPSState(redirect_url_2).has_value());
+
+  // Record a bounce through redirect_url_3 that starts on an
+  // excepted URL. This should not clear the DB entry for redirect_url_3 as it
+  // has a recorded interaction.
+  GetService()->RecordBounceForTesting(redirect_url_3, excepted_1p_url,
+                                       non_excepted_url, bounce, false);
+  EXPECT_TRUE(GetDIPSState(redirect_url_3).has_value());
+}
+
 TEST_F(DIPSServiceStateRemovalTest, ImmediateEnforcement) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeatureWithParameters(
@@ -433,10 +480,9 @@
   // Record a bounce.
   GURL url("https://example.com");
   base::Time bounce = Now();
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(url, bounce, false);
+  GetService()->RecordBounceForTesting(url, GURL("https://initial.com"),
+                                       GURL("https://final.com"), bounce,
+                                       false);
   WaitOnStorage();
   EXPECT_TRUE(GetDIPSState(url).has_value());
 
@@ -502,10 +548,9 @@
   // Record a bounce.
   GURL url("https://example.com");
   base::Time bounce = base::Time::FromDoubleT(2);
-  GetService()
-      ->storage()
-      ->AsyncCall(&DIPSStorage::RecordBounce)
-      .WithArgs(url, bounce, false);
+  GetService()->RecordBounceForTesting(url, GURL("https://initial.com"),
+                                       GURL("https://final.com"), bounce,
+                                       false);
   WaitOnStorage();
 
   // Set the current time to just after the bounce happened.
diff --git a/chrome/browser/dips/dips_storage.cc b/chrome/browser/dips/dips_storage.cc
index a80348f..32183705 100644
--- a/chrome/browser/dips/dips_storage.cc
+++ b/chrome/browser/dips/dips_storage.cc
@@ -149,6 +149,17 @@
   db_->RemoveRows(sites);
 }
 
+void DIPSStorage::RemoveRowsWithoutInteraction(
+    const std::set<std::string>& sites) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(db_);
+
+  std::set<std::string> filtered_sites = FilterSitesWithoutInteraction(sites);
+
+  RemoveRows(
+      std::vector<std::string>(filtered_sites.begin(), filtered_sites.end()));
+}
+
 // DIPSTabHelper Function Impls ------------------------------------------------
 
 void DIPSStorage::RecordStorage(const GURL& url,
diff --git a/chrome/browser/dips/dips_storage.h b/chrome/browser/dips/dips_storage.h
index e1f67cd..54c7794d 100644
--- a/chrome/browser/dips/dips_storage.h
+++ b/chrome/browser/dips/dips_storage.h
@@ -36,7 +36,10 @@
                     network::mojom::ClearDataFilterPtr filter,
                     const DIPSEventRemovalType type);
 
+  // Delete all DB rows for |sites|.
   void RemoveRows(const std::vector<std::string>& sites);
+  // Delete all DB rows for |sites| without eligible user interactions.
+  void RemoveRowsWithoutInteraction(const std::set<std::string>& sites);
 
   // DIPS Helper Method Impls --------------------------------------------------
 
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
index a968caab..2ee6a55 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
@@ -636,6 +636,7 @@
 
     PrepareRequest(enterprise_connectors::PRINT, request.get());
     request->set_filename(title_);
+    request->set_printer_name(data_.printer_name);
     if (!page_content_type_.empty()) {
       request->set_content_type(page_content_type_);
     }
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h
index e38dca4..248f147 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h
@@ -111,6 +111,11 @@
     // Page to be printed to scan.
     base::ReadOnlySharedMemoryRegion page;
 
+    // TODO(b/280457160): Set printer name once scan after printer preview
+    // is done.
+    // Printer name of the page being sent to, empty for non-print actions.
+    std::string printer_name;
+
     // The settings to use for the analysis of the data in this struct.
     enterprise_connectors::AnalysisSettings settings;
   };
diff --git a/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc
index 97d2850b..d1d6e16a 100644
--- a/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc
+++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc
@@ -234,7 +234,7 @@
         data = std::move(data_arg);
       }));
 
-  // Increment request canalysis_ount.
+  // Increment total analysis request count.
   total_analysis_requests_count_++;
 
   // Simulate a response.
@@ -262,7 +262,7 @@
         data = std::move(data_arg);
       }));
 
-  // Increment request canalysis_ount.
+  // Increment total analysis request count.
   total_analysis_requests_count_++;
 
   // Simulate a response.
@@ -285,7 +285,7 @@
     DCHECK_EQ(dm_token_, request->device_token());
   }
 
-  // Increment request canalysis_ount.
+  // Increment total analysis request count.
   total_analysis_requests_count_++;
 
   // Simulate a response.
@@ -304,7 +304,7 @@
     DCHECK_EQ(dm_token_, request->device_token());
   }
 
-  // Increment request coanalysis_unt.
+  // Increment total analysis request count.
   total_analysis_requests_count_++;
 
   // Simulate a response.
diff --git a/chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.cc b/chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.cc
new file mode 100644
index 0000000..8707818
--- /dev/null
+++ b/chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.cc
@@ -0,0 +1,84 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.h"
+
+#include "base/values.h"
+#include "build/build_config.h"
+#include "chrome/browser/enterprise/reporting/prefs.h"
+#include "chrome/common/pref_names.h"
+#include "components/policy/core/browser/policy_error_map.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_value_map.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/url_matcher/url_util.h"
+#include "url/gurl.h"
+
+namespace enterprise_reporting {
+
+LegacyTechReportPolicyHandler::LegacyTechReportPolicyHandler()
+    : policy::URLSchemeListPolicyHandler(
+          policy::key::kLegacyTechReportAllowlist,
+          kCloudLegacyTechReportAllowlist) {}
+
+LegacyTechReportPolicyHandler::~LegacyTechReportPolicyHandler() = default;
+
+bool LegacyTechReportPolicyHandler::CheckPolicySettings(
+    const policy::PolicyMap& policies,
+    policy::PolicyErrorMap* errors) {
+  if (!policies.IsPolicySet(policy_name())) {
+    return true;
+  }
+  if (!URLSchemeListPolicyHandler::CheckPolicySettings(policies, errors)) {
+    return false;
+  }
+
+  const policy::PolicyMap::Entry* policy = policies.Get(policy_name());
+  if (policy->source != policy::POLICY_SOURCE_CLOUD) {
+    errors->AddError(policy_name(), IDS_POLICY_CLOUD_SOURCE_ONLY_ERROR);
+    return false;
+  }
+
+#if !BUILDFLAG(IS_CHROMEOS)
+  // If policy is set with the signed in account, it must be affiliated.
+  if (policy->scope == policy::POLICY_SCOPE_USER &&
+      !policies.IsUserAffiliated()) {
+    errors->AddError(policy_name(), IDS_POLICY_USER_IS_NOT_AFFILIATED_ERROR);
+    return false;
+  }
+#endif
+
+  return true;
+}
+
+size_t LegacyTechReportPolicyHandler::max_items() {
+  return 100;
+}
+
+bool LegacyTechReportPolicyHandler::ValidatePolicyEntry(
+    const std::string* policy) {
+  url_matcher::util::FilterComponents components;
+  if (!policy) {
+    return false;
+  }
+
+  if (!url_matcher::util::FilterToComponents(
+          *policy, &components.scheme, &components.host,
+          &components.match_subdomains, &components.port, &components.path,
+          &components.query)) {
+    return false;
+  }
+
+  // Wildcard URL '*' and Wildcard host is not allowed.
+  if (components.IsWildcard() || components.host == "") {
+    return false;
+  }
+
+  // Scheme, port, query will be ignored without warning.
+  return true;
+}
+
+}  // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.h b/chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.h
new file mode 100644
index 0000000..36c0d21
--- /dev/null
+++ b/chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.h
@@ -0,0 +1,32 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ENTERPRISE_REPORTING_LEGACY_TECH_LEGACY_TECH_REPORT_POLICY_HANDLER_H_
+#define CHROME_BROWSER_ENTERPRISE_REPORTING_LEGACY_TECH_LEGACY_TECH_REPORT_POLICY_HANDLER_H_
+
+#include "components/policy/core/browser/url_scheme_list_policy_handler.h"
+
+namespace enterprise_reporting {
+
+class LegacyTechReportPolicyHandler
+    : public policy::URLSchemeListPolicyHandler {
+ public:
+  LegacyTechReportPolicyHandler();
+  LegacyTechReportPolicyHandler(const LegacyTechReportPolicyHandler&) = delete;
+  LegacyTechReportPolicyHandler& operator=(
+      const LegacyTechReportPolicyHandler&) = delete;
+  ~LegacyTechReportPolicyHandler() override;
+
+  // policy::URLSchemeListPolicyHandler
+  bool CheckPolicySettings(const policy::PolicyMap& policies,
+                           policy::PolicyErrorMap* errors) override;
+
+ protected:
+  size_t max_items() override;
+  bool ValidatePolicyEntry(const std::string* policy) override;
+};
+
+}  // namespace enterprise_reporting
+
+#endif  // CHROME_BROWSER_ENTERPRISE_REPORTING_LEGACY_TECH_LEGACY_TECH_REPORT_POLICY_HANDLER_H_
diff --git a/chrome/browser/enterprise/reporting/prefs.cc b/chrome/browser/enterprise/reporting/prefs.cc
index f0679d74..ca091e1b 100644
--- a/chrome/browser/enterprise/reporting/prefs.cc
+++ b/chrome/browser/enterprise/reporting/prefs.cc
@@ -20,6 +20,9 @@
 const char kCloudExtensionRequestUploadedIds[] =
     "enterprise_reporting.extension_request.pending.ids";
 
+const char kCloudLegacyTechReportAllowlist[] =
+    "enterprise_reporting.legachy_tech.urls";
+
 const base::TimeDelta kDefaultReportFrequency = base::Hours(24);
 
 void RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
@@ -47,6 +50,8 @@
   registry->RegisterDictionaryPref(prefs::kCloudExtensionRequestIds);
   registry->RegisterDictionaryPref(kCloudExtensionRequestUploadedIds);
 #endif  // !BUILDFLAG(IS_ANDROID)
+
+  registry->RegisterListPref(kCloudLegacyTechReportAllowlist);
 }
 
 }  // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise/reporting/prefs.h b/chrome/browser/enterprise/reporting/prefs.h
index 783b489..62852b3 100644
--- a/chrome/browser/enterprise/reporting/prefs.h
+++ b/chrome/browser/enterprise/reporting/prefs.h
@@ -16,6 +16,8 @@
 extern const char kLastUploadVersion[];
 extern const char kCloudExtensionRequestUploadedIds[];
 
+extern const char kCloudLegacyTechReportAllowlist[];
+
 void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
diff --git a/chrome/browser/enterprise/signals/user_delegate_impl.cc b/chrome/browser/enterprise/signals/user_delegate_impl.cc
index f1365ad..2498c72 100644
--- a/chrome/browser/enterprise/signals/user_delegate_impl.cc
+++ b/chrome/browser/enterprise/signals/user_delegate_impl.cc
@@ -4,10 +4,13 @@
 
 #include "chrome/browser/enterprise/signals/user_delegate_impl.h"
 
+#include <set>
+
 #include "base/check.h"
 #include "chrome/browser/enterprise/util/affiliation.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/policy/core/common/policy_types.h"
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 
@@ -26,7 +29,7 @@
   return chrome::enterprise_util::IsProfileAffiliated(profile_);
 }
 
-bool UserDelegateImpl::IsManaged() const {
+bool UserDelegateImpl::IsManagedUser() const {
   const auto* profile_policy_connector = profile_->GetProfilePolicyConnector();
 
   if (!profile_policy_connector) {
@@ -42,4 +45,10 @@
          identity_manager_->FindExtendedAccountInfoByGaiaId(gaia_id).account_id;
 }
 
+std::set<policy::PolicyScope> UserDelegateImpl::GetPolicyScopesNeedingSignals()
+    const {
+  // TODO(b:279060607): Add actual policy scopes.
+  return std::set<policy::PolicyScope>();
+}
+
 }  // namespace enterprise_signals
diff --git a/chrome/browser/enterprise/signals/user_delegate_impl.h b/chrome/browser/enterprise/signals/user_delegate_impl.h
index ed623ac..7eb74c2 100644
--- a/chrome/browser/enterprise/signals/user_delegate_impl.h
+++ b/chrome/browser/enterprise/signals/user_delegate_impl.h
@@ -26,8 +26,9 @@
 
   // UserDelegate:
   bool IsAffiliated() const override;
-  bool IsManaged() const override;
+  bool IsManagedUser() const override;
   bool IsSameUser(const std::string& gaia_id) const override;
+  std::set<policy::PolicyScope> GetPolicyScopesNeedingSignals() const override;
 
  private:
   const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/enterprise/signals/user_delegate_impl_unittest.cc b/chrome/browser/enterprise/signals/user_delegate_impl_unittest.cc
index cf35e62e..a7ee91d 100644
--- a/chrome/browser/enterprise/signals/user_delegate_impl_unittest.cc
+++ b/chrome/browser/enterprise/signals/user_delegate_impl_unittest.cc
@@ -4,7 +4,10 @@
 
 #include "chrome/browser/enterprise/signals/user_delegate_impl.h"
 
+#include <set>
+
 #include "chrome/test/base/testing_profile.h"
+#include "components/policy/core/common/policy_types.h"
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
@@ -32,22 +35,22 @@
   signin::IdentityTestEnvironment identity_test_env_;
 };
 
-// Tests that IsManaged returns false when the user is not managed.
-TEST_F(UserDelegateImplTest, IsManaged_False) {
+// Tests that IsManagedUser returns false when the user is not managed.
+TEST_F(UserDelegateImplTest, IsManagedUser_False) {
   auto test_profile = CreateProfile(/*is_managed=*/false);
 
   UserDelegateImpl user_delegate(test_profile.get(),
                                  identity_test_env_.identity_manager());
-  EXPECT_FALSE(user_delegate.IsManaged());
+  EXPECT_FALSE(user_delegate.IsManagedUser());
 }
 
-// Tests that IsManaged returns true when the user is managed.
-TEST_F(UserDelegateImplTest, IsManaged_True) {
+// Tests that IsManagedUser returns true when the user is managed.
+TEST_F(UserDelegateImplTest, IsManagedUser_True) {
   auto test_profile = CreateProfile(/*is_managed=*/true);
 
   UserDelegateImpl user_delegate(test_profile.get(),
                                  identity_test_env_.identity_manager());
-  EXPECT_TRUE(user_delegate.IsManaged());
+  EXPECT_TRUE(user_delegate.IsManagedUser());
 }
 
 // Tests that IsSameUser returns false when given a different user.
@@ -98,4 +101,14 @@
   EXPECT_TRUE(user_delegate.IsSameUser(account.gaia));
 }
 
+// Tests that GetPolicyScopesNeedingSignals only returns an empty set
+// for now.
+TEST_F(UserDelegateImplTest, GetPolicyScopesNeedingSignals_Empty) {
+  auto test_profile = CreateProfile(/*is_managed=*/true);
+  UserDelegateImpl user_delegate(test_profile.get(),
+                                 identity_test_env_.identity_manager());
+  EXPECT_EQ(user_delegate.GetPolicyScopesNeedingSignals(),
+            std::set<policy::PolicyScope>());
+}
+
 }  // namespace enterprise_signals
diff --git a/chrome/browser/extensions/api/automation/automation_apitest.cc b/chrome/browser/extensions/api/automation/automation_apitest.cc
index 75decfb..a7ed23f5 100644
--- a/chrome/browser/extensions/api/automation/automation_apitest.cc
+++ b/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -487,8 +487,8 @@
 IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopFocusViews) {
   AutomationManagerAura::GetInstance()->Enable();
   // Trigger the shelf subtree to be computed.
-  ash::AcceleratorController::Get()->PerformActionIfEnabled(ash::FOCUS_SHELF,
-                                                            {});
+  ash::AcceleratorController::Get()->PerformActionIfEnabled(
+      ash::AcceleratorAction::kFocusShelf, {});
 
   ASSERT_TRUE(RunExtensionTest("automation/tests/desktop",
                                {.extension_url = "focus_views.html"}))
@@ -512,8 +512,8 @@
 IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopActions) {
   AutomationManagerAura::GetInstance()->Enable();
   // Trigger the shelf subtree to be computed.
-  ash::AcceleratorController::Get()->PerformActionIfEnabled(ash::FOCUS_SHELF,
-                                                            {});
+  ash::AcceleratorController::Get()->PerformActionIfEnabled(
+      ash::AcceleratorAction::kFocusShelf, {});
 
   ASSERT_TRUE(RunExtensionTest("automation/tests/desktop",
                                {.extension_url = "actions.html"}))
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_api.cc b/chrome/browser/extensions/api/content_settings/content_settings_api.cc
index a99e703a..9d3cff2 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_api.cc
+++ b/chrome/browser/extensions/api/content_settings/content_settings_api.cc
@@ -266,16 +266,13 @@
                                                readable_type_name.c_str())));
   }
 
-  size_t num_values = 0;
-  int histogram_value =
-      ContentSettingTypeToHistogramValue(content_type, &num_values);
   if (primary_pattern != secondary_pattern &&
       secondary_pattern != ContentSettingsPattern::Wildcard()) {
-    UMA_HISTOGRAM_EXACT_LINEAR("ContentSettings.ExtensionEmbeddedSettingSet",
-                               histogram_value, num_values);
+    RecordContentSettingsHistogram(
+        "ContentSettings.ExtensionEmbeddedSettingSet", content_type);
   } else {
-    UMA_HISTOGRAM_EXACT_LINEAR("ContentSettings.ExtensionNonEmbeddedSettingSet",
-                               histogram_value, num_values);
+    RecordContentSettingsHistogram(
+        "ContentSettings.ExtensionNonEmbeddedSettingSet", content_type);
   }
 
   if (primary_pattern != secondary_pattern &&
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
index fca8048..3a4f89d 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
+++ b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
@@ -356,13 +356,12 @@
   const char kExtensionPath[] = "content_settings/embeddedsettingsmetric";
   EXPECT_TRUE(RunExtensionTest(kExtensionPath)) << message_;
 
-  size_t num_values = 0;
-  int images_type = ContentSettingTypeToHistogramValue(
-      ContentSettingsType::IMAGES, &num_values);
-  int geolocation_type = ContentSettingTypeToHistogramValue(
-      ContentSettingsType::GEOLOCATION, &num_values);
-  int cookies_type = ContentSettingTypeToHistogramValue(
-      ContentSettingsType::COOKIES, &num_values);
+  int images_type =
+      ContentSettingTypeToHistogramValue(ContentSettingsType::IMAGES);
+  int geolocation_type =
+      ContentSettingTypeToHistogramValue(ContentSettingsType::GEOLOCATION);
+  int cookies_type =
+      ContentSettingTypeToHistogramValue(ContentSettingsType::COOKIES);
 
   histogram_tester.ExpectBucketCount(
       "ContentSettings.ExtensionEmbeddedSettingSet", images_type, 1);
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc b/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc
index 8be4e3c..1223270 100644
--- a/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc
+++ b/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc
@@ -28,10 +28,10 @@
   return NativeMessagingHostManifest::IsValidName(str);
 }
 
-void NativeMessagingHostListPolicyHandler::ApplyList(base::Value filtered_list,
-                                                     PrefValueMap* prefs) {
-  DCHECK(filtered_list.is_list());
-  prefs->SetValue(pref_path_, std::move(filtered_list));
+void NativeMessagingHostListPolicyHandler::ApplyList(
+    base::Value::List filtered_list,
+    PrefValueMap* prefs) {
+  prefs->SetValue(pref_path_, base::Value(std::move(filtered_list)));
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h b/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h
index 280c581..559b60cd 100644
--- a/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h
+++ b/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h
@@ -32,7 +32,7 @@
   bool CheckListEntry(const base::Value& value) override;
 
   // Sets |prefs| at pref_path() to |filtered_list|.
-  void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override;
+  void ApplyList(base::Value::List filtered_list, PrefValueMap* prefs) override;
 
  private:
   const char* pref_path_;
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc
index eec22173..b31c9653 100644
--- a/chrome/browser/extensions/policy_handlers.cc
+++ b/chrome/browser/extensions/policy_handlers.cc
@@ -71,10 +71,9 @@
   return crx_file::id_util::IdIsValid(str);
 }
 
-void ExtensionListPolicyHandler::ApplyList(base::Value filtered_list,
+void ExtensionListPolicyHandler::ApplyList(base::Value::List filtered_list,
                                            PrefValueMap* prefs) {
-  DCHECK(filtered_list.is_list());
-  prefs->SetValue(pref_path_, std::move(filtered_list));
+  prefs->SetValue(pref_path_, base::Value(std::move(filtered_list)));
 }
 
 // ExtensionInstallForceListPolicyHandler implementation -----------------------
diff --git a/chrome/browser/extensions/policy_handlers.h b/chrome/browser/extensions/policy_handlers.h
index acddaab..add5dda 100644
--- a/chrome/browser/extensions/policy_handlers.h
+++ b/chrome/browser/extensions/policy_handlers.h
@@ -36,7 +36,7 @@
   bool CheckListEntry(const base::Value& value) override;
 
   // Sets |prefs| at pref_path() to |filtered_list|.
-  void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override;
+  void ApplyList(base::Value::List filtered_list, PrefValueMap* prefs) override;
 
  private:
   const char* pref_path_;
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
index ddaf009..c390d950 100644
--- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
+++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
@@ -309,9 +309,13 @@
     // https://crbug.com/984641#c22.
     {base::DIR_HOME, FILE_PATH_LITERAL("Library/Containers"),
      kDontBlockChildren},
-    // Allow access to iCloud files.
+    // Allow access to iCloud files...
     {base::DIR_HOME, FILE_PATH_LITERAL("Library/Mobile Documents"),
      kDontBlockChildren},
+    // ... which may also appear at this directory.
+    {base::DIR_HOME,
+     FILE_PATH_LITERAL("Library/Mobile Documents/com~apple~CloudDocs"),
+     kDontBlockChildren},
 #endif
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     // On Linux also block access to devices via /dev.
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
index eca014eb..13d95541 100644
--- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
+++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
@@ -423,6 +423,54 @@
 #endif
 }
 
+#if BUILDFLAG(IS_MAC)
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       ConfirmSensitiveEntryAccess_DontBlockAllChildren_Overlapping) {
+  base::FilePath home_dir = temp_dir_.GetPath().AppendASCII("home");
+  base::ScopedPathOverride home_override(base::DIR_HOME, home_dir, true, true);
+
+  // Home directory itself should not be allowed.
+  EXPECT_EQ(SensitiveDirectoryResult::kAbort,
+            ConfirmSensitiveEntryAccessSync(
+                permission_context(), PathType::kLocal, home_dir,
+                HandleType::kDirectory, UserAction::kOpen));
+  // $HOME/Library should be blocked.
+  EXPECT_EQ(SensitiveDirectoryResult::kAbort,
+            ConfirmSensitiveEntryAccessSync(
+                permission_context(), PathType::kLocal,
+                home_dir.AppendASCII("Library"), HandleType::kDirectory,
+                UserAction::kOpen));
+  // $HOME/Library/Mobile Documents should be blocked.
+  EXPECT_EQ(SensitiveDirectoryResult::kAbort,
+            ConfirmSensitiveEntryAccessSync(
+                permission_context(), PathType::kLocal,
+                home_dir.AppendASCII("Library/Mobile Documents"),
+                HandleType::kDirectory, UserAction::kOpen));
+  // Paths within $HOME/Library/Mobile Documents should not be blocked.
+  EXPECT_EQ(SensitiveDirectoryResult::kAllowed,
+            ConfirmSensitiveEntryAccessSync(
+                permission_context(), PathType::kLocal,
+                home_dir.AppendASCII("Library/Mobile Documents/foo"),
+                HandleType::kDirectory, UserAction::kOpen));
+  // Except for $HOME/Library/Mobile Documents/com~apple~CloudDocs, which should
+  // be blocked.
+  EXPECT_EQ(
+      SensitiveDirectoryResult::kAbort,
+      ConfirmSensitiveEntryAccessSync(
+          permission_context(), PathType::kLocal,
+          home_dir.AppendASCII("Library/Mobile Documents/com~apple~CloudDocs"),
+          HandleType::kDirectory, UserAction::kOpen));
+  // Paths within $HOME/Library/Mobile Documents/com~apple~CloudDocs should not
+  // be blocked.
+  EXPECT_EQ(SensitiveDirectoryResult::kAllowed,
+            ConfirmSensitiveEntryAccessSync(
+                permission_context(), PathType::kLocal,
+                home_dir.AppendASCII(
+                    "Library/Mobile Documents/com~apple~CloudDocs/foo"),
+                HandleType::kDirectory, UserAction::kOpen));
+}
+#endif  // BUILDFLAG(IS_MAC)
+
 #if BUILDFLAG(IS_WIN)
 TEST_F(ChromeFileSystemAccessPermissionContextTest,
        ConfirmSensitiveEntryAccess_UNCPath) {
diff --git a/chrome/browser/first_run/first_run_internal_linux.cc b/chrome/browser/first_run/first_run_internal_linux.cc
index 4c1ff7c..33fd5790 100644
--- a/chrome/browser/first_run/first_run_internal_linux.cc
+++ b/chrome/browser/first_run/first_run_internal_linux.cc
@@ -20,15 +20,12 @@
 
 base::FilePath InitialPrefsPath() {
   // The standard location of the initial prefs is next to the chrome binary.
-  base::FilePath initial_prefs;
-  if (!base::PathService::Get(base::DIR_EXE, &initial_prefs))
+  base::FilePath dir_exe;
+  if (!base::PathService::Get(base::DIR_EXE, &dir_exe)) {
     return base::FilePath();
+  }
 
-  base::FilePath new_path = initial_prefs.AppendASCII(installer::kInitialPrefs);
-  if (base::PathIsReadable(new_path))
-    return new_path;
-
-  return initial_prefs.AppendASCII(installer::kLegacyInitialPrefs);
+  return installer::InitialPreferences::Path(dir_exe);
 }
 
 }  // namespace internal
diff --git a/chrome/browser/first_run/first_run_internal_win.cc b/chrome/browser/first_run/first_run_internal_win.cc
index 034379df..b86746a 100644
--- a/chrome/browser/first_run/first_run_internal_win.cc
+++ b/chrome/browser/first_run/first_run_internal_win.cc
@@ -158,11 +158,7 @@
   if (!base::PathService::Get(base::DIR_EXE, &dir_exe))
     return base::FilePath();
 
-  base::FilePath initial_prefs = dir_exe.AppendASCII(installer::kInitialPrefs);
-  if (base::PathIsReadable(initial_prefs))
-    return initial_prefs;
-
-  return dir_exe.AppendASCII(installer::kLegacyInitialPrefs);
+  return installer::InitialPreferences::Path(dir_exe);
 }
 
 }  // namespace internal
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 24fe530..cb7ed27 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3211,12 +3211,6 @@
     "Warning: Highly experimental. May lead to loss of passwords and "
     "impact performance.";
 
-const char kUnifiedPasswordManagerErrorMessagesName[] =
-    "Error Messages when using Google Mobile Services for passwords";
-const char kUnifiedPasswordManagerErrorMessagesDescription[] =
-    "Enables showing error messages that offer signing in again to fix the "
-    "auth errors.";
-
 const char kUnifiedPasswordManagerAndroidReenrollmentName[] =
     "Automatic reenrollement of users who were evicted from using Google "
     "Mobile Services after experiencing errors.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 7ec9d4e..16de394 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1843,9 +1843,6 @@
 extern const char kUnifiedPasswordManagerAndroidName[];
 extern const char kUnifiedPasswordManagerAndroidDescription[];
 
-extern const char kUnifiedPasswordManagerErrorMessagesName[];
-extern const char kUnifiedPasswordManagerErrorMessagesDescription[];
-
 extern const char kUnifiedPasswordManagerAndroidReenrollmentName[];
 extern const char kUnifiedPasswordManagerAndroidReenrollmentDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 470a771..aed0593 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -376,7 +376,6 @@
     &password_manager::features::kUnifiedCredentialManagerDryRun,
     &password_manager::features::kUnifiedPasswordManagerAndroid,
     &password_manager::features::kUnifiedPasswordManagerAndroidBranding,
-    &password_manager::features::kUnifiedPasswordManagerErrorMessages,
     &password_manager::features::kPasswordEditDialogWithDetails,
     &privacy_sandbox::kPrivacySandboxFirstPartySetsUI,
     &privacy_sandbox::kPrivacySandboxSettings3,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 8976392..6b1a85f 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -7,7 +7,6 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -23,7 +22,6 @@
  * flags.
  */
 @JNINamespace("chrome::android")
-@MainDex
 public abstract class ChromeFeatureList {
     /** Prevent instantiation. */
     private ChromeFeatureList() {}
@@ -518,8 +516,6 @@
     public static final String UNIFIED_PASSWORD_MANAGER_ANDROID = "UnifiedPasswordManagerAndroid";
     public static final String UNIFIED_PASSWORD_MANAGER_ANDROID_BRANDING =
             "UnifiedPasswordManagerAndroidBranding";
-    public static final String UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES =
-            "UnifiedPasswordManagerErrorMessages";
     public static final String USE_CHIME_ANDROID_SDK = "UseChimeAndroidSdk";
     public static final String USE_LIBUNWINDSTACK_NATIVE_UNWINDER_ANDROID =
             "UseLibunwindstackNativeUnwinderAndroid";
diff --git a/chrome/browser/history_clusters/BUILD.gn b/chrome/browser/history_clusters/BUILD.gn
index 1d086a2..41f210e 100644
--- a/chrome/browser/history_clusters/BUILD.gn
+++ b/chrome/browser/history_clusters/BUILD.gn
@@ -66,7 +66,6 @@
     "//components/strings:components_strings_grd",
     "//content/public/android:content_java",
     "//content/public/android:content_java_resources",
-    "//third_party/android_deps:com_android_support_support_annotations_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_appcompat_appcompat_java",
     "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java
index 086958b..6b1670e 100644
--- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java
+++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java
@@ -8,12 +8,12 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
-import android.support.annotation.DrawableRes;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 
+import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
 import androidx.core.widget.ImageViewCompat;
diff --git a/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc b/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc
index 5452209..ecd74da 100644
--- a/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc
+++ b/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.cc
@@ -42,10 +42,10 @@
 }
 
 void ExplicitlyAllowedNetworkPortsPolicyHandler::ApplyList(
-    base::Value filtered_list,
+    base::Value::List filtered_list,
     PrefValueMap* prefs) {
   base::Value::List integer_list;
-  for (const base::Value& value : filtered_list.GetList()) {
+  for (const base::Value& value : filtered_list) {
     const std::string& as_string = value.GetString();
     int as_int;
     const bool success = base::StringToInt(as_string, &as_int);
diff --git a/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h b/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h
index 088381a..e94bc2ac 100644
--- a/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h
+++ b/chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h
@@ -25,7 +25,7 @@
   bool CheckListEntry(const base::Value& value) override;
 
   // Converts the values to integers.
-  void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override;
+  void ApplyList(base::Value::List filtered_list, PrefValueMap* prefs) override;
 };
 
 }  // namespace policy
diff --git a/chrome/browser/notifications/notification_interactive_uitest.cc b/chrome/browser/notifications/notification_interactive_uitest.cc
index 28e3c7f..73790cc 100644
--- a/chrome/browser/notifications/notification_interactive_uitest.cc
+++ b/chrome/browser/notifications/notification_interactive_uitest.cc
@@ -414,10 +414,9 @@
   EXPECT_EQ(
       *ukm_recorder.GetEntryMetric(entry, "Source"),
       static_cast<int64_t>(permissions::PermissionSourceUI::INLINE_SETTINGS));
-  size_t num_values = 0;
-  EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "PermissionType"),
-            ContentSettingTypeToHistogramValue(
-                ContentSettingsType::NOTIFICATIONS, &num_values));
+  EXPECT_EQ(
+      *ukm_recorder.GetEntryMetric(entry, "PermissionType"),
+      ContentSettingTypeToHistogramValue(ContentSettingsType::NOTIFICATIONS));
   EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Action"),
             static_cast<int64_t>(permissions::PermissionAction::REVOKED));
 }
diff --git a/chrome/browser/password_manager/android/BUILD.gn b/chrome/browser/password_manager/android/BUILD.gn
index 4b881dd..32e5f0ee5 100644
--- a/chrome/browser/password_manager/android/BUILD.gn
+++ b/chrome/browser/password_manager/android/BUILD.gn
@@ -218,6 +218,7 @@
     ":test_support_java",
     "$google_play_services_package:google_play_services_base_java",
     "$google_play_services_package:google_play_services_basement_java",
+    "pwd_migration:junit",
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_java_test_support_uncommon",
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridge.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridge.java
index 6e3f871..7065757 100644
--- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridge.java
+++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridge.java
@@ -5,13 +5,10 @@
 package org.chromium.chrome.browser.password_manager;
 
 import android.app.Activity;
-
 import androidx.annotation.VisibleForTesting;
-
 import org.chromium.base.TimeUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
@@ -26,29 +23,27 @@
 
 import java.util.concurrent.TimeUnit;
 
-/**
- *  The bridge provides a way to interact with the Android sign in flow.
- */
+/** The bridge provides a way to interact with the Android sign in flow. */
 public class PasswordManagerErrorMessageHelperBridge {
     @VisibleForTesting
     static final long MINIMAL_INTERVAL_BETWEEN_PROMPTS_MS =
             TimeUnit.MILLISECONDS.convert(24, TimeUnit.HOURS);
+
     @VisibleForTesting
     static final long MINIMAL_INTERVAL_TO_SYNC_ERROR_MS =
             TimeUnit.MILLISECONDS.convert(30, TimeUnit.MINUTES);
 
-    /**
-     * Checks whether the right amount of time has passed since the last error UI messages
-     * were shown.
-     *
-     * The error UI should be shown at least {@link #MINIMAL_INTERVAL_BETWEEN_PROMPTS_MS} from the
-     * previous one and at least {@link #MINIMAL_INTERVAL_TO_SYNC_ERROR_MS} from the last sync error
-     * UI.
-     *
-     * @return whether the UI can be shown given the conditions above.
-     */
-    @CalledByNative
-    static boolean shouldShowErrorUi() {
+  /**
+   * Checks whether the right amount of time has passed since the last error UI messages were shown.
+   *
+   * <p>The error UI should be shown at least {@link #MINIMAL_INTERVAL_BETWEEN_PROMPTS_MS} from the
+   * previous one and at least {@link #MINIMAL_INTERVAL_TO_SYNC_ERROR_MS} from the last sync error
+   * UI.
+   *
+   * @return whether the UI can be shown given the conditions above.
+   */
+  @CalledByNative
+  static boolean shouldShowErrorUi() {
         Profile profile = Profile.getLastUsedRegularProfile();
         final CoreAccountInfo primaryAccountInfo =
                 IdentityServicesProvider.get().getIdentityManager(profile).getPrimaryAccountInfo(
@@ -58,12 +53,6 @@
         // case, the error is no longer relevant/fixable.
         if (primaryAccountInfo == null) return false;
 
-        if (ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
-                    ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ERROR_MESSAGES,
-                    "ignore_auth_error_message_timeouts", false)) {
-            return true;
-        }
-
         PrefService prefService = UserPrefs.get(Profile.getLastUsedRegularProfile());
         long lastShownTimestamp =
                 Long.valueOf(prefService.getString(Pref.UPM_ERROR_UI_SHOWN_TIMESTAMP));
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridgeTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridgeTest.java
index 9a14fd1..c79334e 100644
--- a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridgeTest.java
+++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridgeTest.java
@@ -53,9 +53,7 @@
 
 import java.lang.ref.WeakReference;
 
-/**
- * Unit tests for the error message helper bridge.
- * */
+/** Unit tests for the error message helper bridge. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class PasswordManagerErrorMessageHelperBridgeTest {
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
index 3bcfb0f..ed5c70a 100644
--- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
+++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
@@ -83,12 +83,9 @@
 // pref to temporarily prevent password saves. If the user doesn't use GMS,
 // saving keeps working and only the syncing of changes is delayed.
 bool ShouldSuspendPasswordSavingDueToError(PrefService* pref_service) {
-  // The messages feature is a subset of UPM. The actual feature is irrelevant.
-  if (!base::FeatureList::IsEnabled(
-          password_manager::features::kUnifiedPasswordManagerErrorMessages)) {
-    return false;  // Non-UPM users can still save.
-  }
   // Ensure the user is still enrolled. Evicted users can still save normally.
+  // TODO(crbug.com/1443356): possibly auth error disables password saving
+  // after pwd sync is turned off.
   return !IsUnenrolledFromUPM(pref_service) &&
          pref_service->GetBoolean(
              password_manager::prefs::kSavePasswordsSuspendedByError);
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
index 4d991004..4e48334 100644
--- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
+++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
@@ -1052,8 +1052,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/
-      {password_manager::features::kUnifiedPasswordManagerAndroid,
-       password_manager::features::kUnifiedPasswordManagerErrorMessages},
+      {password_manager::features::kUnifiedPasswordManagerAndroid},
       /*disabled_features=*/{});
   InitializeSettingsService(/*password_sync_enabled=*/true,
                             /*setting_sync_enabled=*/true);
@@ -1074,8 +1073,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/
-      {password_manager::features::kUnifiedPasswordManagerAndroid,
-       password_manager::features::kUnifiedPasswordManagerErrorMessages},
+      {password_manager::features::kUnifiedPasswordManagerAndroid},
       /*disabled_features=*/{});
   InitializeSettingsService(/*password_sync_enabled=*/false,
                             /*setting_sync_enabled=*/true);
@@ -1095,8 +1093,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/
-      {password_manager::features::kUnifiedPasswordManagerAndroid,
-       password_manager::features::kUnifiedPasswordManagerErrorMessages},
+      {password_manager::features::kUnifiedPasswordManagerAndroid},
       /*disabled_features=*/{});
   InitializeSettingsService(/*password_sync_enabled=*/false,
                             /*setting_sync_enabled=*/true);
@@ -1119,8 +1116,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/
-      {password_manager::features::kUnifiedPasswordManagerAndroid,
-       password_manager::features::kUnifiedPasswordManagerErrorMessages},
+      {password_manager::features::kUnifiedPasswordManagerAndroid},
       /*disabled_features=*/{});
   InitializeSettingsService(/*password_sync_enabled=*/false,
                             /*setting_sync_enabled=*/true);
@@ -1139,27 +1135,6 @@
 }
 
 TEST_F(PasswordManagerSettingsServiceAndroidImplTest,
-       IgnoreOverriddenValueForOfferToSaveWithoutFeature) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      /*enabled_features=*/{password_manager::features::
-                                kUnifiedPasswordManagerAndroid},
-      /*disabled_features=*/{
-          password_manager::features::kUnifiedPasswordManagerErrorMessages});
-  InitializeSettingsService(/*password_sync_enabled=*/true,
-                            /*setting_sync_enabled=*/true);
-  pref_service()->SetUserPref(
-      password_manager::prefs::kCredentialsEnableService, base::Value(true));
-  pref_service()->SetUserPref(
-      password_manager::prefs::kOfferToSavePasswordsEnabledGMS,
-      base::Value(true));
-  pref_service()->SetBoolean(
-      password_manager::prefs::kSavePasswordsSuspendedByError, true);
-  EXPECT_TRUE(settings_service()->IsSettingEnabled(
-      PasswordManagerSetting::kOfferToSavePasswords));
-}
-
-TEST_F(PasswordManagerSettingsServiceAndroidImplTest,
        TestMigrateSettingsOnReenrollingIntoUPM) {
   SetPasswordsSync(true);
 
diff --git a/chrome/browser/password_manager/android/password_store_android_backend.cc b/chrome/browser/password_manager/android/password_store_android_backend.cc
index df4204b..f323793 100644
--- a/chrome/browser/password_manager/android/password_store_android_backend.cc
+++ b/chrome/browser/password_manager/android/password_store_android_backend.cc
@@ -349,31 +349,6 @@
                                 attempt, kMaxReportedRetryAttempts);
 }
 
-bool HasPromptedTooManyAuthErrors(PrefService* pref_service) {
-  DCHECK(pref_service);
-  // This question only makes sense if auth error prompts are enabled.
-  DCHECK(base::FeatureList::IsEnabled(
-      password_manager::features::kUnifiedPasswordManagerErrorMessages));
-
-  // If there is no limit on how many times an auth error can be shown,
-  // there is no such thing as too many auth error prompts.
-  int max_auth_error_prompts =
-      password_manager::features::kMaxShownUPMErrorsBeforeEviction.Get();
-  if (max_auth_error_prompts < 0) {
-    return false;
-  }
-
-  if (pref_service->GetInteger(
-          password_manager::prefs::kTimesUPMAuthErrorShown) <
-      max_auth_error_prompts) {
-    return false;
-  }
-
-  LOG(ERROR) << "Auth error prompts exceeds limit of "
-             << max_auth_error_prompts;
-  return true;
-}
-
 bool IsUnrecoverableBackendError(AndroidBackendAPIErrorCode api_error_code,
                                  PasswordStoreOperation operation,
                                  PrefService* pref_service) {
@@ -394,17 +369,6 @@
     return true;
   }
 
-  // Auth errors require explicit handling and are not recoverable if this
-  // handling is disabled. They are also considered unrecoverable if the client
-  // has been in a broke auth state for too long, verified by the number of auth
-  // error prompts that were shown.
-  if (IsAuthenticationError(api_error_code) &&
-      (!base::FeatureList::IsEnabled(
-           password_manager::features::kUnifiedPasswordManagerErrorMessages) ||
-       HasPromptedTooManyAuthErrors(pref_service))) {
-    return true;
-  }
-
   return false;
 }
 
@@ -1074,10 +1038,7 @@
         }
         password_manager_upm_eviction::EvictCurrentUser(api_error, prefs_);
       }
-    } else if (IsAuthenticationError(api_error_code) &&
-               base::FeatureList::IsEnabled(
-                   password_manager::features::
-                       kUnifiedPasswordManagerErrorMessages)) {
+    } else if (IsAuthenticationError(api_error_code)) {
       // Auth error specific handling is only triggered if the error is
       // considered recoverable.
       prefs_->SetBoolean(prefs::kSavePasswordsSuspendedByError, true);
diff --git a/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc b/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc
index a3bce6c..0ec3e5c 100644
--- a/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc
+++ b/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc
@@ -697,8 +697,7 @@
        OnExternalIgnoredErrorNotCausingExperimentUnenrollment) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// INTERNAL_ERROR=8
          {password_manager::features::kIgnoredGmsApiErrors.name, "8"},
          {password_manager::features::kRetriableGmsApiErrors.name, ""}}}},
@@ -750,8 +749,7 @@
     OnUnretriableOperationWithExternalRetriableErrorOnCausesExperimentUnenrollment) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// DEVELOPER_ERROR=10, BAD_REQUEST=11008
          {password_manager::features::kIgnoredGmsApiErrors.name, "10,11008"},
          // NETWORK_ERROR=7
@@ -914,8 +912,7 @@
        OnNetworkErrorRetriableStopsRetryingAfterSuccess) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// NETWORK_ERROR = 7
          {password_manager::features::kIgnoredGmsApiErrors.name, ""},
          {password_manager::features::kRetriableGmsApiErrors.name, "7"}}}},
@@ -980,44 +977,10 @@
 }
 
 TEST_F(PasswordStoreAndroidBackendTest,
-       OnExternalAuthErrorKeepSavingWithoutErrorMessageFeature) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerAndroid,
-        {// AUTH_ERROR_UNRESOLVABLE=11006
-         {password_manager::features::kIgnoredGmsApiErrors.name, "11006"}}}},
-      {password_manager::features::kUnifiedPasswordManagerErrorMessages});
-
-  backend().InitBackend(PasswordStoreAndroidBackend::RemoteChangesReceived(),
-                        base::RepeatingClosure(), base::DoNothing());
-  backend().OnSyncServiceInitialized(sync_service());
-  EXPECT_FALSE(prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError));
-
-  base::MockCallback<LoginsOrErrorReply> mock_reply;
-  EXPECT_CALL(*bridge_helper(), GetAllLogins).WillOnce(Return(kJobId));
-  backend().GetAllLoginsAsync(mock_reply.Get());
-
-  EXPECT_CALL(
-      mock_reply,
-      Run(ExpectError(PasswordStoreBackendErrorType::kAuthErrorUnresolvable,
-                      PasswordStoreBackendErrorRecoveryType::kUnrecoverable)));
-  AndroidBackendError error{AndroidBackendErrorType::kExternalError};
-  // Simulate receiving AUTH_ERROR_UNRESOLVABLE code.
-  int kUnresolvableAuthErrorCode =
-      static_cast<int>(AndroidBackendAPIErrorCode::kAuthErrorUnresolvable);
-  error.api_error_code = absl::optional<int>(kUnresolvableAuthErrorCode);
-  consumer().OnError(kJobId, std::move(error));
-  RunUntilIdle();
-
-  EXPECT_FALSE(prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError));
-}
-
-TEST_F(PasswordStoreAndroidBackendTest,
        OnExternalAuthErrorNotCausingExperimentUnenrollmentButSuspendsSaving) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// AUTH_ERROR_UNRESOLVABLE=11006
          {password_manager::features::kIgnoredGmsApiErrors.name, "11006"}}}},
       {});
@@ -1052,8 +1015,7 @@
        OnExternalAuthErrorKeepSavingIfErrorNotIgnorable) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// DEVELOPER_ERROR=10, BAD_REQUEST=11008
          {password_manager::features::kIgnoredGmsApiErrors.name, "10,11008"}}}},
       {});
@@ -1084,8 +1046,6 @@
 
 TEST_F(PasswordStoreAndroidBackendTest,
        ResetTemporarySavingSuspensionAfterSuccessfulLogin) {
-  base::test::ScopedFeatureList scoped_feature_list(
-      password_manager::features::kUnifiedPasswordManagerErrorMessages);
   backend().InitBackend(PasswordStoreAndroidBackend::RemoteChangesReceived(),
                         base::RepeatingClosure(), base::DoNothing());
   backend().OnSyncServiceInitialized(sync_service());
@@ -1566,55 +1526,13 @@
       UnifiedPasswordManagerActiveStatus::kInactiveUnenrolledDueToErrors, 1);
 }
 
-TEST_F(PasswordStoreAndroidBackendTest, AuthErrorUnrecoverableAfterMaxPrompts) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages,
-        {{password_manager::features::kMaxShownUPMErrorsBeforeEviction.name,
-          "3"}}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
-        {
-            // AUTH_ERROR_RESOLVABLE = "11005"
-            {password_manager::features::kIgnoredGmsApiErrors.name, "11005"},
-        }}},
-      {});
-  ASSERT_FALSE(prefs()->GetBoolean(
-      prefs::kUnenrolledFromGoogleMobileServicesDueToErrors));
-  backend().InitBackend(PasswordStoreAndroidBackend::RemoteChangesReceived(),
-                        base::RepeatingClosure(), base::DoNothing());
-  backend().OnSyncServiceInitialized(sync_service());
-
-  base::MockCallback<LoginsOrErrorReply> mock_reply;
-  EXPECT_CALL(*bridge_helper(), GetAllLogins).WillOnce(Return(kJobId));
-  backend().GetAllLoginsAsync(mock_reply.Get());
-  AndroidBackendError error{AndroidBackendErrorType::kExternalError};
-  // Simulate receiving AUTH_ERROR_RESOLVABLE code.
-  int kAuthErrorResolvableCode =
-      static_cast<int>(AndroidBackendAPIErrorCode::kAuthErrorResolvable);
-  error.api_error_code = absl::optional<int>(kAuthErrorResolvableCode);
-
-  // Pretend 3 prompts were already shown.
-  prefs()->SetInteger(prefs::kTimesUPMAuthErrorShown, 3);
-  EXPECT_CALL(
-      mock_reply,
-      Run(ExpectError(PasswordStoreBackendErrorType::kAuthErrorResolvable,
-                      PasswordStoreBackendErrorRecoveryType::kUnrecoverable)));
-  consumer().OnError(kJobId, std::move(error));
-  RunUntilIdle();
-  EXPECT_TRUE(prefs()->GetBoolean(
-      prefs::kUnenrolledFromGoogleMobileServicesDueToErrors));
-}
-
 TEST_F(PasswordStoreAndroidBackendTest,
        AuthErrorStillRecoverableUnderMaxPrompts) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// AUTH_ERROR_RESOLVABLE = "11005"
-         {password_manager::features::kIgnoredGmsApiErrors.name, "11005"},
-         {password_manager::features::kMaxShownUPMErrorsBeforeEviction.name,
-          "3"}}}},
+         {password_manager::features::kIgnoredGmsApiErrors.name, "11005"}}}},
       {});
   ASSERT_FALSE(prefs()->GetBoolean(
       prefs::kUnenrolledFromGoogleMobileServicesDueToErrors));
@@ -1646,12 +1564,9 @@
 TEST_F(PasswordStoreAndroidBackendTest, ResetAuthErrorCounterOnSuccessfulGet) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// AUTH_ERROR_RESOLVABLE = "11005"
-         {password_manager::features::kIgnoredGmsApiErrors.name, "11005"},
-         {password_manager::features::kMaxShownUPMErrorsBeforeEviction.name,
-          "3"}}}},
+         {password_manager::features::kIgnoredGmsApiErrors.name, "11005"}}}},
       {});
   ASSERT_FALSE(prefs()->GetBoolean(
       prefs::kUnenrolledFromGoogleMobileServicesDueToErrors));
@@ -1679,12 +1594,9 @@
        ResetAuthErrorCounterOnSuccessfulModification) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeaturesAndParameters(
-      {{password_manager::features::kUnifiedPasswordManagerErrorMessages, {}},
-       {password_manager::features::kUnifiedPasswordManagerAndroid,
+      {{password_manager::features::kUnifiedPasswordManagerAndroid,
         {// AUTH_ERROR_RESOLVABLE = "11005"
-         {password_manager::features::kIgnoredGmsApiErrors.name, "11005"},
-         {password_manager::features::kMaxShownUPMErrorsBeforeEviction.name,
-          "3"}}}},
+         {password_manager::features::kIgnoredGmsApiErrors.name, "11005"}}}},
       {});
   ASSERT_FALSE(prefs()->GetBoolean(
       prefs::kUnenrolledFromGoogleMobileServicesDueToErrors));
diff --git a/chrome/browser/password_manager/android/pwd_migration/BUILD.gn b/chrome/browser/password_manager/android/pwd_migration/BUILD.gn
index 303b833..e7c740f 100644
--- a/chrome/browser/password_manager/android/pwd_migration/BUILD.gn
+++ b/chrome/browser/password_manager/android/pwd_migration/BUILD.gn
@@ -39,5 +39,25 @@
   sources = [
     "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningBridge.java",
     "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java",
+    "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java",
+    "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java",
+  ]
+}
+
+robolectric_library("junit") {
+  testonly = true
+
+  sources = [ "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningControllerRobolectricTest.java" ]
+
+  deps = [
+    ":java",
+    "//base:base_java_test_support",
+    "//base:base_junit_test_support",
+    "//chrome/test/android:chrome_java_test_support_common",
+    "//components/browser_ui/bottomsheet/android:java",
+    "//third_party/hamcrest:hamcrest_library_java",
+    "//third_party/junit:junit",
+    "//third_party/mockito:mockito_java",
+    "//ui/android:ui_java",
   ]
 }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningControllerRobolectricTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningControllerRobolectricTest.java
new file mode 100644
index 0000000..de5352e
--- /dev/null
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningControllerRobolectricTest.java
@@ -0,0 +1,72 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.pwd_migration;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.DISMISS_HANDLER;
+import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE;
+
+import android.app.Activity;
+import android.content.Context;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.robolectric.Robolectric;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/**
+ * Tests for {@link PasswordMigrationWarningCoordinator} and {@link
+ * PasswordMigrationWarningMediator}
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Batch(Batch.PER_CLASS)
+public class PasswordMigrationWarningControllerRobolectricTest {
+    @Rule
+    public MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
+    private final Context mContext = Robolectric.buildActivity(Activity.class).get();
+    private PasswordMigrationWarningCoordinator mCoordinator;
+
+    @Mock
+    private BottomSheetController mBottomSheetController;
+
+    public PasswordMigrationWarningControllerRobolectricTest() {}
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mCoordinator = new PasswordMigrationWarningCoordinator(mContext, mBottomSheetController);
+    }
+
+    @Test
+    public void testShowWarningUpdatesModel() {
+        PropertyModel model = mCoordinator.getModelForTesting();
+        assertNotNull(model.get(DISMISS_HANDLER));
+        assertThat(model.get(VISIBLE), is(false));
+
+        mCoordinator.showWarning();
+
+        assertThat(model.get(VISIBLE), is(true));
+    }
+}
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java
index 6f26040..a4044d27 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java
@@ -7,15 +7,28 @@
 import android.content.Context;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+import org.chromium.ui.modelutil.PropertyModel;
 
 /** The coordinator of the password migration warning. */
-class PasswordMigrationWarningCoordinator {
+public class PasswordMigrationWarningCoordinator {
+    private final PasswordMigrationWarningMediator mMediator =
+            new PasswordMigrationWarningMediator();
+
     public PasswordMigrationWarningCoordinator(
-            @Nullable Context context, BottomSheetController sheetController) {}
+            @Nullable Context context, BottomSheetController sheetController) {
+        mMediator.initialize(
+                PasswordMigrationWarningProperties.createDefaultModel(mMediator::onDismissed));
+    }
 
     public void showWarning() {
-        // TODO(crbug.com/1439761): Implement.
+        mMediator.showWarning();
+    }
+
+    @VisibleForTesting
+    PropertyModel getModelForTesting() {
+        return mMediator.getModel();
     }
 }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java
new file mode 100644
index 0000000..67f9297
--- /dev/null
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java
@@ -0,0 +1,35 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.pwd_migration;
+
+import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE;
+
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/**
+ * Contains the logic for the local passwords migration warning. It sets the state of the model and
+ * reacts to events.
+ */
+class PasswordMigrationWarningMediator {
+    private PropertyModel mModel;
+
+    void initialize(PropertyModel model) {
+        mModel = model;
+    }
+
+    void showWarning() {
+        mModel.set(VISIBLE, true);
+    }
+
+    void onDismissed(@StateChangeReason int reason) {
+        if (!mModel.get(VISIBLE)) return; // Dismiss only if not dismissed yet.
+        mModel.set(VISIBLE, false);
+    }
+
+    PropertyModel getModel() {
+        return mModel;
+    }
+}
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java
new file mode 100644
index 0000000..7e9d2f90
--- /dev/null
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java
@@ -0,0 +1,27 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.pwd_migration;
+
+import org.chromium.base.Callback;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/**
+ * Properties defined here reflect the visible state of the local passwords migration warning.
+ */
+class PasswordMigrationWarningProperties {
+    static final PropertyModel.WritableBooleanPropertyKey VISIBLE =
+            new PropertyModel.WritableBooleanPropertyKey("visible");
+    static final PropertyModel.ReadableObjectPropertyKey<Callback<Integer>> DISMISS_HANDLER =
+            new PropertyModel.ReadableObjectPropertyKey<>("dismiss_handler");
+
+    static PropertyModel createDefaultModel(Callback<Integer> dismissHandler) {
+        return new PropertyModel.Builder(VISIBLE, DISMISS_HANDLER)
+                .with(VISIBLE, false)
+                .with(DISMISS_HANDLER, dismissHandler)
+                .build();
+    }
+
+    private PasswordMigrationWarningProperties() {}
+}
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 83ce76b..1190405 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -351,13 +351,8 @@
 
   if (web_contents()->GetFocusedFrame()) {
     bool manual_generation_available =
-        password_manager_util::ManualPasswordGenerationEnabled(driver);
-    if (base::FeatureList::IsEnabled(
-            password_manager::features::kUnifiedPasswordManagerErrorMessages)) {
-      manual_generation_available =
-          manual_generation_available &&
-          password_manager_.HaveFormManagersReceivedData(driver);
-    }
+        password_manager_util::ManualPasswordGenerationEnabled(driver) &&
+        password_manager_.HaveFormManagersReceivedData(driver);
     GetOrCreatePasswordAccessory()->RefreshSuggestionsForField(
         focused_field_type, manual_generation_available);
   }
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
index 9a832be1..8ad85828 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -1153,8 +1153,6 @@
 
 TEST_F(ChromePasswordManagerClientAndroidTest,
        FocusedInputChangedFormsFetched) {
-  base::test::ScopedFeatureList scoped_feature_list(
-      {password_manager::features::kUnifiedPasswordManagerErrorMessages});
   FormData observed_form_data = MakePasswordFormData();
   SetUpGenerationPreconditions(observed_form_data.url);
 
diff --git a/chrome/browser/policy/BUILD.gn b/chrome/browser/policy/BUILD.gn
index 46e9563..da1cefe 100644
--- a/chrome/browser/policy/BUILD.gn
+++ b/chrome/browser/policy/BUILD.gn
@@ -28,6 +28,7 @@
   ]
 
   if (is_mac) {
+    configs += [ "//build/config/compiler:enable_arc" ]
     deps += [ "//build:branding_buildflags" ]
   } else if (is_win) {
     deps += [ "//chrome/install_static:install_static_util" ]
@@ -385,6 +386,7 @@
       "cloud/chrome_browser_cloud_management_browsertest_mac_util.h",
       "cloud/chrome_browser_cloud_management_browsertest_mac_util.mm",
     ]
+    configs += [ "//build/config/compiler:enable_arc" ]
   }
 
   if (is_win) {
diff --git a/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest_mac_util.mm b/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest_mac_util.mm
index 6a1d517..b9be039 100644
--- a/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest_mac_util.mm
+++ b/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest_mac_util.mm
@@ -6,20 +6,24 @@
 
 #import <Cocoa/Cocoa.h>
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace policy {
 
 void PostAppControllerNSNotifications() {
   // Simulate the user clicking a window other than the dialog.
   // The Profile is not ready when the dialog is displayed, so it can't be
   // accessed.
-  [[NSNotificationCenter defaultCenter]
+  [NSNotificationCenter.defaultCenter
       postNotificationName:NSWindowDidResignMainNotification
                     object:nil];
 
-  // Simulate the user hiding Chrome via Cmd+h when the dialog is displayed.
+  // Simulate the user hiding Chrome via Cmd+H when the dialog is displayed.
   // The AppShimManager hasn't been created when the dialog is
   // displayed, so it must be skipped.
-  [[NSNotificationCenter defaultCenter]
+  [NSNotificationCenter.defaultCenter
       postNotificationName:NSApplicationWillHideNotification
                     object:nil];
 }
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 96a6672..fdf44dd 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/browsing_data/browsing_data_lifetime_policy_handler.h"
 #include "chrome/browser/enterprise/connectors/device_trust/prefs.h"
 #include "chrome/browser/enterprise/idle/idle_timeout_policy_handler.h"
+#include "chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_policy_handler.h"
 #include "chrome/browser/first_party_sets/first_party_sets_overrides_policy_handler.h"
 #include "chrome/browser/net/disk_cache_dir_policy_handler.h"
 #include "chrome/browser/net/explicitly_allowed_network_ports_policy_handler.h"
@@ -1951,6 +1952,8 @@
   handlers->AddHandler(
       std::make_unique<
           enterprise_reporting::CloudReportingFrequencyPolicyHandler>());
+  handlers->AddHandler(
+      std::make_unique<enterprise_reporting::LegacyTechReportPolicyHandler>());
   handlers->AddHandler(std::make_unique<DefaultSearchPolicyHandler>());
   handlers->AddHandler(std::make_unique<IncognitoModePolicyHandler>());
   handlers->AddHandler(
diff --git a/chrome/browser/policy/policy_path_parser_mac.mm b/chrome/browser/policy/policy_path_parser_mac.mm
index 8eecdf9..50da7547 100644
--- a/chrome/browser/policy/policy_path_parser_mac.mm
+++ b/chrome/browser/policy/policy_path_parser_mac.mm
@@ -5,10 +5,8 @@
 #include "chrome/browser/policy/policy_path_parser.h"
 
 #import <Cocoa/Cocoa.h>
-#include <stddef.h>
-#import <SystemConfiguration/SCDynamicStore.h>
-#import <SystemConfiguration/SCDynamicStoreCopySpecific.h>
 #import <SystemConfiguration/SystemConfiguration.h>
+#include <stddef.h>
 
 #include <string>
 
@@ -20,9 +18,11 @@
 #include "build/branding_buildflags.h"
 #include "components/policy/policy_constants.h"
 
-namespace policy {
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
 
-namespace path_parser {
+namespace policy::path_parser {
 
 const char kUserNamePolicyVarName[] = "${user_name}";
 const char kMachineNamePolicyVarName[] = "${machine_name}";
@@ -31,7 +31,7 @@
 
 struct MacFolderNamesToSPDMapping {
   const char* name;
-  NSSearchPathDirectory id;
+  NSSearchPathDirectory search_path_directory;
 };
 
 // Mapping from variable names to MacOS NSSearchPathDirectory ids.
@@ -57,10 +57,10 @@
   for (const auto& mapping : mac_folder_mapping) {
     size_t position = result.find(mapping.name);
     if (position != std::string::npos) {
-      NSArray* searchpaths = NSSearchPathForDirectoriesInDomains(
-          mapping.id, NSAllDomainsMask, true);
-      if ([searchpaths count] > 0) {
-        NSString* variable_value = searchpaths[0];
+      NSArray<NSString*>* search_paths = NSSearchPathForDirectoriesInDomains(
+          mapping.search_path_directory, NSAllDomainsMask, true);
+      if (search_paths.count > 0) {
+        NSString* variable_value = search_paths[0];
         result.replace(position, strlen(mapping.name),
                        base::SysNSStringToUTF8(variable_value));
       }
@@ -82,11 +82,11 @@
     SCDynamicStoreContext context = {0, nullptr, nullptr, nullptr};
     base::ScopedCFTypeRef<SCDynamicStoreRef> store(SCDynamicStoreCreate(
         kCFAllocatorDefault, CFSTR("policy_subsystem"), nullptr, &context));
-    base::ScopedCFTypeRef<CFStringRef> machinename(
+    base::ScopedCFTypeRef<CFStringRef> machine_name(
         SCDynamicStoreCopyLocalHostName(store));
-    if (machinename) {
+    if (machine_name) {
       result.replace(position, strlen(kMachineNamePolicyVarName),
-                     base::SysCFStringRefToUTF8(machinename));
+                     base::SysCFStringRefToUTF8(machine_name));
     } else {
       int error = SCError();
       LOG(ERROR) << "Machine name variable can not be resolved. Error: "
@@ -128,6 +128,4 @@
   *user_data_dir = base::FilePath(string_value);
 }
 
-}  // namespace path_parser
-
-}  // namespace policy
+}  // namespace policy::path_parser
diff --git a/chrome/browser/policy/system_features_disable_list_policy_handler.cc b/chrome/browser/policy/system_features_disable_list_policy_handler.cc
index 654534f..a90f6c9c 100644
--- a/chrome/browser/policy/system_features_disable_list_policy_handler.cc
+++ b/chrome/browser/policy/system_features_disable_list_policy_handler.cc
@@ -70,15 +70,13 @@
 }
 
 void SystemFeaturesDisableListPolicyHandler::ApplyList(
-    base::Value filtered_list,
+    base::Value::List filtered_list,
     PrefValueMap* prefs) {
-  DCHECK(filtered_list.is_list());
-
   base::Value::List enums_list;
   base::Value* old_list = nullptr;
   prefs->GetValue(policy_prefs::kSystemFeaturesDisableList, &old_list);
 
-  for (const auto& element : filtered_list.GetList()) {
+  for (const auto& element : filtered_list) {
     SystemFeature feature = ConvertToEnum(element.GetString());
     enums_list.Append(static_cast<int>(feature));
 
diff --git a/chrome/browser/policy/system_features_disable_list_policy_handler.h b/chrome/browser/policy/system_features_disable_list_policy_handler.h
index b5d3491..b600c09 100644
--- a/chrome/browser/policy/system_features_disable_list_policy_handler.h
+++ b/chrome/browser/policy/system_features_disable_list_policy_handler.h
@@ -69,7 +69,7 @@
 
  protected:
   // ListPolicyHandler:
-  void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override;
+  void ApplyList(base::Value::List filtered_list, PrefValueMap* prefs) override;
 
  private:
   SystemFeature ConvertToEnum(const std::string& system_feature);
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index fa21e9d..456d0f3 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -106,6 +106,7 @@
     public static final String BOOKMARKS_LAST_USED_URL = "enhanced_bookmark_last_used_url";
     public static final String BOOKMARKS_LAST_USED_PARENT =
             "enhanced_bookmark_last_used_parent_folder";
+    public static final String BOOKMARKS_SORT_ORDER = "Chrome.Bookmarks.BookmarkRowSortOrder";
     public static final String BOOKMARKS_VISUALS_PREF = "Chrome.Bookmarks.BookmarkRowDisplay";
 
     /**
@@ -999,6 +1000,7 @@
                 APP_LAUNCH_SEARCH_ENGINE_HAD_LOGO,
                 APPLICATION_OVERRIDE_LANGUAGE,
                 BLUETOOTH_NOTIFICATION_IDS,
+                BOOKMARKS_SORT_ORDER,
                 BOOKMARKS_VISUALS_PREF,
                 CHROME_SURVEY_DOWNLOAD_ATTEMPTS.pattern(),
                 CHROME_SURVEY_PROMPT_DISPLAYED_TIMESTAMP.pattern(),
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index dcc96a9..e056747 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -463,7 +463,8 @@
 #include "components/os_crypt/sync/os_crypt.h"
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS_ASH)
 #include "components/device_signals/core/browser/pref_names.h"  // nogncheck due to crbug.com/1125897
 #endif
 
@@ -1700,9 +1701,11 @@
   safe_browsing::PostCleanupSettingsResetter::RegisterProfilePrefs(registry);
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS_ASH)
   device_signals::RegisterProfilePrefs(registry);
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   browser_switcher::BrowserSwitcherPrefs::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/quick_delete/BUILD.gn b/chrome/browser/quick_delete/BUILD.gn
index 723c4c8..bf6f6e8 100644
--- a/chrome/browser/quick_delete/BUILD.gn
+++ b/chrome/browser/quick_delete/BUILD.gn
@@ -1,5 +1,5 @@
 # Copyright 2023 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
+# Use of this source code is governed by a BSD - style license that can be
 # found in the LICENSE file.
 
 import("//build/config/android/rules.gni")
@@ -35,7 +35,9 @@
 
 android_resources("java_resources") {
   sources = [
+    "android/java/res/drawable/quick_delete_animation.xml",
     "android/java/res/drawable/quick_delete_trash_bin_icon_24dp.xml",
+    "android/java/res/layout/quick_delete_animation_view.xml",
     "android/java/res/layout/quick_delete_dialog.xml",
   ]
   deps = [
diff --git a/chrome/browser/quick_delete/android/java/res/drawable/quick_delete_animation.xml b/chrome/browser/quick_delete/android/java/res/drawable/quick_delete_animation.xml
new file mode 100644
index 0000000..40beb34
--- /dev/null
+++ b/chrome/browser/quick_delete/android/java/res/drawable/quick_delete_animation.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2023 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt" >
+
+  <aapt:attr name="android:drawable">
+    <vector
+        android:width="96dp"
+        android:height="96dp"
+        android:viewportHeight="100"
+        android:viewportWidth="100">
+      <group
+          android:name="gradientGroup"
+          android:translateY="0"
+          >
+        <path
+            android:name="gradientPath"
+            android:pathData="M1,1 H99 V99 H1Z">
+          <aapt:attr name="android:fillColor">
+            <!-- TODO(crbug.com/1412087): Add proper colors for light and dark mode. -->
+            <gradient
+                android:startColor="#FFFFFFFF"
+                android:startX="50"
+                android:startY="0"
+                android:endColor="#00000000"
+                android:endX="50"
+                android:endY="50"
+                android:type="linear" />
+          </aapt:attr>
+        </path>
+      </group>
+    </vector>
+  </aapt:attr>
+
+  <target android:name="gradientGroup">
+    <aapt:attr name="android:animation">
+      <set>
+        <objectAnimator
+            android:duration="1200"
+            android:propertyName="translateY"
+            android:valueFrom="150"
+            android:valueTo="-150" />
+      </set>
+    </aapt:attr>
+  </target>
+</animated-vector>
diff --git a/chrome/browser/quick_delete/android/java/res/layout/quick_delete_animation_view.xml b/chrome/browser/quick_delete/android/java/res/layout/quick_delete_animation_view.xml
new file mode 100644
index 0000000..d21ff7b
--- /dev/null
+++ b/chrome/browser/quick_delete/android/java/res/layout/quick_delete_animation_view.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2023 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<View
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:visibility="gone"/>
diff --git a/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java b/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java
index 4215874..174bc8a 100644
--- a/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java
+++ b/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java
@@ -5,9 +5,13 @@
 package org.chromium.chrome.browser.quick_delete;
 
 import android.content.Context;
+import android.graphics.drawable.Animatable2;
+import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.VibrationEffect;
 import android.os.Vibrator;
+import android.view.View;
 
 import androidx.annotation.NonNull;
 
@@ -33,6 +37,7 @@
     private final @NonNull QuickDeleteDialogDelegate mDialogDelegate;
     private final @NonNull SnackbarManager mSnackbarManager;
     private final @NonNull LayoutManager mLayoutManager;
+    private final @NonNull View mAnimationView;
 
     /**
      * Constructor for the QuickDeleteController with a dialog and confirmation snackbar.
@@ -44,17 +49,20 @@
      * @param layoutManager {@link LayoutManager} to use for showing the regular overview mode.
      * @param tabModelSelector {@link TabModelSelector} to use for opening the links in search
      *         history disambiguation notice.
+     * @param animationView The {@link View} to use to show the quick delete animation.
      */
     public QuickDeleteController(@NonNull Context context, @NonNull QuickDeleteDelegate delegate,
             @NonNull ModalDialogManager modalDialogManager,
             @NonNull SnackbarManager snackbarManager, @NonNull LayoutManager layoutManager,
-            @NonNull TabModelSelector tabModelSelector) {
+            @NonNull TabModelSelector tabModelSelector, @NonNull View animationView) {
         mContext = context;
         mDelegate = delegate;
         mSnackbarManager = snackbarManager;
         mLayoutManager = layoutManager;
         mDialogDelegate = new QuickDeleteDialogDelegate(
                 context, modalDialogManager, this::onDialogDismissed, tabModelSelector);
+        mAnimationView = animationView;
+        mAnimationView.setBackgroundResource(R.drawable.quick_delete_animation);
     }
 
     /**
@@ -73,8 +81,6 @@
 
     /**
      * A method called when the user confirms or cancels the dialog.
-     *
-     * TODO(crbug.com/1412087): Add implementation logic for the deletion.
      */
     private void onDialogDismissed(@DialogDismissalCause int dismissalCause) {
         switch (dismissalCause) {
@@ -97,8 +103,7 @@
     private void onQuickDeleteFinished() {
         navigateToTabSwitcher();
         triggerHapticFeedback();
-        // TODO(crbug.com/1412087): Show post-delete animation.
-        showSnackbar();
+        showDeleteAnimation(this::showSnackbar);
     }
 
     /**
@@ -130,4 +135,20 @@
 
         mSnackbarManager.showSnackbar(snackbar);
     }
+
+    private void showDeleteAnimation(@NonNull Runnable onAnimationEnd) {
+        AnimatedVectorDrawable deleteAnimation =
+                (AnimatedVectorDrawable) mAnimationView.getBackground();
+        mAnimationView.setVisibility(View.VISIBLE);
+        deleteAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
+            @Override
+            public void onAnimationEnd(Drawable drawable) {
+                super.onAnimationEnd(drawable);
+                ((AnimatedVectorDrawable) drawable).unregisterAnimationCallback(this);
+                mAnimationView.setVisibility(View.GONE);
+                onAnimationEnd.run();
+            }
+        });
+        deleteAnimation.start();
+    }
 }
diff --git a/chrome/browser/resources/chromeos/login/login_ui_tools.js b/chrome/browser/resources/chromeos/login/login_ui_tools.js
index cb87dfd..5ccd9ed 100644
--- a/chrome/browser/resources/chromeos/login/login_ui_tools.js
+++ b/chrome/browser/resources/chromeos/login/login_ui_tools.js
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {assert} from '//resources/ash/common/assert.js';
+import { loadTimeData } from './i18n_setup.js';
+import { $ } from '//resources/ash/common/util.js';
+
 /**
  * @fileoverview JS helpers used on login.
  */
@@ -19,3 +23,36 @@
                                         callback();
                                       }).bind(undefined, callback));
 }
+
+/**
+ * Add screens from the given list into the main screen container.
+ * Screens are added with the following properties:
+ *    - Classes: "step hidden" + any extra classes the screen may have
+ *    - Attribute: "hidden"
+ *
+ * If a screen should be added only under some certain conditions, it must have
+ * the `condition` property associated with a boolean flag. If the condition
+ * yields true it will be added, otherwise it is skipped.
+ * @param {!Array<{tag: string, id: string}>} screenList
+ */
+export function addScreensToMainContainer(screenList) {
+  const screenContainer = ($('inner-container'));
+  for (const screen of screenList) {
+    if (screen.condition) {
+      if (!loadTimeData.getBoolean(screen.condition)) {
+        continue;
+      }
+    }
+
+    const screenElement = document.createElement(screen.tag);
+    screenElement.id = screen.id;
+    screenElement.classList.add('step', 'hidden');
+    screenElement.setAttribute('hidden', '');
+    if (screen.extra_classes) {
+      screenElement.classList.add(...screen.extra_classes);
+    }
+    screenContainer.appendChild(screenElement);
+    assert(
+        !!$(screen.id).shadowRoot, `Error! No shadow root in <${screen.tag}>`);
+  }
+}
diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js
index 0b8084c..0ede0c7d3 100644
--- a/chrome/browser/resources/chromeos/login/oobe.js
+++ b/chrome/browser/resources/chromeos/login/oobe.js
@@ -17,46 +17,14 @@
 import {Oobe} from './cr_ui.js';
 import * as OobeDebugger from './debug/debug.js';
 import {loadTimeData} from './i18n_setup.js';
+import { addScreensToMainContainer } from './login_ui_tools.js';
 import {MultiTapDetector} from './multi_tap_detector.js';
-import {TraceEvent, traceExecution} from './oobe_trace.js';
+import { TraceEvent, traceExecution } from './oobe_trace.js';
 import {commonScreensList, loginScreensList, oobeScreensList} from './screens.js';
 
 // Everything has been imported at this point.
 traceExecution(TraceEvent.FIRST_LINE_AFTER_IMPORTS);
 
-/**
- * Add screens from the given list into the main screen container.
- * Screens are added with the following properties:
- *    - Classes: "step hidden" + any extra classes the screen may have
- *    - Attribute: "hidden"
- *
- * If a screen should be added only under some certain conditions, it must have
- * the `condition` property associated with a boolean flag. If the condition
- * yields true it will be added, otherwise it is skipped.
- * @param {Array<{tag: string, id: string}>}
- */
-function addScreensToMainContainer(screenList) {
-  const screenContainer = $('inner-container');
-  for (const screen of screenList) {
-    if (screen.condition) {
-      if (!loadTimeData.getBoolean(screen.condition)) {
-        continue;
-      }
-    }
-
-    const screenElement = document.createElement(screen.tag);
-    screenElement.id = screen.id;
-    screenElement.classList.add('step', 'hidden');
-    screenElement.setAttribute('hidden', '');
-    if (screen.extra_classes) {
-      screenElement.classList.add(...screen.extra_classes);
-    }
-    screenContainer.appendChild(screenElement);
-    assert(
-        !!$(screen.id).shadowRoot, `Error! No shadow root in <${screen.tag}>`);
-  }
-}
-
 // Create the global values attached to `window` that are used
 // for accessing OOBE controls from the browser side.
 function prepareGlobalValues() {
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.html b/chrome/browser/resources/chromeos/network_ui/network_ui.html
index 72301bd..be73cc1 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.html
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.html
@@ -97,6 +97,14 @@
     </template>
 
     <div>
+      <h2>$i18n{resetApnMigratorLabel}</h2>
+      <cr-button class="action-button"
+          on-click="onResetApnMigratorClick_">
+        $i18n{resetApnMigratorLabel}
+      </cr-button>
+    </div>
+
+    <div>
       <h2>$i18n{addNewWifiLabel}</h2>
       <cr-button class="action-button" id="add-new-wifi-button"
           on-click="showAddNewWifi_">
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js
index e2dcef3..4c2b88256 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -194,6 +194,11 @@
   },
 
   /** @private */
+  onResetApnMigratorClick_() {
+    this.browserProxy_.resetApnMigrator();
+  },
+
+  /** @private */
   showAddNewWifi_() {
     this.browserProxy_.showAddNewWifi();
   },
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui_browser_proxy.js b/chrome/browser/resources/chromeos/network_ui/network_ui_browser_proxy.js
index 269a188..5cd54947 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui_browser_proxy.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui_browser_proxy.js
@@ -79,6 +79,8 @@
 
   resetEuicc() {}
 
+  resetApnMigrator() {}
+
   /**
    * @return {Promise<string>}
    */
@@ -205,6 +207,11 @@
     chrome.send('resetEuicc');
   }
 
+  /** @override */
+  resetApnMigrator() {
+    chrome.send('resetApnMigrator');
+  }
+
   /**
    * @return {Promise<string>}
    */
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_section.ts b/chrome/browser/resources/settings/autofill_page/autofill_section.ts
index 5f4d079..d6a6e311 100644
--- a/chrome/browser/resources/settings/autofill_page/autofill_section.ts
+++ b/chrome/browser/resources/settings/autofill_page/autofill_section.ts
@@ -27,7 +27,6 @@
 import {SettingsToggleButtonElement} from '/shared/settings/controls/settings_toggle_button.js';
 import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
-import {assert} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -85,21 +84,10 @@
   private accountInfo_?: chrome.autofillPrivate.AccountInfo;
   private showAddressDialog_: boolean;
   private showAddressRemoveConfirmationDialog_: boolean;
-  private activeDialogAnchor_: HTMLElement|null;
   private autofillManager_: AutofillManagerProxy =
       AutofillManagerImpl.getInstance();
   private setPersonalDataListener_: PersonalDataChangedListener|null = null;
 
-  constructor() {
-    super();
-
-    /**
-     * The element to return focus to, when the currently active dialog is
-     * closed.
-     */
-    this.activeDialogAnchor_ = null;
-  }
-
   override ready() {
     super.ready();
     this.addEventListener('save-address', this.saveAddress_);
@@ -158,7 +146,6 @@
 
     const dotsButton = e.target as HTMLElement;
     this.$.addressSharedMenu.showAt(dotsButton);
-    this.activeDialogAnchor_ = dotsButton;
   }
 
   /**
@@ -168,14 +155,10 @@
     e.preventDefault();
     this.activeAddress = {};
     this.showAddressDialog_ = true;
-    this.activeDialogAnchor_ = this.$.addAddress;
   }
 
   private onAddressDialogClose_() {
     this.showAddressDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
   }
 
   /**
@@ -192,10 +175,19 @@
     if (this.shadowRoot!
             .querySelector('settings-address-remove-confirmation-dialog')!
             .wasConfirmed()) {
+      // Two corner cases are handled:
+      // 1. removing the only address: the focus goes to the Add button
+      // 2. removing the last address: the focus goes to the previous address
+      // In other cases the focus remaining on the same node (reused in
+      // subsequently updated address list), but the next address, works fine.
       if (this.addresses.length === 1) {
-        // When user removes the last address, move focus to the Add Address
-        // button when the dialog closes. Otherwise, focus gets lost.
-        this.activeDialogAnchor_ = this.$.addAddress;
+        focusWithoutInk(this.$.addAddress);
+      } else {
+        const lastIndex = this.addresses.length - 1;
+        if (this.activeAddress!.guid === this.addresses[lastIndex]!.guid) {
+          focusWithoutInk(this.$.addressList.querySelectorAll<HTMLElement>(
+              '.address-menu')[lastIndex - 1]);
+        }
       }
 
       this.autofillManager_.removeAddress(this.activeAddress!.guid as string);
@@ -203,9 +195,6 @@
           loadTimeData.getString('addressRemovedMessage'));
     }
     this.showAddressRemoveConfirmationDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
   }
 
   /**
diff --git a/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts b/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts
index 8420fb61..7b4f964 100644
--- a/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts
+++ b/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts
@@ -23,7 +23,7 @@
 
 const SettingsCreditCardListEntryElementBase = I18nMixin(PolymerElement);
 
-class SettingsCreditCardListEntryElement extends
+export class SettingsCreditCardListEntryElement extends
     SettingsCreditCardListEntryElementBase {
   static get is() {
     return 'settings-credit-card-list-entry';
@@ -66,6 +66,10 @@
   private readonly showExpirationAsSecondaryLabelEnabled_: boolean;
   private readonly virtualCardEnrollmentEnabled_: boolean;
 
+  get dotsMenu(): HTMLElement|null {
+    return this.shadowRoot!.getElementById('creditCardMenu');
+  }
+
   /**
    * Opens the credit card action menu.
    */
diff --git a/chrome/browser/resources/settings/autofill_page/iban_list_entry.ts b/chrome/browser/resources/settings/autofill_page/iban_list_entry.ts
index 8ebc35c..8bc3558 100644
--- a/chrome/browser/resources/settings/autofill_page/iban_list_entry.ts
+++ b/chrome/browser/resources/settings/autofill_page/iban_list_entry.ts
@@ -56,6 +56,10 @@
 
   iban: chrome.autofillPrivate.IbanEntry;
 
+  get dotsMenu(): HTMLElement {
+    return this.$.ibanMenu;
+  }
+
   /**
    * Opens the IBAN action menu.
    */
diff --git a/chrome/browser/resources/settings/autofill_page/payments_list.html b/chrome/browser/resources/settings/autofill_page/payments_list.html
index 8075a84..cf965a2 100644
--- a/chrome/browser/resources/settings/autofill_page/payments_list.html
+++ b/chrome/browser/resources/settings/autofill_page/payments_list.html
@@ -27,7 +27,8 @@
       </div>
       <div class="vertical-list list-with-header" role="rowgroup">
         <template is="dom-repeat" items="[[creditCards]]">
-          <settings-credit-card-list-entry credit-card="[[item]]">
+          <settings-credit-card-list-entry id="[[getCreditCardId_(index)]]"
+              class="payment-method" credit-card="[[item]]">
           </settings-credit-card-list-entry>
         </template>
       </div>
@@ -35,7 +36,8 @@
       </div>
       <div class="vertical-list list-with-header" role="rowgroup">
         <template is="dom-repeat" items="[[ibans]]">
-          <settings-iban-list-entry iban="[[item]]">
+          <settings-iban-list-entry id="[[getIbanId_(index)]]"
+              class="payment-method" iban="[[item]]">
           </settings-iban-list-entry>
         </template>
       </div>
diff --git a/chrome/browser/resources/settings/autofill_page/payments_list.ts b/chrome/browser/resources/settings/autofill_page/payments_list.ts
index b4668e0..4135795 100644
--- a/chrome/browser/resources/settings/autofill_page/payments_list.ts
+++ b/chrome/browser/resources/settings/autofill_page/payments_list.ts
@@ -14,13 +14,16 @@
 import './passwords_shared.css.js';
 import './upi_id_list_entry.js';
 
+import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../i18n_setup.js';
 
+import {SettingsCreditCardListEntryElement} from './credit_card_list_entry.js';
+import {SettingsIbanListEntryElement} from './iban_list_entry.js';
 import {getTemplate} from './payments_list.html.js';
 
-class SettingsPaymentsListElement extends PolymerElement {
+export class SettingsPaymentsListElement extends PolymerElement {
   static get is() {
     return 'settings-payments-list';
   }
@@ -122,6 +125,71 @@
   private showAnyPaymentMethods_: boolean;
 
   /**
+   * Focuses the next most appropriate element after removing a specific
+   * credit card. Returns `false` if it could not find such an element,
+   * in this case the focus is supposed to be handled by someone else.
+   */
+  updateFocusBeforeCreditCardRemoval(cardIndex: number): boolean {
+    // The focused element is to be reset only if the last element is deleted,
+    // when the number of "dom-repeat" nodes changes and the focus get lost.
+    if (cardIndex === this.creditCards.length - 1) {
+      return this.updateFocusBeforeRemoval_(this.getCreditCardId_(cardIndex));
+    } else {
+      return true;
+    }
+  }
+
+  /**
+   * Focuses the next most appropriate element after removing a specific
+   * iban. Returns `false` if it could not find such an element,
+   * in this case the focus is supposed to be handled by someone else.
+   */
+  updateFocusBeforeIbanRemoval(ibanIndex: number): boolean {
+    // The focused element is to be reset only if the last element is deleted,
+    // when the number of "dom-repeat" nodes changes and the focus get lost.
+    if (ibanIndex === this.ibans.length - 1) {
+      return this.updateFocusBeforeRemoval_(this.getIbanId_(ibanIndex));
+    } else {
+      return true;
+    }
+  }
+
+  /**
+   * Handles focus resetting across all payment method lists. Returns `false`
+   * only when the last payment method is removed, in other cases sets the focus
+   * to either the next or previous payment method.
+   */
+  private updateFocusBeforeRemoval_(id: string): boolean {
+    const paymentMethods =
+        this.shadowRoot!.querySelectorAll<SettingsCreditCardListEntryElement|
+                                          SettingsIbanListEntryElement>(
+            '.payment-method');
+
+    if (paymentMethods.length <= 1) {
+      return false;
+    }
+
+    const index = [...paymentMethods].findIndex((element) => element.id === id);
+    const isLastItem = index === paymentMethods.length - 1;
+    const indexToFocus = index + (isLastItem ? -1 : +1);
+    const menu = paymentMethods[indexToFocus].dotsMenu;
+    if (menu) {
+      focusWithoutInk(menu);
+      return true;
+    }
+
+    return false;
+  }
+
+  private getCreditCardId_(index: number): string {
+    return `card-${index}`;
+  }
+
+  private getIbanId_(index: number): string {
+    return `iban-${index}`;
+  }
+
+  /**
    * @return Whether the list exists and has items.
    */
   private hasSome_(list: any[]): boolean {
diff --git a/chrome/browser/resources/settings/autofill_page/payments_section.ts b/chrome/browser/resources/settings/autofill_page/payments_section.ts
index 38f94d4..d3d448e5 100644
--- a/chrome/browser/resources/settings/autofill_page/payments_section.ts
+++ b/chrome/browser/resources/settings/autofill_page/payments_section.ts
@@ -25,7 +25,6 @@
 
 import {SettingsToggleButtonElement} from '/shared/settings/controls/settings_toggle_button.js';
 import {AnchorAlignment, CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
@@ -38,6 +37,7 @@
 
 import {PersonalDataChangedListener} from './autofill_manager_proxy.js';
 import {DotsIbanMenuClickEvent} from './iban_list_entry.js';
+import {SettingsPaymentsListElement} from './payments_list.js';
 import {PaymentsManagerImpl, PaymentsManagerProxy} from './payments_manager_proxy.js';
 import {getTemplate} from './payments_section.html.js';
 
@@ -65,7 +65,7 @@
     menuAddVirtualCard: HTMLElement,
     menuRemoveVirtualCard: HTMLElement,
     migrateCreditCards: HTMLElement,
-    paymentsList: HTMLElement,
+    paymentsList: SettingsPaymentsListElement,
   };
 }
 
@@ -214,7 +214,6 @@
   private removeCardExpirationAndTypeTitlesEnabled_: boolean;
   private virtualCardEnrollmentEnabled_: boolean;
   private deviceAuthAvailable_: boolean;
-  private activeDialogAnchor_: HTMLElement|null = null;
   private paymentsManager_: PaymentsManagerProxy =
       PaymentsManagerImpl.getInstance();
   private setPersonalDataListener_: PersonalDataChangedListener|null = null;
@@ -319,7 +318,6 @@
     this.activeCreditCard_ = e.detail.creditCard;
 
     this.$.creditCardSharedMenu.showAt(e.detail.anchorElement);
-    this.activeDialogAnchor_ = e.detail.anchorElement;
   }
 
   /**
@@ -328,7 +326,6 @@
   private onDotsIbanMenuClick_(e: DotsIbanMenuClickEvent) {
     // Copy item so dialog won't update model on cancel.
     this.activeIban_ = e.detail.iban;
-    this.activeDialogAnchor_ = e.detail.anchorElement;
 
     this.$.ibanSharedActionMenu.get().showAt(e.detail.anchorElement);
   }
@@ -345,9 +342,6 @@
       expirationYear: date.getFullYear().toString(),
     };
     this.showCreditCardDialog_ = true;
-    this.activeDialogAnchor_ = this.shadowRoot!.querySelector<CrButtonElement>(
-        this.showIbanSettingsEnabled_ ? '#addPaymentMethods' :
-                                        '#addCreditCard');
     if (this.showIbanSettingsEnabled_) {
       const menu = this.shadowRoot!
                        .querySelector<CrLazyRenderElement<CrActionMenuElement>>(
@@ -359,9 +353,6 @@
 
   private onCreditCardDialogClose_() {
     this.showCreditCardDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
     this.activeCreditCard_ = null;
   }
 
@@ -371,8 +362,6 @@
   private onAddIbanClick_(e: Event) {
     e.preventDefault();
     this.showIbanDialog_ = true;
-    this.activeDialogAnchor_ =
-        this.shadowRoot!.querySelector<CrButtonElement>('#addPaymentMethods');
     const menu = this.shadowRoot!
                      .querySelector<CrLazyRenderElement<CrActionMenuElement>>(
                          '#paymentMethodsActionMenu')!.get();
@@ -382,9 +371,6 @@
 
   private onIbanDialogClose_() {
     this.showIbanDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
     this.activeIban_ = null;
   }
 
@@ -418,14 +404,16 @@
     if (confirmationDialog.wasConfirmed()) {
       assert(this.activeCreditCard_);
       assert(this.activeCreditCard_.guid);
+      const index = this.creditCards.findIndex(
+          (card) => card.guid === this.activeCreditCard_!.guid);
+      if (!this.$.paymentsList.updateFocusBeforeCreditCardRemoval(index)) {
+        this.focusHeaderControls_();
+      }
       this.paymentsManager_.removeCreditCard(this.activeCreditCard_.guid);
       this.activeCreditCard_ = null;
     }
 
     this.showLocalCreditCardRemoveConfirmationDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
   }
 
   /**
@@ -455,14 +443,16 @@
     if (confirmationDialog.wasConfirmed()) {
       assert(this.activeIban_);
       assert(this.activeIban_.guid);
+      const index =
+          this.ibans.findIndex((iban) => iban.guid === this.activeIban_!.guid);
+      if (!this.$.paymentsList.updateFocusBeforeIbanRemoval(index)) {
+        this.focusHeaderControls_();
+      }
       this.paymentsManager_.removeIban(this.activeIban_.guid);
       this.activeIban_ = null;
     }
 
     this.showLocalIbanRemoveConfirmationDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
   }
 
   /**
@@ -497,9 +487,6 @@
 
   private onVirtualCardUnenrollDialogClose_() {
     this.showVirtualCardUnenrollDialog_ = false;
-    assert(this.activeDialogAnchor_);
-    focusWithoutInk(this.activeDialogAnchor_);
-    this.activeDialogAnchor_ = null;
     this.activeCreditCard_ = null;
   }
 
@@ -625,6 +612,14 @@
     return creditCardEnabled &&
         (deviceAuthAvailable || mandatoryReauthToggleEnabled);
   }
+
+  private focusHeaderControls_(): void {
+    const element =
+        this.shadowRoot!.querySelector<HTMLElement>('.header-aligned-button');
+    if (element) {
+      focusWithoutInk(element);
+    }
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/chromeos/os_page_availability.ts b/chrome/browser/resources/settings/chromeos/os_page_availability.ts
index bf1434c..5e677cb 100644
--- a/chrome/browser/resources/settings/chromeos/os_page_availability.ts
+++ b/chrome/browser/resources/settings/chromeos/os_page_availability.ts
@@ -19,44 +19,26 @@
 
 export interface OsPageAvailability {
   a11y: boolean;
-  advancedSettings: boolean;
-  appearance: {
-    bookmarksBar: boolean,
-    homeButton: boolean,
-    pageZoom: boolean,
-    setTheme: boolean,
-    setWallpaper: boolean,
-  };
-  autofill: boolean;
+  apps: boolean;
   bluetooth: boolean;
+  crostini: boolean;
   dateTime: boolean;
   device: boolean;
-  downloads: {
-    googleDrive: boolean,
-    smbShares: boolean,
-  };
-  extensions: boolean;
+  files: boolean;
   internet: boolean;
   kerberos: boolean;
-  languages: {
-    manageInputMethods: boolean,
-    inputMethodsList: boolean,
-  };
+  languages: boolean;
   multidevice: boolean;
   onStartup: boolean;
   people: boolean|{
     googleAccounts: boolean,
     lockScreen: boolean,
-    manageUsers: boolean,
   };
+  personalization: boolean;
   printing: boolean;
-  privacy: {
-    contentProtectionAttestation: boolean,
-    networkPrediction: boolean,
-    searchPrediction: boolean,
-    wakeOnWifi: boolean,
-  };
+  privacy: boolean;
   reset: boolean;
+  search: boolean;
 }
 
 const isGuestMode = loadTimeData.getBoolean('isGuest');
@@ -66,87 +48,50 @@
 const isKerberosEnabled = loadTimeData.valueExists('isKerberosEnabled') &&
     loadTimeData.getBoolean('isKerberosEnabled');
 
-let osPageAvailability: OsPageAvailability;
+export let osPageAvailability: OsPageAvailability;
 if (isGuestMode) {
   osPageAvailability = {
     a11y: true,
-    advancedSettings: true,
-    appearance: {
-      setWallpaper: false,
-      setTheme: false,
-      homeButton: false,
-      bookmarksBar: false,
-      pageZoom: false,
-    },
-    autofill: false,
+    apps: true,
     bluetooth: true,
+    crostini: true,
     dateTime: true,
     device: true,
-    downloads: {
-      googleDrive: false,
-      smbShares: false,
-    },
-    extensions: false,
+    files: false,
     internet: true,
     kerberos: isKerberosEnabled,
-    languages: {
-      manageInputMethods: true,
-      inputMethodsList: true,
-    },
+    languages: true,
     multidevice: false,
     onStartup: false,
     people: false,
+    personalization: false,
     printing: true,
-    privacy: {
-      contentProtectionAttestation: true,
-      searchPrediction: false,
-      networkPrediction: false,
-      wakeOnWifi: true,
-    },
+    privacy: true,
     reset: false,
+    search: true,
   };
 } else {
   osPageAvailability = {
     a11y: true,
-    advancedSettings: true,
-    appearance: {
-      setWallpaper: true,
-      setTheme: true,
-      homeButton: true,
-      bookmarksBar: true,
-      pageZoom: true,
-    },
-    autofill: true,
+    apps: true,
     bluetooth: true,
+    crostini: true,
     dateTime: true,
     device: true,
-    downloads: {
-      googleDrive: true,
-      smbShares: true,
-    },
-    extensions: true,
+    files: true,
     internet: true,
     kerberos: isKerberosEnabled,
-    languages: {
-      manageInputMethods: true,
-      inputMethodsList: true,
-    },
+    languages: true,
     multidevice: true,
     onStartup: true,
     people: {
-      lockScreen: true,
       googleAccounts: isAccountManagerEnabled,
-      manageUsers: true,
+      lockScreen: true,
     },
+    personalization: true,
     printing: true,
-    privacy: {
-      contentProtectionAttestation: true,
-      searchPrediction: true,
-      networkPrediction: true,
-      wakeOnWifi: true,
-    },
+    privacy: true,
     reset: true,
+    search: true,
   };
 }
-
-export {osPageAvailability};
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html
index ebb35b3..bc47b72 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html
@@ -135,14 +135,14 @@
 <template is="dom-if"
     if="[[doesAccountHaveSavedPrinters_(savedPrinters_)]]" restamp>
   <div id="savedPrintersContainer">
-    <div class="padded first">
+    <div class="settings-box first">
       <div class="start">
         <span aria-label$="[[savedPrintersAriaLabel_]]">
           $i18n{savedPrintersTitle}
         </span>
-      </div>
-      <div class="secondary" hidden="[[!isPrinterSettingsRevampEnabled_]]">
-        $i18n{savedPrintersSubtext}
+        <div class="secondary" hidden="[[!isPrinterSettingsRevampEnabled_]]">
+          $i18n{savedPrintersSubtext}
+        </div>
       </div>
     </div>
 
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index 8ff4736..d5f7be28 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -117,7 +117,9 @@
 export {BlockingRequestManager} from './autofill_page/blocking_request_manager.js';
 // </if>
 export {SettingsCreditCardEditDialogElement} from './autofill_page/credit_card_edit_dialog.js';
+export {SettingsCreditCardListEntryElement} from './autofill_page/credit_card_list_entry.js';
 export {SettingsIbanEditDialogElement} from './autofill_page/iban_edit_dialog.js';
+export {SettingsIbanListEntryElement} from './autofill_page/iban_list_entry.js';
 // <if expr="is_win or is_macosx">
 export {Passkey, PasskeysBrowserProxy, PasskeysBrowserProxyImpl} from './autofill_page/passkeys_browser_proxy.js';
 export {SettingsPasskeysSubpageElement} from './autofill_page/passkeys_subpage.js';
diff --git a/chrome/browser/resources/settings/site_settings/review_notification_permissions.html b/chrome/browser/resources/settings/site_settings/review_notification_permissions.html
index 211da7e7..9efb58ea 100644
--- a/chrome/browser/resources/settings/site_settings/review_notification_permissions.html
+++ b/chrome/browser/resources/settings/site_settings/review_notification_permissions.html
@@ -16,7 +16,7 @@
   <iron-collapse class="site-list"
       opened="[[notificationPermissionReviewListExpanded_]]">
     <template is="dom-repeat" items="[[sites_]]">
-      <div class="cr-row site-entry">
+      <div class="list-item site-entry">
         <site-favicon url="[[item.origin]]"></site-favicon>
         <div class="display-name cr-padded-text">
           <div class="site-representation">[[item.origin]]</div>
@@ -35,7 +35,7 @@
         </cr-icon-button>
       </div>
     </template>
-    <div class="cr-row first">
+    <div class="list-item first">
       <cr-button id="blockAllButton" on-click="onBlockAllClick_"
           class="bulk-action-button">
         $i18n{safetyCheckNotificationPermissionReviewBlockAllLabel}
diff --git a/chrome/browser/resources/settings/site_settings_page/site_review_shared.css b/chrome/browser/resources/settings/site_settings_page/site_review_shared.css
index 23247a05..3bbafe39 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_review_shared.css
+++ b/chrome/browser/resources/settings/site_settings_page/site_review_shared.css
@@ -50,13 +50,11 @@
 }
 
 .site-list {
-  margin-inline-start: 32px;
+  margin-inline-start: 48px;
 }
 
-/* TODO(crbug.com/1392710): Use a .list-item instead of .cr-row. */
-.site-list .cr-row {
-  border-top-width: 0;
-  padding-inline-end: 0;
+.site-list .list-item {
+  --cr-icon-button-margin-end: initial;
 }
 
 iron-icon[icon='cr:check'] {
diff --git a/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.html b/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.html
index d95ac5e..805cc9d 100644
--- a/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.html
+++ b/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.html
@@ -17,7 +17,7 @@
   <iron-collapse class="site-list"
       opened="[[unusedSitePermissionsReviewListExpanded_]]">
     <template is="dom-repeat" items="[[sites_]]">
-      <div class$="cr-row site-entry [[getRowClass_(item.visible)]]">
+      <div class$="list-item site-entry [[getRowClass_(item.visible)]]">
         <site-favicon url="[[item.origin]]"></site-favicon>
         <div class="display-name cr-padded-text">
           <div class="site-representation">[[item.origin]]</div>
@@ -30,7 +30,7 @@
         </cr-icon-button>
       </div>
     </template>
-    <div class="cr-row first">
+    <div class="list-item first">
       <cr-button class="action-button bulk-action-button"
           on-click="onGotItClick_">
         $i18n{safetyCheckUnusedSitePermissionsGotItLabel}
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
index 75eae9e..a0e5629 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
@@ -206,6 +206,13 @@
   content_analysis_request_.mutable_request_data()->set_tab_url(tab_url.spec());
 }
 
+void BinaryUploadService::Request::set_printer_name(
+    const std::string& printer_name) {
+  content_analysis_request_.mutable_request_data()
+      ->mutable_print_metadata()
+      ->set_printer_name(printer_name);
+}
+
 std::string BinaryUploadService::Request::SetRandomRequestToken() {
   DCHECK(request_token().empty());
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
index e48ddd1d..7c3ccb911 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
@@ -168,6 +168,7 @@
     void set_user_action_id(const std::string& user_action_id);
     void set_user_action_requests_count(uint64_t user_action_requests_count);
     void set_tab_url(const GURL& tab_url);
+    void set_printer_name(const std::string& printer_name);
 
     std::string SetRandomRequestToken();
 
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc
index 32f43a0..8ed8ec8 100644
--- a/chrome/browser/sync/sync_ui_util.cc
+++ b/chrome/browser/sync/sync_ui_util.cc
@@ -103,7 +103,7 @@
 
   // Check to see if sync has been disabled via the dashboard and needs to be
   // set up once again.
-  if (service->GetDisableReasons().Has(
+  if (service->HasDisableReason(
           syncer::SyncService::DISABLE_REASON_USER_CHOICE)) {
     return {SyncStatusMessageType::kSyncError,
             IDS_SIGNED_IN_WITH_SYNC_STOPPED_VIA_DASHBOARD,
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn
index 22b5fa7..06c5d71 100644
--- a/chrome/browser/tab/BUILD.gn
+++ b/chrome/browser/tab/BUILD.gn
@@ -100,7 +100,6 @@
     "//components/strings:components_strings_grd",
     "//content/public/android:content_java",
     "//net/android:net_java",
-    "//third_party/android_deps:com_android_support_support_annotations_java",
     "//third_party/android_deps:guava_android_java",
     "//third_party/android_deps:protobuf_lite_runtime_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java
index 738c280f..b98cb43 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java
@@ -4,10 +4,9 @@
 
 package org.chromium.chrome.browser.tab;
 
-import android.support.annotation.VisibleForTesting;
-
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ObserverList;
 import org.chromium.base.UserDataHost;
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn b/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
index 2656905..f850bb2 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
+++ b/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
@@ -13,7 +13,6 @@
     "//chrome/browser/android/browserservices/intents:java",
     "//chrome/browser/ui/android/searchactivityutils:java",
     "//components/embedder_support/android:util_java",
-    "//third_party/android_deps:com_android_support_support_annotations_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_core_core_java",
   ]
diff --git a/chrome/browser/ui/android/signin/BUILD.gn b/chrome/browser/ui/android/signin/BUILD.gn
index b243651..7ec91f9 100644
--- a/chrome/browser/ui/android/signin/BUILD.gn
+++ b/chrome/browser/ui/android/signin/BUILD.gn
@@ -18,6 +18,7 @@
     "//chrome/browser/signin/services/android:java",
     "//chrome/browser/sync/android:java",
     "//chrome/browser/tab:java",
+    "//chrome/browser/ui/android/device_lock:java",
     "//chrome/browser/version:java",
     "//components/browser_ui/bottomsheet/android:java",
     "//components/browser_ui/modaldialog/android:java",
@@ -36,6 +37,7 @@
     "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
     "//third_party/androidx:androidx_core_core_java",
     "//third_party/androidx:androidx_fragment_fragment_java",
+    "//third_party/androidx:androidx_lifecycle_lifecycle_common_java",
     "//third_party/androidx:androidx_recyclerview_recyclerview_java",
     "//ui/android:ui_no_recycler_view_java",
     "//ui/android:ui_recycler_view_java",
@@ -55,6 +57,7 @@
     "java/src/org/chromium/chrome/browser/ui/signin/SigninUtils.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SigninView.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentActivityLauncher.java",
+    "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentDelegate.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncConsentView.java",
     "java/src/org/chromium/chrome/browser/ui/signin/SyncPromoController.java",
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentDelegate.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentDelegate.java
new file mode 100644
index 0000000..3af3b2a
--- /dev/null
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentDelegate.java
@@ -0,0 +1,17 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.signin;
+
+import org.chromium.ui.base.WindowAndroid;
+
+/**
+ * Defines the host interface for Sync Consent page.
+ */
+public interface SyncConsentDelegate {
+    /**
+     * Return the {@link WindowAndroid} for the host activity.
+     */
+    WindowAndroid getWindowAndroid();
+}
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
index 3ca2a593..74bd36e1 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
@@ -16,13 +16,17 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.FrameLayout;
 import android.widget.TextView;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
+import androidx.lifecycle.Lifecycle;
 
+import org.chromium.base.BuildInfo;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
 import org.chromium.chrome.browser.consent_auditor.ConsentAuditorFeature;
@@ -37,6 +41,7 @@
 import org.chromium.chrome.browser.signin.services.SigninMetricsUtils.State;
 import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge;
 import org.chromium.chrome.browser.sync.SyncService;
+import org.chromium.chrome.browser.ui.device_lock.DeviceLockCoordinator;
 import org.chromium.chrome.browser.ui.signin.account_picker.AccountPickerCoordinator;
 import org.chromium.chrome.browser.ui.signin.account_picker.AccountPickerDialogCoordinator;
 import org.chromium.components.externalauth.ExternalAuthUtils;
@@ -51,6 +56,7 @@
 import org.chromium.components.signin.metrics.SigninAccessPoint;
 import org.chromium.components.sync.UserSelectableType;
 import org.chromium.components.user_prefs.UserPrefs;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogManagerHolder;
 import org.chromium.ui.text.NoUnderlineClickableSpan;
@@ -69,9 +75,9 @@
  * Derived classes must implement {@link #onSyncAccepted}/{@link #onSyncRefused} to define
  * what happens after the signin flow.
  */
-public abstract class SyncConsentFragmentBase
-        extends Fragment implements AccountPickerCoordinator.Listener, AccountsChangeObserver,
-                                    SigninManager.SignInStateObserver {
+public abstract class SyncConsentFragmentBase extends Fragment
+        implements AccountPickerCoordinator.Listener, AccountsChangeObserver,
+                   SigninManager.SignInStateObserver, DeviceLockCoordinator.Delegate {
     private static final String ARGUMENT_ACCESS_POINT = "SyncConsentFragmentBase.AccessPoint";
     private static final String ARGUMENT_ACCOUNT_NAME = "SyncConsentFragmentBase.AccountName";
     private static final String ARGUMENT_SHOW_TANGIBLE_SYNC_CONSENT_VIEW =
@@ -117,6 +123,7 @@
     private final AccountManagerFacade mAccountManagerFacade;
     protected boolean mIsChild;
 
+    private FrameLayout mFrameLayout;
     private SigninView mSigninView;
     private SyncConsentView mSyncConsentView;
     private ConsentTextTracker mConsentTextTracker;
@@ -143,6 +150,11 @@
     private ModalDialogManager mModalDialogManager;
     private ConfirmSyncDataStateMachine mConfirmSyncDataStateMachine;
     private @Nullable AccountPickerDialogCoordinator mAccountPickerDialogCoordinator;
+    private @Nullable WindowAndroid mWindowAndroid;
+    private @Nullable DeviceLockCoordinator mDeviceLockCoordinator;
+
+    private Runnable mDeviceLockPageCallback;
+    private boolean mDeviceLockReady;
 
     /**
      * Creates an argument bundle for the default {@link SyncConsentFragment} flow.
@@ -374,6 +386,7 @@
     @Override
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        mFrameLayout = new FrameLayout(getContext());
         if (mShowTangibleSyncConsentView) {
             createSyncConsentView(inflater, container);
         } else {
@@ -381,8 +394,35 @@
         }
 
         updateConsentText();
+        displaySignInOrSyncView();
+        return mFrameLayout;
+    }
 
-        return mSyncConsentView != null ? mSyncConsentView : mSigninView;
+    private void displaySignInOrSyncView() {
+        mFrameLayout.removeAllViews();
+        mFrameLayout.addView(mSyncConsentView != null ? mSyncConsentView : mSigninView);
+    }
+
+    private void displayDeviceLockPage(Runnable onSuccess) {
+        mDeviceLockPageCallback = onSuccess;
+        mAccountManagerFacade.getAccounts().then((accounts) -> {
+            Account selectedAccount =
+                    AccountUtils.findAccountByName(accounts, mSelectedAccountName);
+            assert selectedAccount != null;
+
+            mDeviceLockCoordinator = new DeviceLockCoordinator(
+                    true, this, getWindowAndroid(), getActivity(), selectedAccount);
+        });
+    }
+
+    @VisibleForTesting
+    public Runnable getDeviceLockPageCallbackForTesting() {
+        return mDeviceLockPageCallback;
+    }
+
+    @VisibleForTesting
+    public boolean getDeviceLockReadyForTesting() {
+        return mDeviceLockReady;
     }
 
     private void createSyncConsentView(LayoutInflater inflater, ViewGroup container) {
@@ -433,6 +473,38 @@
         setHasAccounts(true);
     }
 
+    private WindowAndroid getWindowAndroid() {
+        return getDelegate().getWindowAndroid();
+    }
+
+    private SyncConsentDelegate getDelegate() {
+        return (SyncConsentDelegate) getActivity();
+    }
+
+    @Override
+    public void setView(View view) {
+        mFrameLayout.removeAllViews();
+        mFrameLayout.addView(view);
+    }
+
+    @Override
+    public void onDeviceLockReady() {
+        mDeviceLockCoordinator.destroy();
+        mDeviceLockCoordinator = null;
+
+        // Run the callback, or wait until #onResume if the fragment is not yet RESUMED.
+        if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
+            mDeviceLockPageCallback.run();
+        } else {
+            mDeviceLockReady = true;
+        }
+    }
+
+    @Override
+    public void onDeviceLockRefused() {
+        refuseSignIn();
+    }
+
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
@@ -660,12 +732,24 @@
     }
 
     private void onRefuseButtonClicked(View button) {
+        refuseSignIn();
+    }
+
+    private void refuseSignIn() {
         RecordUserAction.record("Signin_Undo_Signin");
         mRecordUndoSignin = false;
         onSyncRefused();
     }
 
     private void onAcceptButtonClicked(View button) {
+        if (BuildInfo.getInstance().isAutomotive) {
+            displayDeviceLockPage(() -> { initiateSignIn(button); });
+            return;
+        }
+        initiateSignIn(button);
+    }
+
+    private void initiateSignIn(View button) {
         if (!areControlsEnabled()) return;
         mIsSigninInProgress = true;
         mRecordUndoSignin = false;
@@ -836,6 +920,9 @@
                 AccountUtils.getAccountsIfFulfilledOrEmpty(mAccountManagerFacade.getAccounts()));
 
         if (mSigninView != null) mSigninView.startAnimations();
+        if (mDeviceLockReady) {
+            mDeviceLockPageCallback.run();
+        }
     }
 
     @Override
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 5bd68ec..29bec5e7 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2260,9 +2260,6 @@
       <message name="IDS_SYNC_NEEDS_VERIFICATION_TITLE" desc="Title of the error message shown when sync needs to verify the user.">
         Sync needs to verify it's you
       </message>
-      <message name="IDS_HINT_SYNC_AUTH_ERROR" desc="Hint message to resolve sync auth error.">
-        Sign in again to start sync
-      </message>
       <message name="IDS_HINT_SYNC_AUTH_ERROR_MODERN" desc="Hint message to resolve sync auth error updated to align with the UPM error message.">
         Sign back in to start sync
       </message>
diff --git a/chrome/browser/ui/ash/app_list/apps_grid_drag_browsertest.cc b/chrome/browser/ui/ash/app_list/apps_grid_drag_browsertest.cc
index 2614e06..ae31eeb2 100644
--- a/chrome/browser/ui/ash/app_list/apps_grid_drag_browsertest.cc
+++ b/chrome/browser/ui/ash/app_list/apps_grid_drag_browsertest.cc
@@ -33,7 +33,7 @@
 
     // Show the bubble launcher.
     ash::AcceleratorController::Get()->PerformActionIfEnabled(
-        ash::TOGGLE_APP_LIST, {});
+        ash::AcceleratorAction::kToggleAppList, {});
 
     app_list_test_api()->WaitForBubbleWindow(
         /*wait_for_opening_animation=*/true);
diff --git a/chrome/browser/ui/ash/ash_web_view_impl.cc b/chrome/browser/ui/ash/ash_web_view_impl.cc
index a3add3e3..75330f6 100644
--- a/chrome/browser/ui/ash/ash_web_view_impl.cc
+++ b/chrome/browser/ui/ash/ash_web_view_impl.cc
@@ -219,9 +219,10 @@
 }
 
 void AshWebViewImpl::InitWebContents(Profile* profile) {
-  web_contents_ =
-      content::WebContents::Create(content::WebContents::CreateParams(
-          profile, content::SiteInstance::Create(profile)));
+  auto web_contents_params = content::WebContents::CreateParams(
+      profile, content::SiteInstance::Create(profile));
+  web_contents_params.enable_wake_locks = params_.enable_wake_locks;
+  web_contents_ = content::WebContents::Create(web_contents_params);
 
   web_contents_->SetDelegate(this);
   Observe(web_contents_.get());
diff --git a/chrome/browser/ui/ash/system_tray_client_impl.cc b/chrome/browser/ui/ash/system_tray_client_impl.cc
index 710b363..a12552b8 100644
--- a/chrome/browser/ui/ash/system_tray_client_impl.cc
+++ b/chrome/browser/ui/ash/system_tray_client_impl.cc
@@ -904,8 +904,7 @@
   ash::DeviceEnterpriseInfo device_enterprise_info;
   device_enterprise_info.enterprise_domain_manager =
       connector->GetEnterpriseDomainManager();
-  device_enterprise_info.active_directory_managed =
-      connector->IsActiveDirectoryManaged();
+  device_enterprise_info.active_directory_managed = false;
   device_enterprise_info.management_device_mode =
       GetManagementDeviceMode(connector);
   if (!last_device_enterprise_info_) {
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 0fcb029..a462353 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -3219,7 +3219,7 @@
 }
 
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-// TODO(https://1278249): Update function name (and trigger chain) when usage
+// TODO(crbug.com/1443349): Update function name (and trigger chain) when usage
 // is finalized.
 void Browser::RunScreenAIAnnotator() {
   screen_ai::AXScreenAIAnnotatorFactory::GetForBrowserContext(profile())
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h
index 518ef80..a485ea3 100644
--- a/chrome/browser/ui/color/chrome_color_id.h
+++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -20,6 +20,8 @@
            kChromeColorsStart) \
   E_CPONLY(kColorAppMenuHighlightSeverityHigh) \
   E_CPONLY(kColorAppMenuHighlightSeverityMedium) \
+  E_CPONLY(kColorAppMenuHighlightDefault) \
+  E_CPONLY(kColorAppMenuExpandedForegroundDefault) \
   /* Avatar colors. */ \
   E_CPONLY(kColorAvatarButtonHighlightNormal) \
   E_CPONLY(kColorAvatarButtonHighlightSyncError) \
diff --git a/chrome/browser/ui/color/material_chrome_color_mixer.cc b/chrome/browser/ui/color/material_chrome_color_mixer.cc
index 3906f884..64f3e1fc 100644
--- a/chrome/browser/ui/color/material_chrome_color_mixer.cc
+++ b/chrome/browser/ui/color/material_chrome_color_mixer.cc
@@ -24,6 +24,12 @@
   // overriding when required to do so according to the new material spec.
   // TODO(crbug.com/1408542): Update color recipes to match UX mocks.
   ui::ColorMixer& mixer = provider->AddMixer();
+  mixer[kColorAppMenuHighlightDefault] = {ui::kColorSysTonalContainer};
+  mixer[kColorAppMenuHighlightSeverityLow] = {kColorAppMenuHighlightDefault};
+  mixer[kColorAppMenuHighlightSeverityMedium] = {kColorAppMenuHighlightDefault};
+  mixer[kColorAppMenuHighlightSeverityHigh] = {kColorAppMenuHighlightDefault};
+  mixer[kColorAppMenuExpandedForegroundDefault] = {
+      ui::kColorSysOnTonalContainer};
   mixer[kColorAvatarButtonHighlightNormal] =
       AdjustHighlightColorForContrast(ui::kColorSysPrimary, kColorToolbar);
   mixer[kColorBookmarkBarBackground] = {ui::kColorSysBase};
diff --git a/chrome/browser/ui/managed_ui.cc b/chrome/browser/ui/managed_ui.cc
index 12ada086..fb213d6 100644
--- a/chrome/browser/ui/managed_ui.cc
+++ b/chrome/browser/ui/managed_ui.cc
@@ -153,9 +153,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   policy::BrowserPolicyConnectorAsh* connector =
       g_browser_process->platform_part()->browser_policy_connector_ash();
-  return connector->IsActiveDirectoryManaged()
-             ? connector->GetRealm()
-             : connector->GetEnterpriseDomainManager();
+  return connector->GetEnterpriseDomainManager();
 #else
   // The device is managed as
   // `policy::ManagementServiceFactory::GetForPlatform()->IsManaged()` returned
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.cc b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.cc
index 857e36c..d127276 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.cc
@@ -6,12 +6,16 @@
 
 #include <memory>
 
+#include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "chrome/browser/bookmarks/url_and_id.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/model_type_store_service_factory.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h"
 #include "chrome/browser/ui/tabs/tab_group.h"
@@ -29,6 +33,7 @@
 #include "content/public/browser/web_contents.h"
 
 namespace {
+constexpr base::TimeDelta kDelayBeforeMetricsLogged = base::Hours(1);
 
 std::unique_ptr<syncer::ClientTagBasedModelTypeProcessor>
 CreateChangeProcessor() {
@@ -45,6 +50,11 @@
       listener_(model(), profile),
       bridge_(model(), GetStoreFactory(), CreateChangeProcessor()) {
   model()->AddObserver(this);
+
+  metrics_timer_.Start(
+      FROM_HERE, kDelayBeforeMetricsLogged,
+      base::BindRepeating(&SavedTabGroupKeyedService::RecordMetrics,
+                          base::Unretained(this)));
 }
 
 SavedTabGroupKeyedService::~SavedTabGroupKeyedService() {
@@ -357,3 +367,55 @@
                                              /*is_collapsed=*/false);
   tab_group->SetVisualData(visual_data, /*is_customized=*/true);
 }
+
+void SavedTabGroupKeyedService::RecordMetrics() {
+  RecordSavedTabGroupMetrics();
+  RecordTabGroupMetrics();
+  metrics_timer_.Reset();
+}
+
+void SavedTabGroupKeyedService::RecordSavedTabGroupMetrics() {
+  base::UmaHistogramCounts10000("TabGroups.SavedTabGroupCount",
+                                model()->Count());
+
+  for (const SavedTabGroup& group : model()->saved_tab_groups()) {
+    base::UmaHistogramCounts10000("TabGroups.SavedTabGroupTabCount",
+                                  group.saved_tabs().size());
+  }
+}
+
+void SavedTabGroupKeyedService::RecordTabGroupMetrics() {
+  int total_unsaved_groups = 0;
+
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    if (profile_ != browser->profile()) {
+      continue;
+    }
+
+    const TabStripModel* const tab_strip_model = browser->tab_strip_model();
+    if (!tab_strip_model->SupportsTabGroups()) {
+      return;
+    }
+
+    const TabGroupModel* group_model = tab_strip_model->group_model();
+    CHECK(group_model);
+
+    std::vector<tab_groups::TabGroupId> group_ids =
+        group_model->ListTabGroups();
+
+    for (tab_groups::TabGroupId group_id : group_ids) {
+      if (model()->Contains(group_id)) {
+        continue;
+      }
+
+      const TabGroup* const group = group_model->GetTabGroup(group_id);
+      base::UmaHistogramCounts10000("TabGroups.UnsavedTabGroupTabCount",
+                                    group->tab_count());
+      ++total_unsaved_groups;
+    }
+  }
+
+  // Record total number of non-saved tab groups in all browsers.
+  base::UmaHistogramCounts10000("TabGroups.UnsavedTabGroupCount",
+                                total_unsaved_groups);
+}
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h
index 652de2d..77612a4 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h
+++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_TABS_SAVED_TAB_GROUPS_SAVED_TAB_GROUP_KEYED_SERVICE_H_
 
 #include "base/memory/raw_ptr.h"
+#include "base/timer/timer.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_controller.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.h"
 #include "components/keyed_service/core/keyed_service.h"
@@ -72,6 +73,15 @@
   void UpdateGroupVisualData(base::Uuid saved_group_guid,
                              tab_groups::TabGroupId group_id);
 
+  // Wrapper function that calls all metric recording functions.
+  void RecordMetrics();
+
+  // Records the SavedTabGroup count and Tab count per SavedTabGroup.
+  void RecordSavedTabGroupMetrics();
+
+  // Records the Unsaved TabGroup count and the Tab count per Unsaved TabGroup.
+  void RecordTabGroupMetrics();
+
   // The profile used to instantiate the keyed service.
   raw_ptr<Profile> profile_ = nullptr;
 
@@ -85,6 +95,10 @@
   // Stores SavedTabGroup data to the disk and to sync if enabled.
   SavedTabGroupSyncBridge bridge_;
 
+  // Timer used to record periodic metrics about the state of the TabGroups
+  // (saved and unsaved).
+  base::RepeatingTimer metrics_timer_;
+
   // Keeps track of the ids of session restored tab groups that were once saved
   // in order to link them together again once the SavedTabGroupModelLoaded is
   // called. After the model is loaded, this variable is emptied to conserve
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
index d771b02..ab34aa3 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
@@ -20,6 +20,27 @@
 class WebContents;
 }
 
+SavedTabGroupModelListener::SavedTabGroupModelListener() = default;
+
+SavedTabGroupModelListener::SavedTabGroupModelListener(
+    SavedTabGroupModel* model,
+    Profile* profile)
+    : model_(model), profile_(profile) {
+  DCHECK(model);
+  DCHECK(profile);
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    OnBrowserAdded(browser);
+  }
+  BrowserList::GetInstance()->AddObserver(this);
+}
+
+SavedTabGroupModelListener::~SavedTabGroupModelListener() {
+  BrowserList::GetInstance()->RemoveObserver(this);
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    OnBrowserRemoved(browser);
+  }
+}
+
 void SavedTabGroupModelListener::OnTabGroupChanged(
     const TabGroupChange& change) {
   const TabStripModel* tab_strip_model = change.model;
@@ -104,27 +125,6 @@
   }
 }
 
-SavedTabGroupModelListener::SavedTabGroupModelListener() = default;
-
-SavedTabGroupModelListener::SavedTabGroupModelListener(
-    SavedTabGroupModel* model,
-    Profile* profile)
-    : model_(model), profile_(profile) {
-  DCHECK(model);
-  DCHECK(profile);
-  for (Browser* browser : *BrowserList::GetInstance()) {
-    OnBrowserAdded(browser);
-  }
-  BrowserList::GetInstance()->AddObserver(this);
-}
-
-SavedTabGroupModelListener::~SavedTabGroupModelListener() {
-  BrowserList::GetInstance()->RemoveObserver(this);
-  for (Browser* browser : *BrowserList::GetInstance()) {
-    OnBrowserRemoved(browser);
-  }
-}
-
 void SavedTabGroupModelListener::ConnectToLocalTabGroup(
     const SavedTabGroup& saved_tab_group,
     std::vector<std::pair<content::WebContents*, base::Uuid>> mapping) {
diff --git a/chrome/browser/ui/tabs/tab_group_model.cc b/chrome/browser/ui/tabs/tab_group_model.cc
index bcace10..6565a00 100644
--- a/chrome/browser/ui/tabs/tab_group_model.cc
+++ b/chrome/browser/ui/tabs/tab_group_model.cc
@@ -20,7 +20,7 @@
 TabGroupModel::TabGroupModel(TabGroupController* controller)
     : controller_(controller) {}
 
-TabGroupModel::~TabGroupModel() {}
+TabGroupModel::~TabGroupModel() = default;
 
 TabGroup* TabGroupModel::AddTabGroup(
     const tab_groups::TabGroupId& id,
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index 6df969e..28aedc40 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -223,11 +223,21 @@
 #else
     int help_string_id = IDS_HELP_PAGE;
 #endif
-    AddItem(IDC_ABOUT, l10n_util::GetStringUTF16(IDS_ABOUT));
+    AddItemWithStringId(IDC_ABOUT, IDS_ABOUT);
+    if (features::IsChromeRefresh2023()) {
+      SetIcon(
+          GetIndexOfCommandId(IDC_ABOUT).value(),
+          ui::ImageModel::FromVectorIcon(vector_icons::kInfoRefreshIcon,
+                                         ui::kColorMenuIcon, kDefaultIconSize));
+    }
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
     if (base::FeatureList::IsEnabled(features::kChromeWhatsNewUI)) {
-      AddItem(IDC_CHROME_WHATS_NEW,
-              l10n_util::GetStringUTF16(IDS_CHROME_WHATS_NEW));
+      AddItemWithStringId(IDC_CHROME_WHATS_NEW, IDS_CHROME_WHATS_NEW);
+      if (features::IsChromeRefresh2023()) {
+        SetIcon(GetIndexOfCommandId(IDC_CHROME_WHATS_NEW).value(),
+                ui::ImageModel::FromVectorIcon(
+                    kReleaseAlertIcon, ui::kColorMenuIcon, kDefaultIconSize));
+      }
     }
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
     AddItemWithStringId(IDC_HELP_PAGE_VIA_MENU, help_string_id);
@@ -235,9 +245,20 @@
       ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
       SetIcon(GetIndexOfCommandId(IDC_HELP_PAGE_VIA_MENU).value(),
               ui::ImageModel::FromImage(rb.GetNativeImageNamed(IDR_HELP_MENU)));
+    } else if (features::IsChromeRefresh2023()) {
+      SetIcon(GetIndexOfCommandId(IDC_HELP_PAGE_VIA_MENU).value(),
+              ui::ImageModel::FromVectorIcon(kHelpMenuIcon, ui::kColorMenuIcon,
+                                             kDefaultIconSize));
     }
-    if (browser->profile()->GetPrefs()->GetBoolean(prefs::kUserFeedbackAllowed))
+    if (browser->profile()->GetPrefs()->GetBoolean(
+            prefs::kUserFeedbackAllowed)) {
       AddItemWithStringId(IDC_FEEDBACK, IDS_FEEDBACK);
+      if (features::IsChromeRefresh2023()) {
+        SetIcon(GetIndexOfCommandId(IDC_FEEDBACK).value(),
+                ui::ImageModel::FromVectorIcon(kReportIcon, ui::kColorMenuIcon,
+                                               kDefaultIconSize));
+      }
+    }
   }
 };
 
diff --git a/chrome/browser/ui/user_education/OWNERS b/chrome/browser/ui/user_education/OWNERS
index 54d8e0f..afaaa13 100644
--- a/chrome/browser/ui/user_education/OWNERS
+++ b/chrome/browser/ui/user_education/OWNERS
@@ -1,7 +1,7 @@
 # Primary
 dfried@chromium.org
+mickeyburks@chromium.org
 
 # Backup
-bsep@chromium.org
-pbos@chromium.org
 dpenning@chromium.org
+emshack@chromium.org
\ No newline at end of file
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
index 5e95be5..1a1471f 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
@@ -499,10 +499,9 @@
   ukm_recorder.ExpectEntrySourceHasUrl(entry, origin_url);
   EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Source"),
             static_cast<int64_t>(permissions::PermissionSourceUI::OIB));
-  size_t num_values = 0;
-  EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "PermissionType"),
-            ContentSettingTypeToHistogramValue(
-                ContentSettingsType::NOTIFICATIONS, &num_values));
+  EXPECT_EQ(
+      *ukm_recorder.GetEntryMetric(entry, "PermissionType"),
+      ContentSettingTypeToHistogramValue(ContentSettingsType::NOTIFICATIONS));
   EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Action"),
             static_cast<int64_t>(permissions::PermissionAction::REVOKED));
 }
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc
index 29ca9093..5ed22b5c 100644
--- a/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc
+++ b/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/ui/views/page_action/page_action_icon_controller.h"
 #include "chrome/browser/ui/views/performance_controls/high_efficiency_bubble_view.h"
 #include "chrome/browser/ui/views/performance_controls/high_efficiency_chip_view.h"
+#include "chrome/browser/ui/views/performance_controls/high_efficiency_resource_view.h"
 #include "chrome/browser/ui/views/tabs/tab_icon.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/common/webui_url_constants.h"
@@ -130,6 +131,33 @@
     }));
   }
 
+  auto ForceRefreshMemoryMetrics() {
+    return Do(base::BindLambdaForTesting([]() {
+      performance_manager::user_tuning::UserPerformanceTuningManager* manager =
+          performance_manager::user_tuning::UserPerformanceTuningManager::
+              GetInstance();
+
+      base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+      QuitRunLoopOnMemoryMetricsRefreshObserver observer(
+          run_loop.QuitClosure());
+      base::ScopedObservation<
+          performance_manager::user_tuning::UserPerformanceTuningManager,
+          QuitRunLoopOnMemoryMetricsRefreshObserver>
+          memory_metrics_observer(&observer);
+      memory_metrics_observer.Observe(manager);
+
+      performance_manager::PerformanceManager::CallOnGraph(
+          FROM_HERE,
+          base::BindLambdaForTesting([](performance_manager::Graph* graph) {
+            auto* metrics_decorator = graph->GetRegisteredObjectAs<
+                performance_manager::ProcessMetricsDecorator>();
+            metrics_decorator->RefreshMetricsForTesting();
+          }));
+
+      run_loop.Run();
+    }));
+  }
+
   // Attempts to discard the tab at discard_tab_index and navigates to that
   // tab and waits for it to reload
   auto DiscardAndSelectTab(int discard_tab_index,
@@ -351,33 +379,6 @@
                        index));
   }
 
-  auto ForceRefreshMemoryMetrics() {
-    return Do(base::BindLambdaForTesting([]() {
-      performance_manager::user_tuning::UserPerformanceTuningManager* manager =
-          performance_manager::user_tuning::UserPerformanceTuningManager::
-              GetInstance();
-
-      base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
-      QuitRunLoopOnMemoryMetricsRefreshObserver observer(
-          run_loop.QuitClosure());
-      base::ScopedObservation<
-          performance_manager::user_tuning::UserPerformanceTuningManager,
-          QuitRunLoopOnMemoryMetricsRefreshObserver>
-          memory_metrics_observer(&observer);
-      memory_metrics_observer.Observe(manager);
-
-      performance_manager::PerformanceManager::CallOnGraph(
-          FROM_HERE,
-          base::BindLambdaForTesting([](performance_manager::Graph* graph) {
-            auto* metrics_decorator = graph->GetRegisteredObjectAs<
-                performance_manager::ProcessMetricsDecorator>();
-            metrics_decorator->RefreshMetricsForTesting();
-          }));
-
-      run_loop.Run();
-    }));
-  }
-
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -751,3 +752,44 @@
 INSTANTIATE_TEST_SUITE_P(All,
                          HighEfficiencyFaviconTreatmentTest,
                          testing::ValuesIn(HighEfficiencyTestConfig()));
+
+// Tests the new memory savings reporting improvements on the high efficiency
+// dialog.
+class HighEfficiencyMemorySavingsReportingImprovmentsTest
+    : public HighEfficiencyInteractiveTest {
+ public:
+  HighEfficiencyMemorySavingsReportingImprovmentsTest() = default;
+  ~HighEfficiencyMemorySavingsReportingImprovmentsTest() override = default;
+
+  void SetUp() override {
+    scoped_feature_list_.InitAndEnableFeature(
+        performance_manager::features::kMemorySavingsReportingImprovements);
+
+    animation_mode_reset_ = gfx::AnimationTestApi::SetRichAnimationRenderMode(
+        gfx::Animation::RichAnimationRenderMode::FORCE_DISABLED);
+
+    HighEfficiencyInteractiveTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  std::unique_ptr<base::AutoReset<gfx::Animation::RichAnimationRenderMode>>
+      animation_mode_reset_;
+};
+
+// The high efficiency chip dialog renders a gauge style visualization that
+// must be rendered correctly.
+IN_PROC_BROWSER_TEST_F(HighEfficiencyMemorySavingsReportingImprovmentsTest,
+                       RenderVisualizationInDialog) {
+  RunTestSequence(
+      SetOnIncompatibleAction(OnIncompatibleAction::kSkipTest,
+                              kSkipPixelTestsReason),
+      InstrumentTab(kFirstTabContents, 0),
+      NavigateWebContents(kFirstTabContents, GetURL("/title1.html")),
+      AddInstrumentedTab(kSecondTabContents, GURL(chrome::kChromeUINewTabURL)),
+      ForceRefreshMemoryMetrics(), DiscardAndSelectTab(0, kFirstTabContents),
+      PressButton(kHighEfficiencyChipElementId),
+      WaitForShow(HighEfficiencyBubbleView::kHighEfficiencyDialogBodyElementId),
+      Screenshot(HighEfficiencyBubbleView::kHighEfficiencyDialogBodyElementId,
+                 "HighEfficiencyResourceView", "4497874"));
+}
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_resource_view.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_resource_view.cc
index 8a2faf0..4c6229c8 100644
--- a/chrome/browser/ui/views/performance_controls/high_efficiency_resource_view.cc
+++ b/chrome/browser/ui/views/performance_controls/high_efficiency_resource_view.cc
@@ -4,23 +4,158 @@
 
 #include "chrome/browser/ui/views/performance_controls/high_efficiency_resource_view.h"
 
+#include "base/numerics/math_constants.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/performance_manager/public/features.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/metadata/metadata_header_macros.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/text/bytes_formatting.h"
+#include "ui/color/color_id.h"
+#include "ui/color/color_provider.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/geometry/vector2d_f.h"
 #include "ui/views/controls/label.h"
+#include "ui/views/layout/flex_layout_view.h"
+#include "ui/views/layout/layout_types.h"
 
 DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(
     HighEfficiencyResourceView,
     kHighEfficiencyResourceViewMemorySavingsElementId);
 
+namespace {
+
+constexpr int kMemoryLabelSizeDelta = 12;
+constexpr int kGaugeRadius = 80;
+constexpr int kStrokeWidth = 8;
+constexpr int kTickStrokeWidth = 2;
+constexpr int kBucketCount = 4;
+constexpr double kBucketWidthDegrees = 180 / kBucketCount;
+
+class GaugeView : public views::FlexLayoutView {
+ public:
+  METADATA_HEADER(GaugeView);
+
+  explicit GaugeView(const int memory_savings_bytes)
+      : memory_savings_bytes_(memory_savings_bytes) {
+    SetOrientation(views::LayoutOrientation::kVertical);
+    SetMainAxisAlignment(views::LayoutAlignment::kEnd);
+    SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
+  }
+
+  ~GaugeView() override = default;
+
+  gfx::Size CalculatePreferredSize() const override {
+    return gfx::Size((kGaugeRadius + kStrokeWidth) * 2,
+                     kGaugeRadius + kStrokeWidth);
+  }
+
+  void OnPaint(gfx::Canvas* canvas) override {
+    const gfx::PointF center = gfx::RectF(GetLocalBounds()).bottom_center();
+
+    DrawArc(canvas, center, 180,
+            GetColorProvider()->GetColor(ui::kColorMidground));
+
+    // Map the memory savings to which of the 4 buckets it falls into and then
+    // draw an arc to the middle of the corresponding bucket. This is why the
+    // 0.5 parts of the multipliers are needed.
+    int memory_angle;
+    if (memory_savings_bytes_ <
+        performance_manager::features::kHighEfficiencyChartPmf25PercentileBytes
+            .Get()) {
+      memory_angle = 0.5 * kBucketWidthDegrees;
+    } else if (memory_savings_bytes_ <
+               performance_manager::features::
+                   kHighEfficiencyChartPmf50PercentileBytes.Get()) {
+      memory_angle = 1.5 * kBucketWidthDegrees;
+    } else if (memory_savings_bytes_ <
+               performance_manager::features::
+                   kHighEfficiencyChartPmf75PercentileBytes.Get()) {
+      memory_angle = 2.5 * kBucketWidthDegrees;
+    } else {
+      memory_angle = 3.5 * kBucketWidthDegrees;
+    }
+
+    DrawArc(canvas, center, memory_angle,
+            GetColorProvider()->GetColor(ui::kColorAccent));
+
+    const SkColor tick_color =
+        GetColorProvider()->GetColor(ui::kColorDialogBackground);
+    for (int i = 1; i < kBucketCount; i++) {
+      double angle = i * 180 / kBucketCount;
+      DrawTick(canvas, center, angle, tick_color);
+    }
+  }
+
+ private:
+  const int memory_savings_bytes_;
+
+  // Draws an arc starting at the far left, with the specified center point and
+  // angle (in degrees).
+  void DrawArc(gfx::Canvas* canvas,
+               const gfx::PointF center,
+               const int angle_degrees,
+               const SkColor color) {
+    SkPath arc_path;
+    arc_path.addArc(
+        SkRect::MakeXYWH(center.x() - kGaugeRadius, center.y() - kGaugeRadius,
+                         2 * kGaugeRadius, 2 * kGaugeRadius),
+        180, angle_degrees);
+
+    cc::PaintFlags flags;
+    flags.setStyle(cc::PaintFlags::kStroke_Style);
+    flags.setStrokeWidth(kStrokeWidth);
+    flags.setColor(color);
+    flags.setAntiAlias(true);
+
+    canvas->DrawPath(arc_path, flags);
+  }
+
+  // Draw a tick mark over the arc, that is `angle_degrees` from the far left.
+  void DrawTick(gfx::Canvas* canvas,
+                const gfx::PointF center,
+                const double angle_degrees,
+                const SkColor color) {
+    cc::PaintFlags flags;
+    flags.setStyle(cc::PaintFlags::kStroke_Style);
+    flags.setStrokeWidth(kTickStrokeWidth);
+    flags.setColor(color);
+    flags.setAntiAlias(true);
+
+    // Vector of length 1 in the direction of the tick mark.
+    gfx::Vector2dF unit_vector(
+        std::cos(-angle_degrees * base::kPiDouble / 180),
+        std::sin(-angle_degrees * base::kPiDouble / 180));
+
+    // Draw a line from the inner edge of the arc to the outer edge of the arc.
+    canvas->DrawLine(
+        center + ScaleVector2d(unit_vector, kGaugeRadius - kStrokeWidth / 2),
+        center + ScaleVector2d(unit_vector, kGaugeRadius + kStrokeWidth / 2),
+        flags);
+  }
+};
+
+BEGIN_METADATA(GaugeView, views::View)
+END_METADATA
+
+}  // namespace
+
 HighEfficiencyResourceView::HighEfficiencyResourceView(
     const int memory_savings_bytes) {
   SetOrientation(views::LayoutOrientation::kVertical);
 
-  auto* memory_label = AddChildView(
+  auto* gauge_view =
+      AddChildView(std::make_unique<GaugeView>(memory_savings_bytes));
+
+  auto* memory_label = gauge_view->AddChildView(
       std::make_unique<views::Label>(ui::FormatBytes(memory_savings_bytes)));
   memory_label->SetProperty(views::kElementIdentifierKey,
                             kHighEfficiencyResourceViewMemorySavingsElementId);
+  memory_label->SetFontList(
+      memory_label->font_list().DeriveWithSizeDelta(kMemoryLabelSizeDelta));
+
   AddChildView(std::make_unique<views::Label>(
       l10n_util::GetStringUTF16(IDS_HIGH_EFFICIENCY_DIALOG_SAVINGS_LABEL),
       views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY));
diff --git a/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.cc
index 78b1cefe..e1d55f0 100644
--- a/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.cc
@@ -102,6 +102,11 @@
   return BrowserView::GetBrowserViewForBrowser(&GetBrowser());
 }
 
+std::u16string
+SearchCompanionSidePanelCoordinator::GetTooltipForToolbarButton() {
+  return l10n_util::GetStringUTF16(IDS_SIDE_PANEL_COMPANION_TOOLBAR_TOOLTIP);
+}
+
 void SearchCompanionSidePanelCoordinator::OnTabStripModelChanged(
     TabStripModel* tab_strip_model,
     const TabStripModelChange& change,
diff --git a/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.h b/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.h
index f80fd42..24b434a 100644
--- a/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.h
+++ b/chrome/browser/ui/views/side_panel/search_companion/search_companion_side_panel_coordinator.h
@@ -44,6 +44,7 @@
 
   bool Show();
   BrowserView* GetBrowserView();
+  std::u16string GetTooltipForToolbarButton();
 
   std::u16string name() { return name_; }
   const gfx::VectorIcon& icon() { return *icon_; }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
index f024ddc..ed07d3f 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/color/chrome_color_id.h"
+#include "chrome/browser/ui/side_panel/companion/companion_utils.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -89,9 +90,9 @@
   views::ConfigureVectorImageButton(button.get());
   ConfigureControlButton(button.get());
   button->SetTooltipText(
-      l10n_util::GetStringUTF16(IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_PIN));
+      l10n_util::GetStringUTF16(IDS_SIDE_PANEL_HEADER_PIN_BUTTON_TOOLTIP));
   button->SetToggledTooltipText(
-      l10n_util::GetStringUTF16(IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_UNPIN));
+      l10n_util::GetStringUTF16(IDS_SIDE_PANEL_HEADER_UNPIN_BUTTON_TOOLTIP));
 
   int dip_size = ChromeLayoutProvider::Get()->GetDistanceMetric(
       ChromeDistanceMetric::DISTANCE_SIDE_PANEL_HEADER_VECTOR_ICON_SIZE);
@@ -294,8 +295,10 @@
   ClearCachedEntryViews();
 
   // TODO(pbos): Make this button observe panel-visibility state instead.
-  SetSidePanelButtonTooltipText(
-      l10n_util::GetStringUTF16(IDS_TOOLTIP_SIDE_PANEL_SHOW));
+  if (!companion::IsCompanionFeatureEnabled()) {
+    SetSidePanelButtonTooltipText(
+        l10n_util::GetStringUTF16(IDS_TOOLTIP_SIDE_PANEL_SHOW));
+  }
 
   // `OnEntryWillDeregister` (triggered by calling `OnEntryHidden`) may already
   // have deleted the content view, so check that it still exists.
@@ -485,8 +488,10 @@
 
 void SidePanelCoordinator::InitializeSidePanel() {
   // TODO(pbos): Make this button observe panel-visibility state instead.
-  SetSidePanelButtonTooltipText(
-      l10n_util::GetStringUTF16(IDS_TOOLTIP_SIDE_PANEL_HIDE));
+  if (!companion::IsCompanionFeatureEnabled()) {
+    SetSidePanelButtonTooltipText(
+        l10n_util::GetStringUTF16(IDS_TOOLTIP_SIDE_PANEL_HIDE));
+  }
 
   auto container = std::make_unique<views::FlexLayoutView>();
   // Align views vertically top to bottom.
diff --git a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc
index a2b4f5d2..065519a6 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc
@@ -181,9 +181,10 @@
   auto* search_companion_coordinator =
       SearchCompanionSidePanelCoordinator::GetOrCreateForBrowser(
           browser_view_->browser());
-  AddPinnedEntryButtonFor(SidePanelEntry::Id::kSearchCompanion,
-                          search_companion_coordinator->name(),
-                          search_companion_coordinator->icon());
+  AddPinnedEntryButtonFor(
+      SidePanelEntry::Id::kSearchCompanion,
+      search_companion_coordinator->GetTooltipForToolbarButton(),
+      search_companion_coordinator->icon());
 }
 
 void SidePanelToolbarContainer::AddPinnedEntryButtonFor(
@@ -246,12 +247,7 @@
       pinned_button->SetHighlighted(false);
     }
   }
-  // TODO(corising): Update tooltip for case when pinned button is highlighted
-  // once provided by UX.
   GetSidePanelButton()->SetHighlighted(side_panel_button_highlighted);
-  GetSidePanelButton()->SetTooltipText(l10n_util::GetStringUTF16(
-      side_panel_visible ? IDS_TOOLTIP_SIDE_PANEL_HIDE
-                         : IDS_TOOLTIP_SIDE_PANEL_SHOW));
 }
 
 bool SidePanelToolbarContainer::HasPinnedEntryButtonFor(SidePanelEntry::Id id) {
diff --git a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container_unittest.cc b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container_unittest.cc
index 93f2b0a..7cc42f7 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container_unittest.cc
@@ -97,7 +97,7 @@
       SearchCompanionSidePanelCoordinator::GetOrCreateForBrowser(
           browser_view()->browser());
   ASSERT_EQ(pinned_buttons[0]->GetTooltipText(gfx::Point()),
-            search_companion_coordinator->name());
+            search_companion_coordinator->GetTooltipForToolbarButton());
 }
 
 TEST_F(SidePanelToolbarContainerTest, ClickingPinnedEntryOpensSidePanel) {
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
index 64da8b20..60ed735d 100644
--- a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
+++ b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
@@ -22,6 +22,7 @@
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/toolbar/app_menu.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/grit/chromium_strings.h"
@@ -66,9 +67,7 @@
 void BrowserAppMenuButton::SetTypeAndSeverity(
     AppMenuIconController::TypeAndSeverity type_and_severity) {
   type_and_severity_ = type_and_severity;
-
-  UpdateIcon();
-  UpdateTextAndHighlightColor();
+  UpdateColors();
 }
 
 void BrowserAppMenuButton::ShowMenu(int run_types) {
@@ -120,10 +119,17 @@
 }
 
 void BrowserAppMenuButton::OnThemeChanged() {
-  UpdateTextAndHighlightColor();
+  UpdateColors();
   AppMenuButton::OnThemeChanged();
 }
 
+void BrowserAppMenuButton::UpdateColors() {
+  UpdateTextAndHighlightColor();
+  // Call `UpdateIcon()` after `UpdateTextAndHighlightColor()` as the icon color
+  // depends on if the container is in an expanded state.
+  UpdateIcon();
+}
+
 void BrowserAppMenuButton::UpdateIcon() {
   const gfx::VectorIcon& icon =
       ui::TouchUiController::Get()->touch_ui()
@@ -138,6 +144,22 @@
   }
 }
 
+bool BrowserAppMenuButton::IsLabelPresentAndVisible() const {
+  if (!label()) {
+    return false;
+  }
+  return label()->GetVisible() && !label()->GetText().empty();
+}
+
+SkColor BrowserAppMenuButton::GetForegroundColor(ButtonState state) const {
+  if (features::IsChromeRefresh2023() && IsLabelPresentAndVisible()) {
+    const auto* const color_provider = GetColorProvider();
+    return color_provider->GetColor(kColorAppMenuExpandedForegroundDefault);
+  }
+
+  return ToolbarButton::GetForegroundColor(state);
+}
+
 void BrowserAppMenuButton::HandleMenuClosed() {
   // If we were showing a promo in the menu, drop the handle to notify
   // FeaturePromoController we're done. This is a no-op if we weren't
@@ -194,6 +216,18 @@
   SetHighlight(text, color);
 }
 
+bool BrowserAppMenuButton::ShouldPaintBorder() const {
+  return !features::IsChromeRefresh2023();
+}
+
+absl::optional<SkColor> BrowserAppMenuButton::GetHighlightTextColor() const {
+  if (features::IsChromeRefresh2023() && IsLabelPresentAndVisible()) {
+    const auto* const color_provider = GetColorProvider();
+    return color_provider->GetColor(kColorAppMenuExpandedForegroundDefault);
+  }
+  return absl::nullopt;
+}
+
 void BrowserAppMenuButton::OnTouchUiChanged() {
   UpdateColorsAndInsets();
   PreferredSizeChanged();
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_button.h b/chrome/browser/ui/views/toolbar/browser_app_menu_button.h
index 25528e0..9f13b2f8 100644
--- a/chrome/browser/ui/views/toolbar/browser_app_menu_button.h
+++ b/chrome/browser/ui/views/toolbar/browser_app_menu_button.h
@@ -41,6 +41,8 @@
   // Used only in testing.
   static bool g_open_app_immediately_for_testing;
 
+  void UpdateColors();
+
   // AppMenuButton:
   void OnThemeChanged() override;
   // Updates the presentation according to |severity_| and the theme provider.
@@ -54,6 +56,11 @@
 
   void UpdateTextAndHighlightColor();
 
+  bool ShouldPaintBorder() const override;
+  absl::optional<SkColor> GetHighlightTextColor() const override;
+
+  bool IsLabelPresentAndVisible() const;
+  SkColor GetForegroundColor(ButtonState state) const override;
   void SetHasInProductHelpPromo(bool has_in_product_help_promo);
 
   // Closes and continue the flow of an in-product help promo; Returns
diff --git a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc
index 2e0bcc2e..5dbff5d 100644
--- a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc
+++ b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/browser/ui/side_panel/companion/companion_utils.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel.h"
@@ -36,7 +37,9 @@
                           base::Unretained(this)));
 
   UpdateToolbarButtonIcon();
-  SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_SIDE_PANEL_SHOW));
+  SetTooltipText(l10n_util::GetStringUTF16(
+      companion::IsCompanionFeatureEnabled() ? IDS_TOOLTIP_SIDE_PANEL
+                                             : IDS_TOOLTIP_SIDE_PANEL_SHOW));
   button_controller()->set_notify_action(
       views::ButtonController::NotifyAction::kOnPress);
   GetViewAccessibility().OverrideHasPopup(ax::mojom::HasPopup::kMenu);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.cc b/chrome/browser/ui/views/toolbar/toolbar_button.cc
index 1340622..ecb74e5c 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_button.cc
@@ -285,7 +285,7 @@
   if (!GetBorder() || target_insets != current_insets ||
       last_border_color_ != border_color ||
       last_paint_insets_ != paint_insets) {
-    if (border_color) {
+    if (ShouldPaintBorder() && border_color) {
       int border_thickness_dp = GetText().empty()
                                     ? kBorderThicknessDpWithoutLabel
                                     : kBorderThicknessDpWithLabel;
@@ -351,6 +351,14 @@
                                          : kDefaultIconSize;
 }
 
+bool ToolbarButton::ShouldPaintBorder() const {
+  return true;
+}
+
+absl::optional<SkColor> ToolbarButton::GetHighlightTextColor() const {
+  return absl::nullopt;
+}
+
 void ToolbarButton::SetVectorIcon(const gfx::VectorIcon& icon) {
   SetVectorIcons(icon, icon);
 }
@@ -722,8 +730,15 @@
     const {
   if (!IsShown() || !parent_->GetColorProvider())
     return absl::nullopt;
+
+  // Use the overriden value is supplied by the button
+  const absl::optional<SkColor> text_color_overriden =
+      parent_->GetHighlightTextColor();
   SkColor text_color;
-  if (highlight_color_) {
+
+  if (text_color_overriden.has_value()) {
+    text_color = *text_color_overriden;
+  } else if (highlight_color_) {
     text_color = *highlight_color_;
   } else {
     text_color = parent_->GetColorProvider()->GetColor(kColorToolbarButtonText);
@@ -755,9 +770,13 @@
   SkColor bg_color =
       color_provider->GetColor(kColorToolbarButtonBackgroundHighlightedDefault);
   if (highlight_color_) {
-    bg_color = color_utils::AlphaBlend(*highlight_color_,
-                                       color_provider->GetColor(kColorToolbar),
-                                       kToolbarInkDropHighlightVisibleAlpha);
+    if (features::IsChromeRefresh2023()) {
+      bg_color = *highlight_color_;
+    } else {
+      bg_color = color_utils::AlphaBlend(
+          *highlight_color_, color_provider->GetColor(kColorToolbar),
+          kToolbarInkDropHighlightVisibleAlpha);
+    }
   }
   return FadeWithAnimation(bg_color, highlight_color_animation_);
 }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.h b/chrome/browser/ui/views/toolbar/toolbar_button.h
index c079cba..84d24422 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_button.h
@@ -151,6 +151,13 @@
   // Returns the icon size of the toolbar button
   virtual int GetIconSize() const;
 
+  // Retuns true if a non-empty border should be painted.
+  virtual bool ShouldPaintBorder() const;
+
+  // Virtual method to explicitly set the highlighted text color instead of the
+  // default behavior of the HighlightColorAnimation.
+  virtual absl::optional<SkColor> GetHighlightTextColor() const;
+
   // Updates the images using the given icons and specific colors.
   void UpdateIconsWithColors(const gfx::VectorIcon& icon,
                              SkColor normal_color,
diff --git a/chrome/browser/ui/views/user_education/OWNERS b/chrome/browser/ui/views/user_education/OWNERS
index 3878830f..850489a 100644
--- a/chrome/browser/ui/views/user_education/OWNERS
+++ b/chrome/browser/ui/views/user_education/OWNERS
@@ -1,6 +1,7 @@
 # Primary
 dfried@chromium.org
+mickeyburks@chromium.org
 
 # Backup
-robliao@chromium.org
 dpenning@chromium.org
+emshack@chromium.org
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
index d9712d1..1d6ef51e 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -451,7 +451,9 @@
 class PageLoadWaiter final : public content::WebContentsObserver {
  public:
   explicit PageLoadWaiter(content::WebContents* web_contents)
-      : WebContentsObserver(web_contents) {}
+      : WebContentsObserver(web_contents) {
+    CHECK(web_contents);
+  }
   ~PageLoadWaiter() override = default;
 
   void Wait() { run_loop_.Run(); }
@@ -3535,16 +3537,28 @@
   FlushShortcutTasks();
   provider()->command_manager().AwaitAllCommandsCompleteForTesting();
   AwaitManifestSystemIdle();
-  auto* browser_list = BrowserList::GetInstance();
-  for (Browser* browser : *browser_list) {
-    for (int i = 0; i < browser->tab_strip_model()->GetTabCount(); i++) {
-      content::WebContents* web_contents =
-          browser->tab_strip_model()->GetWebContentsAt(i);
-      if (!web_contents->IsDocumentOnLoadCompletedInPrimaryMainFrame()) {
-        PageLoadWaiter page_load_waiter(web_contents);
-        page_load_waiter.Wait();
+
+  auto get_first_loading_web_contents = []() -> content::WebContents* {
+    for (Browser* browser : *BrowserList::GetInstance()) {
+      for (int i = 0; i < browser->tab_strip_model()->GetTabCount(); i++) {
+        content::WebContents* web_contents =
+            browser->tab_strip_model()->GetWebContentsAt(i);
+        if (!web_contents->IsDocumentOnLoadCompletedInPrimaryMainFrame()) {
+          return web_contents;
+        }
       }
     }
+    return nullptr;
+  };
+
+  // In some circumstances, this loop could hang forever (if pages never
+  // complete loading, or if they cause reloads, etc). However, these
+  // tests only use static test pages that don't do that, so this should
+  // be safe.
+  while (content::WebContents* loading_web_content =
+             get_first_loading_web_contents()) {
+    PageLoadWaiter page_load_waiter(loading_web_content);
+    page_load_waiter.Wait();
   }
   after_state_change_action_state_ = ConstructStateSnapshot();
 }
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.cc b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
index 513ba45b..9e7a448 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
@@ -539,6 +539,12 @@
   }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
+  size_t app_extended_scope_score =
+      registrar().GetAppExtendedScopeScore(url, app_id());
+  if (app_extended_scope_score > 0) {
+    return true;
+  }
+
   GURL app_scope = registrar().GetAppScope(app_id());
   if (!app_scope.is_valid())
     return false;
diff --git a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
index 0d04c93a..4226632 100644
--- a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
@@ -229,12 +229,6 @@
   return connector->GetSSOProfile();
 }
 
-std::string GetRealm() {
-  policy::BrowserPolicyConnectorAsh* connector =
-      g_browser_process->platform_part()->browser_policy_connector_ash();
-  return connector->GetRealm();
-}
-
 std::string GetChromeType() {
   switch (chromeos::GetDeviceType()) {
     case chromeos::DeviceType::kChromebox:
@@ -435,11 +429,6 @@
   if (!app_locale.empty())
     params.Set("hl", app_locale);
 
-  std::string realm(GetRealm());
-  if (!realm.empty()) {
-    params.Set("realm", realm);
-  }
-
   const std::string enterprise_enrollment_domain(
       GetEnterpriseEnrollmentDomain());
   const std::string enterprise_domain_manager(GetEnterpriseDomainManager());
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
index 0385f63e..1566f24 100644
--- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -306,7 +306,9 @@
 
   // Configure shared resources
   AddProductLogoResources(source);
-  AddProjectSimonResources(source);
+  if (ash::features::IsOobeSimonEnabled()) {
+    AddProjectSimonResources(source);
+  }
 
   quick_unlock::AddFingerprintResources(source);
   AddSyncConsentResources(source);
diff --git a/chrome/browser/ui/webui/ash/network_ui.cc b/chrome/browser/ui/webui/ash/network_ui.cc
index f01700a..03bad90 100644
--- a/chrome/browser/ui/webui/ash/network_ui.cc
+++ b/chrome/browser/ui/webui/ash/network_ui.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "ash/public/cpp/connectivity_services.h"
 #include "ash/public/cpp/esim_manager.h"
 #include "ash/public/cpp/network_config_service.h"
@@ -21,6 +22,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/ash/net/network_health/network_health_manager.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/ui/ash/system_tray_client_impl.h"
 #include "chrome/browser/ui/chrome_pages.h"
@@ -78,6 +80,7 @@
 constexpr char kOpenCellularActivationUi[] = "openCellularActivationUi";
 constexpr char kResetESimCache[] = "resetESimCache";
 constexpr char kResetEuicc[] = "resetEuicc";
+constexpr char kResetApnMigrator[] = "resetApnMigrator";
 constexpr char kShowNetworkDetails[] = "showNetworkDetails";
 constexpr char kShowNetworkConfig[] = "showNetworkConfig";
 constexpr char kShowAddNewWifiNetworkDialog[] = "showAddNewWifi";
@@ -137,7 +140,8 @@
     NET_LOG(ERROR) << "Couldn't reset EUICC in guest mode.";
     return absl::nullopt;
   }
-  absl::optional<dbus::ObjectPath> euicc_path = GetCurrentEuiccPath();
+  absl::optional<dbus::ObjectPath> euicc_path =
+      cellular_utils::GetCurrentEuiccPath();
   if (!euicc_path) {
     NET_LOG(ERROR) << "No current EUICC. Unable to reset EUICC";
     return absl::nullopt;
@@ -266,6 +270,10 @@
         base::BindRepeating(&NetworkConfigMessageHandler::ResetEuicc,
                             base::Unretained(this)));
     web_ui()->RegisterMessageCallback(
+        kResetApnMigrator,
+        base::BindRepeating(&NetworkConfigMessageHandler::ResetApnMigrator,
+                            base::Unretained(this)));
+    web_ui()->RegisterMessageCallback(
         kShowNetworkDetails,
         base::BindRepeating(&NetworkConfigMessageHandler::ShowNetworkDetails,
                             base::Unretained(this)));
@@ -440,6 +448,11 @@
                                     base::Unretained(this)));
   }
 
+  void ResetApnMigrator(const base::Value::List& arg_list) {
+    NET_LOG(EVENT) << "Executing reset ApnMigrator";
+    g_browser_process->local_state()->ClearPref(prefs::kApnMigratedIccids);
+  }
+
   void OnEuiccReset(bool success) {
     if (!success) {
       NET_LOG(ERROR) << "Error occurred when resetting EUICC.";
@@ -821,6 +834,9 @@
   localized_strings.Set(
       "resetEuiccLabel",
       l10n_util::GetStringUTF16(IDS_NETWORK_UI_RESET_EUICC_LABEL));
+  localized_strings.Set(
+      "resetApnMigratorLabel",
+      l10n_util::GetStringUTF16(IDS_NETWORK_UI_RESET_APN_MIGRATOR_LABEL));
 
   localized_strings.Set(
       "addNewWifiLabel",
diff --git a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
index 6fd4f54..65db1218 100644
--- a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
+++ b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
@@ -317,8 +317,9 @@
 }
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+// TODO(http://b/281528238): reenable the test.
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest,
-                       HighEfficiencySendFeedbackDialogOpens) {
+                       DISABLED_HighEfficiencySendFeedbackDialogOpens) {
   const DeepQuery high_efficiency_feedback = {
       "settings-ui", "settings-main", "settings-basic-page",
       "settings-section#performanceSettingsSection", "cr-icon-button#feedback"};
@@ -331,8 +332,9 @@
       InAnyContext(WaitForShow(FeedbackDialog::kFeedbackDialogForTesting)));
 }
 
+// TODO(http://b/281528238): reenable the test.
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest,
-                       BatterySaverSendFeedbackDialogOpens) {
+                       DISABLED_BatterySaverSendFeedbackDialogOpens) {
   const DeepQuery battery_saver_feedback = {
       "settings-ui", "settings-main", "settings-basic-page",
       "settings-section#batterySettingsSection", "cr-icon-button#feedback"};
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index dfa635a..8a97742 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -239,6 +239,9 @@
       "History.ClearBrowsingData.UserDeletedCookieOrCacheFromDialog", choice,
       content::BrowsingDataRemover::MAX_CHOICE_VALUE);
 
+  browsing_data::RecordDeleteBrowsingDataAction(
+      browsing_data::DeleteBrowsingDataAction::kClearBrowsingDataDialog);
+
   // Record the circumstances under which passwords are deleted.
   if (data_types.find(BrowsingDataType::PASSWORDS) != data_types.end()) {
     static const BrowsingDataType other_types[] = {
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_unittest.cc
index 66e5260..6b6e875 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/search_engines/template_url_service_factory_test_util.h"
@@ -64,6 +65,10 @@
   std::unique_ptr<TestingClearBrowsingDataHandler> handler_;
   std::unique_ptr<TemplateURLServiceFactoryTestUtil> dse_factory_util_;
   raw_ptr<TemplateURLService> template_url_service;
+
+  const content::TestWebUI::CallData& GetCallData() {
+    return *test_web_ui_.call_data().back();
+  }
 };
 
 void ClearBrowsingDataHandlerUnitTest::SetUp() {
@@ -85,6 +90,7 @@
   handler_ = std::make_unique<TestingClearBrowsingDataHandler>(&test_web_ui_,
                                                                profile_.get());
   handler_->set_web_ui(&test_web_ui_);
+  handler_->RegisterMessages();
   handler_->AllowJavascript();
 
   browser_task_environment_.RunUntilIdle();
@@ -144,6 +150,25 @@
   return url;
 }
 
+TEST_F(ClearBrowsingDataHandlerUnitTest,
+       ClearBrowsingData_EmmitsDeleteMetrics) {
+  base::HistogramTester histogram_tester;
+  base::Value::List args;
+
+  args.Append("fooCallback");
+  args.Append(base::Value::List());
+  args.Append(1);
+
+  test_web_ui_.HandleReceivedMessage("clearBrowsingData", args);
+
+  const content::TestWebUI::CallData& call_data = GetCallData();
+  ASSERT_EQ(3u, call_data.args().size());
+
+  histogram_tester.ExpectBucketCount(
+      "Privacy.DeleteBrowsingData.Action",
+      browsing_data::DeleteBrowsingDataAction::kClearBrowsingDataDialog, 1);
+}
+
 TEST_F(ClearBrowsingDataHandlerUnitTest, UpdateSyncState_GoogleDse) {
   handler_->UpdateSyncState();
   VerifySearchHistoryWebUIUpdate(false, u"");
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 2a56e06fd..b7ca779 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -1865,10 +1865,10 @@
   EXPECT_EQ(
       *ukm_recorder.GetEntryMetric(entry, "Source"),
       static_cast<int64_t>(permissions::PermissionSourceUI::SITE_SETTINGS));
-  size_t num_values = 0;
-  EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "PermissionType"),
-            ContentSettingTypeToHistogramValue(
-                ContentSettingsType::NOTIFICATIONS, &num_values));
+
+  EXPECT_EQ(
+      *ukm_recorder.GetEntryMetric(entry, "PermissionType"),
+      ContentSettingTypeToHistogramValue(ContentSettingsType::NOTIFICATIONS));
   EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Action"),
             static_cast<int64_t>(permissions::PermissionAction::REVOKED));
 }
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc
index b764ab3..3df64e6 100644
--- a/chrome/browser/web_applications/web_app_registrar.cc
+++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -17,6 +17,8 @@
 #include "base/functional/callback_helpers.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/observer_list.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_util.h"
 #include "base/strings/to_string.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
@@ -325,6 +327,53 @@
   return GetAppStartUrl(app_id).GetWithoutFilename();
 }
 
+size_t WebAppRegistrar::GetAppExtendedScopeScore(const GURL& url,
+                                                 const AppId& app_id) const {
+  if (!base::FeatureList::IsEnabled(
+          blink::features::kWebAppEnableScopeExtensions)) {
+    return 0;
+  }
+
+  if (!url.is_valid()) {
+    return 0;
+  }
+
+  size_t app_scope = GetUrlInAppScopeScore(url.spec(), app_id);
+  if (app_scope > 0) {
+    return app_scope;
+  }
+
+  url::Origin origin = url::Origin::Create(url);
+  if (origin.opaque() || origin.scheme() != url::kHttpsScheme) {
+    return 0;
+  }
+
+  absl::optional<std::string> origin_str;
+
+  for (const auto& scope_extension : GetValidatedScopeExtensions(app_id)) {
+    if (origin.IsSameOriginWith(scope_extension.origin)) {
+      return origin.host().size();
+    }
+
+    // Origins with wildcard e.g. *.foo are saved as https://foo.
+    // Ensure while matching that the origin ends with '.foo' and not 'foo'.
+    if (scope_extension.has_origin_wildcard) {
+      if (!origin_str.has_value()) {
+        origin_str = origin.Serialize();
+      }
+
+      if (base::EndsWith(origin_str.value(), scope_extension.origin.host(),
+                         base::CompareCase::SENSITIVE) &&
+          origin_str.value().size() > scope_extension.origin.host().size() &&
+          origin_str.value()[origin_str.value().size() -
+                             scope_extension.origin.host().size() - 1] == '.') {
+        return scope_extension.origin.host().size();
+      }
+    }
+  }
+  return 0;
+}
+
 bool WebAppRegistrar::IsUrlInAppScope(const GURL& url,
                                       const AppId& app_id) const {
   return GetUrlInAppScopeScore(url.spec(), app_id) > 0;
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h
index 684a91f..7b5094f 100644
--- a/chrome/browser/web_applications/web_app_registrar.h
+++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -285,6 +285,10 @@
   // Returns whether |url| is in the scope of |app_id|.
   bool IsUrlInAppScope(const GURL& url, const AppId& app_id) const;
 
+  // Returns the strength of matching |url| to the extended & regular scope of
+  // |app_id|. Returns 0 if not in extended scope.
+  size_t GetAppExtendedScopeScore(const GURL& url, const AppId& app_id) const;
+
   // Returns the strength of matching |url_spec| to the scope of |app_id|,
   // returns 0 if not in scope.
   size_t GetUrlInAppScopeScore(const std::string& url_spec,
diff --git a/chrome/browser/web_applications/web_app_registrar_unittest.cc b/chrome/browser/web_applications/web_app_registrar_unittest.cc
index 04eedf6..59b1216 100644
--- a/chrome/browser/web_applications/web_app_registrar_unittest.cc
+++ b/chrome/browser/web_applications/web_app_registrar_unittest.cc
@@ -46,6 +46,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/blink/public/common/features.h"
 #include "url/gurl.h"
 #include "url/url_constants.h"
 
@@ -1235,6 +1236,75 @@
   EXPECT_FALSE(registrar().IsActivelyInstalled(app_id));
 }
 
+class WebAppRegistrarTest_ScopeExtensions : public WebAppRegistrarTest {
+ public:
+  WebAppRegistrarTest_ScopeExtensions() = default;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_{
+      blink::features::kWebAppEnableScopeExtensions};
+};
+
+TEST_F(WebAppRegistrarTest_ScopeExtensions, IsUrlInAppExtendedScope) {
+  InitSyncBridge();
+
+  auto web_app = test::CreateWebApp(GURL("https://example.com/start"));
+  AppId app_id = web_app->app_id();
+
+  auto extended_scope_url = GURL("https://example.app");
+  auto extended_scope_origin = url::Origin::Create(extended_scope_url);
+
+  // Manifest entry {"origin": "https://*.example.co"}.
+  auto extended_scope_url2 = GURL("https://example.co");
+  auto extended_scope_origin2 = url::Origin::Create(extended_scope_url2);
+
+  web_app->SetValidatedScopeExtensions(
+      {ScopeExtensionInfo(extended_scope_origin),
+       ScopeExtensionInfo(extended_scope_origin2,
+                          /*has_origin_wildcard=*/true)});
+  RegisterApp(std::move(web_app));
+
+  EXPECT_EQ(
+      registrar().GetAppExtendedScopeScore(GURL("https://test.com"), app_id),
+      0u);
+
+  EXPECT_GT(registrar().GetAppExtendedScopeScore(
+                GURL("https://example.com/path"), app_id),
+            0u);
+
+  // Scope is extended to all sub-domains of example.co with the wildcard
+  // prefix.
+  EXPECT_GT(registrar().GetAppExtendedScopeScore(GURL("https://app.example.co"),
+                                                 app_id),
+            0u);
+  EXPECT_GT(registrar().GetAppExtendedScopeScore(
+                GURL("https://test.app.example.co"), app_id),
+            0u);
+  EXPECT_GT(registrar().GetAppExtendedScopeScore(
+                GURL("https://example.co/path"), app_id),
+            0u);
+
+  EXPECT_GT(registrar().GetAppExtendedScopeScore(
+                GURL("https://example.app/start"), app_id),
+            0u);
+
+  // Scope is extended to the example.app domain but not to the sub-domain
+  // test.example.app as there was no wildcard prefix.
+  EXPECT_EQ(registrar().GetAppExtendedScopeScore(
+                GURL("https://test.example.app"), app_id),
+            0u);
+
+  EXPECT_EQ(registrar().GetAppExtendedScopeScore(
+                GURL("https://other.origin.com"), app_id),
+            0u);
+  EXPECT_EQ(registrar().GetAppExtendedScopeScore(GURL("https://testexample.co"),
+                                                 app_id),
+            0u);
+  EXPECT_EQ(registrar().GetAppExtendedScopeScore(
+                GURL("https://app.example.com"), app_id),
+            0u);
+}
+
 TEST_F(WebAppRegistrarTest_TabStrip, TabbedAppNewTabUrl) {
   InitSyncBridge();
 
diff --git a/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.cc b/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.cc
index cd19210..ac54b22 100644
--- a/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.cc
+++ b/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.cc
@@ -6,9 +6,11 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/password_manager/password_manager_settings_service_factory.h"
 #include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/content_settings/core/common/content_settings_types.h"
+#include "components/password_manager/core/browser/password_manager_setting.h"
 #include "components/permissions/permission_decision_auto_blocker.h"
 #include "url/origin.h"
 
@@ -19,16 +21,22 @@
           HostContentSettingsMapFactory::GetForProfile(browser_context)),
       permission_autoblocker_(
           PermissionDecisionAutoBlockerFactory::GetForProfile(
+              Profile::FromBrowserContext(browser_context))),
+      password_settings_service_(
+          PasswordManagerSettingsServiceFactory::GetForProfile(
               Profile::FromBrowserContext(browser_context))) {}
 
 FederatedIdentityAutoReauthnPermissionContext::
     ~FederatedIdentityAutoReauthnPermissionContext() = default;
 
 bool FederatedIdentityAutoReauthnPermissionContext::
-    HasAutoReauthnContentSetting() {
+    IsAutoReauthnSettingEnabled() {
   return host_content_settings_map_->GetDefaultContentSetting(
              ContentSettingsType::FEDERATED_IDENTITY_AUTO_REAUTHN_PERMISSION,
-             /*provider_id=*/nullptr) != ContentSetting::CONTENT_SETTING_BLOCK;
+             /*provider_id=*/nullptr) !=
+             ContentSetting::CONTENT_SETTING_BLOCK &&
+         password_settings_service_->IsSettingEnabled(
+             password_manager::PasswordManagerSetting::kAutoSignIn);
 }
 
 bool FederatedIdentityAutoReauthnPermissionContext::IsAutoReauthnEmbargoed(
diff --git a/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.h b/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.h
index f9f52100..8b17e40 100644
--- a/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.h
+++ b/chrome/browser/webid/federated_identity_auto_reauthn_permission_context.h
@@ -7,6 +7,7 @@
 
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/password_manager/core/browser/password_manager_settings_service.h"
 #include "content/public/browser/federated_identity_auto_reauthn_permission_context_delegate.h"
 
 namespace content {
@@ -34,7 +35,7 @@
       const FederatedIdentityAutoReauthnPermissionContext&) = delete;
 
   // content::FederatedIdentityAutoReauthnPermissionContextDelegate:
-  bool HasAutoReauthnContentSetting() override;
+  bool IsAutoReauthnSettingEnabled() override;
   bool IsAutoReauthnEmbargoed(
       const url::Origin& relying_party_embedder) override;
   base::Time GetAutoReauthnEmbargoStartTime(
@@ -49,6 +50,7 @@
   const raw_ptr<HostContentSettingsMap> host_content_settings_map_;
   const raw_ptr<permissions::PermissionDecisionAutoBlocker, DanglingUntriaged>
       permission_autoblocker_;
+  const raw_ptr<PasswordManagerSettingsService> password_settings_service_;
 };
 
 #endif  // CHROME_BROWSER_WEBID_FEDERATED_IDENTITY_AUTO_REAUTHN_PERMISSION_CONTEXT_H_
diff --git a/chrome/browser/webid/federated_identity_auto_reauthn_permission_context_unittest.cc b/chrome/browser/webid/federated_identity_auto_reauthn_permission_context_unittest.cc
index 8c45c5a..a6e4e53ca 100644
--- a/chrome/browser/webid/federated_identity_auto_reauthn_permission_context_unittest.cc
+++ b/chrome/browser/webid/federated_identity_auto_reauthn_permission_context_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/sync/sync_service_factory.h"
 #include "chrome/browser/webid/federated_identity_auto_reauthn_permission_context_factory.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -24,14 +25,18 @@
       FederatedIdentityAutoReauthnPermissionContextTest&) = delete;
 
   void SetUp() override {
+    profile_ = TestingProfile::Builder()
+                   .AddTestingFactory(SyncServiceFactory::GetInstance(),
+                                      SyncServiceFactory::GetDefaultFactory())
+                   .Build();
     context_ =
         FederatedIdentityAutoReauthnPermissionContextFactory::GetForProfile(
-            &profile_);
+            profile());
     host_content_settings_map_ =
-        HostContentSettingsMapFactory::GetForProfile(&profile_);
+        HostContentSettingsMapFactory::GetForProfile(profile());
   }
 
-  Profile* profile() { return &profile_; }
+  Profile* profile() { return profile_.get(); }
 
  protected:
   raw_ptr<FederatedIdentityAutoReauthnPermissionContext> context_;
@@ -50,14 +55,14 @@
  private:
   content::BrowserTaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
-  TestingProfile profile_;
+  std::unique_ptr<TestingProfile> profile_;
 };
 
 // Test that FedCM auto re-authn is opt-in by default.
 TEST_F(FederatedIdentityAutoReauthnPermissionContextTest,
        AutoReauthnEnabledByDefault) {
   GURL rp_url("https://rp.com");
-  EXPECT_TRUE(context_->HasAutoReauthnContentSetting());
+  EXPECT_TRUE(context_->IsAutoReauthnSettingEnabled());
   EXPECT_FALSE(context_->IsAutoReauthnEmbargoed(url::Origin::Create(rp_url)));
 }
 
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt
index da3f349..ddd11a77 100644
--- a/chrome/build/lacros64.pgo.txt
+++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-amd64-generic-main-1683532503-6be1d227cb16be062413ec47635cc898649b9153.profdata
+chrome-chromeos-amd64-generic-main-1683561463-c7057013f3e871ed513786ef7561d95a3b9b06cf.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index c9e89fad..c4b873b 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1683539972-a5e858b7bce2628a081a440526a932190f169066.profdata
+chrome-mac-arm-main-1683568773-a0a24e4eec93cc36e279e0b09a0ce067751292c3.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index f16d3d1..a8395fe 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1683525502-e358bac2852f836329fd43f50de254b1a8c99631.profdata
+chrome-mac-main-1683546861-881df410f4cc8167c15282f0b54cf4f016d7291c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 91cc83f..ef06650 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1683535909-70e6d4250fcc40ebdaf7748a3a31fc1f24483305.profdata
+chrome-win32-main-1683546861-05232a03ac22f367a23cc53a5ad55cbad793a1c5.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 0b190997..1c72a55 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1683535909-7c416d20826bbea109d642061c3eb0c8c2f29ed2.profdata
+chrome-win64-main-1683557303-7b4ad0cf7939ed5e88558c9975ea60f4e493d300.profdata
diff --git a/chrome/installer/setup/install.cc b/chrome/installer/setup/install.cc
index 3e2493f..4ab00374 100644
--- a/chrome/installer/setup/install.cc
+++ b/chrome/installer/setup/install.cc
@@ -158,9 +158,9 @@
 // only on the first install of Chrome.
 void CopyPreferenceFileForFirstRun(const InstallerState& installer_state,
                                    const base::FilePath& prefs_source_path) {
-  base::FilePath prefs_dest_path(
-      installer_state.target_path().AppendASCII(kLegacyInitialPrefs));
-  if (!base::CopyFile(prefs_source_path, prefs_dest_path)) {
+  if (!base::CopyFile(prefs_source_path,
+                      InitialPreferences::Path(installer_state.target_path(),
+                                               /*for_read=*/false))) {
     VLOG(1) << "Failed to copy initial preferences from:"
             << prefs_source_path.value() << " gle: " << ::GetLastError();
   }
@@ -635,7 +635,7 @@
 
   RunShortcutCreationInChildProc(
       installer_state, setup_path,
-      installer_state.target_path().AppendASCII(kLegacyInitialPrefs), level,
+      InitialPreferences::Path(installer_state.target_path()), level,
       INSTALL_SHORTCUT_REPLACE_EXISTING);
 
   // Adapt Chrome registrations to this new OS.
@@ -706,10 +706,9 @@
   // Use the initial preferences copied beside chrome.exe at install for the
   // sake of creating/updating shortcuts.
   const base::FilePath installation_root = installer_state.target_path();
-  RunShortcutCreationInChildProc(
-      installer_state, setup_path,
-      installation_root.AppendASCII(kLegacyInitialPrefs), CURRENT_USER,
-      install_operation);
+  RunShortcutCreationInChildProc(installer_state, setup_path,
+                                 InitialPreferences::Path(installation_root),
+                                 CURRENT_USER, install_operation);
 
   UpdateDefaultBrowserBeaconForPath(installation_root.Append(kChromeExe));
 
diff --git a/chrome/installer/setup/install_unittest.cc b/chrome/installer/setup/install_unittest.cc
index 7dfab5b..6714b4c75 100644
--- a/chrome/installer/setup/install_unittest.cc
+++ b/chrome/installer/setup/install_unittest.cc
@@ -232,7 +232,7 @@
     expected_start_menu_properties_ = expected_properties_;
     expected_start_menu_properties_.set_dual_mode(false);
 
-    prefs_.reset(GetFakeMasterPrefs(false, false));
+    prefs_.reset(GetFakeInitialPrefs(false, false));
 
     ASSERT_TRUE(fake_user_desktop_.CreateUniqueTempDir());
     ASSERT_TRUE(fake_common_desktop_.CreateUniqueTempDir());
@@ -281,7 +281,7 @@
     UnpinShortcutFromTaskbar(system_start_menu_subdir_shortcut_);
   }
 
-  installer::InitialPreferences* GetFakeMasterPrefs(
+  installer::InitialPreferences* GetFakeInitialPrefs(
       bool do_not_create_desktop_shortcut,
       bool do_not_create_quick_launch_shortcut) {
     const struct {
@@ -384,7 +384,7 @@
 
 TEST_F(InstallShortcutTest, CreateAllShortcutsButDesktopShortcut) {
   std::unique_ptr<installer::InitialPreferences> prefs_no_desktop(
-      GetFakeMasterPrefs(true, false));
+      GetFakeInitialPrefs(true, false));
   installer::CreateOrUpdateShortcuts(chrome_exe_, *prefs_no_desktop,
                                      installer::CURRENT_USER,
                                      installer::INSTALL_SHORTCUT_CREATE_ALL);
@@ -397,7 +397,7 @@
 
 TEST_F(InstallShortcutTest, CreateAllShortcutsButQuickLaunchShortcut) {
   std::unique_ptr<installer::InitialPreferences> prefs_no_ql(
-      GetFakeMasterPrefs(false, true));
+      GetFakeInitialPrefs(false, true));
   installer::CreateOrUpdateShortcuts(chrome_exe_, *prefs_no_ql,
                                      installer::CURRENT_USER,
                                      installer::INSTALL_SHORTCUT_CREATE_ALL);
diff --git a/chrome/installer/util/initial_preferences.cc b/chrome/installer/util/initial_preferences.cc
index cdf01df..dd368e9 100644
--- a/chrome/installer/util/initial_preferences.cc
+++ b/chrome/installer/util/initial_preferences.cc
@@ -71,6 +71,19 @@
 
 namespace installer {
 
+#if !BUILDFLAG(IS_MAC)
+// static
+base::FilePath InitialPreferences::Path(const base::FilePath& dir,
+                                        bool for_read) {
+  base::FilePath initial_prefs = dir.AppendASCII("initial_preferences");
+  if (!for_read || base::PathIsReadable(initial_prefs)) {
+    return initial_prefs;
+  }
+
+  return dir.AppendASCII("master_preferences");
+}
+#endif  // !BUILDFLAG(IS_MAC)
+
 InitialPreferences::InitialPreferences() {
   InitializeFromCommandLine(*base::CommandLine::ForCurrentProcess());
 }
diff --git a/chrome/installer/util/initial_preferences.h b/chrome/installer/util/initial_preferences.h
index 6f68742..1659c8cd 100644
--- a/chrome/installer/util/initial_preferences.h
+++ b/chrome/installer/util/initial_preferences.h
@@ -23,13 +23,6 @@
 
 namespace installer {
 
-#if !BUILDFLAG(IS_MAC)
-// This is the default name for the initial preferences file used to pre-set
-// values in the user profile at first run.
-const char kInitialPrefs[] = "initial_preferences";
-const char kLegacyInitialPrefs[] = "master_preferences";
-#endif
-
 // The initial preferences is a JSON file with the same entries as the
 // 'Default\Preferences' file. This function parses the distribution
 // section of the preferences file.
@@ -74,6 +67,16 @@
 
 class InitialPreferences {
  public:
+#if !BUILDFLAG(IS_MAC)
+  // Find and return initial preferences's file path that is located in `dir`.
+  // It will fallback to the legacy file name if the new one is not available
+  // and `for_read` is set to true.
+  // Only available on Windows, Linux and CrOS. Mac has its own initial
+  // preferences file names which is implemented in
+  // `chrome/browser/mac/initial_prefs.h`.
+  static base::FilePath Path(const base::FilePath& dir, bool for_read = true);
+#endif  // !BUILDFLAG(IS_MAC)
+
   // Construct a initial preferences from the current process' current command
   // line. Equivalent to calling
   // InitialPreferences(*CommandLine::ForCurrentProcess()).
diff --git a/chrome/installer/util/initial_preferences_unittest.cc b/chrome/installer/util/initial_preferences_unittest.cc
index 17255183..d0935d2 100644
--- a/chrome/installer/util/initial_preferences_unittest.cc
+++ b/chrome/installer/util/initial_preferences_unittest.cc
@@ -12,8 +12,10 @@
 
 #include "base/environment.h"
 #include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
 #include "base/path_service.h"
 #include "base/values.h"
+#include "build/build_config.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/installer/util/initial_preferences_constants.h"
@@ -424,3 +426,26 @@
     EXPECT_FALSE(value);
   }
 }
+
+#if !BUILDFLAG(IS_MAC)
+
+TEST_F(InitialPreferencesTest, Path) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  auto initial_pref_path =
+      temp_dir.GetPath().AppendASCII("initial_preferences");
+
+  EXPECT_EQ(temp_dir.GetPath().AppendASCII("master_preferences"),
+            installer::InitialPreferences::Path(temp_dir.GetPath()));
+  EXPECT_EQ(initial_pref_path, installer::InitialPreferences::Path(
+                                   temp_dir.GetPath(), /*for_read=*/false));
+
+  base::File file(initial_pref_path, base::File::Flags::FLAG_CREATE);
+  file.Close();
+
+  EXPECT_EQ(initial_pref_path,
+            installer::InitialPreferences::Path(temp_dir.GetPath()));
+}
+
+#endif  // !BUILDFLAG(IS_MAC)
diff --git a/chrome/services/mac_notifications/public/cpp/BUILD.gn b/chrome/services/mac_notifications/public/cpp/BUILD.gn
index 5dd0ca9..a0a6bf7 100644
--- a/chrome/services/mac_notifications/public/cpp/BUILD.gn
+++ b/chrome/services/mac_notifications/public/cpp/BUILD.gn
@@ -8,5 +8,6 @@
     "mac_notification_metrics.mm",
   ]
   deps = [ "//base" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
   frameworks = [ "Foundation.framework" ]
 }
diff --git a/chrome/services/mac_notifications/public/cpp/mac_notification_metrics.mm b/chrome/services/mac_notifications/public/cpp/mac_notification_metrics.mm
index 3f9fc5e..5116e36d 100644
--- a/chrome/services/mac_notifications/public/cpp/mac_notification_metrics.mm
+++ b/chrome/services/mac_notifications/public/cpp/mac_notification_metrics.mm
@@ -10,6 +10,10 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace mac_notifications {
 
 bool IsAppBundleAlertStyle() {
diff --git a/chrome/services/system_signals/BUILD.gn b/chrome/services/system_signals/BUILD.gn
index 64e3417..db59614 100644
--- a/chrome/services/system_signals/BUILD.gn
+++ b/chrome/services/system_signals/BUILD.gn
@@ -42,6 +42,8 @@
 
     sources += [ "mac/mac_system_signals_service.mm" ]
 
+    configs += [ "//build/config/compiler:enable_arc" ]
+
     deps += [ "//components/device_signals/core/system_signals/mac" ]
   }
 
@@ -84,6 +86,7 @@
 
   if (is_mac) {
     sources += [ "mac/mac_system_signals_service_unittest.mm" ]
+    configs += [ "//build/config/compiler:enable_arc" ]
   }
 
   if (is_linux) {
diff --git a/chrome/services/system_signals/mac/mac_system_signals_service.mm b/chrome/services/system_signals/mac/mac_system_signals_service.mm
index 9dd7379b7..7d41dfc8 100644
--- a/chrome/services/system_signals/mac/mac_system_signals_service.mm
+++ b/chrome/services/system_signals/mac/mac_system_signals_service.mm
@@ -12,6 +12,10 @@
 #include "components/device_signals/core/system_signals/mac/mac_platform_delegate.h"
 #include "components/device_signals/core/system_signals/platform_delegate.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace system_signals {
 
 MacSystemSignalsService::MacSystemSignalsService(
diff --git a/chrome/services/system_signals/mac/mac_system_signals_service_unittest.mm b/chrome/services/system_signals/mac/mac_system_signals_service_unittest.mm
index 71c7ce20..4efce03 100644
--- a/chrome/services/system_signals/mac/mac_system_signals_service_unittest.mm
+++ b/chrome/services/system_signals/mac/mac_system_signals_service_unittest.mm
@@ -16,6 +16,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 using device_signals::MockFileSystemService;
 using testing::Return;
 
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/TestContentProvider.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/TestContentProvider.java
index 7b80a4de..dc9e9c20 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/TestContentProvider.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/TestContentProvider.java
@@ -17,8 +17,6 @@
 import android.os.ParcelFileDescriptor;
 import android.util.Log;
 
-import org.chromium.build.annotations.MainDex;
-
 import java.io.File;
 import java.io.IOException;
 import java.net.URLConnection;
@@ -48,7 +46,6 @@
  * The second one is moving the TestContentProvider to the ChromeTestSuport apk. This
  * seems a lot better path than above.
  */
-@MainDex
 public class TestContentProvider extends ContentProvider {
     private static final String ANDROID_DATA_FILE_PATH = "android/";
     private static final String AUTHORITY = "org.chromium.chrome.test.TestContentProvider";
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsDelayedProvider.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsDelayedProvider.java
index a027e1350..f6b87cc 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsDelayedProvider.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsDelayedProvider.java
@@ -9,8 +9,6 @@
 import android.os.Bundle;
 import android.text.TextUtils;
 
-import org.chromium.build.annotations.MainDex;
-
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
@@ -19,7 +17,6 @@
  * query function.
  * Note: if you move or rename this class, make sure you have also updated AndroidManifest.xml.
  */
-@MainDex
 public class TestPartnerBrowserCustomizationsDelayedProvider
         extends TestPartnerBrowserCustomizationsProvider {
     private static String sUriPathToDelay;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsProvider.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsProvider.java
index f721c82f..30e9b7a 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsProvider.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsProvider.java
@@ -16,13 +16,10 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import org.chromium.build.annotations.MainDex;
-
 /**
  * PartnerBrowserCustomizationsProvider example for testing.
  * Note: if you move or rename this class, make sure you have also updated AndroidManifest.xml.
  */
-@MainDex
 public class TestPartnerBrowserCustomizationsProvider extends ContentProvider {
     protected String mTag = TestPartnerBrowserCustomizationsProvider.class.getSimpleName();
 
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 96651f8..10ea2f6 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -6119,7 +6119,7 @@
       }
     })
     resp = conn.WaitForResponse(cmd_id)
-    shared_id = resp['result']['result']['value']['sharedId']
+    shared_id = resp['result']['result']['sharedId']
     self.assertRegex(shared_id, '\\w+_element_\\w',
                      msg='Shared id format is incorrect')
     pos = shared_id.rfind('_')
@@ -6179,7 +6179,7 @@
       }
     })
     resp = conn.WaitForResponse(cmd_id)
-    node_id = resp['result']['result']['value']['sharedId']
+    node_id = resp['result']['result']['sharedId']
     div = webelement.WebElement(self._driver, node_id)
     div.Click()
     self.assertEqual(1, len(self._driver.FindElements('tag name', 'br')))
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js b/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js
index d2d8802..b608a3b 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js
@@ -179,6 +179,21 @@
     assertFalse(!!getZeroStateText());
     assertTrue(!!getErrorMessage());
     assertEquals('Can\'t connect to network.', getErrorMessageText());
+
+    // Add a connected APN. The error should not show.
+    apnList.managedCellularProperties = {
+      connectedApn: connectedApn,
+      apnList: {
+        activeValue: [connectedApn],
+      },
+    };
+    await flushTasks();
+    assertFalse(!!getZeroStateText());
+    assertFalse(!!getErrorMessage());
+    const apns = apnList.shadowRoot.querySelectorAll('apn-list-item');
+    assertEquals(apns.length, 1);
+    assertTrue(OncMojo.apnMatch(apns[0].apn, connectedApn));
+    assertTrue(apns[0].isConnected);
   });
 
   test('There is no Connected APN and no custom APNs', async function() {
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn
index f70d633..594ec6f 100644
--- a/chrome/test/data/webui/settings/BUILD.gn
+++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -56,6 +56,7 @@
     "password_view_test.ts",
     "payments_section_card_rows_test.ts",
     "payments_section_card_dialogs_test.ts",
+    "payments_section_focus_test.ts",
     "payments_section_iban_test.ts",
     "payments_section_interactive_test.ts",
     "payments_section_test.ts",
diff --git a/chrome/test/data/webui/settings/autofill_section_test.ts b/chrome/test/data/webui/settings/autofill_section_test.ts
index 4db0a6c..254f1a8 100644
--- a/chrome/test/data/webui/settings/autofill_section_test.ts
+++ b/chrome/test/data/webui/settings/autofill_section_test.ts
@@ -13,7 +13,7 @@
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
 import {AutofillManagerExpectations, createAddressEntry, createEmptyAddressEntry, STUB_USER_ACCOUNT_INFO, TestAutofillManager} from './passwords_and_autofill_fake_data.js';
-import {createAutofillSection, initiateRemoving, initiateEditing, CountryDetailManagerTestImpl, createAddressDialog, createRemoveAddressDialog, expectEvent, openAddressDialog} from './autofill_section_test_utils.js';
+import {createAutofillSection, initiateRemoving, initiateEditing, CountryDetailManagerTestImpl, createAddressDialog, createRemoveAddressDialog, expectEvent, openAddressDialog, deleteAddress} from './autofill_section_test_utils.js';
 // clang-format on
 
 suite('AutofillSectionUiTest', function() {
@@ -189,6 +189,43 @@
   });
 });
 
+suite('AutofillSectionFocusTest', function() {
+  test('verifyFocusLocationAfterRemoving', async () => {
+    const section = await createAutofillSection(
+        [
+          createAddressEntry(),
+          createAddressEntry(),
+          createAddressEntry(),
+        ],
+        {profile_enabled: {value: true}});
+    const manager = AutofillManagerImpl.getInstance() as TestAutofillManager;
+
+    await deleteAddress(section, manager, 1);
+    const addressesAfterRemovingInTheMiddle =
+        section.$.addressList.querySelectorAll('.list-item');
+    assertTrue(
+        addressesAfterRemovingInTheMiddle[1]!.matches(':focus-within'),
+        'The focus should remain on the same index on the list (but next ' +
+            'to the removed address).');
+
+    await deleteAddress(section, manager, 1);
+    const addressesAfterRemovingLastInTheList =
+        section.$.addressList.querySelectorAll('.list-item');
+    assertTrue(
+        addressesAfterRemovingLastInTheList[0]!.matches(':focus-within'),
+        'After removing the last address on the list the focus should go ' +
+            'to the preivous address.');
+
+    await deleteAddress(section, manager, 0);
+    assertTrue(
+        section.$.addAddress.matches(':focus-within'),
+        'If there are no addresses remaining after removal the focus should ' +
+            'go to the Add button.');
+
+    document.body.removeChild(section);
+  });
+});
+
 suite('AutofillSectionAddressTests', function() {
   suiteSetup(function() {
     CountryDetailManagerImpl.setInstance(new CountryDetailManagerTestImpl());
diff --git a/chrome/test/data/webui/settings/autofill_section_test_utils.ts b/chrome/test/data/webui/settings/autofill_section_test_utils.ts
index 520d1d1..e3efaf6 100644
--- a/chrome/test/data/webui/settings/autofill_section_test_utils.ts
+++ b/chrome/test/data/webui/settings/autofill_section_test_utils.ts
@@ -204,3 +204,22 @@
 
   return initiateRemoving(section, 0);
 }
+
+/**
+ * Performs some UI and manager manipulations to simulate the address removal.
+ */
+export async function deleteAddress(
+    section: SettingsAutofillSectionElement, manager: TestAutofillManager,
+    index: number) {
+  const dialog = await initiateRemoving(section, index);
+  const closePromise = eventToPromise('close', dialog.$.dialog);
+  dialog.$.remove.click();
+  await closePromise;
+
+  const address = [...manager.data.addresses];
+  address.splice(index, 1);
+  manager.data.addresses = address;
+  manager.lastCallback.setPersonalDataManagerListener!
+      (address, [], [], manager.data.accountInfo);
+  await flushTasks();
+}
diff --git a/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js b/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js
index 651720b1..9efce5c 100644
--- a/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js
+++ b/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js
@@ -43,6 +43,18 @@
   mocha.run();
 });
 
+var CrSettingsPaymentsSectionFocusTest =
+    class extends CrSettingsInteractiveUITest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/test_loader.html?module=settings/payments_section_focus_test.js';
+  }
+};
+
+TEST_F('CrSettingsPaymentsSectionFocusTest', 'All', function() {
+  mocha.run();
+});
+
 var CrSettingsSyncPageTest = class extends CrSettingsInteractiveUITest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/settings/payments_section_focus_test.ts b/chrome/test/data/webui/settings/payments_section_focus_test.ts
new file mode 100644
index 0000000..d406904
--- /dev/null
+++ b/chrome/test/data/webui/settings/payments_section_focus_test.ts
@@ -0,0 +1,53 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// clang-format off
+import {PaymentsManagerImpl} from 'chrome://settings/lazy_load.js';
+import {loadTimeData} from 'chrome://settings/settings.js';
+import {assertTrue} from 'chrome://webui-test/chai_assert.js';
+
+import {createCreditCardEntry, createIbanEntry, TestPaymentsManager} from './passwords_and_autofill_fake_data.js';
+import {createPaymentsSection, getPaymentMethodEntry, PaymentMethod, deletePaymentMethod} from './payments_section_utils.js';
+// clang-format on
+
+suite('PaymentSectionFocusTests', function() {
+  setup(function() {
+    loadTimeData.overrideValues({
+      showIbansSettings: true,
+    });
+  });
+
+  test('FocusLocationAfterDeletion', async function() {
+    const section = await createPaymentsSection(
+        [
+          createCreditCardEntry(),
+          createCreditCardEntry(),
+        ],
+        [
+          createIbanEntry('FI1410093000123458', 'NickName'),
+        ],
+        [], {credit_card_enabled: {value: true}});
+    const manager = (PaymentsManagerImpl.getInstance() as TestPaymentsManager);
+
+    const addButton = section.shadowRoot!.querySelector('#addPaymentMethods');
+    assertTrue(!!addButton);
+
+    await deletePaymentMethod(section, manager, PaymentMethod.CREDIT_CARD, 1);
+    assertTrue(
+        getPaymentMethodEntry(section, 'iban-0').matches(':focus-within'),
+        'The focus should go to the first IBAN entry after removing ' +
+            'the latest credit card.');
+
+    await deletePaymentMethod(section, manager, PaymentMethod.IBAN, 0);
+    assertTrue(
+        getPaymentMethodEntry(section, 'card-0').matches(':focus-within'),
+        'The focus should be set on the preceding entry as the removed IBAN ' +
+            'was the latest payment method in the list.');
+
+    await deletePaymentMethod(section, manager, PaymentMethod.CREDIT_CARD, 0);
+    assertTrue(
+        addButton.matches(':focus-within'),
+        'No payment methods in the list, the focus goes to the Add button');
+  });
+});
diff --git a/chrome/test/data/webui/settings/payments_section_utils.ts b/chrome/test/data/webui/settings/payments_section_utils.ts
index 5446dbc..34da2c46 100644
--- a/chrome/test/data/webui/settings/payments_section_utils.ts
+++ b/chrome/test/data/webui/settings/payments_section_utils.ts
@@ -3,9 +3,11 @@
 // found in the LICENSE file.
 
 // clang-format off
-import {PaymentsManagerImpl, SettingsPaymentsSectionElement} from 'chrome://settings/lazy_load.js';
-import {assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PaymentsManagerImpl, SettingsPaymentsSectionElement, SettingsCreditCardListEntryElement, SettingsIbanListEntryElement} from 'chrome://settings/lazy_load.js';
+import {assertTrue, assertLT} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
+import {eventToPromise, whenAttributeIs} from 'chrome://webui-test/test_util.js';
 
 import {PaymentsManagerExpectations, TestPaymentsManager} from './passwords_and_autofill_fake_data.js';
 
@@ -70,3 +72,91 @@
   assertTrue(!!row);
   return row.shadowRoot!;
 }
+
+
+type PaymentEntryElement =
+    SettingsCreditCardListEntryElement|SettingsIbanListEntryElement;
+
+export const enum PaymentMethod {
+  CREDIT_CARD,
+  IBAN,
+}
+
+/**
+ * Queries the payment method element by its DOM id.
+ * See `SettingsPaymentsListElement` for the format of the ids.
+ */
+export function getPaymentMethodEntry(
+    section: SettingsPaymentsSectionElement, id: string): PaymentEntryElement {
+  const container = section.$.paymentsList.shadowRoot;
+  assertTrue(
+      !!container,
+      'the list element is expected to render its content in the shadowRoot');
+  const element = container.querySelector<PaymentEntryElement>('#' + id);
+  assertTrue(!!element, `payment method with DOM id ${id} is not found`);
+  return element;
+}
+/**
+ * The payment method is identified by the position (`index`) in the payment
+ * method sub list (identified by the `type` argument).
+ */
+async function executeUiManipulationsToDeletePaymentMethod(
+    section: SettingsPaymentsSectionElement, type: PaymentMethod,
+    index: number) {
+  const id =
+      type === PaymentMethod.CREDIT_CARD ? `card-${index}` : `iban-${index}`;
+  const deleteButtonSelector = type === PaymentMethod.CREDIT_CARD ?
+      '#menuRemoveCreditCard' :
+      '#menuRemoveIban';
+
+  // Open the dots menu:
+  const entry = getPaymentMethodEntry(section, id);
+  assertTrue(!!entry.dotsMenu);
+  entry.dotsMenu.click();
+  flush();
+
+  // Click the Delete button:
+  const deleteButton = section.shadowRoot!.querySelector<HTMLButtonElement>(
+      deleteButtonSelector);
+  assertTrue(!!deleteButton);
+  deleteButton.click();
+  flush();
+
+  // Confirm the deletion in the dialog:
+  const confirmationDialog =
+      section.shadowRoot!.querySelector('settings-simple-confirmation-dialog');
+  assertTrue(!!confirmationDialog);
+  await whenAttributeIs(confirmationDialog.$.dialog, 'open', '');
+  const closePromise = eventToPromise('close', confirmationDialog.$.dialog);
+  confirmationDialog.$.confirm.click();
+  await closePromise;
+}
+
+/**
+ * Performs required manipulations in the UI and manager to simulate the payment
+ * method removal. The payment method is identified by the position (`index`) in
+ * the respective (`type`) sub list.
+ */
+export async function deletePaymentMethod(
+    section: SettingsPaymentsSectionElement, manager: TestPaymentsManager,
+    type: PaymentMethod, index: number) {
+  const deleteMethod =
+      type === PaymentMethod.CREDIT_CARD ? 'removeCreditCard' : 'removeIban';
+  const dataProperty =
+      type === PaymentMethod.CREDIT_CARD ? 'creditCards' : 'ibans';
+
+  // Ensure manager's deleteMethod call is caused by UI manipulations here.
+  manager.resetResolver(deleteMethod);
+  await executeUiManipulationsToDeletePaymentMethod(section, type, index);
+  await manager.whenCalled(deleteMethod);
+
+  // Create a copy to make sure all the Polymer updates get triggered.
+  const paymentMethodItems = [...manager.data[dataProperty]];
+  assertLT(index, paymentMethodItems.length);
+  paymentMethodItems.splice(index, 1);
+  manager.data[dataProperty] = paymentMethodItems;
+  manager.lastCallback.setPersonalDataManagerListener!
+      ([], manager.data.creditCards, manager.data.ibans);
+
+  await flushTasks();
+}
diff --git a/chrome/updater/app/server/win/com_classes.cc b/chrome/updater/app/server/win/com_classes.cc
index bf7f0bf..8b25c5b5 100644
--- a/chrome/updater/app/server/win/com_classes.cc
+++ b/chrome/updater/app/server/win/com_classes.cc
@@ -144,6 +144,9 @@
 }
 
 HRESULT UpdaterImpl::FetchPolicies(IUpdaterCallback* callback) {
+  if (!callback) {
+    return E_INVALIDARG;
+  }
   scoped_refptr<ComServerApp> com_server = AppServerSingletonInstance();
   com_server->main_task_runner()->PostTask(
       FROM_HERE,
@@ -171,8 +174,9 @@
                                  const wchar_t* version,
                                  const wchar_t* existence_checker_path,
                                  IUpdaterCallback* callback) {
-  if (!callback)
+  if (!callback) {
     return E_INVALIDARG;
+  }
 
   // Validates that string parameters are not longer than 16K characters.
   absl::optional<RegistrationRequest> request =
@@ -252,6 +256,9 @@
 // `update_service` on the main sequence. The callbacks received from
 // `update_service` arrive in the main sequence too.
 HRESULT UpdaterImpl::RunPeriodicTasks(IUpdaterCallback* callback) {
+  if (!callback) {
+    return E_INVALIDARG;
+  }
   scoped_refptr<ComServerApp> com_server = AppServerSingletonInstance();
   com_server->main_task_runner()->PostTask(
       FROM_HERE,
@@ -284,7 +291,9 @@
   StateChangeCallbackFilter(
       scoped_refptr<base::SequencedTaskRunner> task_runner,
       Microsoft::WRL::ComPtr<IUpdaterObserver> observer)
-      : task_runner_(task_runner), observer_(observer) {}
+      : task_runner_(task_runner), observer_(observer) {
+    CHECK(observer);
+  }
   StateChangeCallbackFilter(const StateChangeCallbackFilter&) = delete;
   StateChangeCallbackFilter& operator=(const StateChangeCallbackFilter&) =
       delete;
@@ -322,6 +331,10 @@
                                     LONG priority,
                                     BOOL same_version_update_allowed,
                                     IUpdaterObserver* observer) {
+  if (!observer) {
+    return E_INVALIDARG;
+  }
+
   auto task_runner = base::ThreadPool::CreateSequencedTaskRunner(
       {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
 
@@ -378,6 +391,10 @@
                             LONG priority,
                             BOOL same_version_update_allowed,
                             IUpdaterObserver* observer) {
+  if (!observer) {
+    return E_INVALIDARG;
+  }
+
   // This task runner is responsible for sequencing the callbacks posted
   // by the `UpdateService` and calling the outbound COM functions to
   // notify the client about state changes in the `UpdateService`.
@@ -430,6 +447,10 @@
 
 // See the comment for the UpdaterImpl::Update.
 HRESULT UpdaterImpl::UpdateAll(IUpdaterObserver* observer) {
+  if (!observer) {
+    return E_INVALIDARG;
+  }
+
   using IUpdaterObserverPtr = Microsoft::WRL::ComPtr<IUpdaterObserver>;
   scoped_refptr<ComServerApp> com_server = AppServerSingletonInstance();
 
@@ -478,8 +499,9 @@
                              const wchar_t* install_data_index,
                              LONG priority,
                              IUpdaterObserver* observer) {
-  if (!observer)
+  if (!observer) {
     return E_INVALIDARG;
+  }
 
   // Validates that string parameters are not longer than 16K characters.
   absl::optional<RegistrationRequest> request =
@@ -592,6 +614,10 @@
                                   IUpdaterObserver* observer) {
   VLOG(1) << __func__;
 
+  if (!observer) {
+    return E_INVALIDARG;
+  }
+
   for (const wchar_t* str :
        {app_id, installer_path, install_args, install_data, install_settings}) {
     if (wcsnlen_s(str, kMaxStringLen) >= kMaxStringLen) {
@@ -679,6 +705,10 @@
 
 // See the comment for the UpdaterImpl::Update.
 HRESULT UpdaterInternalImpl::Run(IUpdaterInternalCallback* callback) {
+  if (!callback) {
+    return E_INVALIDARG;
+  }
+
   using IUpdaterInternalCallbackPtr =
       Microsoft::WRL::ComPtr<IUpdaterInternalCallback>;
   scoped_refptr<ComServerApp> com_server = AppServerSingletonInstance();
@@ -712,6 +742,10 @@
 }
 
 HRESULT UpdaterInternalImpl::Hello(IUpdaterInternalCallback* callback) {
+  if (!callback) {
+    return E_INVALIDARG;
+  }
+
   using IUpdaterInternalCallbackPtr =
       Microsoft::WRL::ComPtr<IUpdaterInternalCallback>;
   scoped_refptr<ComServerApp> com_server = AppServerSingletonInstance();
diff --git a/chrome/updater/app/server/win/com_classes.h b/chrome/updater/app/server/win/com_classes.h
index 83032ce..f3b8f9c 100644
--- a/chrome/updater/app/server/win/com_classes.h
+++ b/chrome/updater/app/server/win/com_classes.h
@@ -28,9 +28,7 @@
 // object. The purpose of this class is to remote the state of the
 // |UpdateService|. Instances of this class are typically passed as arguments
 // to RPC method calls which model COM events.
-class UpdateStateImpl : public DynamicIIDsImpl<IUpdateState,
-                                               __uuidof(IUpdateStateUser),
-                                               __uuidof(IUpdateStateSystem)> {
+class UpdateStateImpl : public DYNAMICIIDSIMPL(IUpdateState) {
  public:
   explicit UpdateStateImpl(const UpdateService::UpdateState& update_state)
       : update_state_(update_state) {}
@@ -58,10 +56,7 @@
 
 // This class implements the ICompleteStatus interface and exposes it as a COM
 // object.
-class CompleteStatusImpl
-    : public DynamicIIDsImpl<ICompleteStatus,
-                             __uuidof(ICompleteStatusUser),
-                             __uuidof(ICompleteStatusSystem)> {
+class CompleteStatusImpl : public DYNAMICIIDSIMPL(ICompleteStatus) {
  public:
   CompleteStatusImpl(int code, const std::wstring& message)
       : code_(code), message_(message) {}
@@ -80,9 +75,7 @@
 };
 
 // This class implements the IUpdater interface and exposes it as a COM object.
-class UpdaterImpl : public DynamicIIDsImpl<IUpdater,
-                                           __uuidof(IUpdaterUser),
-                                           __uuidof(IUpdaterSystem)> {
+class UpdaterImpl : public DYNAMICIIDSIMPL(IUpdater) {
  public:
   UpdaterImpl() = default;
   UpdaterImpl(const UpdaterImpl&) = delete;
@@ -137,10 +130,7 @@
 
 // This class implements the IUpdaterInternal interface and exposes it as a COM
 // object.
-class UpdaterInternalImpl
-    : public DynamicIIDsImpl<IUpdaterInternal,
-                             __uuidof(IUpdaterInternalUser),
-                             __uuidof(IUpdaterInternalSystem)> {
+class UpdaterInternalImpl : public DYNAMICIIDSIMPL(IUpdaterInternal) {
  public:
   UpdaterInternalImpl() = default;
   UpdaterInternalImpl(const UpdaterInternalImpl&) = delete;
diff --git a/chrome/updater/app/server/win/com_classes_legacy.cc b/chrome/updater/app/server/win/com_classes_legacy.cc
index 56eade9..ddce9ba 100644
--- a/chrome/updater/app/server/win/com_classes_legacy.cc
+++ b/chrome/updater/app/server/win/com_classes_legacy.cc
@@ -103,9 +103,7 @@
 class AppVersionWebImpl : public IDispatchImpl<IAppVersionWeb> {
  public:
   AppVersionWebImpl()
-      : IDispatchImpl<IAppVersionWeb>(
-            {{__uuidof(IAppVersionWebUser), __uuidof(IAppVersionWeb)}},
-            {{__uuidof(IAppVersionWebSystem), __uuidof(IAppVersionWeb)}}) {}
+      : IDispatchImpl<IAppVersionWeb>(IID_MAPS_USERSYSTEM(IAppVersionWeb)) {}
   AppVersionWebImpl(const AppVersionWebImpl&) = delete;
   AppVersionWebImpl& operator=(const AppVersionWebImpl&) = delete;
 
@@ -144,9 +142,7 @@
 class CurrentStateImpl : public IDispatchImpl<ICurrentState> {
  public:
   CurrentStateImpl()
-      : IDispatchImpl<ICurrentState>(
-            {{__uuidof(ICurrentStateUser), __uuidof(ICurrentState)}},
-            {{__uuidof(ICurrentStateSystem), __uuidof(ICurrentState)}}) {}
+      : IDispatchImpl<ICurrentState>(IID_MAPS_USERSYSTEM(ICurrentState)) {}
   CurrentStateImpl(const CurrentStateImpl&) = delete;
   CurrentStateImpl& operator=(const CurrentStateImpl&) = delete;
 
@@ -343,8 +339,7 @@
 class AppWebImpl : public IDispatchImpl<IAppWeb> {
  public:
   AppWebImpl()
-      : IDispatchImpl<IAppWeb>({{__uuidof(IAppWebUser), __uuidof(IAppWeb)}},
-                               {{__uuidof(IAppWebSystem), __uuidof(IAppWeb)}}),
+      : IDispatchImpl<IAppWeb>(IID_MAPS_USERSYSTEM(IAppWeb)),
         task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
             {base::MayBlock(), base::WithBaseSyncPrimitives()})) {}
   AppWebImpl(const AppWebImpl&) = delete;
@@ -649,9 +644,7 @@
 class AppBundleWebImpl : public IDispatchImpl<IAppBundleWeb> {
  public:
   AppBundleWebImpl()
-      : IDispatchImpl<IAppBundleWeb>(
-            {{__uuidof(IAppBundleWebUser), __uuidof(IAppBundleWeb)}},
-            {{__uuidof(IAppBundleWebSystem), __uuidof(IAppBundleWeb)}}) {}
+      : IDispatchImpl<IAppBundleWeb>(IID_MAPS_USERSYSTEM(IAppBundleWeb)) {}
   AppBundleWebImpl(const AppBundleWebImpl&) = delete;
   AppBundleWebImpl& operator=(const AppBundleWebImpl&) = delete;
 
@@ -783,9 +776,8 @@
 };
 
 LegacyOnDemandImpl::LegacyOnDemandImpl()
-    : IDispatchImpl<IGoogleUpdate3Web>(
-          {{__uuidof(IGoogleUpdate3WebUser), __uuidof(IGoogleUpdate3Web)}},
-          {{__uuidof(IGoogleUpdate3WebSystem), __uuidof(IGoogleUpdate3Web)}}) {}
+    : IDispatchImpl<IGoogleUpdate3Web>(IID_MAPS_USERSYSTEM(IGoogleUpdate3Web)) {
+}
 
 LegacyOnDemandImpl::~LegacyOnDemandImpl() = default;
 
@@ -857,9 +849,7 @@
 }
 
 LegacyAppCommandWebImpl::LegacyAppCommandWebImpl()
-    : IDispatchImpl<IAppCommandWeb>(
-          {{__uuidof(IAppCommandWebUser), __uuidof(IAppCommandWeb)}},
-          {{__uuidof(IAppCommandWebSystem), __uuidof(IAppCommandWeb)}}) {}
+    : IDispatchImpl<IAppCommandWeb>(IID_MAPS_USERSYSTEM(IAppCommandWeb)) {}
 LegacyAppCommandWebImpl::~LegacyAppCommandWebImpl() = default;
 
 HRESULT LegacyAppCommandWebImpl::RuntimeClassInitialize(
@@ -935,12 +925,12 @@
 
 PolicyStatusImpl::PolicyStatusImpl()
     : IDispatchImpl<IPolicyStatus3, IPolicyStatus2, IPolicyStatus>(
-          {{__uuidof(IPolicyStatus3User), __uuidof(IPolicyStatus3)},
-           {__uuidof(IPolicyStatus2User), __uuidof(IPolicyStatus2)},
-           {__uuidof(IPolicyStatusUser), __uuidof(IPolicyStatus)}},
-          {{__uuidof(IPolicyStatus3System), __uuidof(IPolicyStatus3)},
-           {__uuidof(IPolicyStatus2System), __uuidof(IPolicyStatus2)},
-           {__uuidof(IPolicyStatusSystem), __uuidof(IPolicyStatus)}}),
+          {IID_MAP_ENTRY_USER(IPolicyStatus3),
+           IID_MAP_ENTRY_USER(IPolicyStatus2),
+           IID_MAP_ENTRY_USER(IPolicyStatus)},
+          {IID_MAP_ENTRY_SYSTEM(IPolicyStatus3),
+           IID_MAP_ENTRY_SYSTEM(IPolicyStatus2),
+           IID_MAP_ENTRY_SYSTEM(IPolicyStatus)}),
       policy_service_(
           AppServerSingletonInstance()->config()->GetPolicyService()) {}
 PolicyStatusImpl::~PolicyStatusImpl() = default;
diff --git a/chrome/updater/ipc/update_service_internal_proxy_win.cc b/chrome/updater/ipc/update_service_internal_proxy_win.cc
index 480677c..ddb2f014 100644
--- a/chrome/updater/ipc/update_service_internal_proxy_win.cc
+++ b/chrome/updater/ipc/update_service_internal_proxy_win.cc
@@ -30,9 +30,7 @@
 // This class implements the IUpdaterInternalCallback interface and exposes it
 // as a COM object. The class has thread-affinity for the STA thread.
 class UpdaterInternalCallback
-    : public DynamicIIDsImpl<IUpdaterInternalCallback,
-                             __uuidof(IUpdaterInternalCallbackUser),
-                             __uuidof(IUpdaterInternalCallbackSystem)> {
+    : public DYNAMICIIDSIMPL(IUpdaterInternalCallback) {
  public:
   explicit UpdaterInternalCallback(base::OnceClosure callback)
       : callback_(std::move(callback)) {}
diff --git a/chrome/updater/ipc/update_service_proxy_win.cc b/chrome/updater/ipc/update_service_proxy_win.cc
index 6c16639..b356f71 100644
--- a/chrome/updater/ipc/update_service_proxy_win.cc
+++ b/chrome/updater/ipc/update_service_proxy_win.cc
@@ -43,10 +43,7 @@
 
 // This class implements the IUpdaterObserver interface and exposes it as a COM
 // object. The class has thread-affinity for the STA thread.
-class UpdaterObserver
-    : public DynamicIIDsImpl<IUpdaterObserver,
-                             __uuidof(IUpdaterObserverUser),
-                             __uuidof(IUpdaterObserverSystem)> {
+class UpdaterObserver : public DYNAMICIIDSIMPL(IUpdaterObserver) {
  public:
   UpdaterObserver(UpdateService::StateChangeCallback state_update_callback,
                   UpdateService::Callback callback)
@@ -212,10 +209,7 @@
 
 // This class implements the IUpdaterCallback interface and exposes it as a COM
 // object. The class has thread-affinity for the STA thread.
-class UpdaterCallback
-    : public DynamicIIDsImpl<IUpdaterCallback,
-                             __uuidof(IUpdaterCallbackUser),
-                             __uuidof(IUpdaterCallbackSystem)> {
+class UpdaterCallback : public DYNAMICIIDSIMPL(IUpdaterCallback) {
  public:
   explicit UpdaterCallback(base::OnceCallback<void(LONG)> callback)
       : callback_(std::move(callback)) {}
diff --git a/chrome/updater/mac/setup/setup.mm b/chrome/updater/mac/setup/setup.mm
index b01e35c..d386e1b 100644
--- a/chrome/updater/mac/setup/setup.mm
+++ b/chrome/updater/mac/setup/setup.mm
@@ -128,7 +128,8 @@
   // If there is no Current symlink, create one now.
   base::FilePath current_symlink = install_dir->Append("Current");
   if (!base::PathExists(current_symlink)) {
-    if (symlink(kUpdaterVersion, current_symlink.value().c_str())) {
+    if (base::DeleteFile(current_symlink) &&
+        symlink(kUpdaterVersion, current_symlink.value().c_str())) {
       return kErrorFailedToLinkLauncher;
     }
   }
diff --git a/chrome/updater/test/integration_test_commands.h b/chrome/updater/test/integration_test_commands.h
index 66f125c6..97fba5d9 100644
--- a/chrome/updater/test/integration_test_commands.h
+++ b/chrome/updater/test/integration_test_commands.h
@@ -90,6 +90,7 @@
                       const std::string& install_data_index) const = 0;
   virtual void UpdateAll() const = 0;
   virtual void DeleteUpdaterDirectory() const = 0;
+  virtual void DeleteFile(const base::FilePath& path) const = 0;
   virtual void PrintLog() const = 0;
   virtual base::FilePath GetDifferentUserPath() const = 0;
   [[nodiscard]] virtual bool WaitForUpdaterExit() const = 0;
diff --git a/chrome/updater/test/integration_test_commands_system.cc b/chrome/updater/test/integration_test_commands_system.cc
index 1e4c6d2..ad6d819 100644
--- a/chrome/updater/test/integration_test_commands_system.cc
+++ b/chrome/updater/test/integration_test_commands_system.cc
@@ -234,6 +234,10 @@
     RunCommand("delete_updater_directory", {});
   }
 
+  void DeleteFile(const base::FilePath& path) const override {
+    RunCommand("delete_file", {Param("path", path.MaybeAsASCII())});
+  }
+
   void InstallApp(const std::string& app_id) const override {
     RunCommand("install_app", {Param("app_id", app_id)});
   }
@@ -306,13 +310,10 @@
 #endif  // BUILDFLAG(IS_WIN)
 
   base::FilePath GetDifferentUserPath() const override {
-#if BUILDFLAG(IS_MAC)
-    // The updater_tests executable is owned by non-root.
-    return base::PathService::CheckedGet(base::FILE_EXE);
-#else
+    // On POSIX, the path may be chowned; so do not use a file not owned by the
+    // test, nor the test executable itself.
     NOTREACHED() << __func__ << ": not implemented.";
     return base::FilePath();
-#endif
   }
 
   void StressUpdateService() const override {
diff --git a/chrome/updater/test/integration_test_commands_user.cc b/chrome/updater/test/integration_test_commands_user.cc
index a9e3c96..0e2f5bc1 100644
--- a/chrome/updater/test/integration_test_commands_user.cc
+++ b/chrome/updater/test/integration_test_commands_user.cc
@@ -212,6 +212,10 @@
     updater::test::DeleteUpdaterDirectory(updater_scope_);
   }
 
+  void DeleteFile(const base::FilePath& path) const override {
+    updater::test::DeleteFile(updater_scope_, path);
+  }
+
   void InstallApp(const std::string& app_id) const override {
     updater::test::InstallApp(updater_scope_, app_id);
   }
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc
index e35600a..acf93c79 100644
--- a/chrome/updater/test/integration_tests.cc
+++ b/chrome/updater/test/integration_tests.cc
@@ -10,6 +10,7 @@
 
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
+#include "base/files/scoped_temp_dir.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/scoped_refptr.h"
@@ -323,6 +324,10 @@
 
   void DeleteUpdaterDirectory() { test_commands_->DeleteUpdaterDirectory(); }
 
+  void DeleteFile(const base::FilePath& path) {
+    test_commands_->DeleteFile(path);
+  }
+
   base::FilePath GetDifferentUserPath() {
     return test_commands_->GetDifferentUserPath();
   }
@@ -907,10 +912,8 @@
 // test need not run on Windows.
 #if BUILDFLAG(IS_MAC)
 TEST_F(IntegrationTest, UnregisterUnownedApp) {
-  if (GetTestScope() == UpdaterScope::kSystem) {
-    // TODO(crbug.com/1441082): Re-enable this test.
-    return;
-  }
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ASSERT_NO_FATAL_FAILURE(Install());
   ASSERT_NO_FATAL_FAILURE(ExpectInstalled());
   ASSERT_NO_FATAL_FAILURE(ExpectVersionActive(kUpdaterVersion));
@@ -919,13 +922,22 @@
   ASSERT_NO_FATAL_FAILURE(InstallApp("test2"));
   ASSERT_TRUE(WaitForUpdaterExit());
 
-  ASSERT_NO_FATAL_FAILURE(
-      SetExistenceCheckerPath("test1", GetDifferentUserPath()));
+  ASSERT_NO_FATAL_FAILURE(SetExistenceCheckerPath(
+      "test1", IsSystemInstall(GetTestScope()) ? temp_dir.GetPath()
+                                               : GetDifferentUserPath()));
 
   ASSERT_NO_FATAL_FAILURE(RunWake(0));
   ASSERT_TRUE(WaitForUpdaterExit());
 
-  ASSERT_NO_FATAL_FAILURE(ExpectNotRegistered("test1"));
+  // Since the updater may have chowned the temp dir, we may need to elevate to
+  // delete it.
+  ASSERT_NO_FATAL_FAILURE(DeleteFile(temp_dir.GetPath()));
+
+  if (IsSystemInstall(GetTestScope())) {
+    ASSERT_NO_FATAL_FAILURE(ExpectRegistered("test1"));
+  } else {
+    ASSERT_NO_FATAL_FAILURE(ExpectNotRegistered("test1"));
+  }
 
   ASSERT_NO_FATAL_FAILURE(ExpectRegistered("test2"));
 
diff --git a/chrome/updater/test/integration_tests_helper.cc b/chrome/updater/test/integration_tests_helper.cc
index e8e0bba..eb74989 100644
--- a/chrome/updater/test/integration_tests_helper.cc
+++ b/chrome/updater/test/integration_tests_helper.cc
@@ -325,6 +325,7 @@
     {"update_all", WithSystemScope(Wrap(&UpdateAll))},
     {"delete_updater_directory",
      WithSystemScope(Wrap(&DeleteUpdaterDirectory))},
+    {"delete_file", (WithSwitch("path", WithSystemScope(Wrap(&DeleteFile))))},
     {"install_app", WithSwitch("app_id", WithSystemScope(Wrap(&InstallApp)))},
     {"uninstall_app",
      WithSwitch("app_id", WithSystemScope(Wrap(&UninstallApp)))},
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc
index c07b229..3ab3ac0f 100644
--- a/chrome/updater/test/integration_tests_impl.cc
+++ b/chrome/updater/test/integration_tests_impl.cc
@@ -471,6 +471,10 @@
   ASSERT_TRUE(base::DeletePathRecursively(*install_dir));
 }
 
+void DeleteFile(UpdaterScope /*scope*/, const base::FilePath& path) {
+  ASSERT_TRUE(base::DeleteFile(path));
+}
+
 void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version) {
   scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope);
   ASSERT_TRUE(global_prefs) << "No global prefs.";
diff --git a/chrome/updater/test/integration_tests_impl.h b/chrome/updater/test/integration_tests_impl.h
index 7ed6c8d..032c64c 100644
--- a/chrome/updater/test/integration_tests_impl.h
+++ b/chrome/updater/test/integration_tests_impl.h
@@ -128,6 +128,9 @@
 // Invokes the active instance's UpdateService::UpdateAll (via RPC).
 void UpdateAll(UpdaterScope scope);
 
+// Deletes the file.
+void DeleteFile(UpdaterScope scope, const base::FilePath& path);
+
 // Deletes the updater executable directory. Does not do any kind of cleanup
 // related to service registration. The intent of this command is to replicate
 // a common mode of breaking the updater, so we can test how it recovers.
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc
index 5ef80358..9e687b0 100644
--- a/chrome/updater/update_service_impl.cc
+++ b/chrome/updater/update_service_impl.cc
@@ -284,10 +284,10 @@
 
   // The installer should make an updater registration, but in case it halts
   // before it does, synthesize a registration if necessary here.
-  if (!base::Contains(persisted_data_->GetAppIds(),
-                      base::ToLowerASCII(kUpdaterAppId),
-                      static_cast<std::string (*)(base::StringPiece)>(
-                          &base::ToLowerASCII))) {
+  const base::Version registered_updater_version =
+      persisted_data_->GetProductVersion(kUpdaterAppId);
+  if (!registered_updater_version.IsValid() ||
+      base::Version(kUpdaterVersion) > registered_updater_version) {
     RegistrationRequest updater_request;
     updater_request.app_id = kUpdaterAppId;
     updater_request.version = base::Version(kUpdaterVersion);
diff --git a/chrome/updater/util/win_util.h b/chrome/updater/util/win_util.h
index a74aa29..43222057 100644
--- a/chrome/updater/util/win_util.h
+++ b/chrome/updater/util/win_util.h
@@ -120,6 +120,21 @@
   }
 };
 
+// Macro that makes it easier to derive from `DynamicIIDsImpl`.
+#define DYNAMICIIDSIMPL(interface)                      \
+  DynamicIIDsImpl<interface, __uuidof(interface##User), \
+                  __uuidof(interface##System)>
+
+// Macros that makes it easier to call the `IDispatchImpl` constructor.
+#define IID_MAP_ENTRY_USER(interface) \
+  { __uuidof(interface##User), __uuidof(interface) }
+#define IID_MAP_ENTRY_SYSTEM(interface) \
+  { __uuidof(interface##System), __uuidof(interface) }
+#define IID_MAPS_USERSYSTEM(interface) \
+  {IID_MAP_ENTRY_USER(interface)}, {   \
+    IID_MAP_ENTRY_SYSTEM(interface)    \
+  }
+
 // Returns the last error as an HRESULT or E_FAIL if last error is NO_ERROR.
 // This is not a drop in replacement for the HRESULT_FROM_WIN32 macro.
 // The macro maps a NO_ERROR to S_OK, whereas the HRESULTFromLastError maps a
diff --git a/chrome/utility/importer/nss_decryptor.cc b/chrome/utility/importer/nss_decryptor.cc
index 4c3e3d154..8b0ab3c 100644
--- a/chrome/utility/importer/nss_decryptor.cc
+++ b/chrome/utility/importer/nss_decryptor.cc
@@ -175,33 +175,40 @@
   const base::Value::List* password_list = parsed_json_dict->FindList("logins");
   if (password_list) {
     for (const auto& value : *password_list) {
-      if (!value.is_dict())
+      auto* dict = value.GetIfDict();
+      if (!dict) {
         continue;
+      }
 
       FirefoxRawPasswordInfo raw_password_info;
 
-      if (const std::string* hostname = value.FindStringKey("hostname"))
+      if (const std::string* hostname = dict->FindString("hostname")) {
         raw_password_info.host = *hostname;
+      }
 
-      if (const std::string* username = value.FindStringKey("usernameField"))
+      if (const std::string* username = dict->FindString("usernameField")) {
         raw_password_info.username_element = base::UTF8ToUTF16(*username);
+      }
 
-      if (const std::string* password = value.FindStringKey("passwordField"))
+      if (const std::string* password = dict->FindString("passwordField")) {
         raw_password_info.password_element = base::UTF8ToUTF16(*password);
+      }
 
-      if (const std::string* username =
-              value.FindStringKey("encryptedUsername"))
+      if (const std::string* username = dict->FindString("encryptedUsername")) {
         raw_password_info.encrypted_username = *username;
+      }
 
-      if (const std::string* password =
-              value.FindStringKey("encryptedPassword"))
+      if (const std::string* password = dict->FindString("encryptedPassword")) {
         raw_password_info.encrypted_password = *password;
+      }
 
-      if (const std::string* submit_url = value.FindStringKey("formSubmitURL"))
+      if (const std::string* submit_url = dict->FindString("formSubmitURL")) {
         raw_password_info.form_action = *submit_url;
+      }
 
-      if (const std::string* realm = value.FindStringKey("httpRealm"))
+      if (const std::string* realm = dict->FindString("httpRealm")) {
         raw_password_info.realm = *realm;
+      }
 
       importer::ImportedPasswordForm form;
       if (CreatePasswordFormFromRawInfo(raw_password_info, &form))
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
index 689c4fb..91018ddd 100644
--- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
+++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
@@ -87,10 +87,12 @@
         private boolean mInPipMode;
         private MotionEvent mLastTouchEvent;
 
+        @Override
         public boolean getTurnScreenOn() {
             return mTurnScreenOn;
         }
 
+        @Override
         public boolean getShowWhenLocked() {
             return mShowWhenLocked;
         }
@@ -106,11 +108,13 @@
         }
 
         @Implementation
+        @Override
         public void setTurnScreenOn(boolean turnScreenOn) {
             mTurnScreenOn = turnScreenOn;
         }
 
         @Implementation
+        @Override
         public void setShowWhenLocked(boolean showWhenLocked) {
             mShowWhenLocked = showWhenLocked;
         }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index ecca23e5..ef6d883 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-15455.0.0
\ No newline at end of file
+15456.0.0
\ No newline at end of file
diff --git a/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc b/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc
index e5291f5..a103ce7c 100644
--- a/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc
+++ b/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc
@@ -516,8 +516,12 @@
     return;
   }
 
-  // TODO(b/271854446): Update this method to be able to have test profile paths
-  // able to be returned.
+  // Configure a single profile that uses the activation code that was provided
+  // and immediately return the path to this profile.
+  profile_paths.push_back(AddFakeCarrierProfile(
+      euicc_path, hermes::profile::State::kPending, activation_code,
+      AddCarrierProfileBehavior::kAddProfileWithService));
+
   std::move(callback).Run(HermesResponseStatus::kSuccess, profile_paths);
 }
 
diff --git a/chromeos/ash/components/dbus/shill/fake_shill_device_client.cc b/chromeos/ash/components/dbus/shill/fake_shill_device_client.cc
index 48f65ad..f72fad3 100644
--- a/chromeos/ash/components/dbus/shill/fake_shill_device_client.cc
+++ b/chromeos/ash/components/dbus/shill/fake_shill_device_client.cc
@@ -97,6 +97,14 @@
                                         const base::Value& value,
                                         base::OnceClosure callback,
                                         ErrorCallback error_callback) {
+  if (set_property_error_name_.has_value()) {
+    std::move(error_callback)
+        .Run(set_property_error_name_.value(),
+             /*error_message=*/std::string());
+    set_property_error_name_ = absl::nullopt;
+    return;
+  }
+
   if (property_change_delay_.has_value()) {
     // Return callback immediately and set property after delay.
     std::move(callback).Run();
@@ -449,6 +457,11 @@
   property_change_delay_ = time_delay;
 }
 
+void FakeShillDeviceClient::SetErrorForNextSetPropertyAttempt(
+    const std::string& error_name) {
+  set_property_error_name_ = error_name;
+}
+
 // Private Methods -------------------------------------------------------------
 
 FakeShillDeviceClient::SimLockStatus FakeShillDeviceClient::GetSimLockStatus(
diff --git a/chromeos/ash/components/dbus/shill/fake_shill_device_client.h b/chromeos/ash/components/dbus/shill/fake_shill_device_client.h
index 7393da1..795642a 100644
--- a/chromeos/ash/components/dbus/shill/fake_shill_device_client.h
+++ b/chromeos/ash/components/dbus/shill/fake_shill_device_client.h
@@ -101,6 +101,8 @@
   void SetSimulateInhibitScanning(bool simulate_inhibit_scanning) override;
   void SetPropertyChangeDelay(
       absl::optional<base::TimeDelta> time_delay) override;
+  void SetErrorForNextSetPropertyAttempt(
+      const std::string& error_name) override;
 
   static const char kSimPuk[];
   static const char kDefaultSimPin[];
@@ -167,6 +169,9 @@
   // change by given amount.
   absl::optional<base::TimeDelta> property_change_delay_;
 
+  // If set the next SetProperty call will fail with this error_name.
+  absl::optional<std::string> set_property_error_name_;
+
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
   base::WeakPtrFactory<FakeShillDeviceClient> weak_ptr_factory_{this};
diff --git a/chromeos/ash/components/dbus/shill/shill_device_client.h b/chromeos/ash/components/dbus/shill/shill_device_client.h
index 2c1f9b1..4f44042 100644
--- a/chromeos/ash/components/dbus/shill/shill_device_client.h
+++ b/chromeos/ash/components/dbus/shill/shill_device_client.h
@@ -67,6 +67,10 @@
     // change.
     virtual void SetPropertyChangeDelay(
         absl::optional<base::TimeDelta> time_delay) = 0;
+    // Sets a SetProperty error. If set, the next SetProperty call will
+    // fail with the given |error_name|
+    virtual void SetErrorForNextSetPropertyAttempt(
+        const std::string& error_name) = 0;
 
    protected:
     virtual ~TestInterface() = default;
diff --git a/chromeos/ash/components/network/BUILD.gn b/chromeos/ash/components/network/BUILD.gn
index d547f4c4..3b97b5f 100644
--- a/chromeos/ash/components/network/BUILD.gn
+++ b/chromeos/ash/components/network/BUILD.gn
@@ -22,6 +22,7 @@
     "//chromeos/ash/components/network/metrics",
     "//chromeos/ash/components/network/onc",
     "//chromeos/ash/components/network/proxy",
+    "//chromeos/ash/services/cellular_setup/public/mojom",
     "//chromeos/ash/services/hotspot_config/public/cpp",
     "//chromeos/ash/services/hotspot_config/public/mojom",
     "//chromeos/components/onc",
@@ -269,6 +270,7 @@
     "//chromeos/ash/components/network/metrics:unit_tests",
     "//chromeos/ash/components/network/onc:unit_tests",
     "//chromeos/ash/components/network/proxy:unit_tests",
+    "//chromeos/ash/services/cellular_setup/public/mojom",
     "//chromeos/ash/services/hotspot_config/public/cpp",
     "//chromeos/ash/services/hotspot_config/public/cpp:test_support",
     "//chromeos/ash/services/hotspot_config/public/mojom",
diff --git a/chromeos/ash/components/network/DEPS b/chromeos/ash/components/network/DEPS
index 7b31057e..c22c8d7 100644
--- a/chromeos/ash/components/network/DEPS
+++ b/chromeos/ash/components/network/DEPS
@@ -9,6 +9,7 @@
   "+chromeos/ash/components/dbus",
   "+chromeos/ash/services/hotspot_config/public",
   "+chromeos/ash/services/network_config/public",
+  "+chromeos/ash/services/cellular_setup/public",
   "+chromeos/components/onc",
   "+chromeos/dbus",
   "+chromeos/services/network_config/public",
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler.cc b/chromeos/ash/components/network/cellular_esim_profile_handler.cc
index 2dc8ff51..53af1c8 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler.cc
@@ -4,9 +4,13 @@
 
 #include "chromeos/ash/components/network/cellular_esim_profile_handler.h"
 
+#include "ash/constants/ash_features.h"
+#include "base/check.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
-#include "chromeos/ash/components/network/cellular_esim_profile.h"
+#include "chromeos/ash/components/network/cellular_utils.h"
 #include "chromeos/ash/components/network/hermes_metrics_util.h"
+#include "chromeos/ash/components/network/network_event_log.h"
 
 namespace ash {
 namespace {
@@ -26,6 +30,12 @@
   HermesProfileClient::Get()->RemoveObserver(this);
 }
 
+CellularESimProfileHandler::RequestAvailableProfilesInfo::
+    RequestAvailableProfilesInfo() = default;
+
+CellularESimProfileHandler::RequestAvailableProfilesInfo::
+    ~RequestAvailableProfilesInfo() = default;
+
 void CellularESimProfileHandler::Init(
     NetworkStateHandler* network_state_handler,
     CellularInhibitor* cellular_inhibitor) {
@@ -53,6 +63,23 @@
                             std::move(callback), std::move(inhibit_lock));
 }
 
+void CellularESimProfileHandler::RequestAvailableProfiles(
+    const dbus::ObjectPath& euicc_path,
+    RequestAvailableProfilesCallback callback) {
+  DCHECK(ash::features::IsSmdsSupportEnabled());
+
+  std::unique_ptr<RequestAvailableProfilesInfo> info =
+      std::make_unique<RequestAvailableProfilesInfo>();
+  info->smds_activation_codes = cellular_utils::GetSmdsActivationCodes();
+  info->callback = std::move(callback);
+
+  cellular_inhibitor_->InhibitCellularScanning(
+      CellularInhibitor::InhibitReason::kRequestingAvailableProfiles,
+      base::BindOnce(
+          &CellularESimProfileHandler::OnInhibitedForRequestAvailableProfiles,
+          weak_ptr_factory_.GetWeakPtr(), euicc_path, std::move(info)));
+}
+
 void CellularESimProfileHandler::PerformRefreshProfileList(
     const dbus::ObjectPath& euicc_path,
     bool restore_slot,
@@ -66,9 +93,10 @@
 
   cellular_inhibitor_->InhibitCellularScanning(
       CellularInhibitor::InhibitReason::kRefreshingProfileList,
-      base::BindOnce(&CellularESimProfileHandler::OnInhibited,
-                     weak_ptr_factory_.GetWeakPtr(), euicc_path, restore_slot,
-                     std::move(callback)));
+      base::BindOnce(
+          &CellularESimProfileHandler::OnInhibitedForRefreshProfileList,
+          weak_ptr_factory_.GetWeakPtr(), euicc_path, restore_slot,
+          std::move(callback)));
 }
 
 void CellularESimProfileHandler::AddObserver(Observer* observer) {
@@ -100,7 +128,7 @@
   OnHermesPropertiesUpdated();
 }
 
-void CellularESimProfileHandler::OnInhibited(
+void CellularESimProfileHandler::OnInhibitedForRefreshProfileList(
     const dbus::ObjectPath& euicc_path,
     bool restore_slot,
     RefreshProfilesCallback callback,
@@ -164,4 +192,123 @@
       kProfileRefreshCallbackDelay);
 }
 
+void CellularESimProfileHandler::OnInhibitedForRequestAvailableProfiles(
+    const dbus::ObjectPath& euicc_path,
+    std::unique_ptr<RequestAvailableProfilesInfo> info,
+    std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) {
+  DCHECK(info);
+  DCHECK(info->callback);
+
+  if (!inhibit_lock) {
+    // TODO(b/278135630): Emit
+    // Network.Cellular.ESim.SMDSScan.{SMDSType}.{ResultType}.
+    NET_LOG(ERROR)
+        << "Failed to inhibit cellular for requesting available profiles";
+    std::move(info->callback)
+        .Run(cellular_setup::mojom::ESimOperationResult::kFailure,
+             std::vector<CellularESimProfile>());
+    return;
+  }
+
+  PerformRequestAvailableProfiles(euicc_path, std::move(info),
+                                  std::move(inhibit_lock));
+}
+
+void CellularESimProfileHandler::PerformRequestAvailableProfiles(
+    const dbus::ObjectPath& euicc_path,
+    std::unique_ptr<RequestAvailableProfilesInfo> info,
+    std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) {
+  DCHECK(info);
+  DCHECK(info->callback);
+  DCHECK(inhibit_lock);
+
+  if (info->smds_activation_codes.empty()) {
+    // TODO(b/278135630): Emit
+    // Network.Cellular.ESim.SMDSScan.{SMDSType}.{ResultType}.
+    // TODO(b/278135534): Emit Network.Ash.Cellular.ESim.SMDSScan.ProfileCount.
+    NET_LOG(EVENT) << "Finished requesting available profiles";
+    std::move(info->callback)
+        .Run(cellular_setup::mojom::ESimOperationResult::kSuccess,
+             std::move(info->profile_list));
+    return;
+  }
+
+  NET_LOG(EVENT) << "Requesting available profiles";
+
+  // Remove one SM-DS activation code from the list and use this activation code
+  // for the next SM-DS scan. This logic is responsible for making sure we only
+  // scan each activation code once, avoiding an infinite loop.
+  const std::string smds_activation_code = info->smds_activation_codes.back();
+  info->smds_activation_codes.pop_back();
+
+  HermesEuiccClient::Get()->RefreshSmdxProfiles(
+      euicc_path, smds_activation_code,
+      /*restore_slot=*/true,
+      base::BindOnce(&CellularESimProfileHandler::OnRequestAvailableProfiles,
+                     weak_ptr_factory_.GetWeakPtr(), euicc_path,
+                     std::move(info), std::move(inhibit_lock)));
+}
+
+void CellularESimProfileHandler::OnRequestAvailableProfiles(
+    const dbus::ObjectPath& euicc_path,
+    std::unique_ptr<RequestAvailableProfilesInfo> info,
+    std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock,
+    HermesResponseStatus status,
+    const std::vector<dbus::ObjectPath>& profile_paths) {
+  DCHECK(info);
+  DCHECK(info->callback);
+  DCHECK(inhibit_lock);
+
+  // TODO(b/278135481): Emit Network.Cellular.ESim.SMDSScan.{SMDSType}.Duration.
+  // TODO(b/278135630): Emit
+  // Network.Cellular.ESim.SMDSScan.{SMDSType}.{ResultType}.
+  // Each SM-DS scan will return both a result and zero or more available
+  // profiles. An error being returned indicates there was an issue when
+  // performing the scan, but since it does not invalidate the returned profiles
+  // we simply log the error, capture the error in our metrics, and continue.
+  NET_LOG(EVENT)
+      << "HermesEuiccClient::RefreshSmdsProfiles returned with result code "
+      << status;
+
+  HermesEuiccClient::Properties* euicc_properties =
+      HermesEuiccClient::Get()->GetProperties(euicc_path);
+  DCHECK(euicc_properties);
+
+  for (const auto& profile_path : profile_paths) {
+    HermesProfileClient::Properties* profile_properties =
+        HermesProfileClient::Get()->GetProperties(profile_path);
+    if (!profile_properties) {
+      NET_LOG(ERROR)
+          << "Failed to get profile properties for available profile";
+      continue;
+    }
+    if (profile_properties->state().value() !=
+        hermes::profile::State::kPending) {
+      NET_LOG(ERROR) << "Expected available profile to have state "
+                     << hermes::profile::State::kPending << ", has "
+                     << profile_properties->state().value();
+      continue;
+    }
+
+    NET_LOG(EVENT) << "Found available profile";
+
+    info->profile_list.emplace_back(
+        CellularESimProfile::State::kPending, profile_path,
+        euicc_properties->eid().value(), profile_properties->iccid().value(),
+        base::UTF8ToUTF16(profile_properties->name().value()),
+        base::UTF8ToUTF16(profile_properties->nick_name().value()),
+        base::UTF8ToUTF16(profile_properties->service_provider().value()),
+        profile_properties->activation_code().value());
+  }
+
+  // This function is provided as a callback to
+  // PerformRequestAvailableProfiles() to be called when an SM-DS scan
+  // completes. Since the activation code used in this function may not have
+  // been the last needed, continue the loop. When |info.smds_activation_codes|
+  // is empty PerformRequestAvailableProfiles() will exit this loop by invoking
+  // |info.callback|.
+  PerformRequestAvailableProfiles(euicc_path, std::move(info),
+                                  std::move(inhibit_lock));
+}
+
 }  // namespace ash
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler.h b/chromeos/ash/components/network/cellular_esim_profile_handler.h
index 7678224a..ee9b162 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler.h
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler.h
@@ -18,6 +18,7 @@
 #include "chromeos/ash/components/dbus/hermes/hermes_profile_client.h"
 #include "chromeos/ash/components/network/cellular_esim_profile.h"
 #include "chromeos/ash/components/network/cellular_inhibitor.h"
+#include "chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom.h"
 #include "components/prefs/pref_service.h"
 
 class PrefService;
@@ -53,6 +54,12 @@
   using RefreshProfilesCallback =
       base::OnceCallback<void(std::unique_ptr<CellularInhibitor::InhibitLock>)>;
 
+  // Callback which returns the result of requesting available profiles and all
+  // available profiles that were discovered.
+  using RequestAvailableProfilesCallback =
+      base::OnceCallback<void(cellular_setup::mojom::ESimOperationResult,
+                              std::vector<CellularESimProfile>)>;
+
   // Refreshes the list of installed profiles from Hermes. This operation
   // requires the Cellular Device to be inhibited. If |inhibit_lock| is passed
   // by the client, it will be used; otherwise, this function will acquire one
@@ -69,6 +76,14 @@
       RefreshProfilesCallback callback,
       std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock = nullptr);
 
+  // Requests the list of profiles that are available for installation from
+  // known SM-DS servers. This operation will cause the cellular device to
+  // become inhibited. The operation result provided to the callback indicates
+  // whether this function was able to successfully inhibit the cellular device.
+  virtual void RequestAvailableProfiles(
+      const dbus::ObjectPath& euicc_path,
+      RequestAvailableProfilesCallback callback);
+
   // Returns a list of the known cellular eSIM profiles fetched from Hermes.
   // Note that this function returns cached values if an eSIM slot is not active
   // (e.g., if ModemManager is currently pointed to a pSIM slot).
@@ -109,6 +124,26 @@
   virtual void InitInternal() {}
 
  private:
+  // Requesting profiles available to install requires performing operations
+  // that must be done in serial. This struct is used to contain all of the
+  // information necessary to perform these operations, collect the results
+  // of each operation as it is completed, and to hold the callback that should
+  // be invoked once all of the operations have been completed.
+  struct RequestAvailableProfilesInfo {
+    RequestAvailableProfilesInfo();
+    ~RequestAvailableProfilesInfo();
+
+    // The list of SM-DS activation codes that should be used to scan for
+    // available profiles.
+    std::vector<std::string> smds_activation_codes;
+
+    // The list of available profiles found from scanning with activation codes
+    // from |smds_activation_codes|.
+    std::vector<CellularESimProfile> profile_list;
+
+    RequestAvailableProfilesCallback callback;
+  };
+
   // HermesManagerClient::Observer:
   void OnAvailableEuiccListChanged() override;
 
@@ -126,7 +161,7 @@
       bool restore_slot,
       RefreshProfilesCallback callback,
       std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock = nullptr);
-  void OnInhibited(
+  void OnInhibitedForRefreshProfileList(
       const dbus::ObjectPath& euicc_path,
       bool restore_slot,
       RefreshProfilesCallback callback,
@@ -138,6 +173,20 @@
       std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock);
   void OnRequestInstalledProfilesResult(base::TimeTicks start_time,
                                         HermesResponseStatus status);
+  void OnInhibitedForRequestAvailableProfiles(
+      const dbus::ObjectPath& euicc_path,
+      std::unique_ptr<RequestAvailableProfilesInfo> info,
+      std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock);
+  void PerformRequestAvailableProfiles(
+      const dbus::ObjectPath& euicc_path,
+      std::unique_ptr<RequestAvailableProfilesInfo> info,
+      std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock);
+  void OnRequestAvailableProfiles(
+      const dbus::ObjectPath& euicc_path,
+      std::unique_ptr<RequestAvailableProfilesInfo> info,
+      std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock,
+      HermesResponseStatus status,
+      const std::vector<dbus::ObjectPath>& profile_paths);
 
   raw_ptr<CellularInhibitor, ExperimentalAsh> cellular_inhibitor_ = nullptr;
 
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
index e7082039..ccc5870 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
@@ -243,7 +243,7 @@
   DCHECK(device_prefs_);
 
   std::vector<CellularESimProfile> profiles_from_hermes =
-      GenerateProfilesFromHermes();
+      cellular_utils::GenerateProfilesFromHermes();
 
   // Skip updating if there are profiles that haven't received ICCID updates
   // yet. This is required because property updates to eSIM profile objects
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc b/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc
index 61d4bc6e..66d20b06 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc
@@ -20,12 +20,16 @@
 #include "chromeos/ash/components/dbus/hermes/hermes_profile_client.h"
 #include "chromeos/ash/components/dbus/shill/fake_shill_device_client.h"
 #include "chromeos/ash/components/network/cellular_inhibitor.h"
+#include "chromeos/ash/components/network/cellular_utils.h"
 #include "chromeos/ash/components/network/network_state_test_helper.h"
 #include "chromeos/ash/components/network/network_type_pattern.h"
+#include "chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom.h"
 #include "components/prefs/testing_pref_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
+using ash::cellular_setup::mojom::ESimOperationResult;
+
 namespace ash {
 namespace {
 
@@ -36,6 +40,9 @@
 const char kDisableProfileResultHistogram[] =
     "Network.Cellular.ESim.DisableProfile.Result";
 
+constexpr base::TimeDelta kInteractiveDelay = base::Seconds(30);
+constexpr base::TimeDelta kInteractiveDelayHalf = kInteractiveDelay / 2;
+
 std::string CreateTestEuiccPath(int euicc_num) {
   return base::StringPrintf("%s%d", kTestEuiccBasePath, euicc_num);
 }
@@ -68,13 +75,11 @@
       const CellularESimProfileHandlerImplTest&) = delete;
 
  protected:
-  explicit CellularESimProfileHandlerImplTest(bool enable_dbus_migration)
+  explicit CellularESimProfileHandlerImplTest(
+      const std::vector<base::test::FeatureRef>& enabled_features,
+      const std::vector<base::test::FeatureRef>& disabled_features)
       : helper_(/*use_default_devices_and_services=*/false) {
-    if (enable_dbus_migration) {
-      feature_list_.InitAndEnableFeature(ash::features::kSmdsDbusMigration);
-    } else {
-      feature_list_.InitAndDisableFeature(ash::features::kSmdsDbusMigration);
-    }
+    feature_list_.InitWithFeatures(enabled_features, disabled_features);
   }
   ~CellularESimProfileHandlerImplTest() override = default;
 
@@ -161,6 +166,11 @@
     return path;
   }
 
+  void SetErrorForNextSetPropertyAttempt(const std::string& error_name) {
+    helper_.device_test()->SetErrorForNextSetPropertyAttempt(error_name);
+    base::RunLoop().RunUntilIdle();
+  }
+
   std::vector<CellularESimProfile> GetESimProfiles() {
     return handler_->GetESimProfiles();
   }
@@ -194,6 +204,10 @@
     return inhibit_lock;
   }
 
+  absl::optional<CellularInhibitor::InhibitReason> GetInhibitReason() {
+    return cellular_inhibitor_.GetInhibitReason();
+  }
+
   void QueueEuiccErrorStatus() {
     helper_.hermes_euicc_test()->QueueHermesErrorStatus(
         HermesResponseStatus::kErrorUnknown);
@@ -208,6 +222,13 @@
         std::move(inhibit_lock));
   }
 
+  void RequestAvailableProfiles(
+      int euicc_num,
+      CellularESimProfileHandler::RequestAvailableProfilesCallback callback) {
+    handler_->RequestAvailableProfiles(
+        dbus::ObjectPath(CreateTestEuiccPath(euicc_num)), std::move(callback));
+  }
+
   bool GetLastRefreshProfilesRestoreSlotArg() {
     return helper_.hermes_euicc_test()->GetLastRefreshProfilesRestoreSlotArg();
   }
@@ -236,6 +257,8 @@
     task_environment_.FastForwardBy(kProfileRefreshCallbackDelay);
   }
 
+  base::test::TaskEnvironment* task_environment() { return &task_environment_; }
+
  private:
   base::test::ScopedFeatureList feature_list_;
   base::test::TaskEnvironment task_environment_{
@@ -261,7 +284,8 @@
  protected:
   CellularESimProfileHandlerImplTest_DBusMigrationDisabled()
       : CellularESimProfileHandlerImplTest(
-            /*enable_dbus_migration=*/false) {}
+            /*enabled_features=*/{},
+            /*disabled_features=*/{ash::features::kSmdsDbusMigration}) {}
   ~CellularESimProfileHandlerImplTest_DBusMigrationDisabled() override =
       default;
 };
@@ -277,10 +301,49 @@
  protected:
   CellularESimProfileHandlerImplTest_DBusMigrationEnabled()
       : CellularESimProfileHandlerImplTest(
-            /*enable_dbus_migration=*/true) {}
+            /*enabled_features=*/{ash::features::kSmdsDbusMigration},
+            /*disabled_features=*/{}) {}
   ~CellularESimProfileHandlerImplTest_DBusMigrationEnabled() override = default;
 };
 
+class CellularESimProfileHandlerImplTest_SmdsSupportEnabled
+    : public CellularESimProfileHandlerImplTest {
+ public:
+  CellularESimProfileHandlerImplTest_SmdsSupportEnabled(
+      const CellularESimProfileHandlerImplTest_SmdsSupportEnabled&) = delete;
+  CellularESimProfileHandlerImplTest_SmdsSupportEnabled& operator=(
+      const CellularESimProfileHandlerImplTest_SmdsSupportEnabled&) = delete;
+
+ protected:
+  CellularESimProfileHandlerImplTest_SmdsSupportEnabled()
+      : CellularESimProfileHandlerImplTest(
+            /*enabled_features=*/{ash::features::kSmdsDbusMigration,
+                                  ash::features::kSmdsSupport},
+            /*disabled_features=*/{}) {}
+  ~CellularESimProfileHandlerImplTest_SmdsSupportEnabled() override = default;
+};
+
+class CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled
+    : public CellularESimProfileHandlerImplTest {
+ public:
+  CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled(
+      const CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled&) =
+      delete;
+  CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled& operator=(
+      const CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled&) =
+      delete;
+
+ protected:
+  CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled()
+      : CellularESimProfileHandlerImplTest(
+            /*enabled_features=*/{ash::features::kSmdsDbusMigration,
+                                  ash::features::kSmdsSupport,
+                                  ash::features::kUseStorkSmdsServerAddress},
+            /*disabled_features=*/{}) {}
+  ~CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled() override =
+      default;
+};
+
 TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, NoEuicc) {
   AddCellularDevice();
   // No EUICCs exist, so no profiles should exist.
@@ -1004,4 +1067,146 @@
                                      HermesResponseStatus::kSuccess,
                                      /*expected_count=*/1);
 }
+
+TEST_F(CellularESimProfileHandlerImplTest_SmdsSupportEnabled,
+       RequestAvailableProfiles) {
+  AddCellularDevice();
+  AddEuicc(/*euicc_num=*/1);
+  Init();
+  SetDevicePrefs();
+
+  HermesEuiccClient::Get()->GetTestInterface()->SetInteractiveDelay(
+      kInteractiveDelay);
+
+  absl::optional<ESimOperationResult> result;
+  absl::optional<std::vector<CellularESimProfile>> profile_list;
+
+  base::RunLoop run_loop;
+  RequestAvailableProfiles(
+      /*euicc_num=*/1,
+      base::BindLambdaForTesting(
+          [&](ESimOperationResult returned_result,
+              std::vector<CellularESimProfile> returned_profile_list) {
+            result = returned_result;
+            profile_list = returned_profile_list;
+            run_loop.Quit();
+          }));
+
+  task_environment()->FastForwardBy(kInteractiveDelayHalf);
+
+  const absl::optional<CellularInhibitor::InhibitReason> inhibit_reason =
+      GetInhibitReason();
+  ASSERT_TRUE(inhibit_reason);
+  EXPECT_EQ(inhibit_reason,
+            CellularInhibitor::InhibitReason::kRequestingAvailableProfiles);
+
+  EXPECT_FALSE(profile_list.has_value());
+
+  task_environment()->FastForwardBy(kInteractiveDelayHalf);
+  run_loop.Run();
+
+  EXPECT_FALSE(GetInhibitReason());
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(*result, cellular_setup::mojom::ESimOperationResult::kSuccess);
+
+  const std::vector<std::string> smds_activation_codes =
+      cellular_utils::GetSmdsActivationCodes();
+
+  ASSERT_TRUE(profile_list.has_value());
+  EXPECT_EQ(smds_activation_codes.size(), profile_list->size());
+
+  for (const auto& profile : *profile_list) {
+    EXPECT_NE(std::find(smds_activation_codes.begin(),
+                        smds_activation_codes.end(), profile.activation_code()),
+              smds_activation_codes.end());
+  }
+}
+
+TEST_F(CellularESimProfileHandlerImplTest_SmdsSupportEnabled,
+       RequestAvailableProfiles_FailToInhibit) {
+  AddCellularDevice();
+  AddEuicc(/*euicc_num=*/1);
+  Init();
+  SetDevicePrefs();
+
+  // The cellular device is inhibited by setting a device property. Simulate a
+  // failure to inhibit by making the next attempt to set a property fail.
+  SetErrorForNextSetPropertyAttempt("error_name");
+
+  absl::optional<ESimOperationResult> result;
+  absl::optional<std::vector<CellularESimProfile>> profile_list;
+
+  {
+    base::RunLoop run_loop;
+    RequestAvailableProfiles(
+        /*euicc_num=*/1,
+        base::BindLambdaForTesting(
+            [&](ESimOperationResult returned_result,
+                std::vector<CellularESimProfile> returned_profile_list) {
+              result = returned_result;
+              profile_list = returned_profile_list;
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(*result, cellular_setup::mojom::ESimOperationResult::kFailure);
+
+  ASSERT_TRUE(profile_list.has_value());
+  EXPECT_TRUE(profile_list->empty());
+
+  {
+    base::RunLoop run_loop;
+    RequestAvailableProfiles(
+        /*euicc_num=*/1,
+        base::BindLambdaForTesting(
+            [&](ESimOperationResult returned_result,
+                std::vector<CellularESimProfile> returned_profile_list) {
+              result = returned_result;
+              profile_list = returned_profile_list;
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+
+  EXPECT_EQ(result, cellular_setup::mojom::ESimOperationResult::kSuccess);
+  EXPECT_FALSE(profile_list->empty());
+}
+
+TEST_F(CellularESimProfileHandlerImplTest_SmdsSupportAndStorkEnabled,
+       RequestAvailableProfiles_Stork) {
+  AddCellularDevice();
+  AddEuicc(/*euicc_num=*/1);
+  Init();
+  SetDevicePrefs();
+
+  absl::optional<ESimOperationResult> result;
+  absl::optional<std::vector<CellularESimProfile>> profile_list;
+
+  base::RunLoop run_loop;
+  RequestAvailableProfiles(
+      /*euicc_num=*/1,
+      base::BindLambdaForTesting(
+          [&](ESimOperationResult returned_result,
+              std::vector<CellularESimProfile> returned_profile_list) {
+            result = returned_result;
+            profile_list = returned_profile_list;
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(*result, cellular_setup::mojom::ESimOperationResult::kSuccess);
+
+  const std::vector<std::string> smds_activation_codes =
+      cellular_utils::GetSmdsActivationCodes();
+
+  ASSERT_TRUE(profile_list.has_value());
+  ASSERT_EQ(1u, smds_activation_codes.size());
+  ASSERT_EQ(smds_activation_codes.size(), profile_list->size());
+  EXPECT_EQ(smds_activation_codes.front(),
+            profile_list->front().activation_code());
+}
+
 }  // namespace ash
diff --git a/chromeos/ash/components/network/cellular_inhibitor.cc b/chromeos/ash/components/network/cellular_inhibitor.cc
index e58c913..5936c0f 100644
--- a/chromeos/ash/components/network/cellular_inhibitor.cc
+++ b/chromeos/ash/components/network/cellular_inhibitor.cc
@@ -380,6 +380,9 @@
     case CellularInhibitor::InhibitReason::kDisablingProfile:
       stream << "[Disabling profile]";
       break;
+    case CellularInhibitor::InhibitReason::kRequestingAvailableProfiles:
+      stream << "[Requesting available profiles]";
+      break;
   }
   return stream;
 }
diff --git a/chromeos/ash/components/network/cellular_inhibitor.h b/chromeos/ash/components/network/cellular_inhibitor.h
index dd87b89..6a73b92 100644
--- a/chromeos/ash/components/network/cellular_inhibitor.h
+++ b/chromeos/ash/components/network/cellular_inhibitor.h
@@ -75,6 +75,7 @@
     kRefreshingProfileList,
     kResettingEuiccMemory,
     kDisablingProfile,
+    kRequestingAvailableProfiles,
   };
   friend std::ostream& operator<<(std::ostream& stream,
                                   const InhibitReason& state);
diff --git a/chromeos/ash/components/network/cellular_policy_handler.cc b/chromeos/ash/components/network/cellular_policy_handler.cc
index afcd4e4..35c6ba9 100644
--- a/chromeos/ash/components/network/cellular_policy_handler.cc
+++ b/chromeos/ash/components/network/cellular_policy_handler.cc
@@ -153,7 +153,8 @@
     return;
   }
 
-  absl::optional<dbus::ObjectPath> euicc_path = GetCurrentEuiccPath();
+  absl::optional<dbus::ObjectPath> euicc_path =
+      cellular_utils::GetCurrentEuiccPath();
   if (!euicc_path) {
     // Hermes may not be ready and available euicc list is empty. Wait for
     // AvailableEuiccListChanged notification to continue with installation.
diff --git a/chromeos/ash/components/network/cellular_utils.cc b/chromeos/ash/components/network/cellular_utils.cc
index 5a76b47..937da16 100644
--- a/chromeos/ash/components/network/cellular_utils.cc
+++ b/chromeos/ash/components/network/cellular_utils.cc
@@ -21,8 +21,15 @@
 
 namespace {
 
+// The activation code for the GSM Association SM-DS server.
+constexpr char kSmdsGsma[] = "1$lpa.ds.gsma.com$";
+// The activation code for the Stork SM-DS server.
+constexpr char kSmdsStork[] = "1$prod.smds.rsp.goog$";
+
 const char kNonShillCellularNetworkPathPrefix[] = "/non-shill-cellular/";
 
+}  // namespace
+
 base::flat_set<dbus::ObjectPath> GetProfilePathsFromEuicc(
     HermesEuiccClient::Properties* euicc_properties) {
   base::flat_set<dbus::ObjectPath> profile_paths;
@@ -99,7 +106,7 @@
   return esim_slot_to_eid;
 }
 
-}  // namespace
+namespace cellular_utils {
 
 std::vector<CellularESimProfile> GenerateProfilesFromHermes() {
   std::vector<CellularESimProfile> profiles;
@@ -176,4 +183,12 @@
   return use_second_euicc ? euicc_paths[1] : euicc_paths[0];
 }
 
+std::vector<std::string> GetSmdsActivationCodes() {
+  if (features::IsUseStorkSmdsServerAddressEnabled()) {
+    return {kSmdsStork};
+  }
+  return {kSmdsGsma};
+}
+
+}  // namespace cellular_utils
 }  // namespace ash
diff --git a/chromeos/ash/components/network/cellular_utils.h b/chromeos/ash/components/network/cellular_utils.h
index 88e81f24..48ab230 100644
--- a/chromeos/ash/components/network/cellular_utils.h
+++ b/chromeos/ash/components/network/cellular_utils.h
@@ -18,6 +18,8 @@
 
 class CellularESimProfile;
 
+namespace cellular_utils {
+
 // Generates a list of CellularESimProfile objects for all Hermes esim profile
 // objects available through its dbus clients. Note that this function returns
 // an empty array if CellularESimProfileHandler::RefreshProfileList has not
@@ -50,6 +52,12 @@
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
 absl::optional<dbus::ObjectPath> GetCurrentEuiccPath();
 
+// Returns the activation codes that should be used to scan for profiles that
+// are available for installation.
+COMPONENT_EXPORT(CHROMEOS_NETWORK)
+std::vector<std::string> GetSmdsActivationCodes();
+
+}  // namespace cellular_utils
 }  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_CELLULAR_UTILS_H_
diff --git a/chromeos/ash/components/network/cellular_utils_unittest.cc b/chromeos/ash/components/network/cellular_utils_unittest.cc
index 2edb8238..c19ae9e 100644
--- a/chromeos/ash/components/network/cellular_utils_unittest.cc
+++ b/chromeos/ash/components/network/cellular_utils_unittest.cc
@@ -45,19 +45,19 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(features::kCellularUseSecondEuicc);
   HermesManagerClient::Get()->GetTestInterface()->ClearEuiccs();
-  EXPECT_FALSE(GetCurrentEuiccPath());
+  EXPECT_FALSE(cellular_utils::GetCurrentEuiccPath());
   // Verify that use-second-euicc flag should be ignored when Hermes only
   // exposes only one Euicc.
   HermesManagerClient::Get()->GetTestInterface()->AddEuicc(
       dbus::ObjectPath(kTestEuiccPath), kTestEid, /*is_active=*/true,
       /*physical_slot=*/0);
-  EXPECT_EQ(kTestEuiccPath, GetCurrentEuiccPath()->value());
+  EXPECT_EQ(kTestEuiccPath, cellular_utils::GetCurrentEuiccPath()->value());
   // Verify that use-second-euicc flag should take effect when Hermes exposes
   // two Euicc(s).
   HermesManagerClient::Get()->GetTestInterface()->AddEuicc(
       dbus::ObjectPath(kTestEuiccPath2), kTestEid2, /*is_active=*/false,
       /*physical_slot=*/1);
-  EXPECT_EQ(kTestEuiccPath2, GetCurrentEuiccPath()->value());
+  EXPECT_EQ(kTestEuiccPath2, cellular_utils::GetCurrentEuiccPath()->value());
 }
 
 }  // namespace ash
diff --git a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
index 53c8c68a4..1e7058c 100644
--- a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
+++ b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
@@ -95,7 +95,7 @@
   if (!base::Contains(stub_iccid_and_eid_pairs_, iccid, &IccidEidPair::first))
     return false;
 
-  *service_path_out = GenerateStubCellularServicePath(iccid);
+  *service_path_out = cellular_utils::GenerateStubCellularServicePath(iccid);
   *guid_out = GetGuidForStubIccid(iccid);
   return true;
 }
diff --git a/chromeos/ash/components/network/network_connection_handler_impl.cc b/chromeos/ash/components/network/network_connection_handler_impl.cc
index bfbbe4d..3f3e04bc 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl.cc
+++ b/chromeos/ash/components/network/network_connection_handler_impl.cc
@@ -372,7 +372,8 @@
       // If the SIM is active and the active SIM is locked, we are attempting to
       // connect to a locked SIM. A SIM must be unlocked before a connection can
       // succeed.
-      if (cellular_device && IsSimPrimary(network->iccid(), cellular_device) &&
+      if (cellular_device &&
+          cellular_utils::IsSimPrimary(network->iccid(), cellular_device) &&
           cellular_device->IsSimLocked()) {
         InvokeConnectErrorCallback(service_path, std::move(error_callback),
                                    kErrorSimLocked);
diff --git a/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc b/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc
index 09582ae..ad838a2 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc
+++ b/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc
@@ -1205,7 +1205,7 @@
 
   // Connect to a stub path. Internally, this should wait until a connectable
   // Shill-backed service is created.
-  Connect(GenerateStubCellularServicePath(kTestIccid));
+  Connect(cellular_utils::GenerateStubCellularServicePath(kTestIccid));
 
   // Now, create a non-stub service and make it connectable.
   AddNonConnectableESimService();
@@ -1217,14 +1217,15 @@
 
   // A connection was requested to the stub service path, not the actual one.
   EXPECT_TRUE(network_connection_observer()->GetRequested(
-      GenerateStubCellularServicePath(kTestIccid)));
+      cellular_utils::GenerateStubCellularServicePath(kTestIccid)));
   EXPECT_FALSE(
       network_connection_observer()->GetRequested(kTestCellularServicePath));
 
   // However, the connection success was part of the actual service path, not
   // the stub one.
-  EXPECT_EQ(std::string(), network_connection_observer()->GetResult(
-                               GenerateStubCellularServicePath(kTestIccid)));
+  EXPECT_EQ(std::string(),
+            network_connection_observer()->GetResult(
+                cellular_utils::GenerateStubCellularServicePath(kTestIccid)));
   EXPECT_EQ(kSuccessResult,
             network_connection_observer()->GetResult(kTestCellularServicePath));
 }
@@ -1285,7 +1286,7 @@
 
   // Connect to a stub path. Internally, this should wait until a connectable
   // Shill-backed service is created.
-  Connect(GenerateStubCellularServicePath(kTestIccid));
+  Connect(cellular_utils::GenerateStubCellularServicePath(kTestIccid));
 
   // Now, Create a shill backed service for the same network.
   ShillManagerClient::Get()->GetTestInterface()->SetInteractiveDelay(
diff --git a/chromeos/ash/components/network/network_state.cc b/chromeos/ash/components/network/network_state.cc
index 44cbf72..e584c90 100644
--- a/chromeos/ash/components/network/network_state.cc
+++ b/chromeos/ash/components/network/network_state.cc
@@ -511,7 +511,8 @@
 }
 
 bool NetworkState::IsNonShillCellularNetwork() const {
-  return type() == shill::kTypeCellular && IsStubCellularServicePath(path());
+  return type() == shill::kTypeCellular &&
+         cellular_utils::IsStubCellularServicePath(path());
 }
 
 NetworkState::PortalState NetworkState::GetPortalState() const {
@@ -672,7 +673,7 @@
     const std::string& guid,
     bool is_managed,
     const std::string& cellular_device_path) {
-  std::string path = GenerateStubCellularServicePath(iccid);
+  std::string path = cellular_utils::GenerateStubCellularServicePath(iccid);
   auto new_state = std::make_unique<NetworkState>(path);
   new_state->set_type(shill::kTypeCellular);
   new_state->set_update_received();
diff --git a/chromeos/ash/components/network/network_state_handler_unittest.cc b/chromeos/ash/components/network/network_state_handler_unittest.cc
index b6410ca..fa75b85 100644
--- a/chromeos/ash/components/network/network_state_handler_unittest.cc
+++ b/chromeos/ash/components/network/network_state_handler_unittest.cc
@@ -2441,7 +2441,8 @@
   EXPECT_EQ(2u, network_list.size());
   EXPECT_EQ(1u, test_observer_->network_list_changed_count());
   EXPECT_EQ(1u, test_observer_->service_path_transitions().size());
-  EXPECT_EQ(GenerateStubCellularServicePath(kTestCellularServiceIccid2),
+  EXPECT_EQ(cellular_utils::GenerateStubCellularServicePath(
+                kTestCellularServiceIccid2),
             test_observer_->service_path_transitions()[0].first);
   EXPECT_EQ(kTestCellularServicePath2,
             test_observer_->service_path_transitions()[0].second);
diff --git a/chromeos/ash/components/network/stub_cellular_networks_provider.cc b/chromeos/ash/components/network/stub_cellular_networks_provider.cc
index b09cb22c..8b936ebe 100644
--- a/chromeos/ash/components/network/stub_cellular_networks_provider.cc
+++ b/chromeos/ash/components/network/stub_cellular_networks_provider.cc
@@ -101,7 +101,7 @@
     if (iccid_eid_pair.first != iccid)
       continue;
 
-    *service_path_out = GenerateStubCellularServicePath(iccid);
+    *service_path_out = cellular_utils::GenerateStubCellularServicePath(iccid);
     *guid_out = GetGuidForStubIccid(iccid);
     return true;
   }
diff --git a/chromeos/ash/components/network/stub_cellular_networks_provider_unittest.cc b/chromeos/ash/components/network/stub_cellular_networks_provider_unittest.cc
index 251f64e..1ee23726 100644
--- a/chromeos/ash/components/network/stub_cellular_networks_provider_unittest.cc
+++ b/chromeos/ash/components/network/stub_cellular_networks_provider_unittest.cc
@@ -125,7 +125,8 @@
     }
 
     EXPECT_TRUE(exists);
-    EXPECT_EQ(GenerateStubCellularServicePath(iccid), service_path);
+    EXPECT_EQ(cellular_utils::GenerateStubCellularServicePath(iccid),
+              service_path);
   }
 
   void DisableCellularTechnology() {
diff --git a/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc b/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc
index a5f9c2d..0340e740f 100644
--- a/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc
+++ b/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc
@@ -59,7 +59,7 @@
 
 void TestCellularESimProfileHandler::OnHermesPropertiesUpdated() {
   std::vector<CellularESimProfile> new_profile_states =
-      GenerateProfilesFromHermes();
+      cellular_utils::GenerateProfilesFromHermes();
   if (new_profile_states == esim_profile_states_)
     return;
   esim_profile_states_ = new_profile_states;
diff --git a/chromeos/ash/components/osauth/impl/BUILD.gn b/chromeos/ash/components/osauth/impl/BUILD.gn
index 8398dca..2a211225 100644
--- a/chromeos/ash/components/osauth/impl/BUILD.gn
+++ b/chromeos/ash/components/osauth/impl/BUILD.gn
@@ -19,6 +19,10 @@
     "//chromeos/ash/components/login/auth/public:authpublic",
   ]
   sources = [
+    "auth_hub_impl.cc",
+    "auth_hub_impl.h",
+    "auth_hub_mode_lifecycle.cc",
+    "auth_hub_mode_lifecycle.h",
     "auth_parts_impl.cc",
     "auth_parts_impl.h",
     "auth_session_storage_impl.cc",
@@ -31,12 +35,18 @@
   deps = [
     ":impl",
     "//base",
+    "//base/test:test_support",
     "//chromeos/ash/components/dbus/userdataauth",
     "//chromeos/ash/components/dbus/userdataauth:test_support",
     "//chromeos/ash/components/login/auth/public:authpublic",
+    "//chromeos/ash/components/osauth/test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/abseil-cpp:absl",
   ]
-  sources = [ "auth_session_storage_impl_unittest.cc" ]
+  sources = [
+    "auth_hub_impl_test.cc",
+    "auth_hub_mode_lifecycle_unittest.cc",
+    "auth_session_storage_impl_unittest.cc",
+  ]
 }
diff --git a/chromeos/ash/components/osauth/impl/auth_hub_impl.cc b/chromeos/ash/components/osauth/impl/auth_hub_impl.cc
new file mode 100644
index 0000000..2e9dd31
--- /dev/null
+++ b/chromeos/ash/components/osauth/impl/auth_hub_impl.cc
@@ -0,0 +1,41 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/ash/components/osauth/impl/auth_hub_impl.h"
+
+#include "base/functional/callback.h"
+#include "chromeos/ash/components/osauth/public/auth_factor_engine_factory.h"
+#include "chromeos/ash/components/osauth/public/auth_parts.h"
+
+namespace ash {
+
+AuthHubImpl::AuthHubImpl() {
+  mode_lifecycle_ = std::make_unique<AuthHubModeLifecycle>(this);
+}
+
+AuthHubImpl::~AuthHubImpl() = default;
+
+void AuthHubImpl::InitializeForMode(AuthHubMode target) {
+  mode_lifecycle_->SwitchToMode(target);
+}
+
+void AuthHubImpl::OnReadyForMode(
+    AuthHubMode mode,
+    AuthHubModeLifecycle::EnginesMap available_engines) {
+  on_initialized_listeners_.Notify();
+}
+
+void AuthHubImpl::OnExitedMode(AuthHubMode mode) {}
+
+void AuthHubImpl::OnModeShutdown() {}
+
+void AuthHubImpl::EnsureInitialized(base::OnceClosure on_initialized) {
+  if (mode_lifecycle_->IsReady()) {
+    std::move(on_initialized).Run();
+    return;
+  }
+  on_initialized_listeners_.AddUnsafe(std::move(on_initialized));
+}
+
+}  // namespace ash
diff --git a/chromeos/ash/components/osauth/impl/auth_hub_impl.h b/chromeos/ash/components/osauth/impl/auth_hub_impl.h
new file mode 100644
index 0000000..c336fe4
--- /dev/null
+++ b/chromeos/ash/components/osauth/impl/auth_hub_impl.h
@@ -0,0 +1,49 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_AUTH_HUB_IMPL_H_
+#define CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_AUTH_HUB_IMPL_H_
+
+#include <memory>
+
+#include "base/callback_list.h"
+#include "base/component_export.h"
+#include "base/containers/flat_map.h"
+#include "base/memory/weak_ptr.h"
+#include "chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h"
+#include "chromeos/ash/components/osauth/public/auth_factor_engine.h"
+#include "chromeos/ash/components/osauth/public/auth_hub.h"
+#include "chromeos/ash/components/osauth/public/common_types.h"
+
+namespace ash {
+
+class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) AuthHubImpl
+    : public AuthHub,
+      public AuthHubModeLifecycle::Owner {
+ public:
+  explicit AuthHubImpl();
+  ~AuthHubImpl() override;
+
+  // ----- AuthHub implementation:
+
+  // High-level lifecycle:
+  void InitializeForMode(AuthHubMode target) override;
+  void EnsureInitialized(base::OnceClosure on_initialized) override;
+
+  // ----- AuthHubModeLifecycle implementation:
+  void OnReadyForMode(
+      AuthHubMode mode,
+      AuthHubModeLifecycle::EnginesMap available_engines) override;
+  void OnExitedMode(AuthHubMode mode) override;
+  void OnModeShutdown() override;
+
+ private:
+  base::OnceCallbackList<void()> on_initialized_listeners_;
+  std::unique_ptr<AuthHubModeLifecycle> mode_lifecycle_;
+  base::WeakPtrFactory<AuthHubImpl> weak_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_AUTH_HUB_IMPL_H_
diff --git a/chromeos/ash/components/osauth/impl/auth_hub_impl_test.cc b/chromeos/ash/components/osauth/impl/auth_hub_impl_test.cc
new file mode 100644
index 0000000..fd23f6b
--- /dev/null
+++ b/chromeos/ash/components/osauth/impl/auth_hub_impl_test.cc
@@ -0,0 +1,78 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h"
+
+#include <memory>
+
+#include "base/functional/callback_helpers.h"
+#include "base/memory/raw_ptr.h"
+#include "base/test/gmock_callback_support.h"
+#include "base/test/gmock_move_support.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "chromeos/ash/components/osauth/impl/auth_hub_impl.h"
+#include "chromeos/ash/components/osauth/impl/auth_parts_impl.h"
+#include "chromeos/ash/components/osauth/public/auth_hub.h"
+#include "chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.h"
+#include "chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ash {
+
+constexpr AshAuthFactor kOneFactor = AshAuthFactor::kGaiaPassword;
+
+using base::test::RunOnceCallback;
+using testing::_;
+using testing::ByMove;
+using testing::Return;
+using testing::StrictMock;
+
+class AuthHubTestMode : public ::testing::Test {
+ protected:
+  AuthHubTestMode() {
+    parts_ = AuthPartsImpl::CreateTestInstance();
+    parts_->SetAuthHub(std::make_unique<AuthHubImpl>());
+
+    auto factory = std::make_unique<StrictMock<MockAuthFactorEngineFactory>>();
+    auto engine = std::make_unique<StrictMock<MockAuthFactorEngine>>();
+
+    engine_ = engine.get();
+
+    EXPECT_CALL(*factory, GetFactor()).WillRepeatedly(Return(kOneFactor));
+    EXPECT_CALL(*engine, GetFactor()).WillRepeatedly(Return(kOneFactor));
+    EXPECT_CALL(*factory, CreateEngine(_))
+        .WillOnce(Return(ByMove(std::move(engine))));
+
+    parts_->RegisterEngineFactory(std::move(factory));
+  }
+
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+
+  std::unique_ptr<AuthPartsImpl> parts_;
+
+  base::raw_ptr<MockAuthFactorEngine> engine_;
+};
+
+TEST_F(AuthHubTestMode, CheckEnsureInitialized) {
+  base::test::TestFuture<void> init_future;
+
+  AuthHub::Get()->EnsureInitialized(init_future.GetCallback());
+
+  AuthFactorEngine::CommonInitCallback init_callback;
+  EXPECT_CALL(*engine_, InitializeCommon(_))
+      .WillOnce(MoveArg<0>(&init_callback));
+
+  AuthHub::Get()->InitializeForMode(AuthHubMode::kLoginScreen);
+
+  EXPECT_FALSE(init_future.IsReady());
+
+  std::move(init_callback).Run(kOneFactor);
+
+  EXPECT_TRUE(init_future.IsReady());
+}
+
+}  // namespace ash
diff --git a/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.cc b/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.cc
new file mode 100644
index 0000000..29420025
--- /dev/null
+++ b/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.cc
@@ -0,0 +1,266 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h"
+
+#include "base/functional/callback.h"
+#include "base/logging.h"
+#include "base/ranges/algorithm.h"
+#include "base/time/time.h"
+#include "chromeos/ash/components/osauth/public/auth_factor_engine.h"
+#include "chromeos/ash/components/osauth/public/auth_factor_engine_factory.h"
+#include "chromeos/ash/components/osauth/public/auth_parts.h"
+
+namespace ash {
+namespace {
+
+#if !defined(NDEBUG)
+constexpr base::TimeDelta kWatchdogTimeout = base::Seconds(5);
+#else
+constexpr base::TimeDelta kWatchdogTimeout = base::Seconds(10);
+#endif
+
+enum class EngineStatus {
+  kStarting,
+  kStarted,
+  kFailed,
+  kShuttingDown,
+  kStopped
+};
+
+}  // namespace
+
+struct AuthHubModeLifecycle::EngineState {
+  std::unique_ptr<AuthFactorEngine> engine;
+  EngineStatus status;
+};
+
+AuthHubModeLifecycle::AuthHubModeLifecycle(AuthHubModeLifecycle::Owner* owner)
+    : owner_(owner) {}
+
+AuthHubModeLifecycle::~AuthHubModeLifecycle() = default;
+
+void AuthHubModeLifecycle::SwitchToMode(AuthHubMode target) {
+  CHECK_NE(target, AuthHubMode::kNone);
+  SwitchToModeImpl(target);
+}
+
+void AuthHubModeLifecycle::Shutdown() {
+  SwitchToModeImpl(AuthHubMode::kNone);
+}
+
+void AuthHubModeLifecycle::SwitchToModeImpl(AuthHubMode target) {
+  switch (stage_) {
+    case Stage::kUninitialized:
+      CHECK_EQ(mode_, AuthHubMode::kNone);
+      target_mode_ = target;
+      initializing_for_mode_ = target_mode_;
+      InitializeEnginesForMode();
+      break;
+    case Stage::kStarted:
+      CHECK_NE(mode_, AuthHubMode::kNone);
+      if (target != mode_) {
+        target_mode_ = target;
+        stage_ = Stage::kShuttingDownServices;
+        ShutDownEngines();
+      } else {
+        LOG(WARNING) << "Multiple initialization to " << mode_;
+      }
+      return;
+    case Stage::kStartingServices:
+      // Set up new target mode, but do not set initializing_for_mode_,
+      // it would trigger re-initialization.
+      target_mode_ = target;
+      break;
+    case Stage::kShuttingDownServices:
+      // Just update the target mode.
+      target_mode_ = target;
+      return;
+  }
+}
+
+void AuthHubModeLifecycle::InitializeEnginesForMode() {
+  CHECK(engines_.empty());
+  CHECK_NE(target_mode_, AuthHubMode::kNone);
+
+  for (const auto& factory : AuthParts::Get()->GetEngineFactories()) {
+    auto engine = factory->CreateEngine(target_mode_);
+    if (engine) {
+      AshAuthFactor factor = factory->GetFactor();
+      engines_[factor].engine = std::move(engine);
+      engines_[factor].status = EngineStatus::kStarting;
+    }
+  }
+
+  stage_ = Stage::kStartingServices;
+
+  watchdog_.Stop();
+  watchdog_.Start(
+      FROM_HERE, kWatchdogTimeout,
+      base::BindOnce(&AuthHubModeLifecycle::OnInitializationWatchdog,
+                     weak_factory_.GetWeakPtr()));
+
+  // TODO(b/277929602): metrics on initialization time.
+  for (const auto& engine_state : engines_) {
+    engine_state.second.engine->InitializeCommon(
+        base::BindOnce(&AuthHubModeLifecycle::OnAuthEngineInitialized,
+                       weak_factory_.GetWeakPtr()));
+  }
+}
+
+void AuthHubModeLifecycle::OnAuthEngineInitialized(AshAuthFactor factor) {
+  CHECK_EQ(stage_, Stage::kStartingServices);
+  engines_[factor].status = EngineStatus::kStarted;
+  CheckInitializationStatus();
+}
+
+void AuthHubModeLifecycle::OnInitializationWatchdog() {
+  CHECK_EQ(stage_, Stage::kStartingServices);
+  LOG(ERROR) << "Initialization watchdog triggered";
+  // Invalidate all initialization callbacks:
+  weak_factory_.InvalidateWeakPtrs();
+  for (auto& engine_state : engines_) {
+    if (engine_state.second.status == EngineStatus::kStarting) {
+      engine_state.second.status = EngineStatus::kFailed;
+      LOG(ERROR) << "Factor " << static_cast<int>(engine_state.first)
+                 << " did not initialize in time";
+      engine_state.second.engine->InitializationTimedOut();
+    }
+  }
+  CheckInitializationStatus();
+}
+
+void AuthHubModeLifecycle::CheckInitializationStatus() {
+  bool all_initialized = true;
+  for (const auto& engine_state : engines_) {
+    switch (engine_state.second.status) {
+      case EngineStatus::kStarting:
+        all_initialized = false;
+        break;
+      case EngineStatus::kStarted:
+      case EngineStatus::kFailed:
+        break;
+      case EngineStatus::kShuttingDown:
+      case EngineStatus::kStopped:
+        LOG(FATAL) << "Engine " << static_cast<int>(engine_state.first)
+                   << " is in invalid state "
+                   << static_cast<int>(engine_state.second.status);
+    }
+  }
+  if (all_initialized) {
+    watchdog_.Stop();
+
+    if (target_mode_ != initializing_for_mode_) {
+      // Trigger shutdown immediately; after shutdown is completed,
+      // `CheckShutdownStatus` will trigger re-initialization to target_mode_.
+      stage_ = Stage::kShuttingDownServices;
+      ShutDownEngines();
+      return;
+    }
+
+    initializing_for_mode_ = AuthHubMode::kNone;
+    mode_ = target_mode_;
+    stage_ = Stage::kStarted;
+
+    owner_->OnReadyForMode(mode_, GetAvailableEngines());
+  }
+}
+
+void AuthHubModeLifecycle::ShutDownEngines() {
+  CHECK_EQ(stage_, Stage::kShuttingDownServices);
+  for (auto& engine_state : engines_) {
+    engine_state.second.status = EngineStatus::kShuttingDown;
+  }
+
+  watchdog_.Stop();
+  watchdog_.Start(FROM_HERE, kWatchdogTimeout,
+                  base::BindOnce(&AuthHubModeLifecycle::OnShutdownWatchdog,
+                                 weak_factory_.GetWeakPtr()));
+
+  // TODO(b/277929602): metrics on shutdown time.
+  for (const auto& engine_state : engines_) {
+    engine_state.second.engine->ShutdownCommon(
+        base::BindOnce(&AuthHubModeLifecycle::OnAuthEngineShutdown,
+                       weak_factory_.GetWeakPtr()));
+  }
+}
+
+void AuthHubModeLifecycle::OnAuthEngineShutdown(AshAuthFactor factor) {
+  CHECK_EQ(stage_, Stage::kShuttingDownServices);
+
+  engines_[factor].status = EngineStatus::kStopped;
+
+  CheckShutdownStatus();
+}
+
+void AuthHubModeLifecycle::OnShutdownWatchdog() {
+  CHECK_EQ(stage_, Stage::kShuttingDownServices);
+  LOG(ERROR) << "Shutdown watchdog triggered";
+  // Invalidate all remaining shutdown callbacks:
+  weak_factory_.InvalidateWeakPtrs();
+
+  for (auto& engine_state : engines_) {
+    if (engine_state.second.status == EngineStatus::kShuttingDown) {
+      engine_state.second.status = EngineStatus::kFailed;
+      LOG(ERROR) << "Factor " << static_cast<int>(engine_state.first)
+                 << " did not shut down in time";
+      engine_state.second.engine->ShutdownTimedOut();
+    }
+  }
+  CheckShutdownStatus();
+}
+
+void AuthHubModeLifecycle::CheckShutdownStatus() {
+  CHECK_EQ(stage_, Stage::kShuttingDownServices);
+
+  bool all_stopped = true;
+  for (const auto& engine_state : engines_) {
+    switch (engine_state.second.status) {
+      case EngineStatus::kShuttingDown:
+        all_stopped = false;
+        break;
+      case EngineStatus::kStopped:
+      case EngineStatus::kFailed:
+        break;
+      case EngineStatus::kStarting:
+      case EngineStatus::kStarted:
+        LOG(FATAL) << "Engine " << static_cast<int>(engine_state.first)
+                   << " is in invalid state "
+                   << static_cast<int>(engine_state.second.status);
+    }
+  }
+
+  if (all_stopped) {
+    watchdog_.Stop();
+    engines_.clear();
+    if (mode_ != AuthHubMode::kNone) {
+      owner_->OnExitedMode(mode_);
+    }
+    mode_ = AuthHubMode::kNone;
+    stage_ = Stage::kUninitialized;
+    if (target_mode_ != AuthHubMode::kNone) {
+      initializing_for_mode_ = target_mode_;
+      InitializeEnginesForMode();
+    } else {
+      owner_->OnModeShutdown();
+    }
+  }
+}
+
+bool AuthHubModeLifecycle::IsReady() {
+  return stage_ == Stage::kStarted;
+}
+
+AuthHubModeLifecycle::EnginesMap AuthHubModeLifecycle::GetAvailableEngines() {
+  CHECK_EQ(stage_, Stage::kStarted);
+  AuthHubModeLifecycle::EnginesMap result;
+  for (const auto& engine_state : engines_) {
+    if (engine_state.second.status == EngineStatus::kStarted) {
+      result[engine_state.first] = engine_state.second.engine.get();
+    }
+  }
+  return result;
+}
+
+}  // namespace ash
diff --git a/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h b/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h
new file mode 100644
index 0000000..3553277
--- /dev/null
+++ b/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h
@@ -0,0 +1,111 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_AUTH_HUB_MODE_LIFECYCLE_H_
+#define CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_AUTH_HUB_MODE_LIFECYCLE_H_
+
+#include "base/callback_list.h"
+#include "base/containers/flat_map.h"
+#include "base/memory/weak_ptr.h"
+#include "base/timer/timer.h"
+#include "chromeos/ash/components/osauth/public/auth_factor_engine.h"
+#include "chromeos/ash/components/osauth/public/common_types.h"
+
+namespace ash {
+
+// This class manages outer lifecycle of the auth hub.
+// Outer lifecycle includes switching between AuthHub modes, and usually
+// would use the following route:
+// `kNone` -> `kLoginScreen` -> `kInSession` -> `kNone`, but there are
+// two notable exceptions:
+// * after in-session crash AuthHub would go `kNone` -> `kInSession`
+// * Until ChromeOS multi-profile is made obsolete by Lacros
+//   AuthHub would need to support `kInSession`->`kLoginScreen`->`kInSession`
+//   when showing/hiding "Add user" screen.
+// Each mode lifecycle includes:
+//  * Using `AuthFactorEngineFactory`-ies to create `AuthFactorEngine`s;
+//  * Calling `InitializeCommon(...)` for all engines and waiting for them to
+//    complete;
+//  * Running in given mode (outside the scope of this class)
+//  * Calling `ShutdownCommon(...)` for all engines and waiting for them to
+//    complete;
+//  * Destroying all engine instances;
+//  * Switching to another mode if necessary.
+class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) AuthHubModeLifecycle {
+ public:
+  using EnginesMap =
+      base::flat_map<AshAuthFactor, base::raw_ptr<AuthFactorEngine>>;
+
+  // Interface to interact with owning AuthHub:
+  class Owner {
+   public:
+    virtual void OnReadyForMode(AuthHubMode mode,
+                                EnginesMap available_engines) = 0;
+    virtual void OnExitedMode(AuthHubMode mode) = 0;
+    virtual void OnModeShutdown() = 0;
+    virtual ~Owner() = default;
+  };
+
+  explicit AuthHubModeLifecycle(Owner* owner);
+  ~AuthHubModeLifecycle();
+
+  bool IsReady();
+  EnginesMap GetAvailableEngines();
+
+  void SwitchToMode(AuthHubMode mode);
+  void Shutdown();
+
+ private:
+  enum class Stage {
+    kUninitialized,
+    kStartingServices,
+    kStarted,
+    kShuttingDownServices,
+  };
+
+  struct EngineState;
+
+  // Starts initialization sequence, or updates `target_mode_`, if stage is not
+  // `kUninitialized`, triggering `ShutDownEngines` if necessary.
+  void SwitchToModeImpl(AuthHubMode mode);
+
+  // Start initialization sequence.
+  void InitializeEnginesForMode();
+  // Called for each auth factor, would trigger `CheckInitializationStatus`.
+  void OnAuthEngineInitialized(AshAuthFactor factor);
+  // Ensures that shutdown sequence would eventually finish, triggers
+  // `CheckInitializationStatus`.
+  void OnInitializationWatchdog();
+  // Checks if initialization sequence is completed, notifies `owner_`.
+  // If there is a new `target_mode_`, would trigger `ShutDownEngines` without
+  // notifying `owner_`.
+  void CheckInitializationStatus();
+
+  // Starts shutdown sequence.
+  void ShutDownEngines();
+  // Called for each auth factor, would trigger `CheckShutdownStatus`.
+  void OnAuthEngineShutdown(AshAuthFactor factor);
+  // Ensures that shutdown sequence would eventually finish, triggers
+  // `CheckShutdownStatus`.
+  void OnShutdownWatchdog();
+  // Checks if shutdown sequence is completed, notifies `owner_`.
+  // If there is a new `target_mode_`, would trigger `InitializeEnginesForMode`.
+  void CheckShutdownStatus();
+
+  AuthHubMode mode_ = kNone;
+  AuthHubMode initializing_for_mode_ = kNone;
+  AuthHubMode target_mode_ = kNone;
+
+  Stage stage_ = Stage::kUninitialized;
+
+  base::flat_map<AshAuthFactor, EngineState> engines_;
+
+  base::OneShotTimer watchdog_;
+  base::raw_ptr<Owner> owner_;
+  base::WeakPtrFactory<AuthHubModeLifecycle> weak_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_AUTH_HUB_MODE_LIFECYCLE_H_
diff --git a/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle_unittest.cc b/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle_unittest.cc
new file mode 100644
index 0000000..b9cabc63
--- /dev/null
+++ b/chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle_unittest.cc
@@ -0,0 +1,329 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h"
+
+#include <memory>
+
+#include "base/functional/callback_helpers.h"
+#include "base/memory/raw_ptr.h"
+#include "base/test/gmock_callback_support.h"
+#include "base/test/gmock_move_support.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "chromeos/ash/components/osauth/impl/auth_hub_impl.h"
+#include "chromeos/ash/components/osauth/impl/auth_hub_mode_lifecycle.h"
+#include "chromeos/ash/components/osauth/impl/auth_parts_impl.h"
+#include "chromeos/ash/components/osauth/public/auth_hub.h"
+#include "chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.h"
+#include "chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ash {
+
+constexpr base::TimeDelta kLongTime = base::Minutes(1);
+constexpr AshAuthFactor kOneFactor = AshAuthFactor::kGaiaPassword;
+constexpr AshAuthFactor kAnotherFactor = AshAuthFactor::kLegacyPin;
+
+using base::test::RunOnceCallback;
+using testing::_;
+using testing::ByMove;
+using testing::Eq;
+using testing::Invoke;
+using testing::Mock;
+using testing::Return;
+using testing::StrictMock;
+
+class MockModeLifecycleOwner : public AuthHubModeLifecycle::Owner {
+ public:
+  MockModeLifecycleOwner() = default;
+  ~MockModeLifecycleOwner() override = default;
+
+  MOCK_METHOD(void,
+              OnReadyForMode,
+              (AuthHubMode, AuthHubModeLifecycle::EnginesMap),
+              (override));
+  MOCK_METHOD(void, OnExitedMode, (AuthHubMode), (override));
+  MOCK_METHOD(void, OnModeShutdown, (), (override));
+};
+
+class AuthHubModeLifecycleTest : public ::testing::Test {
+ protected:
+  AuthHubModeLifecycleTest() { parts_ = AuthPartsImpl::CreateTestInstance(); }
+
+  ~AuthHubModeLifecycleTest() override {}
+
+  void SetEngineExpectations(MockAuthFactorEngine* engine,
+                             AshAuthFactor factor,
+                             bool auto_init) {
+    EXPECT_CALL(*engine, GetFactor()).WillRepeatedly(Return(factor));
+    // Call or store initialization callback.
+    if (auto_init) {
+      EXPECT_CALL(*engine, InitializeCommon(_))
+          .WillOnce(RunOnceCallback<0>(factor));
+    } else {
+      EXPECT_CALL(*engine, InitializeCommon(_))
+          .WillOnce(
+              Invoke([&, factor](AuthFactorEngine::CommonInitCallback cb) {
+                init_callbacks_[factor] = std::move(cb);
+              }));
+    }
+  }
+
+  void ExpectLoginFactor(AshAuthFactor factor,
+                         bool auto_init = true,
+                         int times = 1) {
+    auto factory = std::make_unique<StrictMock<MockAuthFactorEngineFactory>>();
+    EXPECT_CALL(*factory, GetFactor()).WillRepeatedly(Return(factor));
+    EXPECT_CALL(*factory, CreateEngine(_))
+        .Times(times)
+        .WillRepeatedly(Invoke([&, auto_init, factor](AuthHubMode mode) {
+          auto engine = std::make_unique<StrictMock<MockAuthFactorEngine>>();
+          SetEngineExpectations(engine.get(), factor, auto_init);
+          engines_[factor] = engine.get();
+          return engine;
+        }));
+    parts_->RegisterEngineFactory(std::move(factory));
+  }
+
+  void ExpectSessionOnlyFactor(AshAuthFactor factor,
+                               bool auto_init = true,
+                               int times = 1) {
+    auto factory = std::make_unique<StrictMock<MockAuthFactorEngineFactory>>();
+    EXPECT_CALL(*factory, GetFactor()).WillRepeatedly(Return(factor));
+    EXPECT_CALL(*factory, CreateEngine(Eq(AuthHubMode::kInSession)))
+        .Times(times)
+        .WillRepeatedly(Invoke([&, auto_init, factor](AuthHubMode) {
+          auto engine = std::make_unique<StrictMock<MockAuthFactorEngine>>();
+          SetEngineExpectations(engine.get(), factor, auto_init);
+          engines_[factor] = engine.get();
+          return engine;
+        }));
+    ON_CALL(*factory, CreateEngine(Eq(AuthHubMode::kLoginScreen)))
+        .WillByDefault(Invoke([&](AuthHubMode) {
+          delete engines_[factor];
+          return std::unique_ptr<MockAuthFactorEngine>();
+        }));
+    parts_->RegisterEngineFactory(std::move(factory));
+  }
+
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+
+  std::unique_ptr<AuthPartsImpl> parts_;
+  StrictMock<MockModeLifecycleOwner> owner_;
+  AuthHubModeLifecycle lifecycle_{&owner_};
+  base::flat_map<AshAuthFactor, base::raw_ptr<MockAuthFactorEngine>> engines_;
+  base::flat_map<AshAuthFactor, AuthFactorEngine::CommonInitCallback>
+      init_callbacks_;
+};
+
+// Check when Owner is notified during initialization / shutdown.
+TEST_F(AuthHubModeLifecycleTest, SingleFactorInitShutdown) {
+  ExpectLoginFactor(kOneFactor, /*auto_init=*/false);
+
+  EXPECT_FALSE(lifecycle_.IsReady());
+  lifecycle_.SwitchToMode(AuthHubMode::kLoginScreen);
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  AuthHubModeLifecycle::EnginesMap engines;
+  EXPECT_CALL(owner_, OnReadyForMode(Eq(AuthHubMode::kLoginScreen), _))
+      .WillOnce(MoveArg<1>(&engines));
+
+  ASSERT_TRUE(init_callbacks_.contains(kOneFactor));
+  std::move(init_callbacks_[kOneFactor]).Run(kOneFactor);
+
+  // Should be notified now.
+  EXPECT_TRUE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  ASSERT_TRUE(engines.contains(kOneFactor));
+
+  AuthFactorEngine::ShutdownCallback callback;
+  EXPECT_CALL(*engines_[kOneFactor], ShutdownCommon(_))
+      .WillOnce(MoveArg<0>(&callback));
+
+  lifecycle_.Shutdown();
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  EXPECT_CALL(owner_, OnExitedMode(Eq(AuthHubMode::kLoginScreen)));
+  EXPECT_CALL(owner_, OnModeShutdown());
+
+  std::move(callback).Run(kOneFactor);
+
+  EXPECT_FALSE(lifecycle_.IsReady());
+}
+
+// Check owner notifications when shutdown is requested before all
+// engines have completed initialization.
+TEST_F(AuthHubModeLifecycleTest, SingleFactorShutdownEarly) {
+  ExpectLoginFactor(kOneFactor, /*auto_init=*/false);
+
+  EXPECT_FALSE(lifecycle_.IsReady());
+  lifecycle_.SwitchToMode(AuthHubMode::kLoginScreen);
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  ASSERT_TRUE(engines_.contains(kOneFactor));
+
+  AuthFactorEngine::ShutdownCallback callback;
+  EXPECT_CALL(*engines_[kOneFactor], ShutdownCommon(_))
+      .WillOnce(MoveArg<0>(&callback));
+
+  lifecycle_.Shutdown();
+
+  // Eventually engine initializes.
+  ASSERT_TRUE(init_callbacks_.contains(kOneFactor));
+  std::move(init_callbacks_[kOneFactor]).Run(kOneFactor);
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  // No OnReadyForMode / OnExitedMode.
+  EXPECT_CALL(owner_, OnModeShutdown());
+
+  ASSERT_FALSE(callback.is_null());
+  std::move(callback).Run(kOneFactor);
+
+  EXPECT_FALSE(lifecycle_.IsReady());
+}
+
+// Check owner notifications when initialization for another mode is requested
+// before all engines have completed initialization.
+TEST_F(AuthHubModeLifecycleTest, SingleFactorReInitialization) {
+  ExpectLoginFactor(kOneFactor, /*auto_init=*/false, /*times=*/2);
+
+  EXPECT_FALSE(lifecycle_.IsReady());
+  lifecycle_.SwitchToMode(AuthHubMode::kLoginScreen);
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  ASSERT_TRUE(engines_.contains(kOneFactor));
+
+  AuthFactorEngine::ShutdownCallback callback;
+  EXPECT_CALL(*engines_[kOneFactor], ShutdownCommon(_))
+      .WillOnce(MoveArg<0>(&callback));
+
+  lifecycle_.SwitchToMode(AuthHubMode::kInSession);
+
+  // Eventually engine initializes.
+  ASSERT_TRUE(init_callbacks_.contains(kOneFactor));
+  std::move(init_callbacks_[kOneFactor]).Run(kOneFactor);
+  init_callbacks_.erase(kOneFactor);
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  ASSERT_FALSE(callback.is_null());
+  std::move(callback).Run(kOneFactor);
+
+  // Should finish shutdown and proceed to initialization for second
+  // requested mode.
+  AuthHubModeLifecycle::EnginesMap engines;
+  EXPECT_CALL(owner_, OnReadyForMode(Eq(AuthHubMode::kInSession), _))
+      .WillOnce(MoveArg<1>(&engines));
+
+  ASSERT_TRUE(init_callbacks_.contains(kOneFactor));
+  std::move(init_callbacks_[kOneFactor]).Run(kOneFactor);
+
+  // Should be notified now.
+  EXPECT_TRUE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  ASSERT_TRUE(engines.contains(kOneFactor));
+}
+
+// Check logic when one of the engines takes too long to initialize.
+TEST_F(AuthHubModeLifecycleTest, FactorInitializationTimeout) {
+  ExpectLoginFactor(kOneFactor, /*auto_init=*/false);
+  ExpectLoginFactor(kAnotherFactor, /*auto_init=*/true);
+
+  EXPECT_FALSE(lifecycle_.IsReady());
+  lifecycle_.SwitchToMode(AuthHubMode::kLoginScreen);
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  ASSERT_TRUE(engines_.contains(kOneFactor));
+  ASSERT_TRUE(engines_.contains(kAnotherFactor));
+
+  EXPECT_CALL(*engines_[kOneFactor], InitializationTimedOut());
+
+  AuthHubModeLifecycle::EnginesMap engines;
+  EXPECT_CALL(owner_, OnReadyForMode(Eq(AuthHubMode::kLoginScreen), _))
+      .WillOnce(MoveArg<1>(&engines));
+
+  // Trigger timeout.
+  task_environment_.FastForwardBy(kLongTime);
+
+  // Should be notified now, with only kAnotherFactor factor as "Ready".
+  EXPECT_TRUE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  EXPECT_EQ(engines.size(), 1u);
+  ASSERT_TRUE(engines.contains(kAnotherFactor));
+
+  // Set shutdown expectations:
+  EXPECT_CALL(*engines_[kOneFactor], ShutdownCommon(_))
+      .WillOnce(RunOnceCallback<0>(kOneFactor));
+  EXPECT_CALL(*engines_[kAnotherFactor], ShutdownCommon(_))
+      .WillOnce(RunOnceCallback<0>(kAnotherFactor));
+
+  EXPECT_CALL(owner_, OnExitedMode(Eq(AuthHubMode::kLoginScreen)));
+  EXPECT_CALL(owner_, OnModeShutdown());
+
+  lifecycle_.Shutdown();
+}
+
+// Check logic when one of the engines takes too long to shut down.
+TEST_F(AuthHubModeLifecycleTest, FactorShutdownTimeout) {
+  ExpectLoginFactor(kOneFactor);
+  ExpectLoginFactor(kAnotherFactor);
+
+  AuthHubModeLifecycle::EnginesMap engines;
+  EXPECT_CALL(owner_, OnReadyForMode(Eq(AuthHubMode::kLoginScreen), _))
+      .WillOnce(MoveArg<1>(&engines));
+
+  lifecycle_.SwitchToMode(AuthHubMode::kLoginScreen);
+
+  EXPECT_TRUE(lifecycle_.IsReady());
+  EXPECT_EQ(engines.size(), 2u);
+
+  // Set shutdown expectations:
+  AuthFactorEngine::ShutdownCallback callback;
+  EXPECT_CALL(*engines_[kOneFactor], ShutdownCommon(_))
+      .WillOnce(MoveArg<0>(&callback));
+
+  EXPECT_CALL(*engines_[kAnotherFactor], ShutdownCommon(_))
+      .WillOnce(RunOnceCallback<0>(kAnotherFactor));
+
+  lifecycle_.Shutdown();
+
+  // Should not notify immediately.
+  EXPECT_FALSE(lifecycle_.IsReady());
+  Mock::VerifyAndClearExpectations(&owner_);
+
+  EXPECT_CALL(*engines_[kOneFactor], ShutdownTimedOut());
+  EXPECT_CALL(owner_, OnExitedMode(Eq(AuthHubMode::kLoginScreen)));
+  EXPECT_CALL(owner_, OnModeShutdown());
+
+  // Trigger timeout.
+  task_environment_.FastForwardBy(kLongTime);
+}
+
+}  // namespace ash
diff --git a/chromeos/ash/components/osauth/impl/auth_parts_impl.cc b/chromeos/ash/components/osauth/impl/auth_parts_impl.cc
index 0e41fb6b..cb4828b 100644
--- a/chromeos/ash/components/osauth/impl/auth_parts_impl.cc
+++ b/chromeos/ash/components/osauth/impl/auth_parts_impl.cc
@@ -10,6 +10,7 @@
 #include "base/check.h"
 #include "base/check_op.h"
 #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h"
+#include "chromeos/ash/components/osauth/impl/auth_hub_impl.h"
 #include "chromeos/ash/components/osauth/impl/auth_session_storage_impl.h"
 #include "chromeos/ash/components/osauth/public/auth_factor_engine_factory.h"
 #include "chromeos/ash/components/osauth/public/auth_parts.h"
@@ -54,6 +55,7 @@
 void AuthPartsImpl::CreateDefaultComponents() {
   session_storage_ =
       std::make_unique<AuthSessionStorageImpl>(UserDataAuthClient::Get());
+  auth_hub_ = std::make_unique<AuthHubImpl>();
 }
 
 AuthSessionStorage* AuthPartsImpl::GetAuthSessionStorage() {
@@ -61,6 +63,16 @@
   return session_storage_.get();
 }
 
+AuthHub* AuthPartsImpl::GetAuthHub() {
+  CHECK(auth_hub_);
+  return auth_hub_.get();
+}
+
+void AuthPartsImpl::SetAuthHub(std::unique_ptr<AuthHub> auth_hub) {
+  CHECK(!auth_hub_);
+  auth_hub_ = std::move(auth_hub);
+}
+
 void AuthPartsImpl::RegisterEngineFactory(
     std::unique_ptr<AuthFactorEngineFactory> factory) {
   engine_factories_.push_back(std::move(factory));
diff --git a/chromeos/ash/components/osauth/impl/auth_parts_impl.h b/chromeos/ash/components/osauth/impl/auth_parts_impl.h
index c721d290..44a3eb1 100644
--- a/chromeos/ash/components/osauth/impl/auth_parts_impl.h
+++ b/chromeos/ash/components/osauth/impl/auth_parts_impl.h
@@ -15,6 +15,10 @@
 
 namespace ash {
 
+class AuthFactorEngineFactory;
+class AuthHub;
+class AuthSessionStorage;
+
 class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) AuthPartsImpl
     : public AuthParts {
  public:
@@ -26,15 +30,20 @@
 
   // AuthParts implementation:
   AuthSessionStorage* GetAuthSessionStorage() override;
+  AuthHub* GetAuthHub() override;
   void RegisterEngineFactory(
       std::unique_ptr<AuthFactorEngineFactory> factory) override;
   const std::vector<std::unique_ptr<AuthFactorEngineFactory>>&
   GetEngineFactories() override;
 
+  // Test-related setters:
+  void SetAuthHub(std::unique_ptr<AuthHub> auth_hub);
+
  private:
   friend class AuthParts;
   void CreateDefaultComponents();
 
+  std::unique_ptr<AuthHub> auth_hub_;
   std::unique_ptr<AuthSessionStorage> session_storage_;
 
   std::vector<std::unique_ptr<AuthFactorEngineFactory>> engine_factories_;
diff --git a/chromeos/ash/components/osauth/public/BUILD.gn b/chromeos/ash/components/osauth/public/BUILD.gn
index b4b2411d..a1fd21d 100644
--- a/chromeos/ash/components/osauth/public/BUILD.gn
+++ b/chromeos/ash/components/osauth/public/BUILD.gn
@@ -18,6 +18,7 @@
     "auth_factor_engine.h",
     "auth_factor_engine_factory.h",
     "auth_factor_status_consumer.h",
+    "auth_hub.h",
     "auth_parts.h",
     "auth_session_storage.h",
     "common_types.h",
diff --git a/chromeos/ash/components/osauth/public/auth_factor_engine.h b/chromeos/ash/components/osauth/public/auth_factor_engine.h
index 0bb6116..bc4e72f 100644
--- a/chromeos/ash/components/osauth/public/auth_factor_engine.h
+++ b/chromeos/ash/components/osauth/public/auth_factor_engine.h
@@ -5,6 +5,7 @@
 #ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_FACTOR_ENGINE_H_
 #define CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_FACTOR_ENGINE_H_
 
+#include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "chromeos/ash/components/osauth/public/common_types.h"
 #include "components/account_id/account_id.h"
@@ -97,8 +98,8 @@
     kDisabled,                 // Discard authentication attempts.
   };
 
-  using CommonInitCallback = base::OnceClosure;
-  using ShutdownCallback = base::OnceClosure;
+  using CommonInitCallback = base::OnceCallback<void(AshAuthFactor)>;
+  using ShutdownCallback = base::OnceCallback<void(AshAuthFactor)>;
 
   virtual ~AuthFactorEngine() = default;
 
@@ -152,6 +153,11 @@
   // Relevant for factors like fingerprint, where in some
   // device orientations FP sensor can be used unintentionally.
   virtual bool IsOrientationRestricted() = 0;
+
+  // Engines might override these methods to gracefully handle
+  // timeout during relevant lifecycle operations.
+  virtual void InitializationTimedOut() {}
+  virtual void ShutdownTimedOut() {}
 };
 
 }  // namespace ash
diff --git a/chromeos/ash/components/osauth/public/auth_factor_engine_factory.h b/chromeos/ash/components/osauth/public/auth_factor_engine_factory.h
index ffde39c..ae157b9 100644
--- a/chromeos/ash/components/osauth/public/auth_factor_engine_factory.h
+++ b/chromeos/ash/components/osauth/public/auth_factor_engine_factory.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/component_export.h"
 #include "chromeos/ash/components/osauth/public/common_types.h"
 
 namespace ash {
diff --git a/chromeos/ash/components/osauth/public/auth_hub.h b/chromeos/ash/components/osauth/public/auth_hub.h
new file mode 100644
index 0000000..3afd7d38
--- /dev/null
+++ b/chromeos/ash/components/osauth/public/auth_hub.h
@@ -0,0 +1,40 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_HUB_H_
+#define CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_HUB_H_
+
+#include "base/component_export.h"
+#include "base/functional/callback.h"
+#include "chromeos/ash/components/osauth/public/auth_parts.h"
+#include "chromeos/ash/components/osauth/public/common_types.h"
+
+namespace ash {
+
+// Main entry point for ChromeOS local Authentication.
+class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) AuthHub {
+ public:
+  // Convenience method.
+  static inline AuthHub* Get() { return AuthParts::Get()->GetAuthHub(); }
+
+  // AuthHub is not initialized immediately after creation, to allow
+  // registering extra FactorEngines in AuthParts, so it starts in
+  // `AuthHubMode::kNone`.
+  //
+  // Usually AuthHub would go `kNone` -> `kLoginScreen` -> `kInSession`,
+  // but there are two exceptions:
+  // * after in-session crash AuthHub would go `kNone` -> `kInSession`;
+  // * Until ChromeOS multi-profile is made obsolette by Lacros
+  //   AuthHub would need to go `kInSession`->`kLoginScreen`->`kInSession`
+  //   when showing/hiding "Add user" screen.
+  virtual void InitializeForMode(AuthHubMode target) = 0;
+
+  virtual void EnsureInitialized(base::OnceClosure on_initialized) = 0;
+
+  virtual ~AuthHub() = default;
+};
+
+}  // namespace ash
+
+#endif  // CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_HUB_H_
diff --git a/chromeos/ash/components/osauth/public/auth_parts.h b/chromeos/ash/components/osauth/public/auth_parts.h
index edfc0c6..601fb94 100644
--- a/chromeos/ash/components/osauth/public/auth_parts.h
+++ b/chromeos/ash/components/osauth/public/auth_parts.h
@@ -12,6 +12,7 @@
 
 namespace ash {
 
+class AuthHub;
 class AuthSessionStorage;
 class AuthFactorEngineFactory;
 
@@ -33,6 +34,7 @@
   virtual ~AuthParts() = default;
 
   virtual AuthSessionStorage* GetAuthSessionStorage() = 0;
+  virtual AuthHub* GetAuthHub() = 0;
 
   virtual void RegisterEngineFactory(
       std::unique_ptr<AuthFactorEngineFactory> factory) = 0;
diff --git a/chromeos/ash/components/osauth/public/common_types.h b/chromeos/ash/components/osauth/public/common_types.h
index 80ad118..699fde5 100644
--- a/chromeos/ash/components/osauth/public/common_types.h
+++ b/chromeos/ash/components/osauth/public/common_types.h
@@ -58,7 +58,9 @@
 enum AuthHubMode {
   kNone,         // State before initialization
   kLoginScreen,  // Login screen, no profile data available.
-  kInSession     // In-session mode, user is fixed, but purposes might change.
+  kInSession     // In-session mode (including lock screen), user is fixed,
+                 // but purposes might change,
+
 };
 
 }  // namespace ash
diff --git a/chromeos/ash/components/osauth/test_support/BUILD.gn b/chromeos/ash/components/osauth/test_support/BUILD.gn
new file mode 100644
index 0000000..5cce5006
--- /dev/null
+++ b/chromeos/ash/components/osauth/test_support/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright 2023 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/chromeos/ui_mode.gni")
+import("//testing/test.gni")
+
+assert(is_chromeos_ash,
+       "Non-ChromeOS builds cannot depend on //chromeos/ash/components/osauth")
+
+static_library("test_support") {
+  defines = [ "IS_CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL" ]
+  public_deps = [ "//chromeos/ash/components/osauth/public" ]
+  testonly = true
+
+  deps = [
+    "//base",
+    "//base/test:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+  sources = [
+    "mock_auth_factor_engine.cc",
+    "mock_auth_factor_engine.h",
+    "mock_auth_factor_engine_factory.cc",
+    "mock_auth_factor_engine_factory.h",
+  ]
+}
diff --git a/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.cc b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.cc
new file mode 100644
index 0000000..5098de1
--- /dev/null
+++ b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.cc
@@ -0,0 +1,15 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.h"
+
+#include <memory>
+
+namespace ash {
+
+MockAuthFactorEngine::MockAuthFactorEngine() = default;
+
+MockAuthFactorEngine::~MockAuthFactorEngine() = default;
+
+}  // namespace ash
diff --git a/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.h b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.h
new file mode 100644
index 0000000..7e1596c
--- /dev/null
+++ b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine.h
@@ -0,0 +1,41 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_TEST_SUPPORT_MOCK_AUTH_FACTOR_ENGINE_H_
+#define CHROMEOS_ASH_COMPONENTS_OSAUTH_TEST_SUPPORT_MOCK_AUTH_FACTOR_ENGINE_H_
+
+#include "chromeos/ash/components/osauth/public/auth_factor_engine.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace ash {
+
+class MockAuthFactorEngine : public AuthFactorEngine {
+ public:
+  MockAuthFactorEngine();
+  MockAuthFactorEngine(const MockAuthFactorEngine&) = delete;
+  MockAuthFactorEngine& operator=(const MockAuthFactorEngine&) = delete;
+  ~MockAuthFactorEngine() override;
+
+  MOCK_METHOD(AshAuthFactor, GetFactor, (), (override));
+  MOCK_METHOD(void, InitializeCommon, (CommonInitCallback), (override));
+  MOCK_METHOD(void, ShutdownCommon, (ShutdownCallback), (override));
+  MOCK_METHOD(void,
+              StartAuthFlow,
+              (const AccountId&, AuthPurpose, FactorEngineObserver*),
+              (override));
+  MOCK_METHOD(void,
+              StopAuthFlow,
+              (const AccountId&, AuthPurpose, ShutdownCallback),
+              (override));
+  MOCK_METHOD(void, SetUsageAllowed, (UsageAllowed), (override));
+  MOCK_METHOD(bool, IsDisabledByPolicy, (), (override));
+  MOCK_METHOD(bool, IsLockedOut, (), (override));
+  MOCK_METHOD(bool, IsOrientationRestricted, (), (override));
+  MOCK_METHOD(void, InitializationTimedOut, (), (override));
+  MOCK_METHOD(void, ShutdownTimedOut, (), (override));
+};
+
+}  // namespace ash
+
+#endif  // CHROMEOS_ASH_COMPONENTS_OSAUTH_TEST_SUPPORT_MOCK_AUTH_FACTOR_ENGINE_H_
diff --git a/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.cc b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.cc
new file mode 100644
index 0000000..75ea3ad
--- /dev/null
+++ b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.cc
@@ -0,0 +1,13 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.h"
+
+namespace ash {
+
+MockAuthFactorEngineFactory::MockAuthFactorEngineFactory() = default;
+
+MockAuthFactorEngineFactory::~MockAuthFactorEngineFactory() = default;
+
+}  // namespace ash
diff --git a/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.h b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.h
new file mode 100644
index 0000000..17b4fa62
--- /dev/null
+++ b/chromeos/ash/components/osauth/test_support/mock_auth_factor_engine_factory.h
@@ -0,0 +1,34 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_TEST_SUPPORT_MOCK_AUTH_FACTOR_ENGINE_FACTORY_H_
+#define CHROMEOS_ASH_COMPONENTS_OSAUTH_TEST_SUPPORT_MOCK_AUTH_FACTOR_ENGINE_FACTORY_H_
+
+#include <memory>
+
+#include "chromeos/ash/components/osauth/public/auth_factor_engine.h"
+#include "chromeos/ash/components/osauth/public/auth_factor_engine_factory.h"
+#include "chromeos/ash/components/osauth/public/common_types.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace ash {
+
+class MockAuthFactorEngineFactory : public AuthFactorEngineFactory {
+ public:
+  MockAuthFactorEngineFactory();
+  MockAuthFactorEngineFactory(const MockAuthFactorEngineFactory&) = delete;
+  MockAuthFactorEngineFactory& operator=(const MockAuthFactorEngineFactory&) =
+      delete;
+  ~MockAuthFactorEngineFactory() override;
+
+  MOCK_METHOD(AshAuthFactor, GetFactor, (), (override));
+  MOCK_METHOD(std::unique_ptr<AuthFactorEngine>,
+              CreateEngine,
+              (AuthHubMode),
+              (override));
+};
+
+}  // namespace ash
+
+#endif  // CHROMEOS_ASH_COMPONENTS_OSAUTH_TEST_SUPPORT_MOCK_AUTH_FACTOR_ENGINE_FACTORY_H_
diff --git a/chromeos/ash/services/cellular_setup/ota_activator_impl.cc b/chromeos/ash/services/cellular_setup/ota_activator_impl.cc
index de63aa6..32aa54ea 100644
--- a/chromeos/ash/services/cellular_setup/ota_activator_impl.cc
+++ b/chromeos/ash/services/cellular_setup/ota_activator_impl.cc
@@ -224,7 +224,7 @@
   // SIM slots and SIM cards in external dongles.
   bool has_psim_slots = false;
   for (const CellularSIMSlotInfo& sim_slot_info :
-       GetSimSlotInfosWithUpdatedEid(cellular_device)) {
+       cellular_utils::GetSimSlotInfosWithUpdatedEid(cellular_device)) {
     if (sim_slot_info.eid.empty()) {
       has_psim_slots = true;
       iccid_ = sim_slot_info.iccid;
diff --git a/chromeos/ash/services/network_config/cros_network_config.cc b/chromeos/ash/services/network_config/cros_network_config.cc
index 75ce744..af838a1 100644
--- a/chromeos/ash/services/network_config/cros_network_config.cc
+++ b/chromeos/ash/services/network_config/cros_network_config.cc
@@ -468,7 +468,8 @@
       const DeviceState* cellular_device =
           network_state_handler->GetDeviceState(network->device_path());
       bool sim_is_primary =
-          cellular_device && IsSimPrimary(network->iccid(), cellular_device);
+          cellular_device &&
+          cellular_utils::IsSimPrimary(network->iccid(), cellular_device);
       cellular->sim_lock_enabled =
           sim_is_primary && cellular_device->sim_lock_enabled();
       cellular->sim_locked = sim_is_primary && cellular_device->IsSimLocked();
@@ -537,7 +538,8 @@
 std::vector<mojom::SIMInfoPtr> CellularSIMInfosToMojo(
     const DeviceState* device) {
   std::vector<mojom::SIMInfoPtr> sim_info_mojos;
-  for (const auto& sim_slot : GetSimSlotInfosWithUpdatedEid(device)) {
+  for (const auto& sim_slot :
+       cellular_utils::GetSimSlotInfosWithUpdatedEid(device)) {
     auto sim_info_mojo = mojom::SIMInfo::New();
     sim_info_mojo->slot_id = sim_slot.slot_id;
     sim_info_mojo->iccid = sim_slot.iccid;
@@ -591,6 +593,8 @@
       return mojom::InhibitReason::kResettingEuiccMemory;
     case CellularInhibitor::InhibitReason::kDisablingProfile:
       return mojom::InhibitReason::kDisablingProfile;
+    case CellularInhibitor::InhibitReason::kRequestingAvailableProfiles:
+      return mojom::InhibitReason::kRequestingAvailableProfiles;
   }
 }
 
diff --git a/chromeos/components/kcer/kcer.h b/chromeos/components/kcer/kcer.h
index 5bbd937..c9f3d93c 100644
--- a/chromeos/components/kcer/kcer.h
+++ b/chromeos/components/kcer/kcer.h
@@ -60,6 +60,7 @@
   kFailedToRemoveCertificate = 11,
   kKeyNotFound = 12,
   kFailedToGetKeyId = 13,
+  kFailedToWriteAttribute = 14,
 };
 
 // Handles for tokens on ChromeOS.
diff --git a/chromeos/components/kcer/kcer_impl.cc b/chromeos/components/kcer/kcer_impl.cc
index a6271939..3b684cc7 100644
--- a/chromeos/components/kcer/kcer_impl.cc
+++ b/chromeos/components/kcer/kcer_impl.cc
@@ -201,13 +201,13 @@
   }
 
   auto on_find_key_done =
-      base::BindOnce(&KcerImpl::DoesPrivateKeyExistWithKeyToken,
+      base::BindOnce(&KcerImpl::DoesPrivateKeyExistWithToken,
                      weak_factory_.GetWeakPtr(), std::move(callback));
   return FindKeyToken(/*allow_guessing=*/false,
                       /*key=*/std::move(key), std::move(on_find_key_done));
 }
 
-void KcerImpl::DoesPrivateKeyExistWithKeyToken(
+void KcerImpl::DoesPrivateKeyExistWithToken(
     DoesKeyExistCallback callback,
     base::expected<absl::optional<Token>, Error> find_key_result) {
   if (!find_key_result.has_value()) {
@@ -252,7 +252,37 @@
 void KcerImpl::SetKeyNickname(PrivateKeyHandle key,
                               std::string nickname,
                               StatusCallback callback) {
-  // TODO(244408716): Implement.
+  if (key.GetTokenInternal().has_value()) {
+    return SetKeyNicknameWithToken(std::move(nickname), std::move(callback),
+                                   std::move(key));
+  }
+
+  auto on_token_populated = base::BindOnce(
+      &KcerImpl::SetKeyNicknameWithToken, weak_factory_.GetWeakPtr(),
+      std::move(nickname), std::move(callback));
+  return PopulateTokenForKey(std::move(key), std::move(on_token_populated));
+}
+
+void KcerImpl::SetKeyNicknameWithToken(
+    std::string nickname,
+    StatusCallback callback,
+    base::expected<PrivateKeyHandle, Error> key_or_error) {
+  if (!key_or_error.has_value()) {
+    return std::move(callback).Run(base::unexpected(key_or_error.error()));
+  }
+  PrivateKeyHandle key = std::move(key_or_error).value();
+
+  const base::WeakPtr<KcerToken>& kcer_token =
+      GetToken(key.GetTokenInternal().value());
+  if (!kcer_token.MaybeValid()) {
+    return std::move(callback).Run(
+        base::unexpected(Error::kTokenIsNotAvailable));
+  }
+  token_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&KcerToken::SetKeyNickname, kcer_token, std::move(key),
+                     std::move(nickname),
+                     base::BindPostTaskToCurrentDefault(std::move(callback))));
 }
 
 void KcerImpl::SetKeyPermissions(PrivateKeyHandle key,
@@ -304,4 +334,31 @@
   }
 }
 
+void KcerImpl::PopulateTokenForKey(
+    PrivateKeyHandle key,
+    base::OnceCallback<void(base::expected<PrivateKeyHandle, Error>)>
+        callback) {
+  auto on_find_key_done =
+      base::BindOnce(&KcerImpl::PopulateTokenForKeyWithToken,
+                     weak_factory_.GetWeakPtr(), key, std::move(callback));
+  FindKeyToken(/*allow_guessing=*/true,
+               /*key=*/std::move(key), std::move(on_find_key_done));
+}
+
+void KcerImpl::PopulateTokenForKeyWithToken(
+    PrivateKeyHandle key,
+    base::OnceCallback<void(base::expected<PrivateKeyHandle, Error>)> callback,
+    base::expected<absl::optional<Token>, Error> find_key_result) {
+  if (!find_key_result.has_value()) {
+    return std::move(callback).Run(base::unexpected(find_key_result.error()));
+  }
+
+  if (!find_key_result.value().has_value()) {
+    return std::move(callback).Run(base::unexpected(Error::kKeyNotFound));
+  }
+
+  Token token = find_key_result.value().value();
+  return std::move(callback).Run(PrivateKeyHandle(token, std::move(key)));
+}
+
 }  // namespace kcer::internal
diff --git a/chromeos/components/kcer/kcer_impl.h b/chromeos/components/kcer/kcer_impl.h
index e30611e..c3aaa14 100644
--- a/chromeos/components/kcer/kcer_impl.h
+++ b/chromeos/components/kcer/kcer_impl.h
@@ -102,10 +102,26 @@
       base::OnceCallback<void(base::expected<absl::optional<Token>, Error>)>
           callback);
 
-  void DoesPrivateKeyExistWithKeyToken(
+  // Attempts to find the token for the `key` (guessing is allowed). Returns a
+  // PrivateKeyHandle with the token populated on success, an error on failure.
+  void PopulateTokenForKey(
+      PrivateKeyHandle key,
+      base::OnceCallback<void(base::expected<PrivateKeyHandle, Error>)>
+          callback);
+  void PopulateTokenForKeyWithToken(
+      PrivateKeyHandle key,
+      base::OnceCallback<void(base::expected<PrivateKeyHandle, Error>)>
+          callback,
+      base::expected<absl::optional<Token>, Error> find_key_result);
+
+  void DoesPrivateKeyExistWithToken(
       DoesKeyExistCallback callback,
       base::expected<absl::optional<Token>, Error> find_key_result);
 
+  void SetKeyNicknameWithToken(std::string nickname,
+                               StatusCallback callback,
+                               base::expected<PrivateKeyHandle, Error> key);
+
   // Task runner for the tokens. Can be nullptr if no tokens are available
   // to the current Kcer instance.
   scoped_refptr<base::TaskRunner> token_task_runner_;
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
index c9955a8c..84f128b65 100644
--- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom
+++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -156,7 +156,10 @@
   // Inhibited because the EUICC memory is being reset.
   kResettingEuiccMemory,
   // Inhibited because an eSIM profile is being disabled.
-  kDisablingProfile
+  kDisablingProfile,
+  // Inhibited because SM-DS scans are being performed to discover profiles
+  // available for this device.
+  kRequestingAvailableProfiles,
 };
 
 // Always-on VPN operating mode.
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc
index b26eb12..d0f0f277 100644
--- a/components/autofill/core/browser/autofill_type.cc
+++ b/components/autofill/core/browser/autofill_type.cc
@@ -61,6 +61,7 @@
     case ADDRESS_HOME_ADDRESS:
     case ADDRESS_HOME_ADDRESS_WITH_NAME:
     case ADDRESS_HOME_FLOOR:
+    case ADDRESS_HOME_LANDMARK:
       return FieldTypeGroup::kAddressHome;
 
     case CREDIT_CARD_NAME_FULL:
diff --git a/components/autofill/core/browser/data_model/autofill_profile.cc b/components/autofill/core/browser/data_model/autofill_profile.cc
index 21d6917..d976c31 100644
--- a/components/autofill/core/browser/data_model/autofill_profile.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile.cc
@@ -421,6 +421,7 @@
       ADDRESS_HOME_ZIP,
       ADDRESS_HOME_SORTING_CODE,
       ADDRESS_HOME_COUNTRY,
+      ADDRESS_HOME_LANDMARK,
       ADDRESS_HOME_HOUSE_NUMBER,
       ADDRESS_HOME_STREET_NAME,
       ADDRESS_HOME_DEPENDENT_STREET_NAME,
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc
index ff3b70cc..71b4600 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc
@@ -25,6 +25,7 @@
 using autofill::ADDRESS_HOME_CITY;
 using autofill::ADDRESS_HOME_COUNTRY;
 using autofill::ADDRESS_HOME_DEPENDENT_LOCALITY;
+using autofill::ADDRESS_HOME_LANDMARK;
 using autofill::ADDRESS_HOME_LINE1;
 using autofill::ADDRESS_HOME_LINE2;
 using autofill::ADDRESS_HOME_LINE3;
@@ -190,6 +191,13 @@
     return profile;
   }
 
+  AutofillProfile CreateProfileWithLandmark(const char* landmark) {
+    AutofillProfile profile;
+    profile.SetRawInfo(autofill::ADDRESS_HOME_LANDMARK,
+                       base::UTF8ToUTF16(landmark));
+    return profile;
+  }
+
   AutofillProfile CopyAndModify(
       const AutofillProfile& profile,
       const std::vector<std::pair<ServerFieldType, const char16_t*>>& updates) {
@@ -302,6 +310,8 @@
               actual.GetInfo(AutofillType(ADDRESS_HOME_ZIP), kLocale));
     EXPECT_EQ(expected.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), kLocale),
               actual.GetInfo(AutofillType(ADDRESS_HOME_COUNTRY), kLocale));
+    EXPECT_EQ(expected.GetInfo(AutofillType(ADDRESS_HOME_LANDMARK), kLocale),
+              actual.GetInfo(AutofillType(ADDRESS_HOME_LANDMARK), kLocale));
 
     if (check_structured_address_tokens) {
       EXPECT_EQ(expected.GetInfo(
@@ -1180,6 +1190,16 @@
   }
 }
 
+TEST_F(AutofillProfileComparatorTest, MergeLandmarks) {
+  AutofillProfile empty = CreateProfileWithLandmark("");
+  AutofillProfile profile2 = CreateProfileWithLandmark("Red tree");
+
+  Address expected;
+  expected.SetRawInfo(ADDRESS_HOME_LANDMARK, u"Red tree");
+
+  MergeAddressesAndExpect(empty, profile2, expected);
+}
+
 // Checks for various scenarios for determining mergeability of profiles w.r.t.
 // the state.
 TEST_F(AutofillProfileComparatorTest, CheckStatesMergeability) {
diff --git a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
index 80162879..2d0e3a36 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
@@ -1226,6 +1226,7 @@
       ADDRESS_HOME_ZIP,
       ADDRESS_HOME_SORTING_CODE,
       ADDRESS_HOME_COUNTRY,
+      ADDRESS_HOME_LANDMARK,
       ADDRESS_HOME_HOUSE_NUMBER,
       ADDRESS_HOME_STREET_NAME,
       ADDRESS_HOME_DEPENDENT_STREET_NAME,
@@ -1273,11 +1274,13 @@
   EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
   EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP));
   EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER));
+  EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_LANDMARK));
 
   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, u"US");
   EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
   EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP));
   EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER));
+  EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_LANDMARK));
 
   profile.SetRawInfo(ADDRESS_HOME_STATE, u"C");
   EXPECT_TRUE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE));
@@ -1327,6 +1330,13 @@
   EXPECT_EQ(u"\tuser@example.com    ", profile.GetRawInfo(EMAIL_ADDRESS));
 }
 
+TEST(AutofillProfileTest, SetRawInfoWorksForLandmark) {
+  AutofillProfile profile;
+
+  profile.SetRawInfo(ADDRESS_HOME_LANDMARK, u"Red tree");
+  EXPECT_EQ(u"Red tree", profile.GetRawInfo(ADDRESS_HOME_LANDMARK));
+}
+
 TEST(AutofillProfileTest, SetInfoTrimsWhitespace) {
   AutofillProfile profile;
   profile.SetInfo(EMAIL_ADDRESS, u"\tuser@example.com    ", "en-US");
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.cc b/components/autofill/core/browser/data_model/autofill_structured_address.cc
index 1f77642b..727aaf2 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address.cc
@@ -380,6 +380,13 @@
 
 SortingCodeNode::~SortingCodeNode() = default;
 
+LandmarkNode::LandmarkNode(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_LANDMARK,
+                       parent,
+                       MergeMode::kReplaceEmpty | kReplaceSubset) {}
+
+LandmarkNode::~LandmarkNode() = default;
+
 AddressNode::AddressNode() : AddressNode(nullptr) {}
 
 AddressNode::AddressNode(const AddressNode& other) : AddressNode() {
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.h b/components/autofill/core/browser/data_model/autofill_structured_address.h
index f1d3bfa..1dab96a8 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address.h
@@ -217,6 +217,13 @@
   ~SortingCodeNode() override;
 };
 
+// Stores the landmark of an address profile.
+class LandmarkNode : public AddressComponent {
+ public:
+  explicit LandmarkNode(AddressComponent* parent);
+  ~LandmarkNode() override;
+};
+
 // Stores the overall Address that contains the StreetAddress, the PostalCode
 // the City, the State and the CountryCode.
 class AddressNode : public AddressComponent {
@@ -241,6 +248,7 @@
   CityNode city_{this};
   StateNode state_{this};
   CountryCodeNode country_code_{this};
+  LandmarkNode landmark_code_{this};
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc
index 2493002..f3ed46e 100644
--- a/components/autofill/core/browser/data_model/credit_card.cc
+++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -868,7 +868,7 @@
   // cards matches.
   if (record_type() == MASKED_SERVER_CARD ||
       other.record_type() == MASKED_SERVER_CARD) {
-    bool last_four_digits_match = LastFourDigits() == other.LastFourDigits();
+    bool last_four_digits_match = HasSameNumberAs(other);
 
     bool months_match = expiration_month() == other.expiration_month() ||
                         expiration_month() == 0 ||
@@ -880,6 +880,15 @@
     return last_four_digits_match && months_match && years_match;
   }
 
+  return HasSameNumberAs(other);
+}
+
+bool CreditCard::HasSameNumberAs(const CreditCard& other) const {
+  if (record_type() == CreditCard::MASKED_SERVER_CARD ||
+      other.record_type() == CreditCard::MASKED_SERVER_CARD) {
+    return LastFourDigits() == other.LastFourDigits();
+  }
+
   return StripSeparators(number_) == StripSeparators(other.number_);
 }
 
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h
index 199dfb0..a486ede 100644
--- a/components/autofill/core/browser/data_model/credit_card.h
+++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -235,6 +235,13 @@
   // four digits and expiration dates.
   [[nodiscard]] bool MatchingCardDetails(const CreditCard& other) const;
 
+  // Returns true based on the following criteria:
+  // 1) If `this` or `other` is a masked server card, this function returns true
+  //    if `other` has the same last four digits as `this`.
+  // 2) Otherwise, this function returns true if `other` has the same full card
+  //    number as `this`.
+  [[nodiscard]] bool HasSameNumberAs(const CreditCard& other) const;
+
   // Equality operators compare GUIDs, origins, and the contents.
   // Usage metadata (use count, use date, modification date) are NOT compared.
   bool operator==(const CreditCard& credit_card) const;
diff --git a/components/autofill/core/browser/data_model/credit_card_unittest.cc b/components/autofill/core/browser/data_model/credit_card_unittest.cc
index 5394470..5017eb1 100644
--- a/components/autofill/core/browser/data_model/credit_card_unittest.cc
+++ b/components/autofill/core/browser/data_model/credit_card_unittest.cc
@@ -574,6 +574,37 @@
   EXPECT_NE(full_metadata.use_date, full_card.use_date());
 }
 
+// Test that if one of the two compared cards is masked server card,
+// `HasSameNumberAs` returns true if the last four are the same. For all the
+// other comparing card types (none of them is masked server card),
+// `HasSameNumberAs` returns true if the full card number are the same.
+TEST(CreditCardTest, HasSameNumberAs) {
+  // Creates three types (local card, masked server card and full server card)
+  // of credit cards with the same number.
+  CreditCard local_card = test::GetCreditCard();
+  CreditCard masked_server_card = test::GetMaskedServerCardVisa();
+  CreditCard full_server_card = test::GetFullServerCard();
+
+  // Verify that card number is the same for all combinations of card type.
+  EXPECT_TRUE(local_card.HasSameNumberAs(local_card));
+  EXPECT_TRUE(local_card.HasSameNumberAs(masked_server_card));
+  EXPECT_TRUE(local_card.HasSameNumberAs(full_server_card));
+  EXPECT_TRUE(masked_server_card.HasSameNumberAs(masked_server_card));
+  EXPECT_TRUE(masked_server_card.HasSameNumberAs(full_server_card));
+  EXPECT_TRUE(full_server_card.HasSameNumberAs(full_server_card));
+
+  // Update the local card and full server card number to a different number but
+  // all the three credit cards are with same last four.
+  local_card.SetRawInfo(CREDIT_CARD_NUMBER, u"4111 1111 0006 1111");
+  full_server_card.SetRawInfo(CREDIT_CARD_NUMBER, u"4111 1111 2226 1111");
+
+  // Verify that only last 4 is compared if one of the compared cards is a
+  // masked server card; for all other types, full card number is compared.
+  EXPECT_TRUE(local_card.HasSameNumberAs(masked_server_card));
+  EXPECT_FALSE(local_card.HasSameNumberAs(full_server_card));
+  EXPECT_TRUE(masked_server_card.HasSameNumberAs(full_server_card));
+}
+
 struct SetExpirationYearFromStringTestCase {
   std::string expiration_year;
   int expected_year;
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc
index 6d753649..54e38844 100644
--- a/components/autofill/core/browser/field_types.cc
+++ b/components/autofill/core/browser/field_types.cc
@@ -106,7 +106,8 @@
          {"CREDIT_CARD_STANDALONE_VERIFICATION_CODE",
           CREDIT_CARD_STANDALONE_VERIFICATION_CODE},
          {"NUMERIC_QUANTITY", NUMERIC_QUANTITY},
-         {"ONE_TIME_CODE", ONE_TIME_CODE}});
+         {"ONE_TIME_CODE", ONE_TIME_CODE},
+         {"ADDRESS_HOME_LANDMARK", ADDRESS_HOME_LANDMARK}});
 
 ServerFieldType ToSafeServerFieldType(
     std::underlying_type_t<ServerFieldType> raw_value,
@@ -129,8 +130,8 @@
            !(67 <= t && t <= 72) &&
            // Fax numbers (values [20,24]) are deprecated.
            !(20 <= t && t <= 24) &&
-           // Reserved for server-side only use.
-           t != 127 && !(130 <= t && t <= 153);
+           // Reserved for server-side only use. Except 136.
+           t != 127 && (t == 136 || !(130 <= t && t <= 153));
   };
   return IsValid(raw_value) ? static_cast<ServerFieldType>(raw_value)
                             : fallback_value;
@@ -182,6 +183,7 @@
     case ADDRESS_HOME_ADDRESS:
     case ADDRESS_HOME_ADDRESS_WITH_NAME:
     case ADDRESS_HOME_FLOOR:
+    case ADDRESS_HOME_LANDMARK:
       return true;
 
     case CREDIT_CARD_NAME_FULL:
@@ -423,6 +425,8 @@
       return "CREDIT_CARD_STANDALONE_VERIFICATION_CODE";
     case ONE_TIME_CODE:
       return "ONE_TIME_CODE";
+    case ADDRESS_HOME_LANDMARK:
+      return "ADDRESS_HOME_LANDMARK";
     case MAX_VALID_FIELD_TYPE:
       return "";
   }
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h
index 530e26b..a3f1748 100644
--- a/components/autofill/core/browser/field_types.h
+++ b/components/autofill/core/browser/field_types.h
@@ -361,7 +361,11 @@
   // One-time code used for verifying user identity.
   ONE_TIME_CODE = 129,
 
-  // Reserved for a server-side-only use: 130-153
+  // A well-known object or feature of the landscape that can easily be
+  // recognized to understand where the building is situated.
+  ADDRESS_HOME_LANDMARK = 136,
+
+  // Reserved for a server-side-only use: 130-153. Except 136.
 
   // No new types can be added without a corresponding change to the Autofill
   // server.
diff --git a/components/autofill/core/browser/field_types_unittest.cc b/components/autofill/core/browser/field_types_unittest.cc
index a59e7d7..e8c650e 100644
--- a/components/autofill/core/browser/field_types_unittest.cc
+++ b/components/autofill/core/browser/field_types_unittest.cc
@@ -107,6 +107,7 @@
       BIRTHDATE_4_DIGIT_YEAR,
       NUMERIC_QUANTITY,
       ONE_TIME_CODE,
+      ADDRESS_HOME_LANDMARK,
   };
   ServerFieldType kInvalidValue = static_cast<ServerFieldType>(123456);
   ASSERT_FALSE(kValidFieldTypes.count(kInvalidValue));
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index b452da8..2818261 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -119,6 +119,7 @@
   GROUP_UNKNOWN_TYPE,
   GROUP_BIRTHDATE,
   GROUP_IBAN,
+  GROUP_ADDRESS_HOME_LANDMARK,
   // Add new entries here and update enums.xml.
   NUM_FIELD_TYPE_GROUPS_FOR_METRICS
 };
@@ -240,6 +241,9 @@
         case ADDRESS_HOME_FLOOR:
           group = GROUP_ADDRESS_HOME_FLOOR;
           break;
+        case ADDRESS_HOME_LANDMARK:
+          group = GROUP_ADDRESS_HOME_LANDMARK;
+          break;
         case UNKNOWN_TYPE:
           group = GROUP_UNKNOWN_TYPE;
           break;
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
index fc09ea6..2e322c6 100644
--- a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
@@ -94,7 +94,16 @@
   // If this test fails after adding a type, update
   // `AutofillPredictionsComparisonResult` in tools/metrics/histograms/enums.xml
   // and set `last_known_type` to the last entry in the enum.
-  constexpr ServerFieldType last_known_type = ONE_TIME_CODE;
+  ServerFieldType last_known_type = MAX_VALID_FIELD_TYPE;
+  for (int type_int = MAX_VALID_FIELD_TYPE - 1; type_int >= NO_SERVER_DATA;
+       type_int--) {
+    auto type = ToSafeServerFieldType(type_int, MAX_VALID_FIELD_TYPE);
+    if (type != MAX_VALID_FIELD_TYPE) {
+      last_known_type = type;
+      break;
+    }
+  }
+
   int max_comparison =
       GetShadowPrediction(last_known_type, NAME_FIRST, {NAME_LAST});
 
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
index 365e74c..5cbf089 100644
--- a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
+++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
@@ -686,8 +686,8 @@
   }
 
   for (const base::Value& key_info : *key_info_list) {
-    if (!key_info.is_dict() ||
-        !key_info.GetDict().FindString("credential_id")) {
+    auto* dict = key_info.GetIfDict();
+    if (!dict || !dict->FindString("credential_id")) {
       return false;
     }
   }
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerFeatureList.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerFeatureList.java
index 3f7217881..b221915 100644
--- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerFeatureList.java
+++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerFeatureList.java
@@ -7,14 +7,12 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Contacts Picker features.
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("browser_ui")
-@MainDex
 public class ContactsPickerFeatureList {
     public static final String CONTACTS_PICKER_SELECT_ALL = "ContactsPickerSelectAll";
 
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogFeatureList.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogFeatureList.java
index 07d1aae..7e4c4bf 100644
--- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogFeatureList.java
+++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogFeatureList.java
@@ -7,14 +7,12 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Modaldialog features.
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("browser_ui")
-@MainDex
 public class ModalDialogFeatureList {
     public static final String MODALDIALOG_BUTTON_PROTECTION = "ModalDialogButtonProtection";
 
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/TestImageDecoderService.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/TestImageDecoderService.java
index e4cfa1d..49c758b2 100644
--- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/TestImageDecoderService.java
+++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/TestImageDecoderService.java
@@ -9,12 +9,10 @@
 import android.os.IBinder;
 
 import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * A service to accept requests to take image file contents and decode them, used for tests.
  */
-@MainDex
 public class TestImageDecoderService extends Service {
     private final ImageDecoder mDecoder = new ImageDecoder();
 
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsFeatureList.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsFeatureList.java
index 1f72fd6..5fea5b1 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsFeatureList.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsFeatureList.java
@@ -7,14 +7,12 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Site Settings features.
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("browser_ui")
-@MainDex
 public class SiteSettingsFeatureList {
     public static final String SITE_DATA_IMPROVEMENTS = "SiteDataImprovements";
     public static final String REQUEST_DESKTOP_SITE_EXCEPTIONS_DOWNGRADE =
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn
index 6045020..afc2e867 100644
--- a/components/browser_ui/widget/android/BUILD.gn
+++ b/components/browser_ui/widget/android/BUILD.gn
@@ -128,7 +128,6 @@
     "//components/browser_ui/styles/android:java",
     "//components/browser_ui/util/android:java",
     "//components/embedder_support/android:util_java",
-    "//third_party/android_deps:com_android_support_support_annotations_java",
     "//third_party/android_deps:material_design_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_appcompat_appcompat_java",
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeTransitionDrawable.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeTransitionDrawable.java
index 99490ea..c94dd6f 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeTransitionDrawable.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeTransitionDrawable.java
@@ -13,10 +13,11 @@
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.TransitionDrawable;
 import android.graphics.drawable.VectorDrawable;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
 import android.util.IntProperty;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
 import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener;
 import org.chromium.components.browser_ui.widget.animation.Interpolators;
 
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 05a24fa..c095416 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "20.65",
-  "log_list_timestamp": "2023-05-07T12:54:15Z",
+  "version": "20.66",
+  "log_list_timestamp": "2023-05-08T12:55:07Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/commerce/core/internals/resources/commerce_internals.ts b/components/commerce/core/internals/resources/commerce_internals.ts
index a21117a..05ce037 100644
--- a/components/commerce/core/internals/resources/commerce_internals.ts
+++ b/components/commerce/core/internals/resources/commerce_internals.ts
@@ -31,8 +31,14 @@
 
 function seeEligibleDetails() {
   getProxy().getShoppingListEligibleDetails().then(({detail}) => {
-    const ul = document.createElement('ul');
+    const element = getRequiredElement('shopping-list-eligible-details');
+    getRequiredElement('shopping-list-eligible-see-details-btn').innerText =
+        'Refresh';
+    while (element.hasChildNodes()) {
+      element.removeChild(element.firstElementChild!);
+    }
 
+    const ul = document.createElement('ul');
     ul.appendChild(createLiElement(
         'IsRegionLockedFeatureEnabled', detail.isRegionLockedFeatureEnabled));
     ul.appendChild(createLiElement(
@@ -51,7 +57,7 @@
     ul.appendChild(createLiElement(
         'IsSubjectToParentalControls', detail.isSubjectToParentalControls));
 
-    document.getElementById('shopping-list-eligible-details')!.appendChild(ul);
+    element.appendChild(ul);
   });
 }
 
diff --git a/components/content_settings/core/browser/content_settings_registry_unittest.cc b/components/content_settings/core/browser/content_settings_registry_unittest.cc
index 509f61c..2eba3c0 100644
--- a/components/content_settings/core/browser/content_settings_registry_unittest.cc
+++ b/components/content_settings/core/browser/content_settings_registry_unittest.cc
@@ -228,4 +228,17 @@
             federated_identity_auto_reauthn->GetInitialDefaultSetting());
 }
 
+TEST_F(ContentSettingsRegistryTest, SettingsHaveAHistogramMapping) {
+  size_t count = 0;
+  std::set<int> values;
+  for (const WebsiteSettingsInfo* info : *website_settings_registry()) {
+    int value = ContentSettingTypeToHistogramValue(info->type());
+    EXPECT_GT(value, 0);
+    count++;
+    values.insert(value);
+  }
+  // Validate that values are unique.
+  EXPECT_EQ(count, values.size());
+}
+
 }  // namespace content_settings
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
index fcd6d94..9fa9573 100644
--- a/components/content_settings/core/common/content_settings.cc
+++ b/components/content_settings/core/common/content_settings.cc
@@ -9,27 +9,25 @@
 #include <utility>
 
 #include "base/check_op.h"
+#include "base/containers/fixed_flat_map.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "build/build_config.h"
 #include "components/content_settings/core/common/content_settings_metadata.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/content_settings/core/common/content_settings_utils.h"
 
 namespace {
 
-struct HistogramValue {
-  ContentSettingsType type;
-  int value;
-};
-
 // WARNING: The value specified here for a type should match exactly the value
 // specified in the ContentType enum in enums.xml. Since these values are
 // used for histograms, please do not reuse the same value for a different
 // content setting. Always append to the end and increment.
-//
-// TODO(raymes): We should use a sparse histogram here on the hash of the
-// content settings type name instead.
-constexpr HistogramValue kHistogramValue[] = {
-    {ContentSettingsType::COOKIES, 0},
+constexpr auto kHistogramValue = base::MakeFixedFlatMap<ContentSettingsType,
+                                                        int>({
+    // Cookies was previously logged to bucket 0, which is not a valid bucket
+    // for linear histograms.
+    {ContentSettingsType::COOKIES, 100},
     {ContentSettingsType::IMAGES, 1},
     {ContentSettingsType::JAVASCRIPT, 2},
     // Removed PLUGINS in M91.
@@ -41,6 +39,8 @@
     {ContentSettingsType::MEDIASTREAM_MIC, 12},
     {ContentSettingsType::MEDIASTREAM_CAMERA, 13},
     {ContentSettingsType::PROTOCOL_HANDLERS, 14},
+    // PPAPI_BROKER is deprecated and shouldn't get logged anymore.
+    {ContentSettingsType::DEPRECATED_PPAPI_BROKER, -1},
     {ContentSettingsType::AUTOMATIC_DOWNLOADS, 16},
     {ContentSettingsType::MIDI_SYSEX, 17},
     {ContentSettingsType::SSL_CERT_DECISIONS, 19},
@@ -48,6 +48,7 @@
     {ContentSettingsType::APP_BANNER, 22},
     {ContentSettingsType::SITE_ENGAGEMENT, 23},
     {ContentSettingsType::DURABLE_STORAGE, 24},
+    // Removed "Key generation setting"
     {ContentSettingsType::BLUETOOTH_GUARD, 26},
     {ContentSettingsType::BACKGROUND_SYNC, 27},
     {ContentSettingsType::AUTOPLAY, 28},
@@ -119,7 +120,19 @@
     {ContentSettingsType::ANTI_ABUSE, 96},
     {ContentSettingsType::THIRD_PARTY_STORAGE_PARTITIONING, 97},
     {ContentSettingsType::HTTPS_ENFORCED, 98},
-};
+    {ContentSettingsType::USB_CHOOSER_DATA, 99},
+    // The value 100 is assigned to COOKIES!
+    {ContentSettingsType::GET_DISPLAY_MEDIA_SET_SELECT_ALL_SCREENS, 101},
+    {ContentSettingsType::MIDI, 102},
+
+    // As mentioned at the top, please don't forget to update ContentType in
+    // enums.xml when you add entries here!
+});
+
+constexpr int kkHistogramValueMax = std::max_element(
+    kHistogramValue.begin(),
+    kHistogramValue.end(),
+    [](const auto a, const auto b) { return a.second < b.second; }) -> second;
 
 void FilterRulesForType(ContentSettingsForOneType& settings,
                         const GURL& primary_url) {
@@ -140,28 +153,24 @@
              : static_cast<ContentSetting>(content_setting);
 }
 
-int ContentSettingTypeToHistogramValue(ContentSettingsType content_setting,
-                                       size_t* num_values) {
-  *num_values = std::size(kHistogramValue);
+void RecordContentSettingsHistogram(const char* name,
+                                    ContentSettingsType content_setting) {
+  base::UmaHistogramExactLinear(
+      name, ContentSettingTypeToHistogramValue(content_setting),
+      kkHistogramValueMax + 1);
+}
 
-  // Verify the array is sorted by enum type and contains all values.
-  DCHECK(std::is_sorted(std::begin(kHistogramValue), std::end(kHistogramValue),
-                        [](const HistogramValue& a, const HistogramValue& b) {
-                          return a.type < b.type;
-                        }));
-  static_assert(
-      kHistogramValue[std::size(kHistogramValue) - 1].type ==
-          ContentSettingsType(
-              static_cast<int32_t>(ContentSettingsType::NUM_TYPES) - 1),
-      "Update content settings histogram lookup");
+int ContentSettingTypeToHistogramValue(ContentSettingsType content_setting) {
+  static_assert(kHistogramValue.size() ==
+                    static_cast<size_t>(ContentSettingsType::NUM_TYPES),
+                "Update content settings histogram lookup");
 
-  const HistogramValue* found = std::lower_bound(
-      std::begin(kHistogramValue), std::end(kHistogramValue), content_setting,
-      [](const HistogramValue& a, ContentSettingsType b) {
-        return a.type < b;
-      });
-  if (found != std::end(kHistogramValue) && found->type == content_setting)
-    return found->value;
+  auto* found = kHistogramValue.find(content_setting);
+  if (found != kHistogramValue.end()) {
+    DCHECK_NE(found->second, -1)
+        << "Used for deprecated settings: " << static_cast<int>(found->first);
+    return found->second;
+  }
   NOTREACHED();
   return -1;
 }
diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h
index 8a72a705..7af9be7d 100644
--- a/components/content_settings/core/common/content_settings.h
+++ b/components/content_settings/core/common/content_settings.h
@@ -40,9 +40,11 @@
 ContentSetting IntToContentSetting(int content_setting);
 
 // Converts a given content setting to its histogram value, for use when saving
-// content settings types to a histogram.
-int ContentSettingTypeToHistogramValue(ContentSettingsType content_setting,
-                                       size_t* num_values);
+// content settings types to UKM. For UMA use RecordContentSettingsHistogram.
+int ContentSettingTypeToHistogramValue(ContentSettingsType content_setting);
+// Records a linear histogram for |content_setting|.
+void RecordContentSettingsHistogram(const char* name,
+                                    ContentSettingsType content_setting);
 
 struct ContentSettingPatternSource {
   ContentSettingPatternSource(const ContentSettingsPattern& primary_pattern,
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java
index 61a2262..4554392 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java
@@ -5,7 +5,6 @@
 package org.chromium.components.crash;
 
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * This UncaughtExceptionHandler will upload the stacktrace when there is an uncaught exception.
@@ -13,7 +12,6 @@
  * This happens before native is loaded, and will replace by JavaExceptionReporter after native
  * finishes loading.
  */
-@MainDex
 public class PureJavaExceptionHandler implements Thread.UncaughtExceptionHandler {
     private final Thread.UncaughtExceptionHandler mParent;
     private boolean mHandlingException;
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
index afe73aee..a4f0c7b1 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
@@ -14,7 +14,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.PiiElider;
 import org.chromium.base.StrictModeContext;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.components.minidump_uploader.CrashFileManager;
 import org.chromium.components.version_info.VersionInfo;
 
@@ -32,7 +31,6 @@
  *
  * This class is written in pure Java, so it can handle exception happens before native is loaded.
  */
-@MainDex
 public abstract class PureJavaExceptionReporter
         implements PureJavaExceptionHandler.JavaExceptionReporter {
     // report fields, please keep the name sync with MIME blocks in breakpad_linux.cc
diff --git a/components/crash/content/browser/child_exit_observer_android.cc b/components/crash/content/browser/child_exit_observer_android.cc
index 0b9c634..5f019af 100644
--- a/components/crash/content/browser/child_exit_observer_android.cc
+++ b/components/crash/content/browser/child_exit_observer_android.cc
@@ -44,14 +44,9 @@
 
 ChildExitObserver::ChildExitObserver() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  notification_registrar_.Add(this,
-                              content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
-                              content::NotificationService::AllSources());
-  notification_registrar_.Add(this,
-                              content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
-                              content::NotificationService::AllSources());
   BrowserChildProcessObserver::Add(this);
-  scoped_observation_.Observe(crashpad::CrashHandlerHost::Get());
+  scoped_crash_handler_host_observation_.Observe(
+      crashpad::CrashHandlerHost::Get());
 }
 
 ChildExitObserver::~ChildExitObserver() {
@@ -78,6 +73,9 @@
   // The child process pid isn't available when process is gone, keep a mapping
   // between process_host_id and pid, so we can find it later.
   process_host_id_to_pid_[host->GetID()] = host->GetProcess().Handle();
+  if (!render_process_host_observation_.IsObservingSource(host)) {
+    render_process_host_observation_.AddObservation(host);
+  }
 }
 
 void ChildExitObserver::OnChildExit(TerminationInfo* info) {
@@ -138,12 +136,22 @@
   // Subsequent BrowserChildProcessHostDisconnected will call OnChildExit.
 }
 
-void ChildExitObserver::Observe(int type,
-                                const content::NotificationSource& source,
-                                const content::NotificationDetails& details) {
+void ChildExitObserver::RenderProcessExited(
+    content::RenderProcessHost* host,
+    const content::ChildProcessTerminationInfo& info) {
+  ProcessRenderProcessHostLifetimeEndEvent(host, &info);
+}
+
+void ChildExitObserver::RenderProcessHostDestroyed(
+    content::RenderProcessHost* host) {
+  ProcessRenderProcessHostLifetimeEndEvent(host, nullptr);
+  render_process_host_observation_.RemoveObservation(host);
+}
+
+void ChildExitObserver::ProcessRenderProcessHostLifetimeEndEvent(
+    content::RenderProcessHost* rph,
+    const content::ChildProcessTerminationInfo* content_info) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  content::RenderProcessHost* rph =
-      content::Source<content::RenderProcessHost>(source).ptr();
   TerminationInfo info;
   info.process_host_id = rph->GetID();
   info.pid = rph->GetProcess().Handle();
@@ -162,30 +170,21 @@
     DCHECK(collector->MemoryMetrics());
     info.blink_oom_metrics = *collector->MemoryMetrics();
   }
-  switch (type) {
-    case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
-      // NOTIFICATION_RENDERER_PROCESS_TERMINATED is sent when the renderer
-      // process is cleanly shutdown.
-      info.normal_termination = true;
-      info.renderer_shutdown_requested = rph->ShutdownRequested();
-      break;
-    }
-    case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
-      // We do not care about android fast shutdowns as it is a known case where
-      // the renderer is intentionally killed when we are done with it.
-      info.normal_termination = rph->FastShutdownStarted();
-      info.renderer_shutdown_requested = rph->ShutdownRequested();
-      info.app_state = base::android::ApplicationStatusListener::GetState();
-      const auto& content_info =
-          *content::Details<content::ChildProcessTerminationInfo>(details)
-               .ptr();
-      PopulateTerminationInfo(content_info, &info);
-      break;
-    }
-    default:
-      NOTREACHED();
-      return;
+
+  if (content_info) {
+    // We do not care about android fast shutdowns as it is a known case where
+    // the renderer is intentionally killed when we are done with it.
+    info.normal_termination = rph->FastShutdownStarted();
+    info.renderer_shutdown_requested = rph->ShutdownRequested();
+    info.app_state = base::android::ApplicationStatusListener::GetState();
+    PopulateTerminationInfo(*content_info, &info);
+  } else {
+    // No |content_info| is provided when the renderer process is cleanly
+    // shutdown.
+    info.normal_termination = true;
+    info.renderer_shutdown_requested = rph->ShutdownRequested();
   }
+
   const auto& iter = process_host_id_to_pid_.find(rph->GetID());
   // NOTIFICATION_RENDERER_PROCESS_CLOSED corresponds to death of an underlying
   // RenderProcess. NOTIFICATION_RENDERER_PROCESS_TERMINATED corresponds to when
diff --git a/components/crash/content/browser/child_exit_observer_android.h b/components/crash/content/browser/child_exit_observer_android.h
index 4b80ce64..46dcf6a 100644
--- a/components/crash/content/browser/child_exit_observer_android.h
+++ b/components/crash/content/browser/child_exit_observer_android.h
@@ -12,15 +12,15 @@
 #include "base/android/application_status_listener.h"
 #include "base/android/child_process_binding_types.h"
 #include "base/process/process.h"
+#include "base/scoped_multi_source_observation.h"
 #include "base/scoped_observation.h"
 #include "base/synchronization/lock.h"
 #include "components/crash/content/browser/crash_handler_host_linux.h"
 #include "content/public/browser/browser_child_process_observer.h"
 #include "content/public/browser/child_process_host.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_process_host_creation_observer.h"
+#include "content/public/browser/render_process_host_observer.h"
 #include "content/public/common/process_type.h"
 #include "third_party/blink/public/common/oom_intervention/oom_intervention_types.h"
 
@@ -35,7 +35,7 @@
 // The ChildExitObserver instance exists on the browser main thread.
 class ChildExitObserver : public content::BrowserChildProcessObserver,
                           public content::RenderProcessHostCreationObserver,
-                          public content::NotificationObserver,
+                          public content::RenderProcessHostObserver,
                           public crashpad::CrashHandlerHost::Observer {
  public:
   struct TerminationInfo {
@@ -133,16 +133,21 @@
       const content::ChildProcessData& data,
       const content::ChildProcessTerminationInfo& info) override;
 
-  // NotificationObserver implementation:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
+  // RenderProcessHostObserver implementation.
+  void RenderProcessExited(
+      content::RenderProcessHost* host,
+      const content::ChildProcessTerminationInfo& info) override;
+  void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
+
+  // Processes RenderProcessHost exited and destroyed events. |content_info| is
+  // expected to be null for destroyed events.
+  void ProcessRenderProcessHostLifetimeEndEvent(
+      content::RenderProcessHost* rph,
+      const content::ChildProcessTerminationInfo* content_info);
 
   // Called on child process exit (including crash).
   void OnChildExit(TerminationInfo* info);
 
-  content::NotificationRegistrar notification_registrar_;
-
   base::Lock registered_clients_lock_;
   std::vector<std::unique_ptr<Client>> registered_clients_;
 
@@ -153,11 +158,15 @@
   // accessed on the UI thread.
   std::map<int, TerminationInfo> browser_child_process_info_;
 
+  base::ScopedMultiSourceObservation<content::RenderProcessHost,
+                                     content::RenderProcessHostObserver>
+      render_process_host_observation_{this};
+
   base::Lock crash_signals_lock_;
   std::map<base::ProcessId, int> child_pid_to_crash_signal_;
   base::ScopedObservation<crashpad::CrashHandlerHost,
                           crashpad::CrashHandlerHost::Observer>
-      scoped_observation_{this};
+      scoped_crash_handler_host_observation_{this};
 };
 
 }  // namespace crash_reporter
diff --git a/components/device_signals/core/browser/mock_user_delegate.h b/components/device_signals/core/browser/mock_user_delegate.h
index dc71b1a5..6eb7d9fd 100644
--- a/components/device_signals/core/browser/mock_user_delegate.h
+++ b/components/device_signals/core/browser/mock_user_delegate.h
@@ -16,8 +16,12 @@
   ~MockUserDelegate() override;
 
   MOCK_METHOD(bool, IsAffiliated, (), (const, override));
-  MOCK_METHOD(bool, IsManaged, (), (const, override));
+  MOCK_METHOD(bool, IsManagedUser, (), (const, override));
   MOCK_METHOD(bool, IsSameUser, (const std::string&), (const, override));
+  MOCK_METHOD(std::set<policy::PolicyScope>,
+              GetPolicyScopesNeedingSignals,
+              (),
+              (const, override));
 };
 
 }  // namespace device_signals
diff --git a/components/device_signals/core/browser/user_delegate.h b/components/device_signals/core/browser/user_delegate.h
index ca9fdc5..7579fef 100644
--- a/components/device_signals/core/browser/user_delegate.h
+++ b/components/device_signals/core/browser/user_delegate.h
@@ -5,8 +5,11 @@
 #ifndef COMPONENTS_DEVICE_SIGNALS_CORE_BROWSER_USER_DELEGATE_H_
 #define COMPONENTS_DEVICE_SIGNALS_CORE_BROWSER_USER_DELEGATE_H_
 
+#include <set>
 #include <string>
 
+#include "components/policy/core/common/policy_types.h"
+
 namespace device_signals {
 
 // Delegate representing the user that is currently logged-in to the browser
@@ -20,11 +23,15 @@
   virtual bool IsAffiliated() const = 0;
 
   // Returns true if the current browser user is managed.
-  virtual bool IsManaged() const = 0;
+  virtual bool IsManagedUser() const = 0;
 
   // Returns true if `gaia_id` represents the same user as the one currently
   // logged-in to the browser.
   virtual bool IsSameUser(const std::string& gaia_id) const = 0;
+
+  // Returns the currently enabled Scopes for policies known to require signals.
+  virtual std::set<policy::PolicyScope> GetPolicyScopesNeedingSignals()
+      const = 0;
 };
 
 }  // namespace device_signals
diff --git a/components/device_signals/core/browser/user_permission_service_impl.cc b/components/device_signals/core/browser/user_permission_service_impl.cc
index b18348a..3fe7ba9f 100644
--- a/components/device_signals/core/browser/user_permission_service_impl.cc
+++ b/components/device_signals/core/browser/user_permission_service_impl.cc
@@ -4,11 +4,14 @@
 
 #include "components/device_signals/core/browser/user_permission_service_impl.h"
 
+#include <set>
+
 #include "base/check.h"
 #include "components/device_signals/core/browser/pref_names.h"
 #include "components/device_signals/core/browser/user_context.h"
 #include "components/device_signals/core/browser/user_delegate.h"
 #include "components/policy/core/common/management/management_service.h"
+#include "components/policy/core/common/policy_types.h"
 #include "components/prefs/pref_service.h"
 
 namespace device_signals {
@@ -33,9 +36,26 @@
     return false;
   }
 
-  return !IsDeviceCloudManaged() &&
-         user_prefs_->GetBoolean(
-             prefs::kUnmanagedDeviceSignalsConsentFlowEnabled);
+  bool consent_required_by_specific_policy =
+      !IsDeviceCloudManaged() &&
+      user_prefs_->GetBoolean(prefs::kUnmanagedDeviceSignalsConsentFlowEnabled);
+
+  bool consent_required_by_dependent_policy = false;
+  std::set<policy::PolicyScope> scopes =
+      user_delegate_->GetPolicyScopesNeedingSignals();
+  if (scopes.find(policy::POLICY_SCOPE_USER) != scopes.end()) {
+    if (IsDeviceCloudManaged()) {
+      // Managed device, only trigger the consent flow if the user is
+      // unaffiliated.
+      consent_required_by_dependent_policy = !user_delegate_->IsAffiliated();
+    } else {
+      // Unmanaged device.
+      consent_required_by_dependent_policy = true;
+    }
+  }
+
+  return consent_required_by_specific_policy ||
+         consent_required_by_dependent_policy;
 }
 
 UserPermission UserPermissionServiceImpl::CanUserCollectSignals(
@@ -49,7 +69,7 @@
     return UserPermission::kUnknownUser;
   }
 
-  if (!user_delegate_->IsManaged()) {
+  if (!user_delegate_->IsManagedUser()) {
     return UserPermission::kConsumerUser;
   }
 
@@ -73,16 +93,29 @@
 }
 
 UserPermission UserPermissionServiceImpl::CanCollectSignals() {
-  // For now, the only condition that is required is that the current
-  // browser is Cloud-managed. The rationale being that signals can be
-  // collected on managed devices by their managing organization, but
-  // would require more scrutiny for unmanaged browsers (including
-  // getting user consent). However, support for unmanaged browsers is
-  // not required yet.
+  if (HasUserConsented()) {
+    return UserPermission::kGranted;
+  }
+
   if (!IsDeviceCloudManaged()) {
+    // Consent is required on unmanaged devices.
     return UserPermission::kMissingConsent;
   }
-  return UserPermission::kGranted;
+
+  if (!user_delegate_->IsManagedUser() || user_delegate_->IsAffiliated()) {
+    // Grant access to signals if the profile is unmanaged or affiliated.
+    return UserPermission::kGranted;
+  }
+
+  // In unaffiliated contexts, signals can only be collected without consent if
+  // they are solely needed by a device-level policy.
+  std::set<policy::PolicyScope> scopes =
+      user_delegate_->GetPolicyScopesNeedingSignals();
+  bool only_needed_by_device =
+      (scopes.find(policy::POLICY_SCOPE_MACHINE) != scopes.end()) &&
+      scopes.size() == 1U;
+  return only_needed_by_device ? UserPermission::kGranted
+                               : UserPermission::kMissingConsent;
 }
 
 bool UserPermissionServiceImpl::HasUserConsented() const {
diff --git a/components/device_signals/core/browser/user_permission_service_impl_unittest.cc b/components/device_signals/core/browser/user_permission_service_impl_unittest.cc
index bbfecc6..445ca2d 100644
--- a/components/device_signals/core/browser/user_permission_service_impl_unittest.cc
+++ b/components/device_signals/core/browser/user_permission_service_impl_unittest.cc
@@ -22,6 +22,7 @@
 using policy::EnterpriseManagementAuthority;
 using policy::ScopedManagementServiceOverrideForTesting;
 using testing::_;
+using testing::AnyNumber;
 using testing::Return;
 
 namespace device_signals {
@@ -63,7 +64,7 @@
                              EnterpriseManagementAuthority::CLOUD_DOMAIN);
   }
 
-  void SetDeviceAsCloudUnmanaged() {
+  void SetUserAsCloudManaged() {
     scoped_override_.emplace(&management_service_,
                              EnterpriseManagementAuthority::CLOUD);
   }
@@ -73,6 +74,18 @@
     test_prefs_.SetBoolean(prefs::kDeviceSignalsConsentReceived, true);
   }
 
+  void SetPolicyScopesNeedingSignals(bool machine_scope, bool user_scope) {
+    std::set<policy::PolicyScope> scopes;
+    if (machine_scope) {
+      scopes.insert(policy::POLICY_SCOPE_MACHINE);
+    }
+    if (user_scope) {
+      scopes.insert(policy::POLICY_SCOPE_USER);
+    }
+    EXPECT_CALL(*mock_user_delegate_, GetPolicyScopesNeedingSignals())
+        .WillOnce(Return(std::move(scopes)));
+  }
+
   base::test::TaskEnvironment task_environment_;
 
   TestManagementService management_service_;
@@ -93,6 +106,7 @@
 // managed.
 TEST_F(UserPermissionServiceImplTest, ShouldCollectConsent_DeviceCloudManaged) {
   SetDeviceAsCloudManaged();
+  SetPolicyScopesNeedingSignals(/*machine_scope=*/false, /*user_scope*/ false);
   EXPECT_FALSE(permission_service_->ShouldCollectConsent());
 }
 
@@ -100,16 +114,81 @@
 // managed but the "enable consent flow" policy is not enabled.
 TEST_F(UserPermissionServiceImplTest,
        ShouldCollectConsent_NoEnableConsentFlowPolicy) {
-  SetDeviceAsCloudUnmanaged();
+  SetUserAsCloudManaged();
+  SetPolicyScopesNeedingSignals(/*machine_scope=*/false, /*user_scope*/ false);
   EXPECT_FALSE(permission_service_->ShouldCollectConsent());
 }
 
 // Tests that consent needs to be collected if the device is not cloud managed
 // and the "enable consent flow" policy is enabled.
-TEST_F(UserPermissionServiceImplTest, ShouldCollectConsent) {
-  SetDeviceAsCloudUnmanaged();
+TEST_F(UserPermissionServiceImplTest,
+       ShouldCollectConsent_SpecificPolicy_ManagedUser) {
+  SetUserAsCloudManaged();
   test_prefs_.SetBoolean(prefs::kUnmanagedDeviceSignalsConsentFlowEnabled,
                          true);
+  SetPolicyScopesNeedingSignals(/*machine_scope=*/false, /*user_scope*/ false);
+  EXPECT_TRUE(permission_service_->ShouldCollectConsent());
+}
+
+struct DeviceManagedDependentPolicyTestCase {
+  bool machine_scope = false;
+  bool user_scope = false;
+  bool is_affiliated = false;
+  bool should_collect_consent = false;
+};
+
+// Tests the behavior of ShouldCollectConsent against all permutations of
+// dependent policy scope and affiliation.
+TEST_F(UserPermissionServiceImplTest,
+       ShouldCollectConsent_ManagedDevice_DependentPolicy) {
+  SetDeviceAsCloudManaged();
+
+  std::array<DeviceManagedDependentPolicyTestCase, 8> test_cases = {
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/true, /*user_scope=*/true, /*is_affiliated=*/true,
+          /*should_collect_consent=*/false},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/true, /*user_scope=*/true, /*is_affiliated=*/false,
+          /*should_collect_consent=*/true},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/true, /*user_scope=*/false, /*is_affiliated=*/true,
+          /*should_collect_consent=*/false},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/true, /*user_scope=*/false, /*is_affiliated=*/false,
+          /*should_collect_consent=*/false},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/false, /*user_scope=*/true, /*is_affiliated=*/true,
+          /*should_collect_consent=*/false},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/false, /*user_scope=*/true, /*is_affiliated=*/false,
+          /*should_collect_consent=*/true},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/false, /*user_scope=*/false, /*is_affiliated=*/true,
+          /*should_collect_consent=*/false},
+      DeviceManagedDependentPolicyTestCase{
+          /*machine_scope=*/false, /*user_scope=*/false,
+          /*is_affiliated=*/false, /*should_collect_consent=*/false},
+  };
+
+  for (const auto& test_case : test_cases) {
+    SetPolicyScopesNeedingSignals(test_case.machine_scope,
+                                  test_case.user_scope);
+
+    EXPECT_CALL(*mock_user_delegate_, IsAffiliated())
+        .Times(AnyNumber())
+        .WillOnce(Return(test_case.is_affiliated));
+
+    EXPECT_EQ(permission_service_->ShouldCollectConsent(),
+              test_case.should_collect_consent);
+  }
+}
+
+// Tests that consent should be collected when a dependent policy is enabled on
+// an unmanaged device.
+TEST_F(UserPermissionServiceImplTest,
+       ShouldCollectConsent_UnmanagedDevice_DependentPolicy) {
+  SetUserAsCloudManaged();
+  SetPolicyScopesNeedingSignals(/*machine_scope=*/false, /*user_scope*/ true);
   EXPECT_TRUE(permission_service_->ShouldCollectConsent());
 }
 
@@ -149,7 +228,7 @@
 
   EXPECT_CALL(*mock_user_delegate_, IsSameUser(kUserGaiaId))
       .WillOnce(Return(true));
-  EXPECT_CALL(*mock_user_delegate_, IsManaged()).WillOnce(Return(false));
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(false));
 
   EXPECT_EQ(permission_service_->CanUserCollectSignals(user_context),
             UserPermission::kConsumerUser);
@@ -159,14 +238,14 @@
 // managed and the user has not given consent.
 TEST_F(UserPermissionServiceImplTest,
        CanUserCollectSignals_BrowserNotManaged_NoConsent) {
-  SetDeviceAsCloudUnmanaged();
+  SetUserAsCloudManaged();
 
   UserContext user_context;
   user_context.user_id = kUserGaiaId;
 
   EXPECT_CALL(*mock_user_delegate_, IsSameUser(kUserGaiaId))
       .WillOnce(Return(true));
-  EXPECT_CALL(*mock_user_delegate_, IsManaged()).WillOnce(Return(true));
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(true));
 
   EXPECT_EQ(permission_service_->CanUserCollectSignals(user_context),
             UserPermission::kMissingConsent);
@@ -176,7 +255,7 @@
 // managed and the user has given consent.
 TEST_F(UserPermissionServiceImplTest,
        CanUserCollectSignals_BrowserNotManaged_WithConsent) {
-  SetDeviceAsCloudUnmanaged();
+  SetUserAsCloudManaged();
   SetUserConsentGiven();
 
   UserContext user_context;
@@ -184,7 +263,7 @@
 
   EXPECT_CALL(*mock_user_delegate_, IsSameUser(kUserGaiaId))
       .WillOnce(Return(true));
-  EXPECT_CALL(*mock_user_delegate_, IsManaged()).WillOnce(Return(true));
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(true));
 
   EXPECT_EQ(permission_service_->CanUserCollectSignals(user_context),
             UserPermission::kGranted);
@@ -202,7 +281,7 @@
 
   EXPECT_CALL(*mock_user_delegate_, IsSameUser(kUserGaiaId))
       .WillOnce(Return(true));
-  EXPECT_CALL(*mock_user_delegate_, IsManaged()).WillOnce(Return(true));
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(true));
   EXPECT_CALL(*mock_user_delegate_, IsAffiliated()).WillOnce(Return(false));
 
   EXPECT_EQ(permission_service_->CanUserCollectSignals(user_context),
@@ -221,26 +300,85 @@
 
   EXPECT_CALL(*mock_user_delegate_, IsSameUser(kUserGaiaId))
       .WillOnce(Return(true));
-  EXPECT_CALL(*mock_user_delegate_, IsManaged()).WillOnce(Return(true));
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(true));
   EXPECT_CALL(*mock_user_delegate_, IsAffiliated()).WillOnce(Return(true));
 
   EXPECT_EQ(permission_service_->CanUserCollectSignals(user_context),
             UserPermission::kGranted);
 }
 
+// Tests that signals can be collected if the user has already given their
+// consent.
+TEST_F(UserPermissionServiceImplTest, CanCollectSignals_AlreadyConsented) {
+  SetUserConsentGiven();
+  EXPECT_EQ(permission_service_->CanCollectSignals(), UserPermission::kGranted);
+}
+
 // Tests that consent is required before allowing to collect signals from an
 // unmanaged browser.
 TEST_F(UserPermissionServiceImplTest, CanCollectSignals_BrowserNotManaged) {
-  SetDeviceAsCloudUnmanaged();
-
+  SetUserAsCloudManaged();
   EXPECT_EQ(permission_service_->CanCollectSignals(),
             UserPermission::kMissingConsent);
 }
 
-// Tests that signals can be collected from a managed browser.
-TEST_F(UserPermissionServiceImplTest, CanCollectSignals_BrowserManaged) {
+// Tests that signals can be collected when on a managed browser in an unmanaged
+// profile.
+TEST_F(UserPermissionServiceImplTest,
+       CanCollectSignals_BrowserManaged_UnmanagedUser) {
   SetDeviceAsCloudManaged();
+
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(false));
+
   EXPECT_EQ(permission_service_->CanCollectSignals(), UserPermission::kGranted);
 }
 
+// Tests that signals can be collected when on a managed browser in an
+// affiliated profile.
+TEST_F(UserPermissionServiceImplTest,
+       CanCollectSignals_BrowserManaged_AffiliatedUser) {
+  SetDeviceAsCloudManaged();
+
+  EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(true));
+  EXPECT_CALL(*mock_user_delegate_, IsAffiliated()).WillOnce(Return(true));
+
+  EXPECT_EQ(permission_service_->CanCollectSignals(), UserPermission::kGranted);
+}
+
+struct UnaffiliatedUserTestCase {
+  bool machine_scope = false;
+  bool user_scope = false;
+  bool can_collect = false;
+};
+
+// Tests whether signals can be collected in various unaffiliated context
+// use-cases.
+TEST_F(UserPermissionServiceImplTest,
+       CanCollectSignals_BrowserManaged_UnaffiliatedUser) {
+  SetDeviceAsCloudManaged();
+
+  const std::array<UnaffiliatedUserTestCase, 4> test_cases = {
+      UnaffiliatedUserTestCase{/*machine_scope=*/false, /*user_scope=*/false,
+                               /*can_collect=*/false},
+      UnaffiliatedUserTestCase{/*machine_scope=*/false, /*user_scope=*/true,
+                               /*can_collect=*/false},
+      UnaffiliatedUserTestCase{/*machine_scope=*/true, /*user_scope=*/false,
+                               /*can_collect=*/true},
+      UnaffiliatedUserTestCase{/*machine_scope=*/true, /*user_scope=*/true,
+                               /*can_collect=*/false},
+  };
+
+  for (const auto& test_case : test_cases) {
+    EXPECT_CALL(*mock_user_delegate_, IsManagedUser()).WillOnce(Return(true));
+    EXPECT_CALL(*mock_user_delegate_, IsAffiliated()).WillOnce(Return(false));
+
+    SetPolicyScopesNeedingSignals(test_case.machine_scope,
+                                  test_case.user_scope);
+
+    EXPECT_EQ(permission_service_->CanCollectSignals(),
+              test_case.can_collect ? UserPermission::kGranted
+                                    : UserPermission::kMissingConsent);
+  }
+}
+
 }  // namespace device_signals
diff --git a/components/heap_profiling/multi_process/javatests/src/org/chromium/components/heap_profiling/multi_process/HeapProfilingTestShim.java b/components/heap_profiling/multi_process/javatests/src/org/chromium/components/heap_profiling/multi_process/HeapProfilingTestShim.java
index 9d08e941..3780c3d6 100644
--- a/components/heap_profiling/multi_process/javatests/src/org/chromium/components/heap_profiling/multi_process/HeapProfilingTestShim.java
+++ b/components/heap_profiling/multi_process/javatests/src/org/chromium/components/heap_profiling/multi_process/HeapProfilingTestShim.java
@@ -5,13 +5,11 @@
 package org.chromium.components.heap_profiling.multi_process;
 
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides direct access to heap_profiling_test_shim, which in turn forwards to
  * heap_profiling::TestDriver. Only used for testing.
  */
-@MainDex
 public class HeapProfilingTestShim {
     public HeapProfilingTestShim() {
         mNativeHeapProfilingTestShim = HeapProfilingTestShimJni.get().init(this);
diff --git a/components/media_router/browser/logger_impl_unittest.cc b/components/media_router/browser/logger_impl_unittest.cc
index 3d3af73..e8f07ff 100644
--- a/components/media_router/browser/logger_impl_unittest.cc
+++ b/components/media_router/browser/logger_impl_unittest.cc
@@ -53,7 +53,7 @@
   std::string GetAttributeOfFirstEntry(const std::string& logs_json,
                                        const std::string& attribute) {
     base::Value logs = base::JSONReader::Read(logs_json).value();
-    return *logs.GetList()[0].FindStringKey(attribute);
+    return *logs.GetList()[0].GetDict().FindString(attribute);
   }
 };
 
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
index 89254bf5..e351657 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
@@ -7,13 +7,11 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Message features.
  */
 @JNINamespace("messages")
-@MainDex
 public class MessageFeatureList {
     public static final String MESSAGES_FOR_ANDROID_STACKING_ANIMATION =
             "MessagesForAndroidStackingAnimation";
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java
index 83b3bdc1..ffdfad3 100644
--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java
+++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java
@@ -14,7 +14,6 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.components.module_installer.engine.InstallEngine;
 import org.chromium.components.module_installer.engine.InstallListener;
 import org.chromium.components.module_installer.util.Timer;
@@ -22,12 +21,11 @@
 /**
  * Represents a feature module. Can be used to install the module, access its interface, etc. See
  * {@link ModuleInterface} for how to conveniently create an instance of the module class for a
- * specific feature module. The @MainDex annotation supports module use in the renderer process.
+ * specific feature module.
  *
  * @param <T> The interface of the module
  */
 @JNINamespace("module_installer")
-@MainDex
 public class Module<T> {
     private final String mName;
     private final Class<T> mInterfaceClass;
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index a6182b4..3e7c3c8b 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -227,8 +227,6 @@
     "on_device_head_provider.h",
     "on_device_model_update_listener.cc",
     "on_device_model_update_listener.h",
-    "on_device_tail_model_observer.cc",
-    "on_device_tail_model_observer.h",
     "on_device_tail_tokenizer.cc",
     "on_device_tail_tokenizer.h",
     "open_tab_provider.cc",
@@ -653,6 +651,8 @@
     "//components/bookmarks/test",
     "//components/history/core/browser",
     "//components/history/core/test",
+    "//components/optimization_guide/core:core",
+    "//components/optimization_guide/proto:optimization_guide_proto",
     "//components/prefs:test_support",
     "//components/query_tiles/test:test_support",
     "//components/resources",
@@ -671,6 +671,13 @@
     # Needed to get the TOOLKIT_VIEWS define.
     deps += [ "//ui/views" ]
   }
+
+  if (build_with_tflite_lib) {
+    sources += [
+      "fake_on_device_tail_model_service.cc",
+      "fake_on_device_tail_model_service.h",
+    ]
+  }
 }
 
 bundle_data("unit_tests_bundle_data") {
diff --git a/components/omnibox/browser/fake_autocomplete_provider_client.cc b/components/omnibox/browser/fake_autocomplete_provider_client.cc
index dc7c8492..943893f 100644
--- a/components/omnibox/browser/fake_autocomplete_provider_client.cc
+++ b/components/omnibox/browser/fake_autocomplete_provider_client.cc
@@ -26,6 +26,10 @@
   pref_service_ = std::make_unique<TestingPrefServiceSimple>();
   local_state_ = std::make_unique<TestingPrefServiceSimple>();
   tile_service_ = std::make_unique<query_tiles::FakeTileService>();
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+  on_device_tail_model_service_ =
+      std::make_unique<FakeOnDeviceTailModelService>();
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 }
 
 FakeAutocompleteProviderClient::~FakeAutocompleteProviderClient() {
@@ -90,3 +94,10 @@
 scoped_refptr<history::TopSites> FakeAutocompleteProviderClient::GetTopSites() {
   return top_sites_;
 }
+
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+OnDeviceTailModelService*
+FakeAutocompleteProviderClient::GetOnDeviceTailModelService() const {
+  return on_device_tail_model_service_.get();
+}
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
diff --git a/components/omnibox/browser/fake_autocomplete_provider_client.h b/components/omnibox/browser/fake_autocomplete_provider_client.h
index a47dc9d..82ec721 100644
--- a/components/omnibox/browser/fake_autocomplete_provider_client.h
+++ b/components/omnibox/browser/fake_autocomplete_provider_client.h
@@ -17,6 +17,11 @@
 #include "components/omnibox/browser/mock_autocomplete_provider_client.h"
 #include "components/omnibox/browser/shortcuts_backend.h"
 #include "components/omnibox/browser/test_scheme_classifier.h"
+#include "components/optimization_guide/machine_learning_tflite_buildflags.h"
+
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+#include "components/omnibox/browser/fake_on_device_tail_model_service.h"
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 
 namespace bookmarks {
 class BookmarkModel;
@@ -64,6 +69,10 @@
   const TabMatcher& GetTabMatcher() const override;
   scoped_refptr<history::TopSites> GetTopSites() override;
 
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+  OnDeviceTailModelService* GetOnDeviceTailModelService() const override;
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+
   // Test-only setters
   void set_bookmark_model(std::unique_ptr<bookmarks::BookmarkModel> model) {
     bookmark_model_ = std::move(model);
@@ -107,6 +116,10 @@
   std::unique_ptr<query_tiles::TileService> tile_service_;
   FakeTabMatcher fake_tab_matcher_;
   scoped_refptr<history::TopSites> top_sites_{};
+
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+  std::unique_ptr<FakeOnDeviceTailModelService> on_device_tail_model_service_;
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 };
 
 #endif  // COMPONENTS_OMNIBOX_BROWSER_FAKE_AUTOCOMPLETE_PROVIDER_CLIENT_H_
diff --git a/components/omnibox/browser/fake_on_device_tail_model_service.cc b/components/omnibox/browser/fake_on_device_tail_model_service.cc
new file mode 100644
index 0000000..bb14aa9
--- /dev/null
+++ b/components/omnibox/browser/fake_on_device_tail_model_service.cc
@@ -0,0 +1,34 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/omnibox/browser/fake_on_device_tail_model_service.h"
+
+#include <utility>
+
+#include "base/task/sequenced_task_runner.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+
+FakeOnDeviceTailModelService::FakeOnDeviceTailModelService() = default;
+
+void FakeOnDeviceTailModelService::OnModelUpdated(
+    optimization_guide::proto::OptimizationTarget optimization_target,
+    const optimization_guide::ModelInfo& model_info) {
+  if (optimization_target !=
+      optimization_guide::proto::
+          OPTIMIZATION_TARGET_OMNIBOX_ON_DEVICE_TAIL_SUGGEST) {
+    return;
+  }
+
+  // Only initialize the runner and the executor here, such that tests without
+  // test task environment will not fail unless they explicitly call
+  // `OnModelUpdated`.
+  model_executor_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
+      {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
+  tail_model_executor_ =
+      ExecutorUniquePtr(new OnDeviceTailModelExecutor(),
+                        base::OnTaskRunnerDeleter(model_executor_task_runner_));
+
+  OnDeviceTailModelService::OnModelUpdated(optimization_target, model_info);
+}
diff --git a/components/omnibox/browser/fake_on_device_tail_model_service.h b/components/omnibox/browser/fake_on_device_tail_model_service.h
new file mode 100644
index 0000000..ade92c6e
--- /dev/null
+++ b/components/omnibox/browser/fake_on_device_tail_model_service.h
@@ -0,0 +1,22 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_OMNIBOX_BROWSER_FAKE_ON_DEVICE_TAIL_MODEL_SERVICE_H_
+#define COMPONENTS_OMNIBOX_BROWSER_FAKE_ON_DEVICE_TAIL_MODEL_SERVICE_H_
+
+#include "components/omnibox/browser/on_device_tail_model_service.h"
+#include "components/optimization_guide/core/model_info.h"
+#include "components/optimization_guide/proto/models.pb.h"
+
+// Fake implementation of on device tail model service for use with tests.
+class FakeOnDeviceTailModelService : public OnDeviceTailModelService {
+ public:
+  FakeOnDeviceTailModelService();
+
+  void OnModelUpdated(
+      optimization_guide::proto::OptimizationTarget optimization_target,
+      const optimization_guide::ModelInfo& model_info) override;
+};
+
+#endif  // COMPONENTS_OMNIBOX_BROWSER_FAKE_ON_DEVICE_TAIL_MODEL_SERVICE_H_
diff --git a/components/omnibox/browser/on_device_head_provider.cc b/components/omnibox/browser/on_device_head_provider.cc
index d70f130..c193227 100644
--- a/components/omnibox/browser/on_device_head_provider.cc
+++ b/components/omnibox/browser/on_device_head_provider.cc
@@ -30,8 +30,14 @@
 #include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 #include "third_party/metrics_proto/omnibox_input_type.pb.h"
 
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+#include "components/omnibox/browser/on_device_tail_model_executor.h"
+#include "components/omnibox/browser/on_device_tail_model_service.h"
+#endif
+
 namespace {
 const int kBaseRelevanceForUrlInput = 99;
+const int kTailBaseRelevance = 90;
 const size_t kMaxRequestId = std::numeric_limits<size_t>::max() - 1;
 
 int OnDeviceHeadSuggestMaxScoreForNonUrlInput(bool is_incognito) {
@@ -55,6 +61,13 @@
   TAIL,
 };
 
+struct Suggestion {
+  std::string text;
+  SuggestionType type;
+
+  Suggestion(std::string text, SuggestionType type) : text(text), type(type) {}
+};
+
 }  // namespace
 
 struct OnDeviceHeadProvider::OnDeviceHeadProviderParams {
@@ -66,10 +79,7 @@
   AutocompleteInput input;
 
   // The suggestions fetched from the on device model which matches the input.
-  std::vector<std::string> suggestions;
-
-  // The type of the result suggestions.
-  SuggestionType suggestion_type;
+  std::vector<Suggestion> suggestions;
 
   // Indicates whether this request failed or not.
   bool failed = false;
@@ -86,20 +96,6 @@
       delete;
 };
 
-struct OnDeviceHeadProvider::OnDeviceModelFileParams {
-  // TODO(crbug.com/1372112): update head model class to take file path instead
-  // of the std::string file name.
-  std::string head_model_filename;
-
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-  base::FilePath tail_model_filepath;
-
-  base::FilePath vocab_filepath;
-
-  OnDeviceTailModelExecutor::ModelMetadata tail_model_metadata;
-#endif
-};
-
 // static
 OnDeviceHeadProvider* OnDeviceHeadProvider::Create(
     AutocompleteProviderClient* client,
@@ -117,14 +113,7 @@
       worker_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
           {base::TaskPriority::BEST_EFFORT,
            base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, base::MayBlock()})),
-      on_device_search_request_id_(0)
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-      ,
-      on_device_tail_model_executor_(
-          new OnDeviceTailModelExecutor(),
-          base::OnTaskRunnerDeleter(worker_task_runner_))
-#endif
-{
+      on_device_search_request_id_(0) {
   AddListener(listener);
 }
 
@@ -177,8 +166,7 @@
     return;
 
   matches_.clear();
-  if (input.text().empty() ||
-      GetOnDeviceModelFileParams().head_model_filename.empty()) {
+  if (input.text().empty() || GetOnDeviceHeadModelFilename().empty()) {
     return;
   }
 
@@ -207,14 +195,11 @@
 
 // static
 std::unique_ptr<OnDeviceHeadProvider::OnDeviceHeadProviderParams>
-OnDeviceHeadProvider::GetSuggestionsFromModel(
-    OnDeviceModelFileParams model_file_params,
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-    OnDeviceTailModelExecutor* tail_model_executor,
-#endif
+OnDeviceHeadProvider::GetSuggestionsFromHeadModel(
+    const std::string& model_filename,
     const size_t provider_max_matches,
     std::unique_ptr<OnDeviceHeadProviderParams> params) {
-  if (model_file_params.head_model_filename.empty() || !params) {
+  if (model_filename.empty() || !params) {
     if (params) {
       params->failed = true;
     }
@@ -225,55 +210,13 @@
   std::string sanitized_input = SanitizeInput(params->input.text());
 
   auto results = OnDeviceHeadModel::GetSuggestionsForPrefix(
-      model_file_params.head_model_filename, provider_max_matches,
-      sanitized_input);
+      model_filename, provider_max_matches, sanitized_input);
   params->suggestions.clear();
 
-  // Fallback to the tail model when the head model has no coverage.
-  if (results.empty()) {
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-    if (!tail_model_executor ||
-        !OmniboxFieldTrial::IsOnDeviceTailSuggestEnabled()) {
-      return params;
-    }
-
-    if (tail_model_executor->IsReady() ||
-        tail_model_executor->Init(model_file_params.tail_model_filepath,
-                                  model_file_params.vocab_filepath,
-                                  model_file_params.tail_model_metadata)) {
-      // Extract search query from current URL.
-      std::string previous_query, query_str;
-      const GURL& current_url = params->input.current_url();
-      if (current_url.path() == "/search" &&
-          net::GetValueForKeyInQuery(current_url, "q", &query_str)) {
-        previous_query = query_str;
-      }
-
-      double probability_threshold = base::GetFieldTrialParamByFeatureAsDouble(
-          omnibox::kOnDeviceTailModel, "ProbabilityThreshold", 0.01);
-      std::vector<OnDeviceTailModelExecutor::Prediction> predictions =
-          tail_model_executor->GenerateSuggestionsForPrefix(
-              sanitized_input, previous_query, provider_max_matches,
-              /*max_rnn_steps =*/20, probability_threshold);
-
-      bool should_reset_executor = base::GetFieldTrialParamByFeatureAsBool(
-          omnibox::kOnDeviceTailModel, "ResetAfterExecution", false);
-      if (should_reset_executor) {
-        tail_model_executor->Reset();
-      }
-
-      params->suggestion_type = SuggestionType::TAIL;
-      for (const auto& prediction : predictions) {
-        params->suggestions.push_back(prediction.suggestion);
-      }
-    }
-#endif
-  } else {
-    params->suggestion_type = SuggestionType::HEAD;
-    for (const auto& item : results) {
-      // The second member is the score which is not useful for provider.
-      params->suggestions.push_back(item.first);
-    }
+  for (const auto& item : results) {
+    // The second member is the score which is not useful for provider.
+    params->suggestions.emplace_back(
+        Suggestion(item.first, SuggestionType::HEAD));
   }
   return params;
 }
@@ -289,26 +232,79 @@
     std::unique_ptr<OnDeviceHeadProviderParams> params) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   if (!params || params->request_id != on_device_search_request_id_) {
-    SearchDone(std::move(params));
+    AllSearchDone(std::move(params));
     return;
   }
 
   worker_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&OnDeviceHeadProvider::GetSuggestionsFromModel,
-                     GetOnDeviceModelFileParams(),
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-                     on_device_tail_model_executor_.get(),
-#endif
-                     provider_max_matches_, std::move(params)),
-      base::BindOnce(&OnDeviceHeadProvider::SearchDone,
+      base::BindOnce(&OnDeviceHeadProvider::GetSuggestionsFromHeadModel,
+                     GetOnDeviceHeadModelFilename(), provider_max_matches_,
+                     std::move(params)),
+      base::BindOnce(&OnDeviceHeadProvider::HeadModelSearchDone,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void OnDeviceHeadProvider::SearchDone(
+void OnDeviceHeadProvider::HeadModelSearchDone(
     std::unique_ptr<OnDeviceHeadProviderParams> params) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
-  TRACE_EVENT0("omnibox", "OnDeviceHeadProvider::SearchDone");
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+  if (!OmniboxFieldTrial::IsOnDeviceTailSuggestEnabled() ||
+      client()->GetOnDeviceTailModelService() == nullptr) {
+    AllSearchDone(std::move(params));
+    return;
+  }
+
+  bool should_fetch_tail_suggestions =
+      (base::GetFieldTrialParamByFeatureAsBool(
+           omnibox::kOnDeviceTailModel, "MixHeadAndTailSuggestions", false) ||
+       params->suggestions.empty());
+  if (!should_fetch_tail_suggestions) {
+    AllSearchDone(std::move(params));
+    return;
+  }
+
+  // Extract search query from current URL.
+  std::string previous_query, query_str;
+  const GURL& current_url = params->input.current_url();
+  if (current_url.path() == "/search" &&
+      net::GetValueForKeyInQuery(current_url, "q", &query_str)) {
+    previous_query = query_str;
+  }
+  float probability_threshold = base::GetFieldTrialParamByFeatureAsDouble(
+      omnibox::kOnDeviceTailModel, "ProbabilityThreshold", 0.01);
+
+  OnDeviceTailModelExecutor::ModelInput input(
+      /*prefix=*/SanitizeInput(params->input.text()),
+      /*previous_query=*/previous_query,
+      /*max_num_suggestions=*/provider_max_matches_, /*max_rnn_steps=*/20,
+      /*probability_threshold=*/probability_threshold);
+
+  client()->GetOnDeviceTailModelService()->GetPredictionsForInput(
+      input, base::BindOnce(&OnDeviceHeadProvider::TailModelSearchDone,
+                            weak_ptr_factory_.GetWeakPtr(), std::move(params)));
+#else
+  AllSearchDone(std::move(params));
+#endif
+}
+
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+void OnDeviceHeadProvider::TailModelSearchDone(
+    std::unique_ptr<OnDeviceHeadProviderParams> params,
+    std::vector<OnDeviceTailModelExecutor::Prediction> predictions) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
+  for (const auto& prediction : predictions) {
+    params->suggestions.emplace_back(
+        Suggestion(prediction.suggestion, SuggestionType::TAIL));
+  }
+  AllSearchDone(std::move(params));
+}
+#endif
+
+void OnDeviceHeadProvider::AllSearchDone(
+    std::unique_ptr<OnDeviceHeadProviderParams> params) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
+  TRACE_EVENT0("omnibox", "OnDeviceHeadProvider::AllSearchDone");
   // Ignore this request if it has been stopped or a new one has already been
   // created.
   if (!params || params->request_id != on_device_search_request_id_)
@@ -327,22 +323,38 @@
                                 params->suggestions.size(), 1, 5, 6);
     matches_.clear();
 
-    int relevance = params->input.type() == metrics::OmniboxInputType::URL
-                        ? kBaseRelevanceForUrlInput
-                        : OnDeviceHeadSuggestMaxScoreForNonUrlInput(
-                              client()->IsOffTheRecord());
-    bool is_tail_suggestion = (params->suggestion_type == SuggestionType::TAIL);
+    int head_relevance = params->input.type() == metrics::OmniboxInputType::URL
+                             ? kBaseRelevanceForUrlInput
+                             : OnDeviceHeadSuggestMaxScoreForNonUrlInput(
+                                   client()->IsOffTheRecord());
+    int tail_relevance = kTailBaseRelevance;
 
-    for (const auto& item : params->suggestions) {
-      matches_.push_back(BaseSearchProvider::CreateOnDeviceSearchSuggestion(
-          /*autocomplete_provider=*/this, /*input=*/params->input,
-          /*suggestion=*/base::UTF8ToUTF16(item), /*relevance=*/relevance--,
-          /*template_url=*/
-          template_url_service->GetDefaultSearchProvider(),
-          /*search_terms_data=*/
-          template_url_service->search_terms_data(),
-          /*accepted_suggestion=*/TemplateURLRef::NO_SUGGESTION_CHOSEN,
-          is_tail_suggestion));
+    for (const auto& suggestion : params->suggestions) {
+      if (suggestion.type == SuggestionType::HEAD) {
+        matches_.push_back(BaseSearchProvider::CreateOnDeviceSearchSuggestion(
+            /*autocomplete_provider=*/this, /*input=*/params->input,
+            /*suggestion=*/base::UTF8ToUTF16(suggestion.text),
+            /*relevance=*/head_relevance--,
+            /*template_url=*/
+            template_url_service->GetDefaultSearchProvider(),
+            /*search_terms_data=*/
+            template_url_service->search_terms_data(),
+            /*accepted_suggestion=*/TemplateURLRef::NO_SUGGESTION_CHOSEN,
+            /*is_tail_suggestion=*/false));
+        head_relevance--;
+      } else {
+        matches_.push_back(BaseSearchProvider::CreateOnDeviceSearchSuggestion(
+            /*autocomplete_provider=*/this, /*input=*/params->input,
+            /*suggestion=*/base::UTF8ToUTF16(suggestion.text),
+            /*relevance=*/tail_relevance--,
+            /*template_url=*/
+            template_url_service->GetDefaultSearchProvider(),
+            /*search_terms_data=*/
+            template_url_service->search_terms_data(),
+            /*accepted_suggestion=*/TemplateURLRef::NO_SUGGESTION_CHOSEN,
+            /*is_tail_suggestion=*/true));
+        tail_relevance--;
+      }
     }
     UMA_HISTOGRAM_TIMES("Omnibox.OnDeviceHeadSuggest.AsyncQueryTime",
                         base::TimeTicks::Now() - params->creation_time);
@@ -352,22 +364,12 @@
   NotifyListeners(true);
 }
 
+// TODO(crbug.com/1372112): update head model class to take file path instead
+// of the std::string file name.
 // static
-OnDeviceHeadProvider::OnDeviceModelFileParams
-OnDeviceHeadProvider::GetOnDeviceModelFileParams() {
+std::string OnDeviceHeadProvider::GetOnDeviceHeadModelFilename() const {
   auto* model_update_listener = OnDeviceModelUpdateListener::GetInstance();
-  OnDeviceModelFileParams model_file_params;
-  if (model_update_listener != nullptr) {
-    model_file_params.head_model_filename =
-        model_update_listener->head_model_filename();
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-    model_file_params.tail_model_filepath =
-        model_update_listener->tail_model_filepath();
-    model_file_params.vocab_filepath = model_update_listener->vocab_filepath();
-    model_file_params.tail_model_metadata =
-        model_update_listener->tail_model_metadata();
-#endif
-  }
-
-  return model_file_params;
+  return model_update_listener != nullptr
+             ? model_update_listener->head_model_filename()
+             : "";
 }
diff --git a/components/omnibox/browser/on_device_head_provider.h b/components/omnibox/browser/on_device_head_provider.h
index 1a4720ab..96edfb3 100644
--- a/components/omnibox/browser/on_device_head_provider.h
+++ b/components/omnibox/browser/on_device_head_provider.h
@@ -50,9 +50,6 @@
   // from the on device head model for a search request to the model.
   struct OnDeviceHeadProviderParams;
 
-  // The structure holds params for on device model files.
-  struct OnDeviceModelFileParams;
-
   OnDeviceHeadProvider(AutocompleteProviderClient* client,
                        AutocompleteProviderListener* listener);
   ~OnDeviceHeadProvider() override;
@@ -61,26 +58,34 @@
 
   bool IsOnDeviceHeadProviderAllowed(const AutocompleteInput& input);
 
-  // Helper functions used for asynchronous search to the on device head model.
+  // Helper functions used for asynchronous search to the on device models.
   // The Autocomplete input and output from the model will be passed from
-  // DoSearch to SearchDone via the OnDeviceHeadProviderParams object.
-  // DoSearch: searches the on device model and returns the tops suggestions
+  // DoSearch to AllSearchDone via the OnDeviceHeadProviderParams object.
+  // DoSearch: searches the on device models and returns the tops suggestions
   // matches the given AutocompleteInput.
   void DoSearch(std::unique_ptr<OnDeviceHeadProviderParams> params);
-  // SearchDone: called after DoSearch, fills |matches_| with the suggestions
-  // fetches by DoSearch and then calls NotifyListeners.
-  void SearchDone(std::unique_ptr<OnDeviceHeadProviderParams> params);
+  // AllSearchDone: called after all searches are completed, fills |matches_|
+  // with the suggestions fetched by DoSearch and then calls NotifyListeners.
+  void AllSearchDone(std::unique_ptr<OnDeviceHeadProviderParams> params);
+  // Helper function to be called when searches to the head model is done.
+  void HeadModelSearchDone(std::unique_ptr<OnDeviceHeadProviderParams> params);
 
-  // Helper functions to read model file params from the static
-  // OnDeviceModelUpdateListener instance.
-  static OnDeviceModelFileParams GetOnDeviceModelFileParams();
-
-  // Fetches suggestions matching the params from the given on device model.
-  static std::unique_ptr<OnDeviceHeadProviderParams> GetSuggestionsFromModel(
-      OnDeviceModelFileParams model_file_params,
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-      OnDeviceTailModelExecutor* tail_model_executor,
+  // Helper function to be called when searches to the tail model is done.
+  void TailModelSearchDone(
+      std::unique_ptr<OnDeviceHeadProviderParams> params,
+      std::vector<OnDeviceTailModelExecutor::Prediction> predictions);
 #endif
+
+  // Helper functions to read head model filename from the static
+  // OnDeviceModelUpdateListener instance.
+  std::string GetOnDeviceHeadModelFilename() const;
+
+  // Fetches suggestions matching the params from the given on device head
+  // model.
+  static std::unique_ptr<OnDeviceHeadProviderParams>
+  GetSuggestionsFromHeadModel(
+      const std::string& model_filename,
       const size_t provider_max_matches,
       std::unique_ptr<OnDeviceHeadProviderParams> params);
 
@@ -99,14 +104,6 @@
   // AutocompleteController.
   size_t on_device_search_request_id_;
 
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-  using ExecutorUniquePtr =
-      std::unique_ptr<OnDeviceTailModelExecutor, base::OnTaskRunnerDeleter>;
-
-  // The executor to run the tail suggest model.
-  ExecutorUniquePtr on_device_tail_model_executor_;
-#endif
-
   base::WeakPtrFactory<OnDeviceHeadProvider> weak_ptr_factory_{this};
 };
 
diff --git a/components/omnibox/browser/on_device_head_provider_unittest.cc b/components/omnibox/browser/on_device_head_provider_unittest.cc
index 3a2b240..2a42050 100644
--- a/components/omnibox/browser/on_device_head_provider_unittest.cc
+++ b/components/omnibox/browser/on_device_head_provider_unittest.cc
@@ -24,6 +24,10 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_focus_type.pb.h"
 
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+#include "components/optimization_guide/core/test_model_info_builder.h"
+#endif
+
 using testing::_;
 using testing::NiceMock;
 using testing::Return;
@@ -82,11 +86,24 @@
     metadata.mutable_lstm_model_params()->set_state_size(512);
     metadata.mutable_lstm_model_params()->set_embedding_dimension(64);
 
-    auto* update_listener = OnDeviceModelUpdateListener::GetInstance();
-    if (update_listener) {
-      update_listener->OnTailModelUpdate(tail_model_path, additional_files,
-                                         metadata);
-    }
+    optimization_guide::proto::Any any_metadata;
+    any_metadata.set_type_url(
+        "type.googleapis.com/com.foo.OnDeviceTailSuggestModelMetadata");
+    metadata.SerializeToString(any_metadata.mutable_value());
+
+    std::unique_ptr<optimization_guide::ModelInfo> model_info =
+        optimization_guide::TestModelInfoBuilder()
+            .SetModelFilePath(tail_model_path)
+            .SetAdditionalFiles(additional_files)
+            .SetVersion(123)
+            .SetModelMetadata(any_metadata)
+            .Build();
+
+    client_->GetOnDeviceTailModelService()->OnModelUpdated(
+        optimization_guide::proto::OptimizationTarget::
+            OPTIMIZATION_TARGET_OMNIBOX_ON_DEVICE_TAIL_SUGGEST,
+        *model_info);
+
     task_environment_.RunUntilIdle();
   }
 #endif
@@ -220,7 +237,8 @@
 
   EXPECT_TRUE(provider_->done());
   EXPECT_FALSE(provider_->matches().empty());
-  EXPECT_EQ(u"facebook", provider_->matches()[0].contents);
+  EXPECT_TRUE(base::StartsWith(provider_->matches()[0].contents, u"facebook",
+                               base::CompareCase::SENSITIVE));
 }
 #endif
 
diff --git a/components/omnibox/browser/on_device_model_update_listener.cc b/components/omnibox/browser/on_device_model_update_listener.cc
index b49cabc7..d4d0aa1e 100644
--- a/components/omnibox/browser/on_device_model_update_listener.cc
+++ b/components/omnibox/browser/on_device_model_update_listener.cc
@@ -35,22 +35,6 @@
   return head_model_filename_;
 }
 
-base::FilePath OnDeviceModelUpdateListener::tail_model_filepath() const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  return tail_model_filepath_;
-}
-
-base::FilePath OnDeviceModelUpdateListener::vocab_filepath() const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  return vocab_filepath_;
-}
-
-optimization_guide::proto::OnDeviceTailSuggestModelMetadata
-OnDeviceModelUpdateListener::tail_model_metadata() const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  return tail_model_metadata_;
-}
-
 OnDeviceModelUpdateListener::OnDeviceModelUpdateListener() = default;
 
 OnDeviceModelUpdateListener::~OnDeviceModelUpdateListener() = default;
@@ -72,29 +56,7 @@
   }
 }
 
-void OnDeviceModelUpdateListener::OnTailModelUpdate(
-    const base::FilePath& model_file,
-    const base::flat_set<base::FilePath>& additional_files,
-    const optimization_guide::proto::OnDeviceTailSuggestModelMetadata&
-        metadata) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (!(model_file.empty() || additional_files.empty())) {
-    tail_model_filepath_ = model_file;
-    tail_model_metadata_ = metadata;
-    for (const auto& file_path : additional_files) {
-      if (!file_path.empty()) {
-        // Currently only one additional file (i.e. vocabulary) will be sent.
-        vocab_filepath_ = file_path;
-        break;
-      }
-    }
-  }
-}
-
 void OnDeviceModelUpdateListener::ResetListenerForTest() {
   head_model_dir_.clear();
   head_model_filename_.clear();
-  tail_model_filepath_.clear();
-  vocab_filepath_.clear();
-  tail_model_metadata_.Clear();
 }
diff --git a/components/omnibox/browser/on_device_model_update_listener.h b/components/omnibox/browser/on_device_model_update_listener.h
index b14776c..6c1d2b6 100644
--- a/components/omnibox/browser/on_device_model_update_listener.h
+++ b/components/omnibox/browser/on_device_model_update_listener.h
@@ -11,7 +11,6 @@
 #include "base/files/file_path.h"
 #include "base/no_destructor.h"
 #include "base/threading/thread_checker.h"
-#include "components/optimization_guide/proto/on_device_tail_suggest_model_metadata.pb.h"
 
 // This class is used by OnDeviceHeadSuggestComponentInstaller or
 // OnDeviceTailModelObserver to hold the filenames for the on device models
@@ -25,20 +24,7 @@
   // |head_model_dir_| and |head_model_filename_|.
   void OnHeadModelUpdate(const base::FilePath& model_dir);
 
-  // Called by on device tail model observer when tail model update is completed
-  // to update |tail_model_filename_|, |vocab_filename_| and
-  // |tail_model_metadata_|.
-  void OnTailModelUpdate(
-      const base::FilePath& model_file,
-      const base::flat_set<base::FilePath>& additional_files,
-      const optimization_guide::proto::OnDeviceTailSuggestModelMetadata&
-          metadata);
-
   std::string head_model_filename() const;
-  base::FilePath tail_model_filepath() const;
-  base::FilePath vocab_filepath() const;
-  optimization_guide::proto::OnDeviceTailSuggestModelMetadata
-  tail_model_metadata() const;
 
  private:
   friend class base::NoDestructor<OnDeviceModelUpdateListener>;
@@ -59,16 +45,6 @@
   // The filename of the head model.
   std::string head_model_filename_;
 
-  // The file path of the tail model.
-  base::FilePath tail_model_filepath_;
-
-  // The file path of the vocabulary file for the tail model.
-  base::FilePath vocab_filepath_;
-
-  // The metadata for the tail model.
-  optimization_guide::proto::OnDeviceTailSuggestModelMetadata
-      tail_model_metadata_;
-
   THREAD_CHECKER(thread_checker_);
 };
 
diff --git a/components/omnibox/browser/on_device_model_update_listener_unittest.cc b/components/omnibox/browser/on_device_model_update_listener_unittest.cc
index c6e01791..31c3dec5 100644
--- a/components/omnibox/browser/on_device_model_update_listener_unittest.cc
+++ b/components/omnibox/browser/on_device_model_update_listener_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "components/omnibox/browser/on_device_model_update_listener.h"
 
-#include "base/containers/flat_set.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/memory/raw_ptr.h"
@@ -17,8 +16,6 @@
 namespace {
 
 static const char kHeadModelFilename[] = "on_device_head_test_model_index.bin";
-static const char kTailModelFilename[] = "test_tail_model.tflite";
-static const char kVocabFilename[] = "vocab_test.txt";
 
 const base::FilePath GetTestDataDir() {
   base::FilePath file_path;
@@ -53,27 +50,4 @@
   task_environment_.RunUntilIdle();
   ASSERT_TRUE(base::EndsWith(listener_->head_model_filename(),
                              kHeadModelFilename, base::CompareCase::SENSITIVE));
-}
-
-TEST_F(OnDeviceModelUpdateListenerTest, OnTailModelUpdate) {
-  base::FilePath dir_path, model_path, vocab_path;
-  dir_path = GetTestDataDir();
-  model_path = dir_path.AppendASCII(kTailModelFilename);
-  vocab_path = dir_path.AppendASCII(kVocabFilename);
-
-  base::flat_set<base::FilePath> additional_files;
-  additional_files.insert(vocab_path);
-
-  optimization_guide::proto::OnDeviceTailSuggestModelMetadata metadata;
-  metadata.mutable_lstm_model_params()->set_state_size(33);
-
-  listener_->OnTailModelUpdate(model_path, additional_files, metadata);
-
-  task_environment_.RunUntilIdle();
-  ASSERT_TRUE(base::EndsWith(listener_->tail_model_filepath().MaybeAsASCII(),
-                             kTailModelFilename, base::CompareCase::SENSITIVE));
-  ASSERT_TRUE(base::EndsWith(listener_->vocab_filepath().MaybeAsASCII(),
-                             kVocabFilename, base::CompareCase::SENSITIVE));
-  ASSERT_EQ(33,
-            listener_->tail_model_metadata().lstm_model_params().state_size());
 }
\ No newline at end of file
diff --git a/components/omnibox/browser/on_device_tail_model_executor.cc b/components/omnibox/browser/on_device_tail_model_executor.cc
index 6c8151f..ed2a0fc 100644
--- a/components/omnibox/browser/on_device_tail_model_executor.cc
+++ b/components/omnibox/browser/on_device_tail_model_executor.cc
@@ -61,6 +61,21 @@
 
 }  // namespace
 
+OnDeviceTailModelExecutor::ModelInput::ModelInput() = default;
+
+OnDeviceTailModelExecutor::ModelInput::ModelInput(std::string prefix,
+                                                  std::string previous_query,
+                                                  size_t max_num_suggestions,
+                                                  size_t max_rnn_steps,
+                                                  float probability_threshold)
+    : prefix(std::move(prefix)),
+      previous_query(std::move(previous_query)),
+      max_num_suggestions(max_num_suggestions),
+      max_rnn_steps(max_rnn_steps),
+      probability_threshold(probability_threshold) {}
+
+OnDeviceTailModelExecutor::ModelInput::~ModelInput() = default;
+
 OnDeviceTailModelExecutor::RnnCellStates::RnnCellStates() = default;
 
 OnDeviceTailModelExecutor::RnnCellStates::RnnCellStates(size_t num_layer,
@@ -508,39 +523,35 @@
 
 std::vector<OnDeviceTailModelExecutor::Prediction>
 OnDeviceTailModelExecutor::GenerateSuggestionsForPrefix(
-    const std::string& prefix,
-    const std::string& previous_query,
-    size_t max_num_suggestions,
-    size_t max_rnn_steps,
-    float probability_threshold) {
+    const ModelInput& input) {
   DCHECK(IsReady());
   std::vector<Prediction> predictions;
 
-  if (prefix.empty()) {
+  if (input.prefix.empty()) {
     return predictions;
   }
 
   OnDeviceTailTokenizer::Tokenization input_tokenization;
-  tokenizer_->CreatePrefixTokenization(prefix, &input_tokenization);
+  tokenizer_->CreatePrefixTokenization(input.prefix, &input_tokenization);
 
   OnDeviceTailTokenizer::TokenIds prev_query_token_ids;
-  tokenizer_->TokenizePrevQuery(previous_query, &prev_query_token_ids);
+  tokenizer_->TokenizePrevQuery(input.previous_query, &prev_query_token_ids);
 
   std::vector<float> prev_query_encoding;
   BeamNode root_beam;
   if (!GetRootBeamNode(input_tokenization, prev_query_token_ids,
                        &prev_query_encoding, &root_beam)) {
-    DVLOG(1) << "Failed to get root beam node for prefix [" << prefix << "]["
-             << previous_query << "]";
+    DVLOG(1) << "Failed to get root beam node for prefix [" << input.prefix
+             << "][" << input.previous_query << "]";
     return predictions;
   }
 
   OnDeviceTailModelExecutor::CandidateQueue partial_candidates,
       completed_candidates;
   partial_candidates.emplace(std::move(root_beam));
-  float log_prob_threshold = GetLogProbability(probability_threshold);
+  float log_prob_threshold = GetLogProbability(input.probability_threshold);
 
-  for (size_t i = 0; i < max_rnn_steps; ++i) {
+  for (size_t i = 0; i < input.max_rnn_steps; ++i) {
     if (partial_candidates.empty()) {
       break;
     }
@@ -555,7 +566,7 @@
       RnnStepOutput rnn_step_output;
       if (RunRnnStep(beam.rnn_step_cache_key, beam.token_ids.back(),
                      prev_query_encoding, beam.states, &rnn_step_output)) {
-        CreateNewBeams(rnn_step_output, beam, max_num_suggestions,
+        CreateNewBeams(rnn_step_output, beam, input.max_num_suggestions,
                        log_prob_threshold, &partial_candidates,
                        &completed_candidates);
 
@@ -593,7 +604,7 @@
     }
 
     // Remove echo suggestion.
-    if (suggestion == prefix) {
+    if (suggestion == input.prefix) {
       continue;
     }
 
diff --git a/components/omnibox/browser/on_device_tail_model_executor.h b/components/omnibox/browser/on_device_tail_model_executor.h
index dd662cc2..7d9332c 100644
--- a/components/omnibox/browser/on_device_tail_model_executor.h
+++ b/components/omnibox/browser/on_device_tail_model_executor.h
@@ -35,6 +35,24 @@
     float probability;
   };
 
+  // The struct holds the input parameters needed to generate predictions from
+  // the model.
+  struct ModelInput {
+    ModelInput();
+    ModelInput(std::string prefix,
+               std::string previous_query,
+               size_t max_num_suggestions,
+               size_t max_rnn_steps,
+               float probability_threshold);
+    ~ModelInput();
+
+    std::string prefix;
+    std::string previous_query;
+    size_t max_num_suggestions;
+    size_t max_rnn_steps;
+    float probability_threshold;
+  };
+
   using ModelMetadata =
       optimization_guide::proto::OnDeviceTailSuggestModelMetadata;
 
@@ -56,12 +74,7 @@
   // with minimum probability `probability_threshold` for the given `prefix` and
   // `previous_query`. The given prefix will only be extended at most
   // `max_rnn_steps` times.
-  std::vector<Prediction> GenerateSuggestionsForPrefix(
-      const std::string& prefix,
-      const std::string& previous_query,
-      size_t max_num_suggestions,
-      size_t max_rnn_steps,
-      float probability_threshold);
+  std::vector<Prediction> GenerateSuggestionsForPrefix(const ModelInput& input);
 
  private:
   friend class OnDeviceTailModelExecutorPublic;
diff --git a/components/omnibox/browser/on_device_tail_model_executor_unittest.cc b/components/omnibox/browser/on_device_tail_model_executor_unittest.cc
index debb29c..667bb2ea 100644
--- a/components/omnibox/browser/on_device_tail_model_executor_unittest.cc
+++ b/components/omnibox/browser/on_device_tail_model_executor_unittest.cc
@@ -348,28 +348,23 @@
   std::vector<OnDeviceTailModelExecutor::Prediction> predictions;
 
   {
-    predictions = executor_->GenerateSuggestionsForPrefix(
-        /*prefix =*/"faceb", /*previous_query=*/"",
-        /*max_num_suggestions =*/5, /*max_rnn_steps =*/20,
-        /*probability_threshold =*/0.05);
+    OnDeviceTailModelExecutor::ModelInput input("faceb", "", 5, 20, 0.05);
+    predictions = executor_->GenerateSuggestionsForPrefix(input);
     EXPECT_FALSE(predictions.empty());
     EXPECT_TRUE(base::StartsWith(predictions[0].suggestion, "facebook",
                                  base::CompareCase::SENSITIVE));
   }
 
   {
-    predictions = executor_->GenerateSuggestionsForPrefix(
-        /*prefix =*/"", /*previous_query=*/"snapchat",
-        /*max_num_suggestions =*/5, /*max_rnn_steps =*/20,
-        /*probability_threshold =*/0.05);
+    OnDeviceTailModelExecutor::ModelInput input("", "snapchat", 5, 20, 0.05);
+    predictions = executor_->GenerateSuggestionsForPrefix(input);
     EXPECT_TRUE(predictions.empty());
   }
 
   {
-    predictions = executor_->GenerateSuggestionsForPrefix(
-        /*prefix =*/"faceb", /*previous_query=*/"snapchat",
-        /*max_num_suggestions =*/5, /*max_rnn_steps =*/20,
-        /*probability_threshold =*/0.05);
+    OnDeviceTailModelExecutor::ModelInput input("faceb", "snapchat", 5, 20,
+                                                0.05);
+    predictions = executor_->GenerateSuggestionsForPrefix(input);
     EXPECT_FALSE(predictions.empty());
     EXPECT_TRUE(base::StartsWith(predictions[0].suggestion, "facebook",
                                  base::CompareCase::SENSITIVE));
diff --git a/components/omnibox/browser/on_device_tail_model_observer.cc b/components/omnibox/browser/on_device_tail_model_observer.cc
deleted file mode 100644
index afa3547..0000000
--- a/components/omnibox/browser/on_device_tail_model_observer.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/omnibox/browser/on_device_tail_model_observer.h"
-
-#include "base/logging.h"
-#include "components/omnibox/browser/on_device_model_update_listener.h"
-#include "components/optimization_guide/core/optimization_guide_util.h"
-#include "components/optimization_guide/proto/models.pb.h"
-#include "components/optimization_guide/proto/on_device_tail_suggest_model_metadata.pb.h"
-
-OnDeviceTailModelObserver::OnDeviceTailModelObserver(
-    optimization_guide::OptimizationGuideModelProvider* opt_guide)
-    : opt_guide_(opt_guide) {
-  if (opt_guide_) {
-    opt_guide_->AddObserverForOptimizationTargetModel(
-        optimization_guide::proto::
-            OPTIMIZATION_TARGET_OMNIBOX_ON_DEVICE_TAIL_SUGGEST,
-        /* model_metadata= */ absl::nullopt, this);
-  }
-}
-
-OnDeviceTailModelObserver::~OnDeviceTailModelObserver() {
-  opt_guide_->RemoveObserverForOptimizationTargetModel(
-      optimization_guide::proto::
-          OPTIMIZATION_TARGET_OMNIBOX_ON_DEVICE_TAIL_SUGGEST,
-      this);
-  opt_guide_ = nullptr;
-}
-
-void OnDeviceTailModelObserver::OnModelUpdated(
-    optimization_guide::proto::OptimizationTarget optimization_target,
-    const optimization_guide::ModelInfo& model_info) {
-  if (optimization_target !=
-      optimization_guide::proto::
-          OPTIMIZATION_TARGET_OMNIBOX_ON_DEVICE_TAIL_SUGGEST) {
-    return;
-  }
-  auto* listener = OnDeviceModelUpdateListener::GetInstance();
-  if (listener) {
-    absl::optional<optimization_guide::proto::OnDeviceTailSuggestModelMetadata>
-        metadata = optimization_guide::ParsedAnyMetadata<
-            optimization_guide::proto::OnDeviceTailSuggestModelMetadata>(
-            model_info.GetModelMetadata().value());
-
-    if (!metadata.has_value()) {
-      DVLOG(1) << "Failed to fetch metadata for Omnibox on device tail model";
-      return;
-    }
-
-    listener->OnTailModelUpdate(model_info.GetModelFilePath(),
-                                model_info.GetAdditionalFiles(),
-                                metadata.value());
-  }
-}
diff --git a/components/omnibox/browser/on_device_tail_model_observer.h b/components/omnibox/browser/on_device_tail_model_observer.h
deleted file mode 100644
index 9328f2f..0000000
--- a/components/omnibox/browser/on_device_tail_model_observer.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_OMNIBOX_BROWSER_ON_DEVICE_TAIL_MODEL_OBSERVER_H_
-#define COMPONENTS_OMNIBOX_BROWSER_ON_DEVICE_TAIL_MODEL_OBSERVER_H_
-
-#include "base/memory/raw_ptr.h"
-#include "components/optimization_guide/core/optimization_guide_model_provider.h"
-#include "components/optimization_guide/core/optimization_target_model_observer.h"
-
-// The optimization target model observer implementation to update the files
-// for Omnibox on device tail suggest.
-class OnDeviceTailModelObserver
-    : public optimization_guide::OptimizationTargetModelObserver {
- public:
-  explicit OnDeviceTailModelObserver(
-      optimization_guide::OptimizationGuideModelProvider* opt_guide);
-  ~OnDeviceTailModelObserver() override;
-
-  // optimization_guide::OptimizationTargetModelObserver implementation:
-  void OnModelUpdated(
-      optimization_guide::proto::OptimizationTarget optimization_target,
-      const optimization_guide::ModelInfo& model_info) override;
-
- private:
-  // Optimization Guide Service that provides model files for this service.
-  raw_ptr<optimization_guide::OptimizationGuideModelProvider> opt_guide_ =
-      nullptr;
-};
-
-#endif  // COMPONENTS_OMNIBOX_BROWSER_ON_DEVICE_TAIL_MODEL_OBSERVER_H_
diff --git a/components/omnibox/browser/on_device_tail_model_service.cc b/components/omnibox/browser/on_device_tail_model_service.cc
index 8973711..f1064f9 100644
--- a/components/omnibox/browser/on_device_tail_model_service.cc
+++ b/components/omnibox/browser/on_device_tail_model_service.cc
@@ -53,14 +53,12 @@
 
 std::vector<OnDeviceTailModelExecutor::Prediction> RunTailModelExecutor(
     OnDeviceTailModelExecutor* executor,
-    const OnDeviceTailModelService::OnDeviceTailModelInput& input) {
+    const OnDeviceTailModelExecutor::ModelInput& input) {
   std::vector<OnDeviceTailModelExecutor::Prediction> predictions;
   if (executor == nullptr || !executor->IsReady()) {
     return predictions;
   }
-  predictions = executor->GenerateSuggestionsForPrefix(
-      input.sanitized_input, input.previous_query, input.max_num_suggestions,
-      input.max_num_step, input.probability_threshold);
+  predictions = executor->GenerateSuggestionsForPrefix(input);
   return predictions;
 }
 
@@ -82,6 +80,9 @@
   }
 }
 
+OnDeviceTailModelService::OnDeviceTailModelService()
+    : tail_model_executor_(nullptr, base::OnTaskRunnerDeleter(nullptr)) {}
+
 OnDeviceTailModelService::~OnDeviceTailModelService() {
   if (model_provider_) {
     model_provider_->RemoveObserverForOptimizationTargetModel(
@@ -115,7 +116,6 @@
     DVLOG(1) << "Failed to fetch metadata for Omnibox on device tail model";
     return;
   }
-
   model_executor_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&InitializeTailModelExecutor, tail_model_executor_.get(),
@@ -125,10 +125,16 @@
 }
 
 void OnDeviceTailModelService::GetPredictionsForInput(
-    const OnDeviceTailModelInput& input,
+    const OnDeviceTailModelExecutor::ModelInput& input,
     ResultCallback result_callback) {
-  model_executor_task_runner_->PostTaskAndReplyWithResult(
-      FROM_HERE,
-      base::BindOnce(&RunTailModelExecutor, tail_model_executor_.get(), input),
-      std::move(result_callback));
+  if (model_executor_task_runner_) {
+    model_executor_task_runner_->PostTaskAndReplyWithResult(
+        FROM_HERE,
+        base::BindOnce(&RunTailModelExecutor, tail_model_executor_.get(),
+                       input),
+        std::move(result_callback));
+  } else {
+    std::move(result_callback)
+        .Run(std::vector<OnDeviceTailModelExecutor::Prediction>());
+  }
 }
diff --git a/components/omnibox/browser/on_device_tail_model_service.h b/components/omnibox/browser/on_device_tail_model_service.h
index f12b9d9..03aeb55 100644
--- a/components/omnibox/browser/on_device_tail_model_service.h
+++ b/components/omnibox/browser/on_device_tail_model_service.h
@@ -22,15 +22,6 @@
   using ResultCallback = base::OnceCallback<void(
       std::vector<OnDeviceTailModelExecutor::Prediction>)>;
 
-  // TODO(crbug.com/1372112): move this struct into model executor class.
-  struct OnDeviceTailModelInput {
-    std::string sanitized_input;
-    std::string previous_query;
-    size_t max_num_suggestions;
-    size_t max_num_step;
-    float probability_threshold;
-  };
-
   explicit OnDeviceTailModelService(
       optimization_guide::OptimizationGuideModelProvider* model_provider);
   ~OnDeviceTailModelService() override;
@@ -45,14 +36,22 @@
       const optimization_guide::ModelInfo& model_info) override;
 
   // Calls the model executor to generate predictions for the input.
-  void GetPredictionsForInput(const OnDeviceTailModelInput& input,
-                              ResultCallback result_callback);
+  void GetPredictionsForInput(
+      const OnDeviceTailModelExecutor::ModelInput& input,
+      ResultCallback result_callback);
 
  private:
   friend class OnDeviceTailModelServiceTest;
+  friend class FakeOnDeviceTailModelService;
+
+  // The default constructor used with tests only, which will create nullptrs
+  // for all private members such that tests can initialize members later on
+  // demand.
+  OnDeviceTailModelService();
 
   // The task runner to run tail model executor.
-  scoped_refptr<base::SequencedTaskRunner> model_executor_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> model_executor_task_runner_ =
+      nullptr;
 
   using ExecutorUniquePtr =
       std::unique_ptr<OnDeviceTailModelExecutor, base::OnTaskRunnerDeleter>;
diff --git a/components/omnibox/browser/on_device_tail_model_service_unittest.cc b/components/omnibox/browser/on_device_tail_model_service_unittest.cc
index 7c3d083..cc0e5cf6 100644
--- a/components/omnibox/browser/on_device_tail_model_service_unittest.cc
+++ b/components/omnibox/browser/on_device_tail_model_service_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/functional/bind.h"
 #include "base/path_service.h"
 #include "base/test/task_environment.h"
+#include "components/omnibox/browser/on_device_tail_model_executor.h"
 #include "components/optimization_guide/core/test_model_info_builder.h"
 #include "components/optimization_guide/core/test_optimization_guide_model_provider.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -94,13 +95,7 @@
 TEST_F(OnDeviceTailModelServiceTest, GetPredictionsForInput) {
   std::vector<OnDeviceTailModelExecutor::Prediction> results;
 
-  OnDeviceTailModelService::OnDeviceTailModelInput input;
-  input.sanitized_input = "faceb";
-  input.previous_query = "";
-  input.max_num_suggestions = 5;
-  input.max_num_step = 20;
-  input.probability_threshold = 0.05;
-
+  OnDeviceTailModelExecutor::ModelInput input("faceb", "", 5, 20, 0.05);
   OnDeviceTailModelService::ResultCallback callback = base::BindOnce(
       [](std::vector<OnDeviceTailModelExecutor::Prediction>* results,
          std::vector<OnDeviceTailModelExecutor::Prediction> predictions) {
diff --git a/components/optimization_guide/core/prediction_model_override.cc b/components/optimization_guide/core/prediction_model_override.cc
index 6cf1c78..aee6068 100644
--- a/components/optimization_guide/core/prediction_model_override.cc
+++ b/components/optimization_guide/core/prediction_model_override.cc
@@ -76,7 +76,7 @@
                              OnPredictionModelBuiltCallback callback,
                              bool success) {
   if (!success) {
-    LOG(ERROR) << FilePathToString(base_model_dir) << "failed to unzip";
+    LOG(ERROR) << FilePathToString(base_model_dir) << " failed to unzip";
     std::move(callback).Run(nullptr);
     return;
   }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoFeatures.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoFeatures.java
index 2ee2879..60287a0 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoFeatures.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoFeatures.java
@@ -7,7 +7,6 @@
 import org.chromium.base.Features;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Page Info features.
@@ -15,7 +14,6 @@
  * TODO(crbug.com/1060097): generate this file.
  */
 @JNINamespace("page_info")
-@MainDex
 public class PageInfoFeatures extends Features {
     public static final String PAGE_INFO_STORE_INFO_NAME = "PageInfoStoreInfo";
 
diff --git a/components/page_info/page_info.cc b/components/page_info/page_info.cc
index 505cfbd4..2196cb3e 100644
--- a/components/page_info/page_info.cc
+++ b/components/page_info/page_info.cc
@@ -553,19 +553,15 @@
 
   // Count how often a permission for a specific content type is changed using
   // the Page Info UI.
-  size_t num_values;
-  int histogram_value = ContentSettingTypeToHistogramValue(type, &num_values);
-  base::UmaHistogramExactLinear("WebsiteSettings.OriginInfo.PermissionChanged",
-                                histogram_value, num_values);
+  RecordContentSettingsHistogram("WebsiteSettings.OriginInfo.PermissionChanged",
+                                 type);
 
   if (setting == ContentSetting::CONTENT_SETTING_ALLOW) {
-    base::UmaHistogramExactLinear(
-        "WebsiteSettings.OriginInfo.PermissionChanged.Allowed", histogram_value,
-        num_values);
+    RecordContentSettingsHistogram(
+        "WebsiteSettings.OriginInfo.PermissionChanged.Allowed", type);
   } else if (setting == ContentSetting::CONTENT_SETTING_BLOCK) {
-    base::UmaHistogramExactLinear(
-        "WebsiteSettings.OriginInfo.PermissionChanged.Blocked", histogram_value,
-        num_values);
+    RecordContentSettingsHistogram(
+        "WebsiteSettings.OriginInfo.PermissionChanged.Blocked", type);
   }
 
   // This is technically redundant given the histogram above, but putting the
diff --git a/components/password_manager/core/browser/affiliation/affiliations_prefetcher_unittest.cc b/components/password_manager/core/browser/affiliation/affiliations_prefetcher_unittest.cc
index 48bb25dd..9f4f587 100644
--- a/components/password_manager/core/browser/affiliation/affiliations_prefetcher_unittest.cc
+++ b/components/password_manager/core/browser/affiliation/affiliations_prefetcher_unittest.cc
@@ -501,9 +501,15 @@
       ->OnLoginsRetained(nullptr, forms);
 }
 
+// Test both true and false (kFillingAcrossAffiliatedWebsites on/off) on Android
+// only. On other platforms, this is already enabled by default.
 INSTANTIATE_TEST_SUITE_P(FillingAcrossAffiliatedWebsites,
                          AffiliationsPrefetcherTest,
+#if BUILDFLAG(IS_ANDROID)
                          ::testing::Bool());
+#else
+                         ::testing::Values(true));
+#endif
 
 class AffiliationsPrefetcherWithTwoStoresTest
     : public AffiliationsPrefetcherTest {
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index 8eea75b..2a7f239 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -145,10 +145,6 @@
     return false;
   DCHECK(error.recovery_type !=
          PasswordStoreBackendErrorRecoveryType::kUnrecoverable);
-  if (!base::FeatureList::IsEnabled(
-          password_manager::features::kUnifiedPasswordManagerErrorMessages)) {
-    return false;
-  }
   return true;
 }
 #endif
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index 39ca4920..f777997f 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -2897,8 +2897,6 @@
 TEST_P(PasswordFormManagerTest,
        ClientShouldShowErrorMessageForAuthErrorResolvable) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kUnifiedPasswordManagerErrorMessages);
   fetcher_->SetProfileStoreBackendError(PasswordStoreBackendError(
       PasswordStoreBackendErrorType::kAuthErrorResolvable,
       PasswordStoreBackendErrorRecoveryType::kRecoverable));
@@ -2912,9 +2910,6 @@
 
 TEST_P(PasswordFormManagerTest,
        ClientShouldShowErrorMessageForAuthErrorUnresolvable) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kUnifiedPasswordManagerErrorMessages);
   fetcher_->SetProfileStoreBackendError(PasswordStoreBackendError(
       PasswordStoreBackendErrorType::kAuthErrorUnresolvable,
       PasswordStoreBackendErrorRecoveryType::kRecoverable));
@@ -2927,23 +2922,7 @@
 }
 
 TEST_P(PasswordFormManagerTest,
-       ClientShouldNotShowErrorMessageWhenFeatureIsDisabled) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      features::kUnifiedPasswordManagerErrorMessages);
-  fetcher_->SetProfileStoreBackendError(PasswordStoreBackendError(
-      PasswordStoreBackendErrorType::kAuthErrorResolvable,
-      PasswordStoreBackendErrorRecoveryType::kRecoverable));
-
-  EXPECT_CALL(client_, ShowPasswordManagerErrorMessage).Times(0);
-  fetcher_->NotifyFetchCompleted();
-}
-
-TEST_P(PasswordFormManagerTest,
        ClientShouldNotShowErrorMessageWhenThereIsNoError) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kUnifiedPasswordManagerErrorMessages);
   fetcher_->SetProfileStoreBackendError(absl::nullopt);
 
   EXPECT_CALL(client_, ShowPasswordManagerErrorMessage).Times(0);
@@ -2952,9 +2931,6 @@
 
 TEST_P(PasswordFormManagerTest,
        ClientShouldNotShowErrorMessageWhenErrorIsNotAuthError) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kUnifiedPasswordManagerErrorMessages);
   fetcher_->SetProfileStoreBackendError(PasswordStoreBackendError(
       PasswordStoreBackendErrorType::kUncategorized,
       PasswordStoreBackendErrorRecoveryType::kUnspecified));
@@ -2964,9 +2940,6 @@
 }
 
 TEST_P(PasswordFormManagerTest, ClientShouldNotShowErrorMessageWhenUnenrolled) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kUnifiedPasswordManagerErrorMessages);
   client_.GetPrefs()->SetBoolean(
       password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors,
       true);
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index 1514ed33..529dc5a 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -71,7 +71,7 @@
 // affiliated website.
 BASE_FEATURE(kFillingAcrossAffiliatedWebsites,
              "FillingAcrossAffiliatedWebsites",
-#if !BUILDFLAG(IS_ANDROID) // Desktop and iOS
+#if !BUILDFLAG(IS_ANDROID)  // Desktop and iOS
              base::FEATURE_ENABLED_BY_DEFAULT);
 #else
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -241,11 +241,6 @@
              "UnifiedPasswordManagerAndroid",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enables showing contextual error messages when UPM encounters an auth error.
-BASE_FEATURE(kUnifiedPasswordManagerErrorMessages,
-             "UnifiedPasswordManagerErrorMessages",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enables showing the warning about UPM migrating local passwords.
 BASE_FEATURE(kUnifiedPasswordManagerLocalPasswordsMigrationWarning,
              "UnifiedPasswordManagerLocalPasswordsMigrationWarning",
@@ -299,21 +294,6 @@
 extern const base::FeatureParam<int> kMigrationVersion = {
     &kUnifiedPasswordManagerAndroid, "migration_version", 1};
 
-// Whether to ignore the 24h timeout in between auth error messages as
-// well as the 30 mins distance to sync error messages.
-extern const base::FeatureParam<bool> kIgnoreAuthErrorMessageTimeouts = {
-    &kUnifiedPasswordManagerErrorMessages, "ignore_auth_error_message_timeouts",
-    false};
-
-// The maximum number of authentication error UI messages to show before
-// considering auth errors as unrecoverable and unenrolling the user from UPM.
-// If this param is set, unenrollment will happen even if the auth error is in
-// the ignore list.
-// By default, there is no limit to how many errors will be shown.
-extern const base::FeatureParam<int> kMaxShownUPMErrorsBeforeEviction = {
-    &kUnifiedPasswordManagerErrorMessages,
-    "max_shown_auth_errors_before_eviction", -1};
-
 // The string version to use for the save/update password prompts when the user
 // is syncing passwords. Version 1 is outdated, so the only supported versions
 // currently are 2 and 3.
@@ -343,8 +323,9 @@
 
 #if BUILDFLAG(IS_ANDROID)
 bool UsesUnifiedPasswordManagerUi() {
-  if (!base::FeatureList::IsEnabled(kUnifiedPasswordManagerAndroid))
+  if (!base::FeatureList::IsEnabled(kUnifiedPasswordManagerAndroid)) {
     return false;
+  }
   UpmExperimentVariation variation = kUpmExperimentVariationParam.Get();
   switch (variation) {
     case UpmExperimentVariation::kEnableForSyncingUsers:
@@ -364,8 +345,9 @@
 }
 
 bool RequiresMigrationForUnifiedPasswordManager() {
-  if (!base::FeatureList::IsEnabled(kUnifiedPasswordManagerAndroid))
+  if (!base::FeatureList::IsEnabled(kUnifiedPasswordManagerAndroid)) {
     return false;
+  }
   UpmExperimentVariation variation = kUpmExperimentVariationParam.Get();
   switch (variation) {
     case UpmExperimentVariation::kEnableForSyncingUsers:
@@ -380,8 +362,9 @@
 }
 
 bool ManagesLocalPasswordsInUnifiedPasswordManager() {
-  if (!base::FeatureList::IsEnabled(kUnifiedPasswordManagerAndroid))
+  if (!base::FeatureList::IsEnabled(kUnifiedPasswordManagerAndroid)) {
     return false;
+  }
   UpmExperimentVariation variation = kUpmExperimentVariationParam.Get();
   switch (variation) {
     case UpmExperimentVariation::kEnableForSyncingUsers:
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h
index d6bef812..c6d7bbc 100644
--- a/components/password_manager/core/common/password_manager_features.h
+++ b/components/password_manager/core/common/password_manager_features.h
@@ -52,7 +52,7 @@
 BASE_DECLARE_FEATURE(kIOSPasswordUISplit);
 BASE_DECLARE_FEATURE(kIOSPasswordCheckup);
 BASE_DECLARE_FEATURE(kIOSPasswordBottomSheet);
-#endif  // IS_IOS
+#endif                                            // IS_IOS
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)  // Desktop
 BASE_DECLARE_FEATURE(kMemoryMapWeaknessCheckDictionaries);
 #endif
@@ -81,7 +81,6 @@
 BASE_DECLARE_FEATURE(kShowUPMErrorNotification);
 BASE_DECLARE_FEATURE(kUnifiedCredentialManagerDryRun);
 BASE_DECLARE_FEATURE(kUnifiedPasswordManagerAndroid);
-BASE_DECLARE_FEATURE(kUnifiedPasswordManagerErrorMessages);
 BASE_DECLARE_FEATURE(kUnifiedPasswordManagerLocalPasswordsMigrationWarning);
 BASE_DECLARE_FEATURE(kUnifiedPasswordManagerSyncUsingAndroidBackendOnly);
 BASE_DECLARE_FEATURE(kUnifiedPasswordManagerAndroidBranding);
@@ -166,9 +165,6 @@
                                  UpmExperimentVariation::kEnableForSyncingUsers,
                                  &kUpmExperimentVariationOption};
 
-extern const base::FeatureParam<bool> kIgnoreAuthErrorMessageTimeouts;
-extern const base::FeatureParam<int> kMaxShownUPMErrorsBeforeEviction;
-
 extern const base::FeatureParam<int> kSaveUpdatePromptSyncingStringVersion;
 #endif
 
diff --git a/components/password_manager/core/common/password_manager_pref_names.h b/components/password_manager/core/common/password_manager_pref_names.h
index e184044..f930194 100644
--- a/components/password_manager/core/common/password_manager_pref_names.h
+++ b/components/password_manager/core/common/password_manager_pref_names.h
@@ -118,6 +118,7 @@
 // auth error UI was displayed to the user. Reset once the error is resolved
 // (detected by a successful backend request) or when the user is unenrolled
 // from UPM.
+// Deprecated. TODO(crbug/1313893): cleanup.
 extern const char kTimesUPMAuthErrorShown[];
 #endif
 
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java
index 022eb000..efbf555 100644
--- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java
@@ -8,7 +8,6 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of features relevant for
@@ -16,7 +15,6 @@
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("permissions")
-@MainDex
 public class PermissionsAndroidFeatureList {
     public static final String ANDROID_APPROXIMATE_LOCATION_PERMISSION_SUPPORT =
             "AndroidApproximateLocationPermissionSupport";
diff --git a/components/permissions/permission_context_base_unittest.cc b/components/permissions/permission_context_base_unittest.cc
index 046a00dd..da271235 100644
--- a/components/permissions/permission_context_base_unittest.cc
+++ b/components/permissions/permission_context_base_unittest.cc
@@ -290,17 +290,13 @@
       auto* entry = entries.front();
       ukm_recorder.ExpectEntrySourceHasUrl(entry, url);
 
-      size_t num_values = 0;
-
-      EXPECT_NE(ContentSettingTypeToHistogramValue(content_settings_type,
-                                                   &num_values),
-                -1);
+      EXPECT_NE(ContentSettingTypeToHistogramValue(content_settings_type), -1);
 
       EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Source"),
                 static_cast<int64_t>(PermissionSourceUI::PROMPT));
       EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "PermissionType"),
-                static_cast<int64_t>(ContentSettingTypeToHistogramValue(
-                    content_settings_type, &num_values)));
+                static_cast<int64_t>(
+                    ContentSettingTypeToHistogramValue(content_settings_type)));
       EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Action"),
                 static_cast<int64_t>(action.value()));
 
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc
index 267eb57..d2c754e 100644
--- a/components/permissions/permission_uma_util.cc
+++ b/components/permissions/permission_uma_util.cc
@@ -267,12 +267,9 @@
   if (!source_id.has_value())
     return;
 
-  size_t num_values = 0;
-
   ukm::builders::PermissionUsage builder(source_id.value());
   builder.SetPermissionType(static_cast<int64_t>(
-      ContentSettingTypeToHistogramValue(permission_type, &num_values)));
-
+      ContentSettingTypeToHistogramValue(permission_type)));
   builder.Record(ukm::UkmRecorder::Get());
 }
 
@@ -301,8 +298,6 @@
   if (!source_id.has_value())
     return;
 
-  size_t num_values = 0;
-
   const int loud_ui_prompts_count_for_request_type =
       loud_ui_actions_counts_for_request_type.total();
   const int loud_ui_prompts_count = loud_ui_actions_counts.total();
@@ -312,8 +307,8 @@
   ukm::builders::Permission builder(source_id.value());
   builder.SetAction(static_cast<int64_t>(action))
       .SetGesture(static_cast<int64_t>(gesture_type))
-      .SetPermissionType(static_cast<int64_t>(
-          ContentSettingTypeToHistogramValue(permission, &num_values)))
+      .SetPermissionType(
+          static_cast<int64_t>(ContentSettingTypeToHistogramValue(permission)))
       .SetPriorDismissals(std::min(kPriorCountCap, dismiss_count))
       .SetPriorIgnores(std::min(kPriorCountCap, ignore_count))
       .SetSource(static_cast<int64_t>(source_ui))
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc
index 66a286329..6aebda2 100644
--- a/components/policy/core/browser/configuration_policy_handler.cc
+++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -118,30 +118,33 @@
 
 bool ListPolicyHandler::CheckPolicySettings(const policy::PolicyMap& policies,
                                             policy::PolicyErrorMap* errors) {
-  return CheckAndGetList(policies, errors, nullptr);
+  absl::optional<base::Value::List> empty = absl::nullopt;
+  return CheckAndGetList(policies, errors, empty);
 }
 
 void ListPolicyHandler::ApplyPolicySettings(const policy::PolicyMap& policies,
                                             PrefValueMap* prefs) {
-  base::Value list(base::Value::Type::NONE);
-  if (CheckAndGetList(policies, nullptr, &list) && list.is_list())
-    ApplyList(std::move(list), prefs);
+  auto list = absl::make_optional<base::Value::List>();
+  if (CheckAndGetList(policies, nullptr, list) && list) {
+    ApplyList(*std::move(list), prefs);
+  }
 }
 
-bool ListPolicyHandler::CheckAndGetList(const policy::PolicyMap& policies,
-                                        policy::PolicyErrorMap* errors,
-                                        base::Value* filtered_list) {
+bool ListPolicyHandler::CheckAndGetList(
+    const policy::PolicyMap& policies,
+    policy::PolicyErrorMap* errors,
+    absl::optional<base::Value::List>& filtered_list) {
   const base::Value* value = nullptr;
   if (!CheckAndGetValue(policies, errors, &value))
     return false;
 
-  if (!value)
+  if (!value) {
+    filtered_list = absl::nullopt;  // nothing to apply
     return true;
+  }
 
   // Filter the list, rejecting any invalid strings.
   const base::Value::List& list = value->GetList();
-  if (filtered_list)
-    *filtered_list = base::Value(base::Value::Type::LIST);
   for (size_t list_index = 0; list_index < list.size(); ++list_index) {
     const base::Value& entry = list[list_index];
     if (entry.type() != list_entry_type_) {
@@ -162,7 +165,7 @@
     }
 
     if (filtered_list)
-      filtered_list->GetList().Append(entry.Clone());
+      filtered_list->Append(entry.Clone());
   }
 
   return true;
diff --git a/components/policy/core/browser/configuration_policy_handler.h b/components/policy/core/browser/configuration_policy_handler.h
index 55d92c0..9e1ba42e 100644
--- a/components/policy/core/browser/configuration_policy_handler.h
+++ b/components/policy/core/browser/configuration_policy_handler.h
@@ -15,6 +15,7 @@
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/core/common/schema.h"
 #include "components/policy/policy_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 class PrefValueMap;
 
@@ -158,16 +159,18 @@
 
   // Implement this method to apply the |filtered_list| of values of type
   // |list_entry_type_| as returned from CheckAndGetList() to |prefs|.
-  virtual void ApplyList(base::Value filtered_list, PrefValueMap* prefs) = 0;
+  virtual void ApplyList(base::Value::List filtered_list,
+                         PrefValueMap* prefs) = 0;
 
  private:
   // Checks whether the policy value is indeed a list, filters out all entries
   // that are not of type |list_entry_type_| or where CheckListEntry() returns
-  // false, and returns the |filtered_list| if not nullptr. Sets errors for
-  // filtered list entries if |errors| is not nullptr.
+  // false, and appends to |filtered_list| if present. If the value is missing,
+  // |filtered_list| is cleared. Sets errors for filtered list entries if
+  // |errors| is not nullptr.
   bool CheckAndGetList(const policy::PolicyMap& policies,
                        policy::PolicyErrorMap* errors,
-                       base::Value* filtered_list);
+                       absl::optional<base::Value::List>& filtered_list);
 
   // Expected value type for list entries. All other types are filtered out.
   base::Value::Type list_entry_type_;
diff --git a/components/policy/core/browser/configuration_policy_handler_unittest.cc b/components/policy/core/browser/configuration_policy_handler_unittest.cc
index fb9692f..3019aa8 100644
--- a/components/policy/core/browser/configuration_policy_handler_unittest.cc
+++ b/components/policy/core/browser/configuration_policy_handler_unittest.cc
@@ -117,9 +117,9 @@
       : ListPolicyHandler(policy_name, base::Value::Type::STRING) {}
 
  protected:
-  void ApplyList(base::Value filtered_list, PrefValueMap* prefs) override {
-    DCHECK(filtered_list.is_list());
-    prefs->SetValue(kTestPref, std::move(filtered_list));
+  void ApplyList(base::Value::List filtered_list,
+                 PrefValueMap* prefs) override {
+    prefs->SetValue(kTestPref, base::Value(std::move(filtered_list)));
   }
 };
 
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler.cc b/components/policy/core/browser/url_scheme_list_policy_handler.cc
index 69a6ca7..ca3f1d48 100644
--- a/components/policy/core/browser/url_scheme_list_policy_handler.cc
+++ b/components/policy/core/browser/url_scheme_list_policy_handler.cc
@@ -42,10 +42,10 @@
 
   // Filters more than |url_util::kMaxFiltersPerPolicy| are ignored, add a
   // warning message.
-  if (schemes->GetList().size() > policy::kMaxUrlFiltersPerPolicy) {
+  if (schemes->GetList().size() > max_items()) {
     errors->AddError(policy_name(),
                      IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING,
-                     base::NumberToString(policy::kMaxUrlFiltersPerPolicy));
+                     base::NumberToString(max_items()));
   }
 
   std::vector<std::string> invalid_policies;
@@ -70,8 +70,9 @@
     return;
   base::Value::List filtered_schemes;
   for (const auto& entry : schemes->GetList()) {
-    if (filtered_schemes.size() >= policy::kMaxUrlFiltersPerPolicy)
+    if (filtered_schemes.size() >= max_items()) {
       break;
+    }
 
     if (ValidatePolicyEntry(entry.GetIfString()))
       filtered_schemes.Append(entry.Clone());
@@ -80,6 +81,10 @@
   prefs->SetValue(pref_path_, base::Value(std::move(filtered_schemes)));
 }
 
+size_t URLSchemeListPolicyHandler::max_items() {
+  return kMaxUrlFiltersPerPolicy;
+}
+
 // Validates that policy follows official pattern
 // https://www.chromium.org/administrators/url-blocklist-filter-format
 bool URLSchemeListPolicyHandler::ValidatePolicyEntry(
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler.h b/components/policy/core/browser/url_scheme_list_policy_handler.h
index 599dedbb..15a3d025 100644
--- a/components/policy/core/browser/url_scheme_list_policy_handler.h
+++ b/components/policy/core/browser/url_scheme_list_policy_handler.h
@@ -29,8 +29,11 @@
   void ApplyPolicySettings(const PolicyMap& policies,
                            PrefValueMap* prefs) override;
 
+ protected:
+  virtual size_t max_items();
+  virtual bool ValidatePolicyEntry(const std::string* policy);
+
  private:
-  bool ValidatePolicyEntry(const std::string* policy);
   const char* pref_path_;
 
   FRIEND_TEST_ALL_PREFIXES(URLSchemeListPolicyHandlerTest, ValidatePolicyEntry);
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml
index 85fd15ca..ce549ca 100644
--- a/components/policy/resources/templates/policies.yaml
+++ b/components/policy/resources/templates/policies.yaml
@@ -1099,7 +1099,7 @@
   1098: SafeBrowsingExtensionProtectionAllowed
   1099: ShowDisplaySizeScreenEnabled
   1100: AnonymousSearchEnabled
-
+  1101: LegacyTechReportAllowlist
 atomic_groups:
   1: Homepage
   2: RemoteAccess
diff --git a/components/policy/resources/templates/policy_definitions/CloudReporting/LegacyTechReportAllowlist.yaml b/components/policy/resources/templates/policy_definitions/CloudReporting/LegacyTechReportAllowlist.yaml
new file mode 100644
index 0000000..e193a0c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitions/CloudReporting/LegacyTechReportAllowlist.yaml
@@ -0,0 +1,40 @@
+caption: Specifies URLs that allow legacy technology report
+default: []
+desc: |-
+  Controls if a page that use legacy technologies will be reported based on its URL.
+
+  When policy is set, the URLs whose prefix match an allowlist entry will be used to generated report and uploaded. Unmatched URLs will be ignored.
+  When policy is not set or set to an empty list, no report will be generated.
+
+  The matching patterns use a similar format to those for the '<ph name="URL_BLOCKLIST_POLICY_NAME">URLBlocklist</ph>' policy, which are documented at https://support.google.com/chrome/a?p=url_blocklist_filter_format. With a few exceptions below:
+   * No wildcard '*' support.
+   * Schema, port and query are ignored.
+   * subdomain must always be specified to be matched.
+   * At most 100 URLs can be added into the allowlist,
+
+  For <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>, this policy is only effective when the machine is enrolled with <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN">CloudManagementEnrollmentToken</ph>.
+
+  More information about legacy technologies can be found at https://chromestatus.com/features.
+example_value:
+- example.com
+- www.example.edu/path
+features:
+  cloud_only: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- chrome.*
+- chrome_os
+- android
+- fuchsia
+owners:
+- zmin@chromium.org
+- file://components/enterprise/browser/reporting/OWNERS
+schema:
+  items:
+    type: string
+  type: array
+tags:
+- admin-sharing
+- google-sharing
+type: list
diff --git a/components/policy/test/data/policy_test_cases.json b/components/policy/test/data/policy_test_cases.json
index cf384bc..20d38f4 100644
--- a/components/policy/test/data/policy_test_cases.json
+++ b/components/policy/test/data/policy_test_cases.json
@@ -16525,6 +16525,60 @@
       }
     ]
   },
+  "LegacyTechReportAllowlist": {
+    "os": [
+      "win",
+      "linux",
+      "mac",
+      "chromeos_lacros",
+      "android",
+      "fuchsia"
+    ],
+    "policy_pref_mapping_tests": [
+      {
+        "policies": {
+          "LegacyTechReportAllowlist": [
+            "https://www.example.com",
+            "www.example.com/path",
+            "192.168.0.1:8088/path",
+            "localhost"
+          ]
+        },
+        "policies_settings": {
+          "LegacyTechReportAllowlist": {
+            "scope": "machine",
+            "source": "cloud"
+          }
+        },
+        "prefs": {
+          "enterprise_reporting.legachy_tech.urls": {
+            "value": [
+              "https://www.example.com",
+              "www.example.com/path",
+              "192.168.0.1:8088/path",
+              "localhost"
+            ]
+          }
+        }
+      },
+      {
+        "policies": {
+          "LegacyTechReportAllowlist": []
+        },
+        "policies_settings": {
+          "LegacyTechReportAllowlist": {
+            "scope": "machine",
+            "source": "cloud"
+          }
+        },
+        "prefs": {
+          "enterprise_reporting.legachy_tech.urls": {
+            "value": []
+          }
+        }
+      }
+    ]
+  },
   "CloudReportingUploadFrequency": {
     "os": [
       "win",
diff --git a/components/printing/renderer/BUILD.gn b/components/printing/renderer/BUILD.gn
index b87cb9ae..a7c0ba09 100644
--- a/components/printing/renderer/BUILD.gn
+++ b/components/printing/renderer/BUILD.gn
@@ -22,8 +22,4 @@
     "//third_party/blink/public/common",
     "//ui/base",
   ]
-
-  if (is_mac) {
-    sources += [ "print_render_frame_helper_mac.mm" ]
-  }
 }
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index 35a39df..9328ac37 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -2568,7 +2568,6 @@
   return true;
 }
 
-#if !BUILDFLAG(IS_APPLE)
 void PrintRenderFrameHelper::PrintPageInternal(const mojom::PrintParams& params,
                                                uint32_t page_number,
                                                uint32_t page_count,
@@ -2613,7 +2612,6 @@
   bool ret = metafile->FinishPage();
   DCHECK(ret);
 }
-#endif  // !BUILDFLAG(IS_APPLE)
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 void PrintRenderFrameHelper::ShowScriptedPrintPreview() {
diff --git a/components/printing/renderer/print_render_frame_helper_mac.mm b/components/printing/renderer/print_render_frame_helper_mac.mm
deleted file mode 100644
index 92cbcb3..0000000
--- a/components/printing/renderer/print_render_frame_helper_mac.mm
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/printing/renderer/print_render_frame_helper.h"
-
-#import <AppKit/AppKit.h>
-
-#include <memory>
-
-#include "base/check.h"
-#include "base/mac/scoped_nsautorelease_pool.h"
-#include "base/metrics/histogram.h"
-#include "cc/paint/paint_canvas.h"
-#include "printing/buildflags/buildflags.h"
-#include "printing/metafile_skia.h"
-#include "printing/mojom/print.mojom.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-
-namespace printing {
-
-void PrintRenderFrameHelper::PrintPageInternal(const mojom::PrintParams& params,
-                                               uint32_t page_number,
-                                               uint32_t page_count,
-                                               double scale_factor,
-                                               blink::WebLocalFrame* frame,
-                                               MetafileSkia* metafile) {
-  double css_scale_factor = scale_factor;
-  mojom::PageSizeMarginsPtr page_layout_in_points =
-      ComputePageLayoutInPointsForCss(frame, page_number, params,
-                                      ignore_css_margins_, &css_scale_factor);
-
-  gfx::Size page_size;
-  gfx::Rect content_area;
-  GetPageSizeAndContentAreaFromPageLayout(*page_layout_in_points, &page_size,
-                                          &content_area);
-
-  gfx::Rect canvas_area =
-      params.display_header_footer ? gfx::Rect(page_size) : content_area;
-
-  double webkit_page_shrink_factor = frame->GetPrintPageShrink(page_number);
-  float final_scale_factor = css_scale_factor * webkit_page_shrink_factor;
-
-  cc::PaintCanvas* canvas = metafile->GetVectorCanvasForNewPage(
-      page_size, canvas_area, final_scale_factor, params.page_orientation);
-  if (!canvas)
-    return;
-
-  canvas->SetPrintingMetafile(metafile);
-  if (params.display_header_footer) {
-    PrintHeaderAndFooter(canvas, page_number + 1, page_count, *frame,
-                         final_scale_factor, *page_layout_in_points, params);
-  }
-  RenderPageContent(frame, page_number, canvas_area, content_area,
-                    final_scale_factor, canvas);
-
-  // Done printing. Close the canvas to retrieve the compiled metafile.
-  bool ret = metafile->FinishPage();
-  DCHECK(ret);
-}
-
-}  // namespace printing
diff --git a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc
index d9a2ccf2..7e6269f8 100644
--- a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc
+++ b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.cc
@@ -205,15 +205,13 @@
           // need to adjust our search url to the original request.
           auto* retargeting_nav_event =
               GetNavigationEvent(retargeting_nav_event_index);
-          if (!nav_event->server_redirect_urls.empty()) {
-            // Adjust retargeting navigation event's attributes.
-            retargeting_nav_event->server_redirect_urls.push_back(
-                std::move(search_url));
-          } else {
-            // The retargeting_nav_event original request url is unreliable,
-            // since that navigation can be canceled.
-            retargeting_nav_event->original_request_url = std::move(search_url);
-          }
+          // Adjust retargeting navigation event's attributes. The
+          // retargeting_nav_event original request and redirects are
+          // unreliable, since that navigation can be canceled.
+          retargeting_nav_event->server_redirect_urls =
+              nav_event->server_redirect_urls;
+          retargeting_nav_event->original_request_url =
+              nav_event->original_request_url;
           result_index = retargeting_nav_event_index;
         }
       }
diff --git a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_unittest.cc b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_unittest.cc
index 992b3f3..88ebb06 100644
--- a/components/safe_browsing/content/browser/safe_browsing_navigation_observer_unittest.cc
+++ b/components/safe_browsing/content/browser/safe_browsing_navigation_observer_unittest.cc
@@ -852,6 +852,65 @@
   EXPECT_TRUE(referrer_chain[0].is_retargeting());
 }
 
+TEST_F(SBNavigationObserverTest,
+       CanceledRetargetingNavigationHasCorrectRedirects) {
+  base::Time now = base::Time::Now();
+  base::Time one_second_ago = base::Time::FromDoubleT(now.ToDoubleT() - 1.0);
+
+  SessionID source_tab = SessionID::NewUnique();
+  SessionID target_tab = SessionID::NewUnique();
+
+  // Add two navigations. A initially opens a new tab with url B, but cancels
+  // that before it completes. It then navigates the new tab to C. We expect
+  // that asking for the referrer chain for C has C as the event url.
+  std::unique_ptr<NavigationEvent> first_navigation =
+      std::make_unique<NavigationEvent>();
+  first_navigation->source_url = GURL("http://example.com/a");
+  first_navigation->original_request_url = GURL("http://example.com/b");
+  first_navigation->server_redirect_urls.emplace_back(
+      "http://example.com/b_redirect1");
+  first_navigation->server_redirect_urls.emplace_back(
+      "http://example.com/b_redirect2");
+  first_navigation->last_updated = one_second_ago;
+  first_navigation->navigation_initiation =
+      ReferrerChainEntry::RENDERER_INITIATED_WITH_USER_GESTURE;
+  first_navigation->source_tab_id = source_tab;
+  first_navigation->target_tab_id = target_tab;
+  first_navigation->has_committed = false;
+  navigation_event_list()->RecordNavigationEvent(std::move(first_navigation));
+
+  std::unique_ptr<NavigationEvent> second_navigation =
+      std::make_unique<NavigationEvent>();
+  second_navigation->original_request_url = GURL("http://example.com/c");
+  second_navigation->server_redirect_urls.emplace_back(
+      "http://example.com/c_redirect1");
+  second_navigation->server_redirect_urls.emplace_back(
+      "http://example.com/c_redirect2");
+  second_navigation->last_updated = now;
+  second_navigation->navigation_initiation =
+      ReferrerChainEntry::BROWSER_INITIATED;
+  second_navigation->source_tab_id = target_tab;
+  second_navigation->target_tab_id = target_tab;
+  navigation_event_list()->RecordNavigationEvent(std::move(second_navigation));
+
+  ReferrerChain referrer_chain;
+  navigation_observer_manager_->IdentifyReferrerChainByEventURL(
+      GURL("http://example.com/c_redirect2"), SessionID::InvalidValue(),
+      content::GlobalRenderFrameHostId(), 10, &referrer_chain);
+
+  ASSERT_EQ(1, referrer_chain.size());
+
+  EXPECT_EQ("http://example.com/c_redirect2", referrer_chain[0].url());
+  ASSERT_EQ(3, referrer_chain[0].server_redirect_chain_size());
+  EXPECT_EQ("http://example.com/c",
+            referrer_chain[0].server_redirect_chain(0).url());
+  EXPECT_EQ("http://example.com/c_redirect1",
+            referrer_chain[0].server_redirect_chain(1).url());
+  EXPECT_EQ("http://example.com/c_redirect2",
+            referrer_chain[0].server_redirect_chain(2).url());
+  EXPECT_TRUE(referrer_chain[0].is_retargeting());
+}
+
 TEST_F(SBNavigationObserverTest, TestGetLatestPendingNavigationEvent) {
   base::Time now = base::Time::Now();
   base::Time one_minute_ago = base::Time::FromDoubleT(now.ToDoubleT() - 60.0);
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc
index 89803f2..0ff6d6a 100644
--- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc
+++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc
@@ -134,6 +134,7 @@
     std::unique_ptr<tflite::task::vision::ImageClassifier> classifier,
     scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
     base::OnceCallback<void(std::vector<double>)> callback) {
+  base::Time before_operation = base::Time::Now();
   tflite::task::vision::FrameBuffer::Plane plane{
       reinterpret_cast<const tflite::uint8*>(model_input.data()),
       {3 * input_width, 3}};
@@ -142,6 +143,8 @@
       tflite::task::vision::FrameBuffer::Format::kRGB,
       tflite::task::vision::FrameBuffer::Orientation::kTopLeft);
   auto statusor_result = classifier->Classify(*frame_buffer);
+  base::UmaHistogramTimes("SBClientPhishing.ApplyTfliteTime.Classify",
+                          base::Time::Now() - before_operation);
   if (!statusor_result.ok()) {
     VLOG(1) << statusor_result.status().ToString();
     callback_task_runner->PostTask(
diff --git a/components/safe_browsing/core/browser/db/v4_store.cc b/components/safe_browsing/core/browser/db/v4_store.cc
index 9446b88..b4df352 100644
--- a/components/safe_browsing/core/browser/db/v4_store.cc
+++ b/components/safe_browsing/core/browser/db/v4_store.cc
@@ -265,6 +265,76 @@
   CopyingBaseFileOutputStream stream_;
 };
 
+// A ZeroCopyInputStream that reads from a file using base::File. Any errors
+// during deserialization close the file.
+class BaseFileInputStream : public google::protobuf::io::ZeroCopyInputStream {
+ public:
+  // Creates and opens `input_file`.
+  explicit BaseFileInputStream(const base::FilePath& input_file)
+      : stream_(input_file), impl_(&stream_) {}
+  BaseFileInputStream(const BaseFileInputStream&) = delete;
+  BaseFileInputStream& operator=(const BaseFileInputStream&) = delete;
+
+  // Closes the file, if it was still open.
+  ~BaseFileInputStream() override = default;
+
+  // Returns `base::File::FILE_OK` if no error and the file is still open; else
+  // the error that led to closure of the file.
+  base::File::Error GetError() const { return stream_.GetError(); }
+
+  // google::protobuf::io::ZeroCopyInputStream:
+  bool Next(const void** data, int* size) override {
+    return impl_.Next(data, size);
+  }
+  void BackUp(int count) override { return impl_.BackUp(count); }
+  bool Skip(int count) override { return impl_.Skip(count); }
+  int64_t ByteCount() const override { return impl_.ByteCount(); }
+
+ private:
+  class CopyingBaseFileInputStream
+      : public google::protobuf::io::CopyingInputStream {
+   public:
+    explicit CopyingBaseFileInputStream(const base::FilePath& input_file)
+        : file_(input_file,
+                base::File::FLAG_OPEN | base::File::FLAG_READ |
+                    base::File::FLAG_WIN_EXCLUSIVE_WRITE |
+                    base::File::FLAG_WIN_SHARE_DELETE) {}
+    CopyingBaseFileInputStream(const CopyingBaseFileInputStream&) = delete;
+    CopyingBaseFileInputStream& operator=(const CopyingBaseFileInputStream&) =
+        delete;
+    ~CopyingBaseFileInputStream() override = default;
+
+    base::File::Error GetError() const { return file_.error_details(); }
+
+    // google::protobuf::io::CopyingInputStream:
+    int Read(void* buffer, int size) override {
+      if (!file_.IsValid()) {
+        return -1;
+      }
+      const int bytes_read =
+          file_.ReadAtCurrentPos(reinterpret_cast<char*>(buffer), size);
+      if (bytes_read >= 0) {
+        return bytes_read;
+      }
+      file_ = base::File(base::File::GetLastFileError());
+      return -1;
+    }
+
+    int Skip(int count) override {
+      if (file_.Seek(base::File::FROM_CURRENT, count) != -1) {
+        return count;
+      }
+      return CopyingInputStream::Skip(count);
+    }
+
+   private:
+    base::File file_;
+  };
+
+  CopyingBaseFileInputStream stream_;
+  google::protobuf::io::CopyingInputStreamAdaptor impl_;
+};
+
 }  // namespace
 
 using ::google::protobuf::int32;
@@ -798,22 +868,21 @@
   V4StoreFileFormat file_format;
   int64_t file_size;
   {
-    // A temporary scope to make sure that |contents| get destroyed as soon as
-    // we are doing using it.
-    std::string contents;
-    if (!base::ReadFileToStringWithMaxSize(store_path_, &contents,
-                                           kMaxStoreSizeBytes)) {
+    BaseFileInputStream input_stream(store_path_);
+    if (!file_format.ParseFromZeroCopyStream(&input_stream)) {
+      return input_stream.GetError() != base::File::FILE_OK
+                 ? FILE_UNREADABLE_FAILURE
+                 : PROTO_PARSING_FAILURE;
+    }
+    // `ParseFromZeroCopyStream` will return true if the file didn't exist, so
+    // explicitly check for an error when reading from the file.
+    if (input_stream.GetError() != base::File::FILE_OK) {
       return FILE_UNREADABLE_FAILURE;
     }
-
-    if (contents.empty()) {
+    file_size = input_stream.ByteCount();
+    if (!file_size) {
       return FILE_EMPTY_FAILURE;
     }
-
-    if (!file_format.ParseFromString(contents)) {
-      return PROTO_PARSING_FAILURE;
-    }
-    file_size = static_cast<int64_t>(contents.size());
   }
 
   if (file_format.magic_number() != kFileMagic) {
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn
index 5da475c..1532beb6 100644
--- a/components/segmentation_platform/internal/BUILD.gn
+++ b/components/segmentation_platform/internal/BUILD.gn
@@ -102,6 +102,8 @@
     "execution/processing/uma_feature_processor.h",
     "local_state_helper_impl.cc",
     "local_state_helper_impl.h",
+    "logging.cc",
+    "logging.h",
     "metadata/metadata_utils.cc",
     "metadata/metadata_utils.h",
     "metadata/metadata_writer.cc",
diff --git a/components/segmentation_platform/internal/database/cached_result_provider.cc b/components/segmentation_platform/internal/database/cached_result_provider.cc
index ab9af47..a5be16d 100644
--- a/components/segmentation_platform/internal/database/cached_result_provider.cc
+++ b/components/segmentation_platform/internal/database/cached_result_provider.cc
@@ -4,10 +4,12 @@
 
 #include "components/segmentation_platform/internal/database/cached_result_provider.h"
 
+#include "base/logging.h"
 #include "base/task/single_thread_task_runner.h"
 #include "components/segmentation_platform/internal/post_processor/post_processor.h"
 #include "components/segmentation_platform/internal/stats.h"
 #include "components/segmentation_platform/public/config.h"
+#include "components/segmentation_platform/public/constants.h"
 
 namespace segmentation_platform {
 
@@ -53,6 +55,12 @@
 ClassificationResult CachedResultProvider::GetCachedResultForClient(
     const std::string& segmentation_key) {
   const auto iter = client_result_from_last_session_map_.find(segmentation_key);
+  if (VLOG_IS_ON(1) && iter != client_result_from_last_session_map_.end()) {
+    VLOG(1) << "CachedResultProvider loaded prefs with results from previous "
+               "session: "
+            << iter->second.ToDebugString() << " for segmentation key "
+            << segmentation_key;
+  }
   return iter == client_result_from_last_session_map_.end()
              ? ClassificationResult(PredictionStatus::kFailed)
              : iter->second;
diff --git a/components/segmentation_platform/internal/database/cached_result_writer.cc b/components/segmentation_platform/internal/database/cached_result_writer.cc
index 79696937..4ce1cd4 100644
--- a/components/segmentation_platform/internal/database/cached_result_writer.cc
+++ b/components/segmentation_platform/internal/database/cached_result_writer.cc
@@ -7,9 +7,11 @@
 #include "base/logging.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
+#include "components/segmentation_platform/internal/logging.h"
 #include "components/segmentation_platform/internal/post_processor/post_processor.h"
 #include "components/segmentation_platform/internal/stats.h"
 #include "components/segmentation_platform/public/config.h"
+#include "components/segmentation_platform/public/result.h"
 
 namespace segmentation_platform {
 
@@ -27,6 +29,10 @@
       config->on_demand_execution) {
     return;
   }
+  VLOG(1) << "CachedResultWriter updating prefs with new result: "
+          << segmentation_platform::PredictionResultToDebugString(
+                 client_result.client_result())
+          << " for segmentation key: " << config->segmentation_key;
   UpdateNewClientResultToPrefs(config, client_result);
 }
 
@@ -54,7 +60,8 @@
     stats::RecordSegmentSelectionFailure(
         *config, stats::SegmentationSelectionFailureReason::
                      kProtoPrefsUpdateNotRequired);
-    VLOG(1) << __func__ << ": previous client_result"
+    VLOG(1) << __func__ << ": previous client_result for segmentation_key: "
+            << config->segmentation_key
             << " has not yet expired. Expiration: " << expiration_time;
     return false;
   }
diff --git a/components/segmentation_platform/internal/database/segment_info_database.cc b/components/segmentation_platform/internal/database/segment_info_database.cc
index d9daef4..bd66d91 100644
--- a/components/segmentation_platform/internal/database/segment_info_database.cc
+++ b/components/segmentation_platform/internal/database/segment_info_database.cc
@@ -5,8 +5,13 @@
 #include "components/segmentation_platform/internal/database/segment_info_database.h"
 
 #include "base/functional/callback_helpers.h"
+#include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/single_thread_task_runner.h"
+#include "components/segmentation_platform/internal/logging.h"
+
+#include <sstream>
+#include <string>
 
 namespace segmentation_platform {
 
@@ -152,8 +157,14 @@
 
   // Update results.
   if (result.has_value()) {
+    VLOG(1) << "SaveSegmentResult: saving: "
+            << segmentation_platform::PredictionResultToDebugString(
+                   result.value())
+            << " for segment id: " << proto::SegmentId_Name(segment_id);
     segment_info->mutable_prediction_result()->CopyFrom(*result);
   } else {
+    VLOG(1) << "SaveSegmentResult: clearing prediction result for segment "
+            << proto::SegmentId_Name(segment_id);
     segment_info->clear_prediction_result();
   }
 
diff --git a/components/segmentation_platform/internal/execution/model_executor_impl.cc b/components/segmentation_platform/internal/execution/model_executor_impl.cc
index 7cb3722..b9d98e0 100644
--- a/components/segmentation_platform/internal/execution/model_executor_impl.cc
+++ b/components/segmentation_platform/internal/execution/model_executor_impl.cc
@@ -184,11 +184,16 @@
   stats::RecordModelExecutionDurationModel(
       state->segment_info.segment_id(), result.has_value(),
       clock_->Now() - state->model_execution_start_time);
-  // TODO(ritikagup): Change the use of this according to MultiOutputModel.
-  if (result.has_value()) {
-    VLOG(1) << "Segmentation model result: " << result.value().at(0)
-            << " for segment "
-            << proto::SegmentId_Name(state->segment_info.segment_id());
+  if (result.has_value() && result.value().size() > 0) {
+    if (VLOG_IS_ON(1)) {
+      std::stringstream log_output;
+      for (unsigned i = 0; i < result.value().size(); ++i) {
+        log_output << " output " << i << ": " << result.value().at(i);
+      }
+      VLOG(1) << "Segmentation model result: " << log_output.str()
+              << " for segment "
+              << proto::SegmentId_Name(state->segment_info.segment_id());
+    }
     const proto::SegmentationModelMetadata& model_metadata =
         state->segment_info.model_metadata();
     if (model_metadata.has_output_config()) {
diff --git a/components/segmentation_platform/internal/logging.cc b/components/segmentation_platform/internal/logging.cc
new file mode 100644
index 0000000..f6ef7abc
--- /dev/null
+++ b/components/segmentation_platform/internal/logging.cc
@@ -0,0 +1,23 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/segmentation_platform/internal/logging.h"
+#include <sstream>
+
+namespace segmentation_platform {
+
+std::string PredictionResultToDebugString(
+    proto::PredictionResult prediction_result) {
+  std::stringstream debug_string;
+  debug_string << "PredictionResult: timestamp: "
+               << prediction_result.timestamp_us();
+
+  for (auto i = 0; i < prediction_result.result_size(); ++i) {
+    debug_string << " result " << i << ": " << prediction_result.result(i);
+  }
+
+  return debug_string.str();
+}
+
+}  // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/logging.h b/components/segmentation_platform/internal/logging.h
new file mode 100644
index 0000000..28be2a6
--- /dev/null
+++ b/components/segmentation_platform/internal/logging.h
@@ -0,0 +1,18 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_LOGGING_H_
+#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_LOGGING_H_
+
+#include <string>
+
+#include "components/segmentation_platform/public/proto/prediction_result.pb.h"
+
+namespace segmentation_platform {
+
+std::string PredictionResultToDebugString(proto::PredictionResult result);
+
+}
+
+#endif  // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_LOGGING_H_
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
index a44469e..e602a7ec 100644
--- a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
+++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
@@ -297,6 +297,7 @@
   signal_handler_.OnSignalListUpdated();
 
   execution_service_.OnNewModelInfoReady(segment_info);
+  request_dispatcher_->OnModelUpdated(segment_info.segment_id());
 
   // Update the service status for proxy.
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher.cc b/components/segmentation_platform/internal/selection/request_dispatcher.cc
index cc3aa2e..55dce1c 100644
--- a/components/segmentation_platform/internal/selection/request_dispatcher.cc
+++ b/components/segmentation_platform/internal/selection/request_dispatcher.cc
@@ -3,19 +3,34 @@
 // found in the LICENSE file.
 
 #include "components/segmentation_platform/internal/selection/request_dispatcher.h"
+#include <set>
+#include <utility>
 
+#include "base/containers/circular_deque.h"
+#include "base/functional/callback_forward.h"
+#include "base/location.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
+#include "components/segmentation_platform/internal/metadata/metadata_utils.h"
 #include "components/segmentation_platform/internal/selection/request_handler.h"
 #include "components/segmentation_platform/internal/selection/segment_result_provider.h"
 #include "components/segmentation_platform/internal/stats.h"
 #include "components/segmentation_platform/public/config.h"
 #include "components/segmentation_platform/public/prediction_options.h"
+#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
 
 namespace segmentation_platform {
 
 namespace {
 
+// Amount of time to wait for model initialization. During this period requests
+// for uninitialized models will be enqueued and processed either when the model
+// is ready or when this timeout expires. Time is 200ms to cover 80% of cases
+// (According to
+// OptimizationGuide.ModelHandler.HandlerCreatedToModelAvailable histogram).
+const int kModelInitializationTimeoutMs = 200;
+
 // Wrap callback to record metrics.
 template <typename ResultType>
 base::OnceCallback<void(const ResultType&)> GetWrappedCallback(
@@ -38,7 +53,37 @@
 RequestDispatcher::RequestDispatcher(
     const std::vector<std::unique_ptr<Config>>& configs,
     CachedResultProvider* cached_result_provider)
-    : configs_(configs), cached_result_provider_(cached_result_provider) {}
+    : configs_(configs), cached_result_provider_(cached_result_provider) {
+  std::set<proto::SegmentId> found_segments;
+
+  // Individual models must be loaded from disk or fetched from network. Fill a
+  // list to keep track of which ones are still pending.
+  for (const auto& config : *configs_) {
+    // Ignore segmentation keys using legacy models.
+    if (metadata_utils::ConfigUsesLegacyOutput(config.get())) {
+      legacy_output_segmentation_keys_.insert(config->segmentation_key);
+    } else {
+      // Non legacy segment IDs must have a 1:1 relationship with segmentation
+      // keys. These checks ensure that.
+      CHECK(config->segments.size() <= 1)
+          << "segmentation_key: " << config->segmentation_key
+          << " must not have multiple segments.";
+
+      for (const auto& segment_id : config->segments) {
+        CHECK(!segmentation_key_by_segment_id_.contains(segment_id.first))
+            << "segment_id: " << proto::SegmentId_Name(segment_id.first)
+            << " was found in two segmentation keys: "
+            << segmentation_key_by_segment_id_.at(segment_id.first) << " and "
+            << config->segmentation_key;
+
+        segmentation_key_by_segment_id_.insert(
+            {segment_id.first, config->segmentation_key});
+      }
+
+      uninitialized_segmentation_keys_.insert(config->segmentation_key);
+    }
+  }
+}
 
 RequestDispatcher::~RequestDispatcher() = default;
 
@@ -58,13 +103,56 @@
     }
   }
 
-  // Run any method calls that were received during initialization.
+  // Set a timeout to execute all pending requests even if their models didn't
+  // initialize after |kModelInitializationTimeoutMs|. This is to avoid waiting
+  // for long periods of time when models need to be downloaded, and to avoid
+  // requests waiting forever when there's no model.
+  base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&RequestDispatcher::OnModelInitializationTimeout,
+                     weak_ptr_factory_.GetWeakPtr()),
+      base::Milliseconds(kModelInitializationTimeoutMs));
+}
+
+void RequestDispatcher::ExecuteAllPendingActions() {
   while (!pending_actions_.empty()) {
-    auto callback = std::move(pending_actions_.front());
-    pending_actions_.pop_front();
+    ExecutePendingActionsForKey(pending_actions_.begin()->first);
+  }
+}
+
+void RequestDispatcher::ExecutePendingActionsForKey(
+    const std::string& segmentation_key) {
+  auto pending_actions_for_key = pending_actions_.find(segmentation_key);
+
+  if (pending_actions_for_key == pending_actions_.end()) {
+    return;
+  }
+
+  while (!pending_actions_for_key->second.empty()) {
+    auto callback = std::move(pending_actions_for_key->second.front());
+    pending_actions_for_key->second.pop_front();
     base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE, std::move(callback));
   }
+
+  pending_actions_.erase(segmentation_key);
+}
+
+void RequestDispatcher::OnModelUpdated(proto::SegmentId segment_id) {
+  auto key_for_updated_segment =
+      segmentation_key_by_segment_id_.find(segment_id);
+  if (key_for_updated_segment == segmentation_key_by_segment_id_.end()) {
+    return;
+  }
+  std::string segmentation_key = key_for_updated_segment->second;
+
+  uninitialized_segmentation_keys_.erase(segmentation_key);
+  ExecutePendingActionsForKey(segmentation_key);
+}
+
+void RequestDispatcher::OnModelInitializationTimeout() {
+  uninitialized_segmentation_keys_.clear();
+  ExecuteAllPendingActions();
 }
 
 template <typename ResultType, typename Request>
@@ -74,16 +162,21 @@
     scoped_refptr<InputContext> input_context,
     Request request,
     base::OnceCallback<void(const ResultType&)> callback) {
+  if (legacy_output_segmentation_keys_.contains(segmentation_key)) {
+    return;
+  }
+
   // TODO(ssid): Support cached results for all APIs.
   DCHECK(options.on_demand_execution);
 
   // For on-demand results, we need to run the models for which we need DB
   // initialization to be complete. Hence cache the request if platform
   // initialization isn't completed yet.
-  if (!storage_init_status_.has_value()) {
+  if (!storage_init_status_.has_value() ||
+      uninitialized_segmentation_keys_.contains(segmentation_key)) {
     // If the platform isn't fully initialized, cache the input arguments to
     // run later.
-    pending_actions_.push_back(base::BindOnce(
+    pending_actions_[segmentation_key].push_back(base::BindOnce(
         &RequestDispatcher::GetModelResult<ResultType, Request>,
         weak_ptr_factory_.GetWeakPtr(), segmentation_key, options,
         std::move(input_context), std::move(request), std::move(callback)));
@@ -151,4 +244,12 @@
                  std::move(callback));
 }
 
+int RequestDispatcher::GetPendingActionCountForTesting() {
+  int total_actions = 0;
+  for (auto& actions_for_key : pending_actions_) {
+    total_actions += actions_for_key.second.size();
+  }
+  return total_actions;
+}
+
 }  // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher.h b/components/segmentation_platform/internal/selection/request_dispatcher.h
index 9c5a17935..cf83321 100644
--- a/components/segmentation_platform/internal/selection/request_dispatcher.h
+++ b/components/segmentation_platform/internal/selection/request_dispatcher.h
@@ -16,6 +16,7 @@
 #include "components/segmentation_platform/internal/database/cached_result_provider.h"
 #include "components/segmentation_platform/internal/selection/request_handler.h"
 #include "components/segmentation_platform/public/input_context.h"
+#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
 #include "components/segmentation_platform/public/result.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -46,6 +47,10 @@
       std::map<std::string, std::unique_ptr<SegmentResultProvider>>
           result_providers);
 
+  // Called when the model for |segment_id| has been initialized. Used to
+  // execute any queued requests that depend on that model.
+  void OnModelUpdated(proto::SegmentId segment_id);
+
   // Client API. See `SegmentationPlatformService::GetClassificationResult`.
   void GetClassificationResult(const std::string& segmentation_key,
                                const PredictionOptions& options,
@@ -58,7 +63,7 @@
                                  AnnotatedNumericResultCallback callback);
 
   // For testing only.
-  int get_pending_actions_size_for_testing() { return pending_actions_.size(); }
+  int GetPendingActionCountForTesting();
   void set_request_handler_for_testing(
       const std::string& segmentation_key,
       std::unique_ptr<RequestHandler> request_handler) {
@@ -66,6 +71,10 @@
   }
 
  private:
+  void OnModelInitializationTimeout();
+  void ExecuteAllPendingActions();
+  void ExecutePendingActionsForKey(const std::string& segmentation_key);
+
   template <typename ResultType, typename Request>
   void GetModelResult(const std::string& segmentation_key,
                       const PredictionOptions& options,
@@ -79,14 +88,32 @@
   // Request handlers associated with the clients.
   std::map<std::string, std::unique_ptr<RequestHandler>> request_handlers_;
 
+  // List of segmentation keys whose models haven't been initialized. Used to
+  // enqueue requests that involve an uninitialized model. It gets populated
+  // when the platform initializes and each element gets removed when
+  // |OnModelUpdated| gets called with its corresponding segment ID. All
+  // elements get cleared after a timeout to avoid waiting for too long.
+  std::set<std::string> uninitialized_segmentation_keys_;
+
+  // List of segmentation keys with segment IDs that use the legacy output
+  // config (e.g. don't support multi-output models). Requests from these
+  // segmentation keys will be ignored.
+  std::set<std::string> legacy_output_segmentation_keys_;
+
   // Delegate to provide cached results for all clients, shared among clients.
   const raw_ptr<CachedResultProvider> cached_result_provider_;
 
   // Storage initialization status.
   absl::optional<bool> storage_init_status_;
 
+  // Map from segment ID to the segmentation key that makes use of it. Used
+  // to run all requests that use a segment ID once its model is available.
+  std::map<proto::SegmentId, std::string> segmentation_key_by_segment_id_;
+
   // For caching any method calls that were received before initialization.
-  base::circular_deque<base::OnceClosure> pending_actions_;
+  // Key is a segmentation key, value is a queue of actions that use that model.
+  std::map<std::string, base::circular_deque<base::OnceClosure>>
+      pending_actions_;
 
   base::WeakPtrFactory<RequestDispatcher> weak_ptr_factory_{this};
 };
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher_unittest.cc b/components/segmentation_platform/internal/selection/request_dispatcher_unittest.cc
index c25b3fda..80206403 100644
--- a/components/segmentation_platform/internal/selection/request_dispatcher_unittest.cc
+++ b/components/segmentation_platform/internal/selection/request_dispatcher_unittest.cc
@@ -7,8 +7,11 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/user_metrics.h"
 #include "base/run_loop.h"
+#include "base/task/single_thread_task_executor.h"
+#include "base/task/single_thread_task_runner.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/task_environment.h"
+#include "base/time/time.h"
 #include "components/segmentation_platform/internal/post_processor/post_processing_test_utils.h"
 #include "components/segmentation_platform/internal/selection/request_handler.h"
 #include "components/segmentation_platform/internal/selection/segment_result_provider.h"
@@ -57,7 +60,7 @@
         SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DEVICE_SWITCHER));
     configs_.emplace_back(test_utils::CreateTestConfig(
         kAdaptiveToolbarClient,
-        SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB));
+        SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR));
 
     request_dispatcher_ =
         std::make_unique<RequestDispatcher>(configs_, nullptr);
@@ -102,7 +105,7 @@
   PredictionOptions options;
   options.on_demand_execution = true;
 
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
 
   // Request handler will never be invoked if init fails.
   EXPECT_CALL(*request_handler1_, GetClassificationResult(_, _, _)).Times(0);
@@ -113,7 +116,7 @@
       base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
                      base::Unretained(this), loop.QuitClosure(),
                      ClassificationResult(PredictionStatus::kFailed)));
-  EXPECT_EQ(1, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(1, request_dispatcher_->GetPendingActionCountForTesting());
 
   // Finish platform initialization with failure. The request queue is flushed
   // and callbacks are invoked with empty results.
@@ -123,15 +126,17 @@
   request_dispatcher_->OnPlatformInitialized(false, &execution_service,
                                              std::move(result_providers));
   loop.Run();
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
 }
 
-TEST_F(RequestDispatcherTest, TestRequestQueuingWithInitSuccess) {
-  base::RunLoop loop;
+TEST_F(RequestDispatcherTest,
+       TestRequestQueuingWithInitSuccessAndNoModelsLoading) {
+  base::RunLoop run_loop_1;
+  base::RunLoop run_loop_2;
   PredictionOptions options;
   options.on_demand_execution = true;
 
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
 
   // Request from client 1.
   ClassificationResult result1(PredictionStatus::kSucceeded);
@@ -146,8 +151,9 @@
   request_dispatcher_->GetClassificationResult(
       kDeviceSwitcherClient, options, scoped_refptr<InputContext>(),
       base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
-                     base::Unretained(this), loop.QuitClosure(), result1));
-  EXPECT_EQ(1, request_dispatcher_->get_pending_actions_size_for_testing());
+                     base::Unretained(this), run_loop_1.QuitClosure(),
+                     result1));
+  EXPECT_EQ(1, request_dispatcher_->GetPendingActionCountForTesting());
 
   // Request from client 2.
   ClassificationResult result2(PredictionStatus::kSucceeded);
@@ -162,21 +168,101 @@
   request_dispatcher_->GetClassificationResult(
       kAdaptiveToolbarClient, options, scoped_refptr<InputContext>(),
       base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
-                     base::Unretained(this), loop.QuitClosure(), result2));
-  EXPECT_EQ(2, request_dispatcher_->get_pending_actions_size_for_testing());
+                     base::Unretained(this), run_loop_2.QuitClosure(),
+                     result2));
+  EXPECT_EQ(2, request_dispatcher_->GetPendingActionCountForTesting());
 
-  // Finish platform initialization with success. The request queue is flushed,
-  // and the request handler is invoked.
+  // Finish platform initialization with success. The request queue shouldn't be
+  // cleared because the models for the queued segments haven't been
+  // initialized.
   std::map<std::string, std::unique_ptr<SegmentResultProvider>>
       result_providers;
   ExecutionService execution_service;
   request_dispatcher_->OnPlatformInitialized(true, &execution_service,
                                              std::move(result_providers));
-  loop.Run();
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(2, request_dispatcher_->GetPendingActionCountForTesting());
+
+  // Run all pending tasks, this triggers a timeout to clear the request queue
+  // even if the models didn't load.
+  task_environment_.FastForwardBy(base::Seconds(1));
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
+
+  run_loop_1.Run();
+  run_loop_2.Run();
 }
 
-TEST_F(RequestDispatcherTest, TestRequestAfterInitSuccess) {
+TEST_F(RequestDispatcherTest,
+       TestRequestQueuingWithInitSuccessAndAfterModelsLoaded) {
+  base::RunLoop run_loop_1;
+  base::RunLoop run_loop_2;
+  PredictionOptions options;
+  options.on_demand_execution = true;
+
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
+
+  // Request from client 1.
+  ClassificationResult result1(PredictionStatus::kSucceeded);
+  result1.ordered_labels.emplace_back("test_label1");
+  EXPECT_CALL(*request_handler1_, GetClassificationResult(_, _, _))
+      .WillRepeatedly(Invoke([&](const PredictionOptions& options,
+                                 scoped_refptr<InputContext> input_context,
+                                 ClassificationResultCallback callback) {
+        std::move(callback).Run(result1);
+      }));
+
+  request_dispatcher_->GetClassificationResult(
+      kDeviceSwitcherClient, options, scoped_refptr<InputContext>(),
+      base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
+                     base::Unretained(this), run_loop_1.QuitClosure(),
+                     result1));
+  EXPECT_EQ(1, request_dispatcher_->GetPendingActionCountForTesting());
+
+  // Request from client 2.
+  ClassificationResult result2(PredictionStatus::kSucceeded);
+  result2.ordered_labels.emplace_back("test_label2");
+  EXPECT_CALL(*request_handler2_, GetClassificationResult(_, _, _))
+      .WillRepeatedly(Invoke([&](const PredictionOptions& options,
+                                 scoped_refptr<InputContext> input_context,
+                                 ClassificationResultCallback callback) {
+        std::move(callback).Run(result2);
+      }));
+
+  request_dispatcher_->GetClassificationResult(
+      kAdaptiveToolbarClient, options, scoped_refptr<InputContext>(),
+      base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
+                     base::Unretained(this), run_loop_2.QuitClosure(),
+                     result2));
+  EXPECT_EQ(2, request_dispatcher_->GetPendingActionCountForTesting());
+
+  // Finish platform initialization with success. The request queue is posted,
+  // but no requests are dispatched because their models are still not yet
+  // loaded.
+  std::map<std::string, std::unique_ptr<SegmentResultProvider>>
+      result_providers;
+  ExecutionService execution_service;
+  request_dispatcher_->OnPlatformInitialized(true, &execution_service,
+                                             std::move(result_providers));
+  // Initialize platform, no requests should be executed.
+  EXPECT_EQ(2, request_dispatcher_->GetPendingActionCountForTesting());
+
+  // Set the device switcher model as initialized. Its request should be
+  // executed.
+  request_dispatcher_->OnModelUpdated(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DEVICE_SWITCHER);
+  // The device switcher request should be dispatched and
+  // the other one gets enqueued again.
+  run_loop_1.Run();
+  EXPECT_EQ(1, request_dispatcher_->GetPendingActionCountForTesting());
+
+  // Set the new tab model as initialized.
+  request_dispatcher_->OnModelUpdated(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR);
+  // The last request should be dispatched.
+  run_loop_2.Run();
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
+}
+
+TEST_F(RequestDispatcherTest, TestRequestAfterInitSuccessAndModelsLoaded) {
   base::RunLoop loop;
   PredictionOptions options;
   options.on_demand_execution = true;
@@ -185,8 +271,15 @@
   std::map<std::string, std::unique_ptr<SegmentResultProvider>>
       result_providers;
   ExecutionService execution_service;
+  // Set platform as initialized.
   request_dispatcher_->OnPlatformInitialized(true, &execution_service,
                                              std::move(result_providers));
+  // Set both models as initialized, now requests should be dispatched
+  // immediately without queueing.
+  request_dispatcher_->OnModelUpdated(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DEVICE_SWITCHER);
+  request_dispatcher_->OnModelUpdated(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR);
 
   // Request from client 1.
   ClassificationResult result1(PredictionStatus::kSucceeded);
@@ -202,7 +295,7 @@
       kDeviceSwitcherClient, options, scoped_refptr<InputContext>(),
       base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
                      base::Unretained(this), loop.QuitClosure(), result1));
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
 
   // Request from client 2.
   ClassificationResult result2(PredictionStatus::kSucceeded);
@@ -219,7 +312,7 @@
       base::BindOnce(&RequestDispatcherTest::OnGetClassificationResult,
                      base::Unretained(this), loop.QuitClosure(), result2));
   loop.Run();
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
 }
 
 TEST_F(RequestDispatcherTest, TestAnnotatedNumericResultRequestWithWaiting) {
@@ -241,7 +334,7 @@
       kDeviceSwitcherClient, options, scoped_refptr<InputContext>(),
       base::BindOnce(&RequestDispatcherTest::OnGetAnnotatedNumericResult,
                      base::Unretained(this), loop.QuitClosure(), result1));
-  EXPECT_EQ(1, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(1, request_dispatcher_->GetPendingActionCountForTesting());
 
   // Init platform.
   std::map<std::string, std::unique_ptr<SegmentResultProvider>>
@@ -251,7 +344,7 @@
                                              std::move(result_providers));
 
   loop.Run();
-  EXPECT_EQ(0, request_dispatcher_->get_pending_actions_size_for_testing());
+  EXPECT_EQ(0, request_dispatcher_->GetPendingActionCountForTesting());
 }
 
 }  // namespace
diff --git a/components/segmentation_platform/internal/selection/segment_result_provider.cc b/components/segmentation_platform/internal/selection/segment_result_provider.cc
index a8f64b1..ce388a67 100644
--- a/components/segmentation_platform/internal/selection/segment_result_provider.cc
+++ b/components/segmentation_platform/internal/selection/segment_result_provider.cc
@@ -13,6 +13,7 @@
 #include "components/segmentation_platform/internal/database/signal_storage_config.h"
 #include "components/segmentation_platform/internal/execution/default_model_manager.h"
 #include "components/segmentation_platform/internal/execution/execution_request.h"
+#include "components/segmentation_platform/internal/logging.h"
 #include "components/segmentation_platform/internal/metadata/metadata_utils.h"
 #include "components/segmentation_platform/internal/proto/model_prediction.pb.h"
 #include "components/segmentation_platform/internal/scheduler/execution_service.h"
@@ -174,7 +175,7 @@
   if (request_state->options->ignore_db_scores) {
     VLOG(1) << __func__ << ": segment="
             << SegmentId_Name(request_state->options->segment_id)
-            << " executing model to get score";
+            << " ignoring DB score, executing model.";
     ExecuteModelAndGetScore(std::move(request_state),
                             DefaultModelManager::SegmentSource::DATABASE,
                             std::move(db_score_callback));
@@ -206,7 +207,7 @@
                        DefaultModelManager::SegmentSource::DEFAULT_MODEL);
     VLOG(1) << __func__ << ": segment="
             << SegmentId_Name(request_state->options->segment_id)
-            << " executing model to get score";
+            << " failed to get score from database, executing server model.";
     ExecuteModelAndGetScore(std::move(request_state),
                             fallback_source_to_execute,
                             std::move(db_score_callback));
@@ -270,6 +271,12 @@
     return;
   }
 
+  VLOG(1) << __func__ << ": Retrieved prediction from database: "
+          << segmentation_platform::PredictionResultToDebugString(
+                 db_segment_info->prediction_result())
+          << " for segment "
+          << proto::SegmentId_Name(request_state->options->segment_id);
+
   float rank = ComputeDiscreteMapping(
       request_state->options->discrete_mapping_key, *db_segment_info);
   std::move(callback).Run(std::move(request_state),
@@ -342,11 +349,12 @@
   std::unique_ptr<SegmentResult> segment_result;
 
   bool success = result->status == ModelExecutionStatus::kSuccess;
+  bool is_default_model =
+      source == DefaultModelManager::SegmentSource::DEFAULT_MODEL;
 
   if (success) {
-    state = source == DefaultModelManager::SegmentSource::DEFAULT_MODEL
-                ? ResultState::kDefaultModelScoreUsed
-                : ResultState::kTfliteModelScoreUsed;
+    state = is_default_model ? ResultState::kDefaultModelScoreUsed
+                             : ResultState::kTfliteModelScoreUsed;
     prediction_result = metadata_utils::CreatePredictionResult(
         result->scores, segment_info->model_metadata().output_config(),
         clock_->Now());
@@ -355,15 +363,23 @@
         request_state->options->discrete_mapping_key, *segment_info);
     segment_result =
         std::make_unique<SegmentResult>(state, prediction_result, rank);
+    VLOG(1) << __func__ << ": " << (is_default_model ? "Default" : "Server")
+            << " model executed successfully. Result: "
+            << segmentation_platform::PredictionResultToDebugString(
+                   prediction_result)
+            << " for segment "
+            << proto::SegmentId_Name(request_state->options->segment_id);
   } else {
-    state = source == DefaultModelManager::SegmentSource::DEFAULT_MODEL
-                ? ResultState::kDefaultModelExecutionFailed
-                : ResultState::kTfliteModelExecutionFailed;
+    state = is_default_model ? ResultState::kDefaultModelExecutionFailed
+                             : ResultState::kTfliteModelExecutionFailed;
     segment_result = std::make_unique<SegmentResult>(state);
+    VLOG(1) << __func__ << ": " << (is_default_model ? "Default" : "Server")
+            << " model execution failed"
+            << " for segment "
+            << proto::SegmentId_Name(request_state->options->segment_id);
   }
 
-  if (source == DefaultModelManager::SegmentSource::DATABASE &&
-      request_state->options->save_results_to_db) {
+  if (!is_default_model && request_state->options->save_results_to_db) {
     // Saving results to database.
     segment_database_->SaveSegmentResult(
         segment_info->segment_id(),
diff --git a/components/segmentation_platform/public/result.cc b/components/segmentation_platform/public/result.cc
index b7ddb2f7..64da291 100644
--- a/components/segmentation_platform/public/result.cc
+++ b/components/segmentation_platform/public/result.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "components/segmentation_platform/public/result.h"
+#include <sstream>
 
 namespace segmentation_platform {
 
@@ -17,6 +18,29 @@
 ClassificationResult& ClassificationResult::operator=(
     const ClassificationResult&) = default;
 
+std::string ClassificationResult::ToDebugString() const {
+  std::stringstream debug_string;
+  debug_string << "Status: ";
+
+  switch (status) {
+    case segmentation_platform::PredictionStatus::kNotReady:
+      debug_string << "Not ready";
+      break;
+    case segmentation_platform::PredictionStatus::kFailed:
+      debug_string << "Failed";
+      break;
+    case segmentation_platform::PredictionStatus::kSucceeded:
+      debug_string << "Succeeded";
+      break;
+  }
+
+  for (unsigned i = 0; i < ordered_labels.size(); ++i) {
+    debug_string << " output " << i << ": " << ordered_labels.at(i);
+  }
+
+  return debug_string.str();
+}
+
 AnnotatedNumericResult::AnnotatedNumericResult(PredictionStatus status)
     : status(status) {}
 
diff --git a/components/segmentation_platform/public/result.h b/components/segmentation_platform/public/result.h
index ea9579c..b35fbe1 100644
--- a/components/segmentation_platform/public/result.h
+++ b/components/segmentation_platform/public/result.h
@@ -49,6 +49,8 @@
   // The request ID used for identifying a specific training data inputs. Can be
   // null if training data was not uploaded for that execution.
   TrainingRequestId request_id;
+
+  std::string ToDebugString() const;
 };
 
 // Result generated by evaluating the TFLite file or the default heuristic.
diff --git a/components/services/screen_ai/BUILD.gn b/components/services/screen_ai/BUILD.gn
index 73123d85..374abbb 100644
--- a/components/services/screen_ai/BUILD.gn
+++ b/components/services/screen_ai/BUILD.gn
@@ -84,7 +84,7 @@
     "screen_ai_service_impl_unittest.cc",
   ]
 
-  # TODO(https://crbug.com/1278249): Enable after the protobuf issue is fixed.
+  # TODO(https://crbug.com/1443341): Enable after the protobuf issue is fixed.
   if (!is_win) {
     sources += [
       "proto/main_content_extractor_proto_convertor_unittest.cc",
diff --git a/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc b/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc
index 22c2245..ecd7732d 100644
--- a/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc
+++ b/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc
@@ -153,7 +153,7 @@
   return role_name;
 }
 
-// TODO(https://crbug.com/1278249): Consider merging the following functions
+// TODO(https://crbug.com/1443341): Consider merging the following functions
 // into a template, e.g. using std::is_same.
 void AddAttribute(const std::string& name,
                   int value,
@@ -199,7 +199,7 @@
   uie.set_id(id);
 
   // Attributes.
-  // TODO(https://crbug.com/1278249): Get attribute strings from a Google3
+  // TODO(https://crbug.com/1443341): Get attribute strings from a Google3
   // export, also the experimental ones for the unittest.
   AddAttribute("axnode_id", static_cast<int>(node->id()), uie);
   const std::string& display_value =
@@ -314,7 +314,7 @@
   ui::AXTree tree(snapshot);
 
   // To be computed based on the max dimensions of all elements in the tree.
-  // TODO(https://crbug.com/1278249): Consider using combination of scroll
+  // TODO(https://crbug.com/1443341): Consider using combination of scroll
   // max and view port size to find the tree dimensions. Screen2x is getting the
   // size from the screenshot image of the tree.
   gfx::SizeF tree_dimensions;
diff --git a/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc b/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc
index 0eb21ba0..a7cd39c62 100644
--- a/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc
+++ b/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc
@@ -25,7 +25,7 @@
 // Set to 'true' to get debug protos.
 #define WRITE_DEBUG_PROTO false
 
-// TODO(crbug.com/1278249): Name test files with more context. E.g. what is it
+// TODO(crbug.com/1341655): Name test files with more context. E.g. what is it
 // testing? Which site is it? etc.
 // Test definitions for ProtoConvertorViewHierarchyTest.
 constexpr int kProtoConversionTestCasesCount = 5;
@@ -99,7 +99,7 @@
   EXPECT_NEAR(box1.right(), box2.right(), max_diff.x());
 }
 
-// TODO(https://crbug.com/1278249): Consider making the comparison not sensitive
+// TODO(https://crbug.com/1341655): Consider making the comparison not sensitive
 // to order.
 template <class T>
 void ExpectLists(const T& list1, const T& list2) {
@@ -213,7 +213,7 @@
         attribute_indices_map.erase(expected_attrib_index);
         continue;
       }
-      // TODO(https://crbug.com/1278249): Follow up why visibility is
+      // TODO(https://crbug.com/1341655): Follow up why visibility is
       // sometimes not passed.
       if (generated_attrib.name() != "/extras/styles/visibility")
         EXPECT_TRUE(attribute_found_in_expected) << generated_attrib.name();
diff --git a/components/services/screen_ai/proto/visual_annotator_proto_convertor.cc b/components/services/screen_ai/proto/visual_annotator_proto_convertor.cc
index 884c695b..ff880bc 100644
--- a/components/services/screen_ai/proto/visual_annotator_proto_convertor.cc
+++ b/components/services/screen_ai/proto/visual_annotator_proto_convertor.cc
@@ -38,7 +38,7 @@
 
 ui::AXNodeID next_negative_node_id{kFirstValidNegativeId};
 
-// TODO(crbug.com/1278249): Check if this max count will cover different cases.
+// TODO(crbug.com/1443341): Check if this max count will cover different cases.
 constexpr int kUmaMaxNodesCount = 500;
 
 // Returns the next valid negative ID that can be used for identifying
@@ -80,7 +80,7 @@
   DCHECK_EQ(out_data.role, ax::mojom::Role::kUnknown);
   switch (predicted_type.type_of_case()) {
     case chrome_screen_ai::UIComponent::PredictedType::kEnumType:
-      // TODO(https://crbug.com/1278249): We do not actually need an enum. All
+      // TODO(https://crbug.com/1443341): We do not actually need an enum. All
       // predicted types could be strings. We could easily map from a string to
       // an `ax::mojom::Role`. Then, we won't need to keep the enums synced.
       out_data.role = static_cast<ax::mojom::Role>(predicted_type.enum_type());
@@ -199,7 +199,7 @@
   DCHECK_NE(inline_text_box.id, ui::kInvalidAXNodeID);
   // The boundaries of each `inline_text_box` is computed as the union of the
   // boundaries of all `word_box`es that are inside.
-  // TODO(crbug.com/1278249): What if the angles of orientation are different?
+  // TODO(crbug.com/1443341): What if the angles of orientation are different?
   // Do we need to apply the related transform, or is the fact that the
   // transform is the same between line and word boxes results in no difference?
   inline_text_box.relative_bounds.bounds.Union(gfx::RectF(
@@ -207,7 +207,8 @@
       word_box.bounding_box().width(), word_box.bounding_box().height()));
 
   std::vector<int32_t> character_offsets;
-  // TODO(nektar): Handle writing directions other than LEFT_TO_RIGHT.
+  // TODO(crbug.com/1443341): Handle writing directions other than
+  // LEFT_TO_RIGHT.
   int32_t line_offset =
       base::ClampRound(inline_text_box.relative_bounds.bounds.x());
   ranges::transform(word_box.symbols(), std::back_inserter(character_offsets),
@@ -310,8 +311,8 @@
   std::string language;
   if (static_text_node.GetStringAttribute(ax::mojom::StringAttribute::kLanguage,
                                           &language)) {
-    // TODO(nektar): Only set language if different from parent node (i.e. the
-    // static text node), in order to minimize memory usage.
+    // TODO(crbug.com/1443341): Only set language if different from parent node
+    // (i.e. the static text node), in order to minimize memory usage.
     inline_text_box_node.AddStringAttribute(
         ax::mojom::StringAttribute::kLanguage, language);
   }
@@ -374,8 +375,8 @@
   // role.
   line_box_node.SetNameChecked(line_box.utf8_string());
   if (!line_box.language().empty()) {
-    // TODO(nektar): Only set language if different from parent node (i.e. the
-    // page node), in order to minimize memory usage.
+    // TODO(crbug.com/1443341): Only set language if different from parent node
+    // (i.e. the page node), in order to minimize memory usage.
     line_box_node.AddStringAttribute(ax::mojom::StringAttribute::kLanguage,
                                      line_box.language());
   }
@@ -397,8 +398,8 @@
   next_negative_node_id = kFirstValidNegativeId;
 }
 
-// TODO(nektar): Change return value to `std::vector<ui::AXNodeData>` as other
-// fields in `AXTreeUpdate` are unused.
+// TODO(crbug.com/1443341): Change return value to `std::vector<ui::AXNodeData>`
+// as other fields in `AXTreeUpdate` are unused.
 ui::AXTreeUpdate VisualAnnotationToAXTreeUpdate(
     const chrome_screen_ai::VisualAnnotation& visual_annotation,
     const gfx::Rect& image_rect) {
@@ -407,7 +408,7 @@
   DCHECK(visual_annotation.lines_size() == 0 ||
          visual_annotation.ui_component_size() == 0);
 
-  // TODO(https://crbug.com/1278249): Create an AXTreeSource and create the
+  // TODO(https://crbug.com/1443341): Create an AXTreeSource and create the
   // update using AXTreeSerializer.
 
   // Each `UIComponent`, `LineBox`, as well as every `WordBox` that results in a
diff --git a/components/services/screen_ai/public/cpp/screen_ai_service_router.cc b/components/services/screen_ai/public/cpp/screen_ai_service_router.cc
index 3fac75f..f35671a 100644
--- a/components/services/screen_ai/public/cpp/screen_ai_service_router.cc
+++ b/components/services/screen_ai/public/cpp/screen_ai_service_router.cc
@@ -17,7 +17,7 @@
 
 namespace {
 
-// TODO(https://crbug.com/1278249): Move file names into a shared constants
+// TODO(https://crbug.com/1443341): Move file names into a shared constants
 // file before adding more files.
 class ComponentModelFiles {
  public:
@@ -108,7 +108,7 @@
     return;
   }
 
-  // TODO(https://crbug.com/1278249): Make sure the library is sandboxed and
+  // TODO(https://crbug.com/1443341): Make sure the library is sandboxed and
   // loaded from the same folder and component updater doesn't download a new
   // version during sandbox creation.
   content::ServiceProcessHost::Launch(
diff --git a/components/services/screen_ai/screen_ai_library_wrapper.h b/components/services/screen_ai/screen_ai_library_wrapper.h
index 91caa48a..dc01e13 100644
--- a/components/services/screen_ai/screen_ai_library_wrapper.h
+++ b/components/services/screen_ai/screen_ai_library_wrapper.h
@@ -73,7 +73,7 @@
   // Initializes the pipeline for OCR.
   // |models_folder| is a null terminated string pointing to the
   // folder that includes model files for OCR.
-  // TODO(http://crbug.com/1278249): Replace |models_folder| with file
+  // TODO(http://crbug.com/1443341): Replace |models_folder| with file
   // handle(s).
   typedef bool (*InitOCRFn)(const char* /*models_folder*/);
   InitOCRFn init_ocr_ = nullptr;
diff --git a/components/stylus_handwriting/android/BUILD.gn b/components/stylus_handwriting/android/BUILD.gn
index 2cf3b32..99a150e 100644
--- a/components/stylus_handwriting/android/BUILD.gn
+++ b/components/stylus_handwriting/android/BUILD.gn
@@ -60,7 +60,7 @@
     "//base:base_junit_test_support",
     "//content/public/android:content_full_java",
     "//mojo/public/mojom/base:base_java",
-    "//third_party/android_deps:com_android_support_support_annotations_java",
+    "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/blink/public:blink_headers_java",
     "//third_party/blink/public/mojom:mojom_platform_java",
     "//third_party/junit:junit",
diff --git a/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingTriggerTest.java b/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingTriggerTest.java
index ce6391e5..6eb2a5ce 100644
--- a/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingTriggerTest.java
+++ b/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingTriggerTest.java
@@ -22,10 +22,11 @@
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.SystemClock;
-import android.support.annotation.RequiresApi;
 import android.view.MotionEvent;
 import android.view.ViewGroup;
 
+import androidx.annotation.RequiresApi;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/SubresourceFilterFeatureList.java b/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/SubresourceFilterFeatureList.java
index df92d3ab..2ce340b 100644
--- a/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/SubresourceFilterFeatureList.java
+++ b/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/SubresourceFilterFeatureList.java
@@ -7,14 +7,12 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of subresource_filter component Features.
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("subresource_filter")
-@MainDex
 public class SubresourceFilterFeatureList {
     public static final String SUBRESOURCE_FILTER = "SubresourceFilter";
 
diff --git a/components/sync/base/syncer_error.cc b/components/sync/base/syncer_error.cc
index 1bc1b12..dad86af 100644
--- a/components/sync/base/syncer_error.cc
+++ b/components/sync/base/syncer_error.cc
@@ -36,7 +36,6 @@
     ENUM_CASE(SERVER_RETURN_DISABLED_BY_ADMIN);
     ENUM_CASE(SERVER_RETURN_CLIENT_DATA_OBSOLETE);
     ENUM_CASE(SERVER_RETURN_ENCRYPTION_OBSOLETE);
-    ENUM_CASE(SERVER_MORE_TO_DOWNLOAD);
     ENUM_CASE(SYNCER_OK);
   }
   NOTREACHED();
@@ -81,8 +80,7 @@
 }
 
 bool SyncerError::IsActualError() const {
-  return value_ != UNSET && value_ != SYNCER_OK &&
-         value_ != SERVER_MORE_TO_DOWNLOAD;
+  return value_ != UNSET && value_ != SYNCER_OK;
 }
 
 }  // namespace syncer
diff --git a/components/sync/base/syncer_error.h b/components/sync/base/syncer_error.h
index 8a95f61..f236d0f 100644
--- a/components/sync/base/syncer_error.h
+++ b/components/sync/base/syncer_error.h
@@ -42,8 +42,7 @@
     SERVER_RETURN_ENCRYPTION_OBSOLETE = 19,
 
     // Deprecated: DATATYPE_TRIGGERED_RETRY = 20,
-
-    SERVER_MORE_TO_DOWNLOAD = 21,
+    // Deprecated: SERVER_MORE_TO_DOWNLOAD = 21,
 
     SYNCER_OK = 22,
 
@@ -64,7 +63,7 @@
   std::string ToString() const;
 
   // Helper to check that |error| is set to something (not UNSET) and is not
-  // SYNCER_OK or SERVER_MORE_TO_DOWNLOAD.
+  // SYNCER_OK.
   bool IsActualError() const;
 
  private:
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc
index ae881572d..7d12d7f 100644
--- a/components/sync/driver/sync_service_impl.cc
+++ b/components/sync/driver/sync_service_impl.cc
@@ -1401,8 +1401,11 @@
 }
 
 ModelTypeSet SyncServiceImpl::GetModelTypesForTransportOnlyMode() const {
+  // Control types (in practice, NIGORI) are always supported. This special case
+  // is necessary because the NIGORI controller isn't in
+  // `data_type_controllers_`.
+  ModelTypeSet allowed_types = ControlTypes();
   // Collect the types from all controllers that support transport-only mode.
-  ModelTypeSet allowed_types;
   for (const auto& [type, controller] : data_type_controllers_) {
     if (controller->ShouldRunInTransportOnlyMode()) {
       allowed_types.Put(type);
diff --git a/components/sync/driver/sync_service_impl_unittest.cc b/components/sync/driver/sync_service_impl_unittest.cc
index 85fab4d..78e80e3 100644
--- a/components/sync/driver/sync_service_impl_unittest.cc
+++ b/components/sync/driver/sync_service_impl_unittest.cc
@@ -623,8 +623,8 @@
   CreateService(SyncServiceImpl::MANUAL_START);
   service()->Initialize();
 
-  EXPECT_TRUE(service()->GetDisableReasons().Has(
-      SyncService::DISABLE_REASON_USER_CHOICE));
+  EXPECT_TRUE(
+      service()->HasDisableReason(SyncService::DISABLE_REASON_USER_CHOICE));
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
@@ -1194,10 +1194,36 @@
                     {BOOKMARKS, false},
                     {DEVICE_INFO, true},
                 });
+  // Note: Even though NIGORI technically isn't registered, it should always be
+  // considered part of the interested data types.
   EXPECT_CALL(*sync_invalidations_service(),
-              SetInterestedDataTypes(AllOf(ContainsDataType(BOOKMARKS),
+              SetInterestedDataTypes(AllOf(ContainsDataType(NIGORI),
+                                           ContainsDataType(BOOKMARKS),
                                            ContainsDataType(DEVICE_INFO))));
   InitializeForNthSync();
+  ASSERT_TRUE(service()->IsSyncFeatureActive());
+  EXPECT_TRUE(engine()->started_handling_invalidations());
+}
+
+TEST_F(SyncServiceImplTest,
+       ShouldSendDataTypesToSyncInvalidationsServiceInTransportMode) {
+  SignIn();
+  CreateService(SyncServiceImpl::MANUAL_START,
+                /*registered_types_and_transport_mode_support=*/
+                {
+                    {BOOKMARKS, false},
+                    {DEVICE_INFO, true},
+                });
+  // In this test, BOOKMARKS doesn't support transport mode, so it should *not*
+  // be included.
+  // Note: Even though NIGORI technically isn't registered, it should always be
+  // considered part of the interested data types.
+  EXPECT_CALL(*sync_invalidations_service(),
+              SetInterestedDataTypes(AllOf(ContainsDataType(NIGORI),
+                                           Not(ContainsDataType(BOOKMARKS)),
+                                           ContainsDataType(DEVICE_INFO))));
+  InitializeForFirstSync();
+  ASSERT_FALSE(service()->IsSyncFeatureActive());
   EXPECT_TRUE(engine()->started_handling_invalidations());
 }
 
diff --git a/components/sync/driver/sync_user_settings_impl.cc b/components/sync/driver/sync_user_settings_impl.cc
index 6cbf515..c802f2b 100644
--- a/components/sync/driver/sync_user_settings_impl.cc
+++ b/components/sync/driver/sync_user_settings_impl.cc
@@ -288,10 +288,13 @@
 #endif
   types.RetainAll(registered_model_types_);
 
+  // Control types (in practice, NIGORI) are always considered "preferred", even
+  // though they're technically not registered.
+  types.PutAll(ControlTypes());
+
   static_assert(46 == GetNumModelTypes(),
                 "If adding a new sync data type, update the list below below if"
                 " you want to disable the new data type for local sync.");
-  types.PutAll(ControlTypes());
   if (prefs_->IsLocalSyncEnabled()) {
     types.Remove(APP_LIST);
     types.Remove(AUTOFILL_WALLET_OFFER);
diff --git a/components/sync/engine/commit.cc b/components/sync/engine/commit.cc
index 840ff4c..34f5539 100644
--- a/components/sync/engine/commit.cc
+++ b/components/sync/engine/commit.cc
@@ -44,7 +44,6 @@
   switch (syncer_error.value()) {
     case SyncerError::UNSET:
     case SyncerError::SYNCER_OK:
-    case SyncerError::SERVER_MORE_TO_DOWNLOAD:
       NOTREACHED();
       break;
     case SyncerError::NETWORK_CONNECTION_UNAVAILABLE:
diff --git a/components/sync/engine/events/get_updates_response_event.cc b/components/sync/engine/events/get_updates_response_event.cc
index 66fda0b..da97410f 100644
--- a/components/sync/engine/events/get_updates_response_event.cc
+++ b/components/sync/engine/events/get_updates_response_event.cc
@@ -33,12 +33,14 @@
 
 std::string GetUpdatesResponseEvent::GetDetails() const {
   switch (error_.value()) {
-    case SyncerError::SYNCER_OK:
-      return base::StringPrintf("Received %d update(s).",
-                                response_.get_updates().entries_size());
-    case SyncerError::SERVER_MORE_TO_DOWNLOAD:
-      return base::StringPrintf("Received %d update(s).  Some updates remain.",
-                                response_.get_updates().entries_size());
+    case SyncerError::SYNCER_OK: {
+      std::string details = base::StringPrintf(
+          "Received %d update(s).", response_.get_updates().entries_size());
+      if (response_.get_updates().changes_remaining() != 0) {
+        details += " Some updates remain.";
+      }
+      return details;
+    }
     case SyncerError::UNSET:
     case SyncerError::NETWORK_CONNECTION_UNAVAILABLE:
     case SyncerError::NETWORK_IO_ERROR:
diff --git a/components/sync/engine/get_updates_processor.cc b/components/sync/engine/get_updates_processor.cc
index 6939abd..b7addbda 100644
--- a/components/sync/engine/get_updates_processor.cc
+++ b/components/sync/engine/get_updates_processor.cc
@@ -186,6 +186,8 @@
                                                  SyncCycle* cycle) {
   TRACE_EVENT0("sync", "DownloadUpdates");
 
+  has_more_updates_to_download_ = false;
+
   sync_pb::ClientToServerMessage message;
   InitDownloadUpdatesContext(cycle, &message);
   PrepareGetUpdates(*request_types, &message);
@@ -353,9 +355,8 @@
   DCHECK(progress_marker_iter == progress_index_by_type.end() &&
          updates_iter == updates_by_type.end());
 
-  return gu_response.changes_remaining() == 0
-             ? SyncerError(SyncerError::SYNCER_OK)
-             : SyncerError(SyncerError::SERVER_MORE_TO_DOWNLOAD);
+  has_more_updates_to_download_ = gu_response.changes_remaining() != 0;
+  return SyncerError(SyncerError::SYNCER_OK);
 }
 
 void GetUpdatesProcessor::ApplyUpdates(const ModelTypeSet& gu_types,
@@ -367,4 +368,8 @@
   }
 }
 
+bool GetUpdatesProcessor::HasMoreUpdatesToDownload() const {
+  return has_more_updates_to_download_;
+}
+
 }  // namespace syncer
diff --git a/components/sync/engine/get_updates_processor.h b/components/sync/engine/get_updates_processor.h
index 2362f79f..303ca6cc7 100644
--- a/components/sync/engine/get_updates_processor.h
+++ b/components/sync/engine/get_updates_processor.h
@@ -41,15 +41,19 @@
 
   // Downloads and processes a batch of updates for the specified types.
   //
-  // Returns SYNCER_OK if the download succeeds, SERVER_MORE_TO_DOWNLOAD if the
-  // download succeeded but there are still some updates left to fetch on the
-  // server, or an appropriate error value in case of failure.
+  // Returns SYNCER_OK if the download succeeds or an appropriate error value in
+  // case of failure.
   SyncerError DownloadUpdates(ModelTypeSet* request_types, SyncCycle* cycle);
 
   // Applies any downloaded and processed updates.
   void ApplyUpdates(const ModelTypeSet& gu_types,
                     StatusController* status_controller);
 
+  // Returns true if last DownloadUpdates() outcome indicated that there are
+  // more updates to download from the server, e.g. when GetUpdatesResponse has
+  // non-zero `changes_remaining`.
+  bool HasMoreUpdatesToDownload() const;
+
  private:
   // Populates a GetUpdates request message with per-type information.
   void PrepareGetUpdates(const ModelTypeSet& gu_types,
@@ -88,6 +92,9 @@
   // that problem is to initialize this map in set_routing_info().
   raw_ptr<UpdateHandlerMap> update_handler_map_;
 
+  // Whether last GetUpdatesResponse has non-zero `changes_remaining`.
+  bool has_more_updates_to_download_ = false;
+
   const raw_ref<const GetUpdatesDelegate> delegate_;
 };
 
diff --git a/components/sync/engine/get_updates_processor_unittest.cc b/components/sync/engine/get_updates_processor_unittest.cc
index 3582f06..a064b98 100644
--- a/components/sync/engine/get_updates_processor_unittest.cc
+++ b/components/sync/engine/get_updates_processor_unittest.cc
@@ -383,9 +383,8 @@
   StatusController status;
   std::unique_ptr<GetUpdatesProcessor> processor(
       BuildGetUpdatesProcessor(normal_delegate));
-  SyncerError error =
-      processor->ProcessResponse(gu_response, enabled_types(), &status);
-  EXPECT_EQ(error.value(), SyncerError::SERVER_MORE_TO_DOWNLOAD);
+  processor->ProcessResponse(gu_response, enabled_types(), &status);
+  EXPECT_TRUE(processor->HasMoreUpdatesToDownload());
 }
 
 // A simple scenario: No updates returned and nothing more to download.
diff --git a/components/sync/engine/syncer.cc b/components/sync/engine/syncer.cc
index c927a5e..7df29f4 100644
--- a/components/sync/engine/syncer.cc
+++ b/components/sync/engine/syncer.cc
@@ -124,7 +124,7 @@
   do {
     download_result =
         get_updates_processor.DownloadUpdates(&download_types, cycle);
-  } while (download_result.value() == SyncerError::SERVER_MORE_TO_DOWNLOAD);
+  } while (get_updates_processor.HasMoreUpdatesToDownload());
 
   // It is our responsibility to propagate the removal of types that occurred in
   // GetUpdatesProcessor::DownloadUpdates().
diff --git a/components/sync/protocol/app_notification_specifics.proto b/components/sync/protocol/app_notification_specifics.proto
deleted file mode 100644
index 4e45087..0000000
--- a/components/sync/protocol/app_notification_specifics.proto
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Sync protocol datatype extension for app notifications.
-
-// If you change or add any fields in this file, update proto_visitors.h and
-// potentially proto_enum_conversions.{h, cc}.
-
-syntax = "proto2";
-
-option java_multiple_files = true;
-option java_package = "org.chromium.components.sync.protocol";
-
-option optimize_for = LITE_RUNTIME;
-
-package sync_pb;
-
-// Properties of an app notification.
-
-// An App Notification, to be delivered from Chrome Apps to the
-// Chrome browser through the Notification API.
-message AppNotification {
-  // Globally unique id. This is more robust for uniquely identifying each
-  // notification and hence gives us flexibility in the future. In absence
-  // of this, unique id would be (app_id, creation_timestamp_ms). But that
-  // relies on creation_timestamp_ms being high resolution and is not
-  // globally unique - only unique for a given user.
-  optional string guid = 1;
-  // Metadata, not shown directly to the user.
-  // The unique App Id, as created by the webstore and used to
-  // delegate messages to the applications. This is defined as 32 characters
-  optional string app_id = 2;
-  // Timestamp when the message was created in milliseconds.
-  // This is seperate from ctime as this is only set by the application.
-  optional int64 creation_timestamp_ms = 3;
-
-  // Payload - these fields are visible to the user content is defined by the
-  // app. The fields are described in:
-  // chrome/browser/extensions/app_notification.h
-  optional string title = 4;
-  optional string body_text = 5;
-  optional string link_url = 6;
-  optional string link_text = 7;
-}
diff --git a/components/sync/protocol/entity_specifics.proto b/components/sync/protocol/entity_specifics.proto
index 97c0e080..5d61d166 100644
--- a/components/sync/protocol/entity_specifics.proto
+++ b/components/sync/protocol/entity_specifics.proto
@@ -13,7 +13,6 @@
 
 import "components/sync/protocol/encryption.proto";
 import "components/sync/protocol/app_list_specifics.proto";
-import "components/sync/protocol/app_notification_specifics.proto";
 import "components/sync/protocol/app_setting_specifics.proto";
 import "components/sync/protocol/app_specifics.proto";
 import "components/sync/protocol/arc_package_specifics.proto";
@@ -33,7 +32,6 @@
 import "components/sync/protocol/history_specifics.proto";
 import "components/sync/protocol/managed_user_setting_specifics.proto";
 import "components/sync/protocol/managed_user_shared_setting_specifics.proto";
-import "components/sync/protocol/managed_user_specifics.proto";
 import "components/sync/protocol/nigori_specifics.proto";
 import "components/sync/protocol/os_preference_specifics.proto";
 import "components/sync/protocol/os_priority_preference_specifics.proto";
@@ -51,8 +49,6 @@
 import "components/sync/protocol/segmentation_specifics.proto";
 import "components/sync/protocol/session_specifics.proto";
 import "components/sync/protocol/sharing_message_specifics.proto";
-import "components/sync/protocol/synced_notification_app_info_specifics.proto";
-import "components/sync/protocol/synced_notification_specifics.proto";
 import "components/sync/protocol/theme_specifics.proto";
 import "components/sync/protocol/typed_url_specifics.proto";
 import "components/sync/protocol/user_consent_specifics.proto";
@@ -106,9 +102,6 @@
     PreferenceSpecifics preference = 37702;
     TypedUrlSpecifics typed_url = 40781;
     ThemeSpecifics theme = 41210;
-    // TODO(crbug.com/1012648): |app_notification| isn't used by the client
-    // anymore, but the server still needs it for now.
-    AppNotification app_notification = 45184 [deprecated = true];
     PasswordSpecifics password = 45873;
     NigoriSpecifics nigori = 47745;
     ExtensionSpecifics extension = 48119;
@@ -119,29 +112,11 @@
     ExtensionSettingSpecifics extension_setting = 96159;
     AppSettingSpecifics app_setting = 103656;
     HistoryDeleteDirectiveSpecifics history_delete_directive = 150251;
-    // TODO(crbug.com/1012648): |synced_notification| and
-    // |synced_notification_app_info| aren't used by the client anymore, but the
-    // server still needs them for now.
-    SyncedNotificationSpecifics synced_notification = 153108
-        [deprecated = true];
-    SyncedNotificationAppInfoSpecifics synced_notification_app_info = 235816
-        [deprecated = true];
     DeviceInfoSpecifics device_info = 154522;
-    // TODO(crbug.com/1009361): |experiments| isn't used by the client anymore,
-    // but the server still needs it for now.
-    ExperimentsSpecifics experiments = 161496 [deprecated = true];
     PriorityPreferenceSpecifics priority_preference = 163425;
     DictionarySpecifics dictionary = 170540;
-    FaviconTrackingSpecifics favicon_tracking = 181534 [deprecated = true];
-    FaviconImageSpecifics favicon_image = 182019 [deprecated = true];
     ManagedUserSettingSpecifics managed_user_setting = 186662;
-    // TODO(tschumann): Remove once server-side dependencies are resolved.
-    ManagedUserSpecifics managed_user = 194582 [deprecated = true];
-    // TODO(tschumann): Remove once server-side dependencies are resolved.
-    ManagedUserSharedSettingSpecifics managed_user_shared_setting = 202026
-        [deprecated = true];
     AppListSpecifics app_list = 229170;
-    EmptySpecifics managed_user_allowlist = 306060 [deprecated = true];
     AutofillWalletSpecifics autofill_wallet = 306270;
     WalletMetadataSpecifics wallet_metadata = 330441;
     ArcPackageSpecifics arc_package = 340906;
@@ -159,8 +134,6 @@
     SharingMessageSpecifics sharing_message = 728866;
     AutofillOfferSpecifics autofill_offer = 774329;
     WorkspaceDeskSpecifics workspace_desk = 874841;
-    // This is not included in model_type.h because it's currently only used by
-    // the server and by Play Services. (crbug.com/1223853)
     WebauthnCredentialSpecifics webauthn_credential = 895275;
     HistorySpecifics history = 963985;
     PrintersAuthorizationServerSpecifics printers_authorization_server = 974304;
@@ -169,6 +142,21 @@
     ContactInfoSpecifics contact_info = 1034378;
     SegmentationSpecifics segmentation = 1026052;
     PowerBookmarkSpecifics power_bookmark = 1073150;
+
+    // No-longer-supported data types, in various stages of removal.
+    // TODO(crbug.com/1395003): Eventually, these should all become "reserved"
+    // fields, or at least use "EmptySpecifics". But some of them are still
+    // needed by the server, e.g. to support older clients.
+    EmptySpecifics app_notification = 45184 [deprecated = true];
+    EmptySpecifics synced_notification = 153108 [deprecated = true];
+    EmptySpecifics synced_notification_app_info = 235816 [deprecated = true];
+    ExperimentsSpecifics experiments = 161496 [deprecated = true];
+    FaviconTrackingSpecifics favicon_tracking = 181534 [deprecated = true];
+    FaviconImageSpecifics favicon_image = 182019 [deprecated = true];
+    EmptySpecifics managed_user = 194582 [deprecated = true];
+    ManagedUserSharedSettingSpecifics managed_user_shared_setting = 202026
+        [deprecated = true];
+    EmptySpecifics managed_user_allowlist = 306060 [deprecated = true];
   }
   reserved 218175;
   reserved "wifi_credential";
diff --git a/components/sync/protocol/managed_user_specifics.proto b/components/sync/protocol/managed_user_specifics.proto
deleted file mode 100644
index 0f519d3b5..0000000
--- a/components/sync/protocol/managed_user_specifics.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Sync protocol datatype extension for managed user settings.
-
-// If you change or add any fields in this file, update proto_visitors.h and
-// potentially proto_enum_conversions.{h, cc}.
-
-syntax = "proto2";
-
-option java_multiple_files = true;
-option java_package = "org.chromium.components.sync.protocol";
-
-option optimize_for = LITE_RUNTIME;
-
-package sync_pb;
-
-// Properties of managed user sync objects.
-message ManagedUserSpecifics {
-  // A randomly-generated identifier for the managed user.
-  optional string id = 1;
-  // The human-visible name of the managed user
-  optional string name = 2;
-  // This flag is set by the server to acknowledge that it has committed a
-  // newly created managed user.
-  optional bool acknowledged = 3 [default = false];
-  // Master key for managed user cryptohome.
-  optional string master_key = 4;
-  // A string representing the index of the supervised user avatar on Chrome.
-  // It has the following format:
-  // "chrome-avatar-index:INDEX" where INDEX is an integer.
-  optional string chrome_avatar = 5;
-  // A string representing the index of the supervised user avatar on Chrome OS.
-  // It has the following format:
-  // "chromeos-avatar-index:INDEX" where INDEX is an integer.
-  optional string chromeos_avatar = 6;
-  // Key for signing supervised user's password.
-  optional string password_signature_key = 7;
-  // Key for encrypting supervised user's password.
-  optional string password_encryption_key = 8;
-}
diff --git a/components/sync/protocol/protocol_sources.gni b/components/sync/protocol/protocol_sources.gni
index 094bfdb..aaa0b46 100644
--- a/components/sync/protocol/protocol_sources.gni
+++ b/components/sync/protocol/protocol_sources.gni
@@ -4,7 +4,6 @@
 
 sync_protocol_sources = [
   "app_list_specifics.proto",
-  "app_notification_specifics.proto",
   "app_setting_specifics.proto",
   "app_specifics.proto",
   "arc_package_specifics.proto",
@@ -35,7 +34,6 @@
   "loopback_server.proto",
   "managed_user_setting_specifics.proto",
   "managed_user_shared_setting_specifics.proto",
-  "managed_user_specifics.proto",
   "model_type_state.proto",
   "model_type_store_schema_descriptor.proto",
   "nigori_local_data.proto",
@@ -62,8 +60,6 @@
   "sync_entity.proto",
   "sync_enums.proto",
   "sync_invalidations_payload.proto",
-  "synced_notification_app_info_specifics.proto",
-  "synced_notification_specifics.proto",
   "test.proto",
   "theme_specifics.proto",
   "typed_url_specifics.proto",
@@ -71,7 +67,6 @@
   "user_consent_specifics.proto",
   "user_consent_types.proto",
   "user_event_specifics.proto",
-  "vault.proto",
   "web_apk_specifics.proto",
   "web_app_specifics.proto",
   "webauthn_credential_specifics.proto",
diff --git a/components/sync/protocol/synced_notification_app_info_specifics.proto b/components/sync/protocol/synced_notification_app_info_specifics.proto
deleted file mode 100644
index c0d9a58..0000000
--- a/components/sync/protocol/synced_notification_app_info_specifics.proto
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Sync protocol datatype extension for synced notification app info objects.
-// DO NOT USE: This datatype is deprecated.
-
-syntax = "proto2";
-
-option java_multiple_files = true;
-option java_package = "org.chromium.components.sync.protocol";
-
-option optimize_for = LITE_RUNTIME;
-
-package sync_pb;
-
-// This message is kept around for backwards compatibility sake.
-message SyncedNotificationAppInfoSpecifics {}
diff --git a/components/sync/protocol/synced_notification_specifics.proto b/components/sync/protocol/synced_notification_specifics.proto
deleted file mode 100644
index 445ad82..0000000
--- a/components/sync/protocol/synced_notification_specifics.proto
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Sync protocol datatype extension for synced notifications.
-// DO NOT USE: This datatype is deprecated.
-
-syntax = "proto2";
-
-option java_multiple_files = true;
-option java_package = "org.chromium.components.sync.protocol";
-
-option optimize_for = LITE_RUNTIME;
-
-package sync_pb;
-
-// This message is kept around for backwards compatibility sake.
-message SyncedNotificationSpecifics {}
diff --git a/components/sync/protocol/vault.proto b/components/sync/protocol/vault.proto
deleted file mode 100644
index 0ef126e5..0000000
--- a/components/sync/protocol/vault.proto
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Trusted vault protos to communicate with backend written in proto3 to avoid
-// subtle differences between enum fields.
-
-// TODO(crbug.com/1423343): Delete this file once downstream references are
-// updated to use components/trusted_vault/proto.
-syntax = "proto3";
-
-option java_multiple_files = true;
-option java_package = "org.chromium.components.sync.protocol";
-
-option optimize_for = LITE_RUNTIME;
-
-package sync_pb;
-
-message SharedMemberKey {
-  int32 epoch = 1;
-  bytes wrapped_key = 2;
-  bytes member_proof = 3;
-}
-
-message RotationProof {
-  int32 new_epoch = 1;
-  bytes rotation_proof = 2;
-}
-
-message SecurityDomainDetails {
-  message SyncDetails { bool degraded_recoverability = 1; }
-
-  SyncDetails sync_details = 1;
-}
-
-message SecurityDomain {
-  string name = 1;
-  int32 current_epoch = 2;
-  SecurityDomainDetails security_domain_details = 3;
-}
-
-message SecurityDomainMember {
-  string name = 1;
-  bytes public_key = 2;
-
-  message SecurityDomainMembership {
-    string security_domain = 1;
-    repeated SharedMemberKey keys = 3;
-    repeated RotationProof rotation_proofs = 4;
-  }
-
-  repeated SecurityDomainMembership memberships = 3;
-
-  enum MemberType {
-    MEMBER_TYPE_UNSPECIFIED = 0;
-    MEMBER_TYPE_PHYSICAL_DEVICE = 1;
-  }
-
-  MemberType member_type = 4;
-}
-
-message JoinSecurityDomainsRequest {
-  SecurityDomain security_domain = 1;
-  SecurityDomainMember security_domain_member = 2;
-  repeated SharedMemberKey shared_member_key = 3;
-  int32 member_type_hint = 4;
-}
-
-message JoinSecurityDomainsResponse {
-  SecurityDomain security_domain = 1;
-}
-
-message JoinSecurityDomainsErrorDetail {
-  JoinSecurityDomainsResponse already_exists_response = 1;
-}
-
-// TODO(crbug.com/1234719): figure out how to link google.protobuf.Any and use
-// it instead.
-message Proto3Any {
-  string type_url = 1;
-  bytes value = 2;
-}
-
-// Forked version of google.rpc.Status.
-message RPCStatus {
-  repeated Proto3Any details = 3;
-}
\ No newline at end of file
diff --git a/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java b/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java
index 05bb39d..5b6820f 100644
--- a/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java
+++ b/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java
@@ -10,7 +10,6 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.url.GURL;
 import org.chromium.url.Origin;
 
@@ -18,7 +17,6 @@
  * Wrapper for utilities in url_formatter.
  */
 @JNINamespace("url_formatter::android")
-@MainDex
 public final class UrlFormatter {
     /**
      * Refer to url_formatter::FixupURL.
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 8bd6c6a7..db8b9bf 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -79,6 +79,7 @@
     "https_valid_chrome_refresh.icon",
     "image_search.icon",
     "info_outline.icon",
+    "info_refresh.icon",
     "insert_drive_file_outline.icon",
     "keyboard.icon",
     "launch.icon",
diff --git a/components/vector_icons/info_refresh.icon b/components/vector_icons/info_refresh.icon
new file mode 100644
index 0000000..9cf55d40
--- /dev/null
+++ b/components/vector_icons/info_refresh.icon
@@ -0,0 +1,48 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 7.34f, 11.26f,
+R_H_LINE_TO, 1.32f,
+V_LINE_TO, 7.2f,
+H_LINE_TO, 7.34f,
+CLOSE,
+R_MOVE_TO, 0.66f, -5.18f,
+R_ARC_TO, 0.66f, 0.66f, 0, 0, 0, 0.48f, -0.19f,
+R_ARC_TO, 0.66f, 0.66f, 0, 0, 0, 0.2f, -0.48f,
+R_ARC_TO, 0.67f, 0.67f, 0, 0, 0, -0.2f, -0.48f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, -0.48f, -0.2f,
+R_ARC_TO, 0.66f, 0.66f, 0, 0, 0, -0.48f, 0.2f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, -0.2f, 0.48f,
+R_CUBIC_TO, 0, 0.2f, 0.07f, 0.36f, 0.2f, 0.49f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, 0.48f, 0.2f,
+CLOSE,
+R_MOVE_TO, 0.01f, 8.46f,
+R_CUBIC_TO, -0.9f, 0, -1.75f, -0.17f, -2.54f, -0.51f,
+R_ARC_TO, 6.52f, 6.52f, 0, 0, 1, -2.08f, -1.4f,
+R_ARC_TO, 6.52f, 6.52f, 0, 0, 1, -1.4f, -2.08f,
+R_ARC_TO, 6.33f, 6.33f, 0, 0, 1, -0.51f, -2.55f,
+R_CUBIC_TO, 0, -0.91f, 0.17f, -1.75f, 0.51f, -2.54f,
+ARC_TO, 6.53f, 6.53f, 0, 0, 1, 3.38f, 3.38f,
+ARC_TO, 6.52f, 6.52f, 0, 0, 1, 5.46f, 1.98f,
+R_ARC_TO, 6.33f, 6.33f, 0, 0, 1, 2.55f, -0.51f,
+R_CUBIC_TO, 0.91f, 0, 1.75f, 0.17f, 2.54f, 0.51f,
+R_CUBIC_TO, 0.79f, 0.34f, 1.48f, 0.8f, 2.07f, 1.4f,
+R_ARC_TO, 6.5f, 6.5f, 0, 0, 1, 1.4f, 2.08f,
+R_ARC_TO, 6.29f, 6.29f, 0, 0, 1, 0.51f, 2.54f,
+R_CUBIC_TO, 0, 0.9f, -0.17f, 1.75f, -0.51f, 2.54f,
+R_ARC_TO, 6.52f, 6.52f, 0, 0, 1, -1.4f, 2.08f,
+R_ARC_TO, 6.5f, 6.5f, 0, 0, 1, -2.08f, 1.4f,
+R_ARC_TO, 6.29f, 6.29f, 0, 0, 1, -2.54f, 0.51f,
+CLOSE,
+MOVE_TO, 8, 13.15f,
+R_CUBIC_TO, 1.43f, 0, 2.65f, -0.5f, 3.65f, -1.5f,
+R_CUBIC_TO, 1, -1, 1.5f, -2.22f, 1.5f, -3.65f,
+R_CUBIC_TO, 0, -1.43f, -0.5f, -2.65f, -1.5f, -3.65f,
+CUBIC_TO_SHORTHAND, 9.43f, 2.85f, 8, 2.85f,
+R_CUBIC_TO, -1.43f, 0, -2.65f, 0.5f, -3.65f, 1.5f,
+CUBIC_TO_SHORTHAND, 2.85f, 6.57f, 2.85f, 8,
+R_CUBIC_TO, 0, 1.43f, 0.5f, 2.65f, 1.5f, 3.65f,
+R_CUBIC_TO, 1, 1, 2.22f, 1.5f, 3.65f, 1.5f,
+CLOSE
diff --git a/components/version_info/android/java/src/org/chromium/components/version_info/VersionConstantsBridge.java b/components/version_info/android/java/src/org/chromium/components/version_info/VersionConstantsBridge.java
index 75a20dd5..c6d6be83 100644
--- a/components/version_info/android/java/src/org/chromium/components/version_info/VersionConstantsBridge.java
+++ b/components/version_info/android/java/src/org/chromium/components/version_info/VersionConstantsBridge.java
@@ -5,12 +5,10 @@
 package org.chromium.components.version_info;
 
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Bridge between native and VersionConstants.java.
  */
-@MainDex
 public class VersionConstantsBridge {
     @CalledByNative
     public static int getChannel() {
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
index aa83934..e3dca4a 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -903,14 +903,14 @@
       bool frame_ack = ack_queued_for_client_count_ > 0;
       ack_pending_during_on_begin_frame_ =
           !frame_ack && ack_pending_from_surface_count_;
-      client_->OnBeginFrame(adjusted_args, std::move(frame_timing_details_),
-                            frame_ack, std::move(surface_returned_resources_));
+      client_->OnBeginFrame(adjusted_args, frame_timing_details_, frame_ack,
+                            std::move(surface_returned_resources_));
       if (frame_ack) {
         ack_queued_for_client_count_--;
       }
       surface_returned_resources_.clear();
     } else {
-      client_->OnBeginFrame(adjusted_args, std::move(frame_timing_details_),
+      client_->OnBeginFrame(adjusted_args, frame_timing_details_,
                             /*frame_ack=*/false,
                             std::vector<ReturnedResource>());
     }
diff --git a/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java b/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java
index 6c9ba52..527be5c 100644
--- a/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java
+++ b/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java
@@ -10,13 +10,11 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides a VSyncMonitor backed BeginFrameSource.
  */
 @JNINamespace("viz")
-@MainDex
 public class ExternalBeginFrameSourceAndroid implements Choreographer.FrameCallback {
     private static final long NANOSECONDS_PER_SECOND = 1000000000;
     private static final long NANOSECONDS_PER_MICROSECOND = 1000;
diff --git a/components/viz/service/java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java b/components/viz/service/java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java
index 30b817fd..a589e9a 100644
--- a/components/viz/service/java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java
+++ b/components/viz/service/java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java
@@ -6,9 +6,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.build.annotations.MainDex;
 
-@MainDex
 abstract class ThrowUncaughtException {
     @CalledByNative
     private static void post() {
diff --git a/content/browser/devtools/browser_devtools_agent_host.cc b/content/browser/devtools/browser_devtools_agent_host.cc
index e1d7d768..5fdccca 100644
--- a/content/browser/devtools/browser_devtools_agent_host.cc
+++ b/content/browser/devtools/browser_devtools_agent_host.cc
@@ -118,11 +118,10 @@
   // DevToolsAgentHostObserver overrides.
   void DevToolsAgentHostCreated(DevToolsAgentHost* host) override {
     DCHECK(auto_attach());
-    // In the top level target handler auto-attach to pages as soon as they
+    // In the top level target handler, auto-attach to pages as soon as they
     // are created, otherwise if they don't incur any network activity we'll
     // never get a chance to throttle them (and auto-attach there).
-
-    if (IsMainFrameHost(host) || IsSharedWorkerHost(host)) {
+    if (ShouldAttachToTarget(host)) {
       DispatchAutoAttach(
           host, wait_for_debugger_on_start() && !processing_existent_targets_);
     }
@@ -130,8 +129,14 @@
 
   bool ShouldForceDevToolsAgentHostCreation() override { return true; }
 
-  static bool IsSharedWorkerHost(DevToolsAgentHost* host) {
-    return host->GetType() == DevToolsAgentHost::kTypeSharedWorker;
+  static bool ShouldAttachToTarget(DevToolsAgentHost* host) {
+    if (host->GetType() == DevToolsAgentHost::kTypeSharedWorker) {
+      return true;
+    }
+    if (host->GetType() == DevToolsAgentHost::kTypeTab) {
+      return true;
+    }
+    return IsMainFrameHost(host);
   }
 
   static bool IsMainFrameHost(DevToolsAgentHost* host) {
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc
index acf1112..33123b0 100644
--- a/content/browser/devtools/devtools_session.cc
+++ b/content/browser/devtools/devtools_session.cc
@@ -336,9 +336,18 @@
 void DevToolsSession::DispatchProtocolMessageInternal(
     crdtp::Dispatchable dispatchable,
     base::span<const uint8_t> message) {
-  if (!runtime_resume_.is_null() &&
-      crdtp::SpanEquals(crdtp::SpanFrom(kResumeMethod), dispatchable.Method()))
-    std::move(runtime_resume_).Run();
+  if ((browser_only_ || runtime_resume_) &&
+      crdtp::SpanEquals(crdtp::SpanFrom(kResumeMethod),
+                        dispatchable.Method())) {
+    if (runtime_resume_) {
+      std::move(runtime_resume_).Run();
+    }
+    if (browser_only_) {
+      DispatchProtocolMessageToClient(
+          crdtp::CreateResponse(dispatchable.CallId(), nullptr)->Serialize());
+      return;
+    }
+  }
 
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
diff --git a/content/browser/devtools/protocol/target_handler.cc b/content/browser/devtools/protocol/target_handler.cc
index aa8962f..7229180 100644
--- a/content/browser/devtools/protocol/target_handler.cc
+++ b/content/browser/devtools/protocol/target_handler.cc
@@ -654,10 +654,13 @@
     return base::WrapUnique(new TargetFilter(std::move(*filter.fromJust())));
   }
 
-  bool Match(DevToolsAgentHost& host) const {
+  bool Match(DevToolsAgentHost& host) const { return Match(host.GetType()); }
+
+  bool Match(base::StringPiece type) const {
     for (const auto& entry : entries_) {
-      if (!entry->HasType() || entry->GetType("") == host.GetType())
+      if (!entry->HasType() || entry->GetType("") == type) {
         return !entry->GetExclude(false);
+      }
     }
     return false;
   }
@@ -735,20 +738,27 @@
   DCHECK(auto_attacher == auto_attacher_);
   DevToolsAgentHost* host =
       RenderFrameDevToolsAgentHost::GetFor(frame_tree_node);
-  // For new pages create Throttle only if the session is still paused.
-  if (!host)
-    return nullptr;
-  auto it = auto_attached_sessions_.find(host);
-  if (it == auto_attached_sessions_.end())
-    return nullptr;
-  if (!it->second->IsWaitingForDebuggerOnStart())
-    return nullptr;
-  // RFDTAHs created during auto-attach had no renderer allocated originally,
-  // and hence have messages paused, but with navigation we're supposed to
-  // have a line host, so we can send messages to renderer now.
-  DCHECK(frame_tree_node->current_frame_host()->IsRenderFrameLive());
-  it->second->ResumeSendingMessagesToAgent();
-
+  TargetHandler::Session* waiting_session = FindWaitingSession(host);
+  if (waiting_session) {
+    // RFDTAHs created during auto-attach had no renderer allocated originally,
+    // and hence have messages paused, but with navigation we're supposed to
+    // have a live host, so we can send messages to renderer now.
+    DCHECK(frame_tree_node->current_frame_host()->IsRenderFrameLive());
+    // Only resume sending messages to frame agents (i.e. skip for WebContents
+    // ones).
+    waiting_session->ResumeSendingMessagesToAgent();
+  } else {
+    // Currently, either RFDTAH or WCDTAH may be waiting for debugger (when
+    // `waitForDebuggerOnStart` is honored for the Tab target, it is ignored
+    // for the Page target), so in case no Page-level sessions are waiting,
+    // also check the tab target.
+    host = WebContentsDevToolsAgentHost::GetFor(
+        WebContentsImpl::FromFrameTreeNode(frame_tree_node));
+    waiting_session = FindWaitingSession(host);
+    if (!waiting_session) {
+      return nullptr;
+    }
+  }
   // window.open() navigations are throttled on the renderer side and the main
   // request will not be sent until runIfWaitingForDebugger is received from
   // the client, so there is no need to throttle the navigation in the
@@ -756,13 +766,28 @@
   //
   // New window navigations (such as ctrl+click) should be throttled before
   // the main request is sent to apply user agent and other overrides.
-  FrameTreeNode* opener = frame_tree_node->opener();
-  if (opener)
+  if (frame_tree_node->opener()) {
     return nullptr;
+  }
   return std::make_unique<RequestThrottle>(weak_factory_.GetWeakPtr(),
                                            navigation_handle, host);
 }
 
+TargetHandler::Session* TargetHandler::FindWaitingSession(
+    DevToolsAgentHost* host) {
+  if (!host) {
+    return nullptr;
+  }
+  auto it = auto_attached_sessions_.find(host);
+  if (it == auto_attached_sessions_.end()) {
+    return nullptr;
+  }
+  if (!it->second->IsWaitingForDebuggerOnStart()) {
+    return nullptr;
+  }
+  return it->second;
+}
+
 void TargetHandler::ClearThrottles() {
   base::flat_set<Throttle*> copy(throttles_);
   for (Throttle* throttle : copy)
@@ -984,6 +1009,14 @@
   }
   auto_attach_target_filter_ =
       auto_attach ? TargetFilter::Create(std::move(filter)) : nullptr;
+  if (auto_attach_target_filter_ && access_mode_ == AccessMode::kBrowser &&
+      auto_attach_target_filter_->Match(DevToolsAgentHost::kTypeTab) &&
+      auto_attach_target_filter_->Match(DevToolsAgentHost::kTypePage)) {
+    callback->sendFailure(Response::InvalidParams(
+        "Filter should not simultaneously allow \"tab\" and \"page\", "
+        "page targets are attached via tab targets"));
+    return;
+  }
   SetAutoAttachInternal(
       auto_attach, wait_for_debugger_on_start, flatten.fromMaybe(false),
       base::BindOnce(&SetAutoAttachCallback::sendSuccess, std::move(callback)));
diff --git a/content/browser/devtools/protocol/target_handler.h b/content/browser/devtools/protocol/target_handler.h
index 5038012..d4089c8f 100644
--- a/content/browser/devtools/protocol/target_handler.h
+++ b/content/browser/devtools/protocol/target_handler.h
@@ -182,6 +182,7 @@
   void DevToolsAgentHostCrashed(DevToolsAgentHost* agent_host,
                                 base::TerminationStatus status) override;
   bool discover() const { return !!discover_target_filter_; }
+  Session* FindWaitingSession(DevToolsAgentHost* host);
 
   const AccessMode access_mode_;
   const std::string owner_target_id_;
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index f0bb579e..9c48f63 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -219,7 +219,8 @@
 void RenderFrameDevToolsAgentHost::AttachToWebContents(
     WebContents* web_contents) {
   if (ShouldForceCreation()) {
-    // Force agent host.
+    // Force agent hosts.
+    DevToolsAgentHost::GetOrCreateForTab(web_contents);
     DevToolsAgentHost::GetOrCreateFor(web_contents);
   }
 }
diff --git a/content/browser/devtools/web_contents_devtools_agent_host.cc b/content/browser/devtools/web_contents_devtools_agent_host.cc
index 2133706..5c9f22d 100644
--- a/content/browser/devtools/web_contents_devtools_agent_host.cc
+++ b/content/browser/devtools/web_contents_devtools_agent_host.cc
@@ -158,7 +158,16 @@
 
 void WebContentsDevToolsAgentHost::InnerAttach(WebContents* wc) {
   CHECK(!web_contents());
-  bool inserted =
+  // With ConnectWebContents(), we may be attaching to a WC that has
+  // a different host created.
+  // TODO(caseq): find a better solution. See also a similar comment in
+  // RenderFrameDevToolsAgentHost::SetFrameTreeNode();
+  auto prev_entry = g_agent_host_instances.Get().find(wc);
+  if (prev_entry != g_agent_host_instances.Get().end()) {
+    CHECK_NE(prev_entry->second, this);
+    prev_entry->second->InnerDetach();
+  }
+  const bool inserted =
       g_agent_host_instances.Get().insert(std::make_pair(wc, this)).second;
   CHECK(inserted);
   auto_attacher_->SetWebContents(wc);
diff --git a/content/browser/download/mhtml_generation_browsertest.cc b/content/browser/download/mhtml_generation_browsertest.cc
index 211d5bb..26c946780 100644
--- a/content/browser/download/mhtml_generation_browsertest.cc
+++ b/content/browser/download/mhtml_generation_browsertest.cc
@@ -521,11 +521,6 @@
     EXPECT_THAT(mhtml,
                 HasSubstr("Content-Transfer-Encoding: quoted-printable"));
   }
-
-  // Checks that the final status reported to UMA is correct.
-  histogram_tester()->ExpectUniqueSample(
-      "PageSerialization.MhtmlGeneration.FinalSaveStatus",
-      static_cast<int>(mojom::MhtmlSaveStatus::kSuccess), 1);
 }
 
 #if BUILDFLAG(IS_WIN)
@@ -565,11 +560,6 @@
     EXPECT_THAT(mhtml,
                 HasSubstr("Content-Transfer-Encoding: quoted-printable"));
   }
-
-  // Checks that the final status reported to UMA is correct.
-  histogram_tester()->ExpectUniqueSample(
-      "PageSerialization.MhtmlGeneration.FinalSaveStatus",
-      static_cast<int>(mojom::MhtmlSaveStatus::kSuccess), 1);
 }
 #endif  // BUILDFLAG(IS_WIN)
 
@@ -616,11 +606,6 @@
   GenerateMHTML(path, embedded_test_server()->GetURL("/page_with_image.html"));
 
   EXPECT_EQ(file_size(), -1);  // Expecting that the callback reported failure.
-
-  // Checks that the final status reported to UMA is correct.
-  histogram_tester()->ExpectUniqueSample(
-      "PageSerialization.MhtmlGeneration.FinalSaveStatus",
-      static_cast<int>(mojom::MhtmlSaveStatus::kFileCreationError), 1);
 }
 
 // Tests that MHTML generated using the default 'quoted-printable' encoding does
diff --git a/content/browser/download/mhtml_generation_manager.cc b/content/browser/download/mhtml_generation_manager.cc
index 025921b..742e4bfc 100644
--- a/content/browser/download/mhtml_generation_manager.cc
+++ b/content/browser/download/mhtml_generation_manager.cc
@@ -283,10 +283,6 @@
   // false for failure.
   static bool CloseFileIfValid(base::File& file, int64_t* file_size);
 
-  // Time tracking for performance metrics reporting.
-  base::TimeTicks wait_on_renderer_start_time_;
-  base::TimeDelta all_renderers_wait_time_;
-
   // User-configurable parameters. Includes the file location, binary encoding
   // choices.
   MHTMLGenerationParams params_;
@@ -460,8 +456,6 @@
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("page-serialization", "WaitingOnRenderer",
                                     this, "frame tree node id",
                                     frame_tree_node_id_of_busy_frame_);
-  DCHECK(wait_on_renderer_start_time_.is_null());
-  wait_on_renderer_start_time_ = base::TimeTicks::Now();
   return mojom::MhtmlSaveStatus::kSuccess;
 }
 
@@ -580,8 +574,6 @@
   TRACE_EVENT_NESTABLE_ASYNC_END2("page-serialization", "SavingMhtmlJob", this,
                                   "job save status", save_status, "file size",
                                   file_size);
-  UMA_HISTOGRAM_ENUMERATION("PageSerialization.MhtmlGeneration.FinalSaveStatus",
-                            save_status);
 
   std::move(callback_).Run(close_file_result.toMHTMLGenerationResult());
 
@@ -606,23 +598,6 @@
 
   TRACE_EVENT_NESTABLE_ASYNC_INSTANT0("page-serialization", "JobFinished",
                                       this);
-
-  // End of job timing reports.
-  if (!wait_on_renderer_start_time_.is_null()) {
-    base::TimeDelta renderer_wait_time =
-        base::TimeTicks::Now() - wait_on_renderer_start_time_;
-    UMA_HISTOGRAM_TIMES(
-        "PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime."
-        "SingleFrame",
-        renderer_wait_time);
-    all_renderers_wait_time_ += renderer_wait_time;
-  }
-  if (!all_renderers_wait_time_.is_zero()) {
-    UMA_HISTOGRAM_TIMES(
-        "PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime."
-        "FrameTree",
-        all_renderers_wait_time_);
-  }
 }
 
 void MHTMLGenerationManager::Job::CloseFile(
@@ -664,16 +639,6 @@
 
 void MHTMLGenerationManager::Job::RecordDigests(
     const std::vector<std::string>& digests_of_uris_of_serialized_resources) {
-  DCHECK(!wait_on_renderer_start_time_.is_null());
-  base::TimeDelta renderer_wait_time =
-      base::TimeTicks::Now() - wait_on_renderer_start_time_;
-  UMA_HISTOGRAM_TIMES(
-      "PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime."
-      "SingleFrame",
-      renderer_wait_time);
-  all_renderers_wait_time_ += renderer_wait_time;
-  wait_on_renderer_start_time_ = base::TimeTicks();
-
   // Renderer should be deduping resources with the same uris.
   DCHECK_EQ(0u, base::STLSetIntersection<std::set<std::string>>(
                     digests_of_already_serialized_uris_,
diff --git a/content/browser/first_party_sets/first_party_set_parser.cc b/content/browser/first_party_sets/first_party_set_parser.cc
index 3e0e27e..80d54eb2 100644
--- a/content/browser/first_party_sets/first_party_set_parser.cc
+++ b/content/browser/first_party_sets/first_party_set_parser.cc
@@ -262,8 +262,9 @@
 // with `elements`), and singleton sets (i.e. sets must have a primary and at
 // least one valid associated site).
 //
-// Uses `elements` to check disjointness of sets; augments `elements` to include
-// the elements of the set that was parsed.
+// Uses `elements` to check disjointness of sets. The caller is expected to
+// augment `elements` to include the elements of the set returned by this
+// function (including any aliases).
 //
 // Returns the parsed set if parsing and validation were successful; otherwise,
 // returns an appropriate ParseError.
@@ -274,7 +275,7 @@
     const base::Value& value,
     bool exempt_from_limits,
     bool emit_errors,
-    base::flat_set<net::SchemefulSite>& elements,
+    const base::flat_set<net::SchemefulSite>& elements,
     std::vector<ParseWarning>* warnings) {
   if (!value.is_dict())
     return base::unexpected(ParseError(ParseErrorType::kInvalidType, {}));
@@ -338,15 +339,6 @@
                                        {kFirstPartySetAssociatedSitesField}));
   }
 
-  for (const std::pair<net::SchemefulSite, net::FirstPartySetEntry>&
-           site_and_entry : set_entries) {
-    CHECK(elements.insert(site_and_entry.first).second);
-  }
-  for (const std::pair<net::SchemefulSite, net::SchemefulSite>&
-           alias_and_canonical : aliases) {
-    CHECK(elements.insert(alias_and_canonical.first).second);
-  }
-
   return std::make_pair(FirstPartySetParser::SingleSet(set_entries), aliases);
 }
 
@@ -395,6 +387,10 @@
       set.insert(std::make_move_iterator(alias_entries.begin()),
                  std::make_move_iterator(alias_entries.end()));
     }
+    for (const std::pair<net::SchemefulSite, net::FirstPartySetEntry>&
+             site_and_entry : set) {
+      CHECK(elements.insert(site_and_entry.first).second);
+    }
     parsed_sets.push_back(set);
     previous_size = warnings.size();
   }
@@ -474,6 +470,17 @@
       return {};
     }
 
+    for (const std::pair<net::SchemefulSite, net::FirstPartySetEntry>&
+             site_and_entry : parsed->first) {
+      const net::SchemefulSite& site = site_and_entry.first;
+      CHECK(elements.insert(site).second);
+    }
+    for (const std::pair<net::SchemefulSite, net::SchemefulSite>&
+             alias_and_canonical : parsed->second) {
+      const net::SchemefulSite& alias = alias_and_canonical.first;
+      CHECK(elements.insert(alias).second);
+    }
+
     base::ranges::move(parsed.value().first, std::back_inserter(sets));
     base::ranges::move(parsed.value().second, std::back_inserter(aliases));
     successfully_parsed_sets++;
diff --git a/content/browser/metrics/histograms_monitor_unittest.cc b/content/browser/metrics/histograms_monitor_unittest.cc
index e7e777a..e417cd8 100644
--- a/content/browser/metrics/histograms_monitor_unittest.cc
+++ b/content/browser/metrics/histograms_monitor_unittest.cc
@@ -38,7 +38,7 @@
 
   diff = monitor.GetDiff();
   ASSERT_EQ(diff.size(), 1ull);
-  std::string* header1 = diff[0].FindStringKey("header");
+  std::string* header1 = diff[0].GetDict().FindString("header");
   EXPECT_EQ(*header1,
             "Histogram: MonitorHistogram1 recorded 2 samples, mean = 35.0");
 
@@ -48,7 +48,7 @@
   histogram2->Add(50);
   diff = monitor.GetDiff();
   ASSERT_EQ(diff.size(), 2ull);
-  std::string* header2 = diff[1].FindStringKey("header");
+  std::string* header2 = diff[1].GetDict().FindString("header");
   EXPECT_EQ(*header2,
             "Histogram: MonitorHistogram2 recorded 1 samples, mean = 50.0");
 }
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc
index 52d80da..46c50b4 100644
--- a/content/browser/preloading/prefetch/prefetch_container.cc
+++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -122,8 +122,7 @@
     absl::optional<PrefetchStatus> old_prefetch_status,
     PrefetchStatus new_prefetch_status) {
   if (old_prefetch_status &&
-      (old_prefetch_status.value() == PrefetchStatus::kPrefetchUsedNoProbe ||
-       old_prefetch_status.value() == PrefetchStatus::kPrefetchResponseUsed)) {
+      old_prefetch_status.value() == PrefetchStatus::kPrefetchResponseUsed) {
     // Skip this update if the triggering outcome has already been updated
     // to kSuccess.
     return;
@@ -149,7 +148,6 @@
         }
         attempt->SetTriggeringOutcome(PreloadingTriggeringOutcome::kReady);
         break;
-      case PrefetchStatus::kPrefetchUsedNoProbe:
       case PrefetchStatus::kPrefetchResponseUsed:
         if (old_prefetch_status && old_prefetch_status.value() !=
                                        PrefetchStatus::kPrefetchSuccessful) {
@@ -199,7 +197,6 @@
         // heldback. This is covered by attempt's holdback status. For these two
         // reasons this PrefetchStatus does not fire a `SetTriggeringOutcome`.
         break;
-      case PrefetchStatus::kPrefetchNotEligibleGoogleDomain:
       case PrefetchStatus::kPrefetchNotEligibleUserHasServiceWorker:
       case PrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps:
       case PrefetchStatus::kPrefetchNotEligibleNonDefaultStoragePartition:
@@ -213,22 +210,6 @@
       case PrefetchStatus::kPrefetchNotUsedCookiesChanged:
       case PrefetchStatus::kPrefetchIsStale:
       case PrefetchStatus::kPrefetchNotUsedProbeFailed:
-      case PrefetchStatus::kNavigatedToLinkNotOnSRP:
-      case PrefetchStatus::kPrefetchUsedNoProbeWithNSP:
-      case PrefetchStatus::kPrefetchUsedProbeSuccessWithNSP:
-      case PrefetchStatus::kPrefetchNotUsedProbeFailedWithNSP:
-      case PrefetchStatus::kPrefetchUsedNoProbeNSPAttemptDenied:
-      case PrefetchStatus::kPrefetchUsedProbeSuccessNSPAttemptDenied:
-      case PrefetchStatus::kPrefetchNotUsedProbeFailedNSPAttemptDenied:
-      case PrefetchStatus::kPrefetchUsedNoProbeNSPNotStarted:
-      case PrefetchStatus::kPrefetchUsedProbeSuccessNSPNotStarted:
-      case PrefetchStatus::kPrefetchNotUsedProbeFailedNSPNotStarted:
-      case PrefetchStatus::kPrefetchIsStaleWithNSP:
-      case PrefetchStatus::kPrefetchIsStaleNSPAttemptDenied:
-      case PrefetchStatus::kPrefetchIsStaleNSPNotStarted:
-      case PrefetchStatus::kSubresourceThrottled:
-      case PrefetchStatus::kPrefetchPositionIneligible:
-      case PrefetchStatus::kPrefetchFailedRedirectsDisabled_DEPRECATED:
       case PrefetchStatus::
           kPrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy:
         NOTIMPLEMENTED();
diff --git a/content/browser/preloading/prefetch/prefetch_document_manager.cc b/content/browser/preloading/prefetch/prefetch_document_manager.cc
index 1b183b1..4e6da81 100644
--- a/content/browser/preloading/prefetch/prefetch_document_manager.cc
+++ b/content/browser/preloading/prefetch/prefetch_document_manager.cc
@@ -264,40 +264,22 @@
       return false;
     case PrefetchStatus::kPrefetchNotEligibleUserHasCookies:
     case PrefetchStatus::kPrefetchNotEligibleUserHasServiceWorker:
-    case PrefetchStatus::kPrefetchNotEligibleGoogleDomain:
     case PrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps:
     case PrefetchStatus::kPrefetchNotEligibleNonDefaultStoragePartition:
-    case PrefetchStatus::kPrefetchPositionIneligible:
     case PrefetchStatus::kPrefetchIneligibleRetryAfter:
     case PrefetchStatus::kPrefetchProxyNotAvailable:
     case PrefetchStatus::kPrefetchNotEligibleHostIsNonUnique:
     case PrefetchStatus::kPrefetchNotEligibleDataSaverEnabled:
     case PrefetchStatus::kPrefetchNotEligibleExistingProxy:
-    case PrefetchStatus::kPrefetchUsedNoProbe:
     case PrefetchStatus::kPrefetchNotUsedProbeFailed:
     case PrefetchStatus::kPrefetchNotStarted:
     case PrefetchStatus::kPrefetchNotFinishedInTime:
     case PrefetchStatus::kPrefetchFailedNetError:
     case PrefetchStatus::kPrefetchFailedNon2XX:
     case PrefetchStatus::kPrefetchFailedMIMENotSupported:
-    case PrefetchStatus::kNavigatedToLinkNotOnSRP:
-    case PrefetchStatus::kSubresourceThrottled:
-    case PrefetchStatus::kPrefetchUsedNoProbeWithNSP:
-    case PrefetchStatus::kPrefetchUsedProbeSuccessWithNSP:
-    case PrefetchStatus::kPrefetchNotUsedProbeFailedWithNSP:
-    case PrefetchStatus::kPrefetchUsedNoProbeNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchUsedProbeSuccessNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchNotUsedProbeFailedNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchUsedNoProbeNSPNotStarted:
-    case PrefetchStatus::kPrefetchUsedProbeSuccessNSPNotStarted:
-    case PrefetchStatus::kPrefetchNotUsedProbeFailedNSPNotStarted:
     case PrefetchStatus::kPrefetchIsPrivacyDecoy:
     case PrefetchStatus::kPrefetchIsStale:
-    case PrefetchStatus::kPrefetchIsStaleWithNSP:
-    case PrefetchStatus::kPrefetchIsStaleNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchIsStaleNSPNotStarted:
     case PrefetchStatus::kPrefetchNotUsedCookiesChanged:
-    case PrefetchStatus::kPrefetchFailedRedirectsDisabled_DEPRECATED:
     case PrefetchStatus::kPrefetchNotEligibleBrowserContextOffTheRecord:
     case PrefetchStatus::kPrefetchHeldback:
     case PrefetchStatus::kPrefetchAllowed:
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc
index 4b076e3..5df1b2a5 100644
--- a/content/browser/preloading/prefetch/prefetch_service.cc
+++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -79,10 +79,8 @@
       // If the prefetch is not eligible because of cookie or a service worker,
       // then maybe send a decoy.
       return true;
-    case PrefetchStatus::kPrefetchNotEligibleGoogleDomain:
     case PrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps:
     case PrefetchStatus::kPrefetchNotEligibleNonDefaultStoragePartition:
-    case PrefetchStatus::kPrefetchPositionIneligible:
     case PrefetchStatus::kPrefetchIneligibleRetryAfter:
     case PrefetchStatus::kPrefetchProxyNotAvailable:
     case PrefetchStatus::kPrefetchNotEligibleHostIsNonUnique:
@@ -94,7 +92,6 @@
       // These statuses don't relate to any user state, so don't send a decoy
       // request.
       return false;
-    case PrefetchStatus::kPrefetchUsedNoProbe:
     case PrefetchStatus::kPrefetchNotUsedProbeFailed:
     case PrefetchStatus::kPrefetchNotStarted:
     case PrefetchStatus::kPrefetchNotFinishedInTime:
@@ -102,24 +99,9 @@
     case PrefetchStatus::kPrefetchFailedNon2XX:
     case PrefetchStatus::kPrefetchFailedMIMENotSupported:
     case PrefetchStatus::kPrefetchSuccessful:
-    case PrefetchStatus::kNavigatedToLinkNotOnSRP:
-    case PrefetchStatus::kSubresourceThrottled:
-    case PrefetchStatus::kPrefetchUsedNoProbeWithNSP:
-    case PrefetchStatus::kPrefetchUsedProbeSuccessWithNSP:
-    case PrefetchStatus::kPrefetchNotUsedProbeFailedWithNSP:
-    case PrefetchStatus::kPrefetchUsedNoProbeNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchUsedProbeSuccessNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchNotUsedProbeFailedNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchUsedNoProbeNSPNotStarted:
-    case PrefetchStatus::kPrefetchUsedProbeSuccessNSPNotStarted:
-    case PrefetchStatus::kPrefetchNotUsedProbeFailedNSPNotStarted:
     case PrefetchStatus::kPrefetchIsPrivacyDecoy:
     case PrefetchStatus::kPrefetchIsStale:
-    case PrefetchStatus::kPrefetchIsStaleWithNSP:
-    case PrefetchStatus::kPrefetchIsStaleNSPAttemptDenied:
-    case PrefetchStatus::kPrefetchIsStaleNSPNotStarted:
     case PrefetchStatus::kPrefetchNotUsedCookiesChanged:
-    case PrefetchStatus::kPrefetchFailedRedirectsDisabled_DEPRECATED:
     case PrefetchStatus::kPrefetchResponseUsed:
     case PrefetchStatus::kPrefetchHeldback:
     case PrefetchStatus::kPrefetchAllowed:
diff --git a/content/browser/preloading/prefetch/prefetch_status.h b/content/browser/preloading/prefetch/prefetch_status.h
index 4dd8f9d..5695c0e 100644
--- a/content/browser/preloading/prefetch/prefetch_status.h
+++ b/content/browser/preloading/prefetch/prefetch_status.h
@@ -14,8 +14,10 @@
 // These are also mapped onto the first content internal range of
 // `PreloadingEligibility` and onto `PreloadingFailureReason`.
 enum class PrefetchStatus {
+  // Deprecated. Replaced by `kPrefetchResponseUsed`.
+  //
   // The interceptor used a prefetch.
-  kPrefetchUsedNoProbe = 0,
+  // kPrefetchUsedNoProbe = 0,
 
   // Deprecated. Probe success implies the response is used. Thus replaced
   // by `kPrefetchResponseUsed`.
@@ -31,9 +33,11 @@
   // made.
   kPrefetchNotStarted = 3,
 
+  // Deprecated. No longer a reason for ineligibility.
+  //
   // The url was not eligible to be prefetched because it is a Google-owned
   // domain.
-  kPrefetchNotEligibleGoogleDomain = 4,
+  // kPrefetchNotEligibleGoogleDomain = 4,
 
   // The url was not eligible to be prefetched because the user had cookies for
   // that origin.
@@ -47,8 +51,10 @@
   // https://.
   kPrefetchNotEligibleSchemeIsNotHttps = 7,
 
+  // Deprecated. No longer a reason for ineligibility.
+  //
   // The url was not eligible to be prefetched because its host was an IP
-  // address. [DEPRECATED]
+  // address.
   // kPrefetchNotEligibleHostIsIPAddress = 8,
 
   // The url was not eligible to be prefetched because it uses a non-default
@@ -71,35 +77,47 @@
   // The prefetch finished successfully but was never used.
   kPrefetchSuccessful = 14,
 
+  // Deprecated. No longer used.
+  //
   // The navigation off of the Google SRP was to a url that was not on the SRP.
-  kNavigatedToLinkNotOnSRP = 15,
+  // kNavigatedToLinkNotOnSRP = 15,
 
+  // Deprecated. NSP no longer supported.
+  //
   // Variants of the first three statuses with the additional context of a
   // successfully completed NoStatePrefetch.
-  kPrefetchUsedNoProbeWithNSP = 16,
-  kPrefetchUsedProbeSuccessWithNSP = 17,
-  kPrefetchNotUsedProbeFailedWithNSP = 18,
+  // kPrefetchUsedNoProbeWithNSP = 16,
+  // kPrefetchUsedProbeSuccessWithNSP = 17,
+  // kPrefetchNotUsedProbeFailedWithNSP = 18,
 
+  // Deprecated. NSP no longer supported
+  //
   // Variants of the first three statuses within the additional context of a
   // link that was eligible for NoStatePrefetch, but was not started because
   // the Prerender code denied the request.
-  kPrefetchUsedNoProbeNSPAttemptDenied = 19,
-  kPrefetchUsedProbeSuccessNSPAttemptDenied = 20,
-  kPrefetchNotUsedProbeFailedNSPAttemptDenied = 21,
+  // kPrefetchUsedNoProbeNSPAttemptDenied = 19,
+  // kPrefetchUsedProbeSuccessNSPAttemptDenied = 20,
+  // kPrefetchNotUsedProbeFailedNSPAttemptDenied = 21,
 
+  // Deprecated. NSP no longer supported.
+  //
   // Variants of the first three statuses with in the additional context of a
   // link that was eligible for NoStatePrefetch that was never started.
-  kPrefetchUsedNoProbeNSPNotStarted = 22,
-  kPrefetchUsedProbeSuccessNSPNotStarted = 23,
-  kPrefetchNotUsedProbeFailedNSPNotStarted = 24,
+  // kPrefetchUsedNoProbeNSPNotStarted = 22,
+  // kPrefetchUsedProbeSuccessNSPNotStarted = 23,
+  // kPrefetchNotUsedProbeFailedNSPNotStarted = 24,
 
+  // Deprecated. Subresources no longer supported.
+  //
   // A subresource which was not fetched because it was throttled by an
   // experimental control for the max number of subresources per prerender.
-  kSubresourceThrottled = 25,
+  // kSubresourceThrottled = 25,
 
+  // Deprecated. No longer a reason for ineligibilty.
+  //
   // The position of the link in the navigation prediction was not eligible to
   // be prefetch due to experiment controls.
-  kPrefetchPositionIneligible = 26,
+  // kPrefetchPositionIneligible = 26,
 
   // A previous prefetch to the origin got a HTTP 503 response with an
   // Retry-After header that has no elapsed yet.
@@ -118,17 +136,21 @@
   // The prefetch was eligible, but too much time elapsed between the prefetch
   // and the interception.
   kPrefetchIsStale = 30,
-  kPrefetchIsStaleWithNSP = 31,
-  kPrefetchIsStaleNSPAttemptDenied = 32,
-  kPrefetchIsStaleNSPNotStarted = 33,
+
+  // Deprecated. NSP no longer supported
+  // kPrefetchIsStaleWithNSP = 31,
+  // kPrefetchIsStaleNSPAttemptDenied = 32,
+  // kPrefetchIsStaleNSPNotStarted = 33,
 
   // The prefetch was not used because cookies were added to the URL after the
   // initial eligibility check.
   kPrefetchNotUsedCookiesChanged = 34,
 
+  // Deprecated. Support for redirecs added.
+  //
   // The prefetch was redirected, but following redirects was disabled.
   // See crbug.com/1266876 for more details.
-  kPrefetchFailedRedirectsDisabled_DEPRECATED = 35,
+  // kPrefetchFailedRedirectsDisabled = 35,
 
   // The url was not eligible to be prefetched because its host was not unique
   // (e.g., a non publicly routable IP address or a hostname which is not
diff --git a/content/browser/smart_card/smart_card_browsertest.cc b/content/browser/smart_card/smart_card_browsertest.cc
index 8f9c298f..1fa5b26 100644
--- a/content/browser/smart_card/smart_card_browsertest.cc
+++ b/content/browser/smart_card/smart_card_browsertest.cc
@@ -30,13 +30,18 @@
 #include "third_party/blink/public/common/features_generated.h"
 #include "third_party/blink/public/mojom/smart_card/smart_card.mojom.h"
 
+using base::test::TestFuture;
+using device::mojom::SmartCardConnection;
 using device::mojom::SmartCardContext;
+using device::mojom::SmartCardDisposition;
 using device::mojom::SmartCardError;
 using device::mojom::SmartCardProtocol;
 using device::mojom::SmartCardReaderStateFlags;
 using device::mojom::SmartCardReaderStateOut;
 using device::mojom::SmartCardReaderStateOutPtr;
+using device::mojom::SmartCardResult;
 using device::mojom::SmartCardShareMode;
+using device::mojom::SmartCardSuccess;
 using ::testing::_;
 using testing::Exactly;
 using testing::InSequence;
@@ -49,8 +54,7 @@
  public:
   MOCK_METHOD(void,
               Disconnect,
-              (device::mojom::SmartCardDisposition disposition,
-               DisconnectCallback callback),
+              (SmartCardDisposition disposition, DisconnectCallback callback),
               (override));
 
   MOCK_METHOD(void,
@@ -849,4 +853,186 @@
     })())"));
 }
 
+IN_PROC_BROWSER_TEST_F(SmartCardTest, Disconnect) {
+  ASSERT_TRUE(NavigateToURL(shell(), GetIsolatedContextUrl()));
+
+  MockSmartCardReaderTracker& mock_tracker = CreateMockSmartCardReaderTracker();
+
+  MockSmartCardContextFactory& mock_context_factory =
+      GetFakeSmartCardDelegate().mock_context_factory;
+  MockSmartCardConnection mock_connection;
+  mojo::Receiver<SmartCardConnection> connection_receiver(&mock_connection);
+
+  {
+    InSequence s;
+
+    EXPECT_CALL(mock_tracker, Start(_, _))
+        .WillOnce(
+            [&mock_tracker](SmartCardReaderTracker::Observer* observer,
+                            SmartCardReaderTracker::StartCallback callback) {
+              mock_tracker.observer_list.AddObserverIfMissing(observer);
+
+              std::vector<blink::mojom::SmartCardReaderInfoPtr> readers;
+              readers.push_back(blink::mojom::SmartCardReaderInfo::New(
+                  "Fake reader", blink::mojom::SmartCardReaderState::kEmpty,
+                  std::vector<uint8_t>()));
+              std::move(callback).Run(
+                  blink::mojom::SmartCardGetReadersResult::NewReaders(
+                      std::move(readers)));
+            });
+
+    EXPECT_CALL(mock_context_factory,
+                Connect("Fake reader", SmartCardShareMode::kShared, _, _))
+        .WillOnce([&connection_receiver](
+                      const std::string& reader,
+                      device::mojom::SmartCardShareMode share_mode,
+                      device::mojom::SmartCardProtocolsPtr preferred_protocols,
+                      SmartCardContext::ConnectCallback callback) {
+          EXPECT_TRUE(preferred_protocols->t0);
+          EXPECT_TRUE(preferred_protocols->t1);
+          EXPECT_FALSE(preferred_protocols->raw);
+
+          auto success = device::mojom::SmartCardConnectSuccess::New(
+              connection_receiver.BindNewPipeAndPassRemote(),
+              SmartCardProtocol::kT1);
+
+          std::move(callback).Run(
+              device::mojom::SmartCardConnectResult::NewSuccess(
+                  std::move(success)));
+        });
+
+    EXPECT_CALL(mock_connection, Disconnect(SmartCardDisposition::kEject, _))
+        .WillOnce([](SmartCardDisposition disposition,
+                     SmartCardConnection::DisconnectCallback callback) {
+          std::move(callback).Run(
+              SmartCardResult::NewSuccess(SmartCardSuccess::kOk));
+        });
+
+    // When the document is destroyed
+    EXPECT_CALL(mock_tracker, Stop(_));
+  }
+
+  EXPECT_EQ(
+      "second disconnect: InvalidStateError, Failed to execute 'disconnect' on "
+      "'SmartCardConnection': Is disconnected.",
+      EvalJs(shell(), R"(
+    (async () => {
+      let readers = await navigator.smartCard.getReaders();
+
+      if (readers.length !== 1) {
+        return "reader not found";
+      }
+
+      let reader = readers[0];
+      let connection = await reader.connect("shared", ["t0", "t1"]);
+
+      await connection.disconnect("eject");
+
+      // A second attempt should fail.
+      try {
+        await connection.disconnect("unpower");
+      } catch (e) {
+        return `second disconnect: ${e.name}, ${e.message}`;
+      }
+
+      return `second disconnect did not throw`;
+    })())"));
+}
+
+IN_PROC_BROWSER_TEST_F(SmartCardTest, ConcurrentDisconnect) {
+  ASSERT_TRUE(NavigateToURL(shell(), GetIsolatedContextUrl()));
+
+  MockSmartCardReaderTracker& mock_tracker = CreateMockSmartCardReaderTracker();
+
+  MockSmartCardContextFactory& mock_context_factory =
+      GetFakeSmartCardDelegate().mock_context_factory;
+  MockSmartCardConnection mock_connection;
+  mojo::Receiver<SmartCardConnection> connection_receiver(&mock_connection);
+
+  TestFuture<SmartCardConnection::DisconnectCallback> disconnect_future;
+
+  {
+    InSequence s;
+
+    EXPECT_CALL(mock_tracker, Start(_, _))
+        .WillOnce(
+            [&mock_tracker](SmartCardReaderTracker::Observer* observer,
+                            SmartCardReaderTracker::StartCallback callback) {
+              mock_tracker.observer_list.AddObserverIfMissing(observer);
+
+              std::vector<blink::mojom::SmartCardReaderInfoPtr> readers;
+              readers.push_back(blink::mojom::SmartCardReaderInfo::New(
+                  "Fake reader", blink::mojom::SmartCardReaderState::kEmpty,
+                  std::vector<uint8_t>()));
+              std::move(callback).Run(
+                  blink::mojom::SmartCardGetReadersResult::NewReaders(
+                      std::move(readers)));
+            });
+
+    EXPECT_CALL(mock_context_factory,
+                Connect("Fake reader", SmartCardShareMode::kShared, _, _))
+        .WillOnce([&connection_receiver](
+                      const std::string& reader,
+                      device::mojom::SmartCardShareMode share_mode,
+                      device::mojom::SmartCardProtocolsPtr preferred_protocols,
+                      SmartCardContext::ConnectCallback callback) {
+          EXPECT_TRUE(preferred_protocols->t0);
+          EXPECT_TRUE(preferred_protocols->t1);
+          EXPECT_FALSE(preferred_protocols->raw);
+
+          auto success = device::mojom::SmartCardConnectSuccess::New(
+              connection_receiver.BindNewPipeAndPassRemote(),
+              SmartCardProtocol::kT1);
+
+          std::move(callback).Run(
+              device::mojom::SmartCardConnectResult::NewSuccess(
+                  std::move(success)));
+        });
+
+    EXPECT_CALL(mock_connection, Disconnect(SmartCardDisposition::kEject, _))
+        .WillOnce([&disconnect_future](
+                      SmartCardDisposition disposition,
+                      SmartCardConnection::DisconnectCallback callback) {
+          // Ensure this disconnect() call doesn't finish before the second
+          // one is issued.
+          disconnect_future.SetValue(std::move(callback));
+        });
+
+    // When the document is destroyed
+    EXPECT_CALL(mock_tracker, Stop(_));
+  }
+
+  EXPECT_EQ(
+      "second disconnect: InvalidStateError, Failed to execute 'disconnect' on "
+      "'SmartCardConnection': An operation is in progress.",
+      EvalJs(shell(), R"(
+    (async () => {
+      let readers = await navigator.smartCard.getReaders();
+
+      if (readers.length !== 1) {
+        return "reader not found";
+      }
+
+      let reader = readers[0];
+      let connection = await reader.connect("shared", ["t0", "t1"]);
+
+      // This first disconnect() call will go through but won't be finished
+      // before the end of this script.
+      connection.disconnect("eject");
+
+      // A second attempt should fail since the first one is still ongoing.
+      try {
+        await connection.disconnect("unpower");
+      } catch (e) {
+        return `second disconnect: ${e.name}, ${e.message}`;
+      }
+
+      return `second disconnect did not throw`;
+    })())"));
+
+  // Let the first disconnect() finish.
+  disconnect_future.Take().Run(
+      SmartCardResult::NewSuccess(SmartCardSuccess::kOk));
+}
+
 }  // namespace content
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index ccdd233..1603b08 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1373,14 +1373,18 @@
   // TODO(cbentzel): remove this debugging code?
   if (delegate == delegate_)
     return;
-  if (delegate_)
+  const bool had_delegate = !!delegate_;
+  if (had_delegate) {
     delegate_->Detach(this);
+  }
   delegate_ = delegate;
   if (delegate_) {
     delegate_->Attach(this);
     // RenderFrameDevToolsAgentHost should not be told about the WebContents
     // until there is a `delegate_`.
-    RenderFrameDevToolsAgentHost::AttachToWebContents(this);
+    if (!had_delegate) {
+      RenderFrameDevToolsAgentHost::AttachToWebContents(this);
+    }
   }
 
   // Re-read values from the new delegate and apply them.
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc
index a155d6b..5d1c721c 100644
--- a/content/browser/webid/federated_auth_request_impl.cc
+++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -1094,13 +1094,13 @@
       IsFedCmAutoReauthnEnabled();
 
   bool auto_reauthn = auto_reauthn_enabled;
-  bool has_auto_reauthn_content_setting = false;
+  bool is_auto_reauthn_setting_enabled = false;
   bool is_auto_reauthn_embargoed = false;
   absl::optional<base::TimeDelta> time_from_embargo;
   if (auto_reauthn_enabled) {
-    has_auto_reauthn_content_setting =
-        auto_reauthn_permission_delegate_->HasAutoReauthnContentSetting();
-    auto_reauthn &= has_auto_reauthn_content_setting;
+    is_auto_reauthn_setting_enabled =
+        auto_reauthn_permission_delegate_->IsAutoReauthnSettingEnabled();
+    auto_reauthn &= is_auto_reauthn_setting_enabled;
     is_auto_reauthn_embargoed =
         auto_reauthn_permission_delegate_->IsAutoReauthnEmbargoed(
             GetEmbeddingOrigin());
@@ -1132,7 +1132,7 @@
         mediation_requirement_ == MediationRequirement::kSilent) {
       fedcm_metrics_->RecordAutoReauthnMetrics(
           has_single_returning_account, auto_reauthn_account, auto_reauthn,
-          !has_auto_reauthn_content_setting, is_auto_reauthn_embargoed,
+          !is_auto_reauthn_setting_enabled, is_auto_reauthn_embargoed,
           time_from_embargo);
 
       // By this moment we know that the user has granted permission in the past
@@ -1199,7 +1199,7 @@
   if (auto_reauthn_enabled) {
     fedcm_metrics_->RecordAutoReauthnMetrics(
         has_single_returning_account, auto_reauthn_account, auto_reauthn,
-        !has_auto_reauthn_content_setting, is_auto_reauthn_embargoed,
+        !is_auto_reauthn_setting_enabled, is_auto_reauthn_embargoed,
         time_from_embargo);
   }
 }
@@ -2018,8 +2018,8 @@
     return false;
   }
 
-  bool has_auto_reauthn_content_setting =
-      auto_reauthn_permission_delegate_->HasAutoReauthnContentSetting();
+  bool is_auto_reauthn_setting_enabled =
+      auto_reauthn_permission_delegate_->IsAutoReauthnSettingEnabled();
 
   bool is_auto_reauthn_embargoed =
       auto_reauthn_permission_delegate_->IsAutoReauthnEmbargoed(
@@ -2030,8 +2030,8 @@
           origin(), GetEmbeddingOrigin(), url::Origin::Create(config_url),
           absl::nullopt);
 
-  return !has_auto_reauthn_content_setting || is_auto_reauthn_embargoed ||
-         !has_sharing_permission_for_any_account || RequiresUserMediation();
+  return RequiresUserMediation() || !is_auto_reauthn_setting_enabled ||
+         is_auto_reauthn_embargoed || !has_sharing_permission_for_any_account;
 }
 
 bool FederatedAuthRequestImpl::RequiresUserMediation() {
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc
index d0c03bf..d509fcb9 100644
--- a/content/browser/webid/federated_auth_request_impl_unittest.cc
+++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -1515,7 +1515,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1554,7 +1554,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1610,7 +1610,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1666,7 +1666,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1704,7 +1704,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1768,7 +1768,7 @@
 
   // Pretend that auto re-authn is not disabled in settings.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
 
   // Pretend that auto re-authn is not in embargo state.
@@ -1789,6 +1789,45 @@
   EXPECT_EQ(dialog_controller_state_.sign_in_mode, SignInMode::kExplicit);
 }
 
+// Test that auto re-authn with multiple accounts and a single returning user
+// sets the sign-in mode to kExplicit if "auto sign-in" is disabled.
+TEST_F(FederatedAuthRequestImplTest,
+       AutoReauthnForSingleReturningUserWithAutoSigninDisabled) {
+  base::test::ScopedFeatureList list;
+  list.InitAndEnableFeature(features::kFedCmAutoReauthn);
+
+  // Pretend the sharing permission has been granted for this account.
+  EXPECT_CALL(
+      *test_permission_delegate_,
+      HasSharingPermission(OriginFromString(kRpUrl), OriginFromString(kRpUrl),
+                           OriginFromString(kProviderUrlFull),
+                           Optional(std::string(kAccountId))))
+      .Times(2)
+      .WillRepeatedly(Return(true));
+
+  // Pretend that auto re-authn is not in embargo state.
+  EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
+              IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
+      .WillOnce(Return(false));
+
+  // Pretend that re-authn does not require user mediation.
+  EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
+              RequiresUserMediation(GURL(kRpUrl)))
+      .WillOnce(Return(false));
+
+  // Pretend that auto re-authn is disabled in settings.
+  EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
+              IsAutoReauthnSettingEnabled())
+      .WillOnce(Return(false));
+
+  RunAuthTest(kDefaultRequestParameters, kExpectationSuccess,
+              kConfigurationValid);
+
+  ASSERT_EQ(displayed_accounts().size(), 1u);
+  EXPECT_EQ(CountNumLoginStateIsSignin(), 1);
+  EXPECT_EQ(dialog_controller_state_.sign_in_mode, SignInMode::kExplicit);
+}
+
 // Test that if browser has not observed sign-in in the past, the sign-in mode
 // is set to explicit regardless the account's login state.
 TEST_F(FederatedAuthRequestImplTest,
@@ -1807,7 +1846,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1833,7 +1872,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1864,7 +1903,7 @@
 
   // Pretend the auto re-authn permission has been blocked for this account.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(false));
 
   RunAuthTest(kDefaultRequestParameters, kExpectationSuccess,
@@ -1896,7 +1935,7 @@
 
   // Pretend the auto re-authn permission has been granted for this account.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   // Pretend that auto re-authn is embargoed.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
@@ -1939,9 +1978,9 @@
                   OriginFromString(kProviderUrlFull), Eq(absl::nullopt)))
       .WillOnce(Return(false));
 
-  // Pretend the auto re-authn permission has been granted.
+  // Pretend the auto re-authn is disabled in settings.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
@@ -1975,8 +2014,9 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
+
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
               IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
       .WillOnce(Return(true));
@@ -2001,7 +2041,7 @@
   list.InitAndEnableFeature(features::kFedCmAutoReauthn);
 
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .WillOnce(Return(true));
   EXPECT_CALL(*test_permission_delegate_,
               HasSharingPermission(
@@ -2027,6 +2067,40 @@
   EXPECT_FALSE(DidFetchAnyEndpoint());
 }
 
+// Test that no network request is sent if `mediation: silent` is used and user
+// has disabled "auto sign-in".
+TEST_F(FederatedAuthRequestImplTest,
+       AutoReauthnMediationSilentFailWithPasswordManagerAutoSigninDisabled) {
+  base::test::ScopedFeatureList list;
+  list.InitAndEnableFeature(features::kFedCmAutoReauthn);
+
+  EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
+              IsAutoReauthnSettingEnabled())
+      .WillOnce(Return(false));
+  EXPECT_CALL(*test_permission_delegate_,
+              HasSharingPermission(
+                  OriginFromString(kRpUrl), OriginFromString(kRpUrl),
+                  OriginFromString(kProviderUrlFull), Eq(absl::nullopt)))
+      .WillOnce(Return(true));
+  EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
+              IsAutoReauthnEmbargoed(OriginFromString(kRpUrl)))
+      .WillOnce(Return(false));
+  EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
+              RequiresUserMediation(GURL(kRpUrl)))
+      .WillOnce(Return(false));
+
+  RequestExpectations expectations = {
+      RequestTokenStatus::kError,
+      {FederatedAuthRequestResult::kError},
+      /*selected_idp_config_url=*/absl::nullopt};
+  MockConfiguration configuration = kConfigurationValid;
+  configuration.mediation_requirement = MediationRequirement::kSilent;
+
+  RunAuthTest(kDefaultRequestParameters, expectations, configuration);
+
+  EXPECT_FALSE(DidFetchAnyEndpoint());
+}
+
 // Test `mediation: silent` could fail silently after fetching accounts
 TEST_F(FederatedAuthRequestImplTest,
        AutoReauthnMediationSilentFailWithTwoReturningAccounts) {
@@ -2068,7 +2142,7 @@
 
   // Pretend the auto re-authn permission has been granted.
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
-              HasAutoReauthnContentSetting())
+              IsAutoReauthnSettingEnabled())
       .Times(2)
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*test_auto_reauthn_permission_delegate_,
diff --git a/content/browser/webid/test/mock_auto_reauthn_permission_delegate.h b/content/browser/webid/test/mock_auto_reauthn_permission_delegate.h
index 3fadeab3..19f1582 100644
--- a/content/browser/webid/test/mock_auto_reauthn_permission_delegate.h
+++ b/content/browser/webid/test/mock_auto_reauthn_permission_delegate.h
@@ -22,7 +22,7 @@
   MockAutoReauthnPermissionDelegate& operator=(
       const MockAutoReauthnPermissionDelegate&) = delete;
 
-  MOCK_METHOD0(HasAutoReauthnContentSetting, bool());
+  MOCK_METHOD0(IsAutoReauthnSettingEnabled, bool());
   MOCK_METHOD1(IsAutoReauthnEmbargoed, bool(const url::Origin&));
   MOCK_METHOD1(GetAutoReauthnEmbargoStartTime, base::Time(const url::Origin&));
   MOCK_METHOD1(RecordDisplayAndEmbargo, void(const url::Origin&));
diff --git a/content/browser/worker_network_isolation_key_browsertest.cc b/content/browser/worker_network_isolation_key_browsertest.cc
index 74ae144..2f15c0b5 100644
--- a/content/browser/worker_network_isolation_key_browsertest.cc
+++ b/content/browser/worker_network_isolation_key_browsertest.cc
@@ -148,6 +148,19 @@
     : public WorkerNetworkIsolationKeyBrowserTest,
       public ::testing::WithParamInterface<
           std::tuple<bool /* test_same_network_isolation_key */, WorkerType>> {
+ public:
+  WorkerImportScriptsAndFetchRequestNetworkIsolationKeyBrowserTest() {
+    // This test was written assuming that iframes/workers corresponding to
+    // different cross-origin frames (same top-level site) would not share an
+    // HTTP cache partition, but this is not the case when the experiment to
+    // replace the frame origin with an "is-cross-site" bit in the Network
+    // Isolation Key is active. Therefore, disable it for this test.
+    feature_list_.InitAndDisableFeature(
+        net::features::kEnableCrossSiteFlagNetworkIsolationKey);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
 };
 
 // Test that network isolation key is filled in correctly for service/shared
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 66ed03be5..57c7d87 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -368,6 +368,8 @@
           {"WebAppTabStrip", raw_ref(features::kDesktopPWAsTabStrip)},
           {"WebAppTabStripCustomizations",
            raw_ref(blink::features::kDesktopPWAsTabStripCustomizations)},
+          {"WebEnvironmentIntegrity",
+           raw_ref(features::kWebEnvironmentIntegrity)},
           {"WGIGamepadTriggerRumble",
            raw_ref(features::kEnableWindowsGamingInputDataFetcher)},
           {"UserAgentFull", raw_ref(blink::features::kFullUserAgent)},
diff --git a/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java b/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java
index dca1cec..beb4519 100644
--- a/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java
+++ b/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java
@@ -21,7 +21,6 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.memory.MemoryPressureUma;
 import org.chromium.base.process_launcher.ChildProcessServiceDelegate;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.content.browser.ChildProcessCreationParamsImpl;
 import org.chromium.content.browser.ContentChildProcessConstants;
 import org.chromium.content.common.IGpuProcessCallback;
@@ -35,7 +34,6 @@
  * access to view surfaces.
  */
 @JNINamespace("content")
-@MainDex
 public class ContentChildProcessServiceDelegate implements ChildProcessServiceDelegate {
     private static final String TAG = "ContentCPSDelegate";
 
diff --git a/content/public/android/java/src/org/chromium/content/app/ContentMain.java b/content/public/android/java/src/org/chromium/content/app/ContentMain.java
index 0fe9cdcb..ea17fea 100644
--- a/content/public/android/java/src/org/chromium/content/app/ContentMain.java
+++ b/content/public/android/java/src/org/chromium/content/app/ContentMain.java
@@ -6,7 +6,6 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * This class is used to initialize all types of process. It corresponds to
@@ -19,7 +18,6 @@
  *
  **/
 @JNINamespace("content")
-@MainDex
 public class ContentMain {
     /**
      * Start the ContentMainRunner in native side.
diff --git a/content/public/android/java/src/org/chromium/content/app/KillChildUncaughtExceptionHandler.java b/content/public/android/java/src/org/chromium/content/app/KillChildUncaughtExceptionHandler.java
index c972d92..4cb18d3 100644
--- a/content/public/android/java/src/org/chromium/content/app/KillChildUncaughtExceptionHandler.java
+++ b/content/public/android/java/src/org/chromium/content/app/KillChildUncaughtExceptionHandler.java
@@ -7,7 +7,6 @@
 import android.os.Process;
 
 import org.chromium.base.BuildInfo;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Handler that immediately kills the current process on an uncaught exception.
@@ -19,7 +18,6 @@
  * This does not have any exception handling or crash reporting. Such handlers should be
  * chained before this handler.
  */
-@MainDex
 class KillChildUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
     private boolean mCrashing;
 
diff --git a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService0.java b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService0.java
index 92d8078..1d5513b 100644
--- a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService0.java
+++ b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService0.java
@@ -4,11 +4,8 @@
 
 package org.chromium.content.app;
 
-import org.chromium.build.annotations.MainDex;
-
 /**
  * This is needed to register multiple PrivilegedProcess services so that we can have
  * more than one unsandboxed process.
  */
-@MainDex
 public class PrivilegedProcessService0 extends PrivilegedProcessService {}
diff --git a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService1.java b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService1.java
index 66ea84c..f5fe400 100644
--- a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService1.java
+++ b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService1.java
@@ -4,11 +4,8 @@
 
 package org.chromium.content.app;
 
-import org.chromium.build.annotations.MainDex;
-
 /**
  * This is needed to register multiple PrivilegedProcess services so that we can have
  * more than one unsandboxed process.
  */
-@MainDex
 public class PrivilegedProcessService1 extends PrivilegedProcessService {}
diff --git a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService2.java b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService2.java
index 927817eb..75d5dc52 100644
--- a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService2.java
+++ b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService2.java
@@ -4,11 +4,8 @@
 
 package org.chromium.content.app;
 
-import org.chromium.build.annotations.MainDex;
-
 /**
  * This is needed to register multiple PrivilegedProcess services so that we can have
  * more than one unsandboxed process.
  */
-@MainDex
 public class PrivilegedProcessService2 extends PrivilegedProcessService {}
diff --git a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService3.java b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService3.java
index 0e58408..85d81a9 100644
--- a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService3.java
+++ b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService3.java
@@ -4,11 +4,8 @@
 
 package org.chromium.content.app;
 
-import org.chromium.build.annotations.MainDex;
-
 /**
  * This is needed to register multiple PrivilegedProcess services so that we can have
  * more than one unsandboxed process.
  */
-@MainDex
 public class PrivilegedProcessService3 extends PrivilegedProcessService {}
diff --git a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService4.java b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService4.java
index 9856471..145eb1f 100644
--- a/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService4.java
+++ b/content/public/android/java/src/org/chromium/content/app/PrivilegedProcessService4.java
@@ -4,11 +4,8 @@
 
 package org.chromium.content.app;
 
-import org.chromium.build.annotations.MainDex;
-
 /**
  * This is needed to register multiple PrivilegedProcess services so that we can have
  * more than one unsandboxed process.
  */
-@MainDex
 public class PrivilegedProcessService4 extends PrivilegedProcessService {}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentFeatureListImpl.java b/content/public/android/java/src/org/chromium/content/browser/ContentFeatureListImpl.java
index 06a7a43..d13aa784 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentFeatureListImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentFeatureListImpl.java
@@ -6,14 +6,12 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Implementation of {@link ContentFeatureList}.
  * Java accessor for base/feature_list.h state.
  */
 @JNINamespace("content::android")
-@MainDex
 public class ContentFeatureListImpl {
     /**
      * Returns whether the specified feature is enabled or not.
diff --git a/content/public/android/java/src/org/chromium/content/common/SurfaceWrapper.java b/content/public/android/java/src/org/chromium/content/common/SurfaceWrapper.java
index 3ac5f1f9..8254995 100644
--- a/content/public/android/java/src/org/chromium/content/common/SurfaceWrapper.java
+++ b/content/public/android/java/src/org/chromium/content/common/SurfaceWrapper.java
@@ -14,13 +14,11 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * A wrapper for marshalling a Surface without self-destruction.
  */
 @JNINamespace("content")
-@MainDex
 public class SurfaceWrapper implements Parcelable {
     private final boolean mWrapsSurface;
     private Surface mSurface;
diff --git a/content/public/browser/federated_identity_auto_reauthn_permission_context_delegate.h b/content/public/browser/federated_identity_auto_reauthn_permission_context_delegate.h
index 8c57da902..a445d1f 100644
--- a/content/public/browser/federated_identity_auto_reauthn_permission_context_delegate.h
+++ b/content/public/browser/federated_identity_auto_reauthn_permission_context_delegate.h
@@ -26,11 +26,11 @@
   // Returns whether the FedCM API's auto re-authn is unblocked based on content
   // settings. A caller should also use `IsAutoReauthnEmbargoed()` to determine
   // whether auto re-authn is allowed or not.
-  virtual bool HasAutoReauthnContentSetting() = 0;
+  virtual bool IsAutoReauthnSettingEnabled() = 0;
 
   // Returns whether the FedCM API's auto re-authn feature is embargoed for the
   // passed-in |relying_party_embedder|. A caller should also use
-  // `HasAutoReauthnContentSetting()` to determine whether auto re-authn is
+  // `IsAutoReauthnSettingEnabled()` to determine whether auto re-authn is
   // allowed or not.
   virtual bool IsAutoReauthnEmbargoed(
       const url::Origin& relying_party_embedder) = 0;
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 9366d27..8bdccda 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -1438,6 +1438,11 @@
              "WebBluetoothNewPermissionsBackend",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enables the Web Environment Integrity API.
+BASE_FEATURE(kWebEnvironmentIntegrity,
+             "WebEnvironmentIntegrity",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // If WebGL Image Chromium is allowed, this feature controls whether it is
 // enabled.
 BASE_FEATURE(kWebGLImageChromium,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index ca65d6c..4cb16451 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -320,6 +320,7 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAuthnTouchToFillCredentialSelection);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebBluetooth);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebBluetoothNewPermissionsBackend);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebEnvironmentIntegrity);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebGLImageChromium);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebMidi);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebOtpBackendAuto);
diff --git a/content/renderer/mhtml_handle_writer.cc b/content/renderer/mhtml_handle_writer.cc
index 38e6efb9..e941c1e5 100644
--- a/content/renderer/mhtml_handle_writer.cc
+++ b/content/renderer/mhtml_handle_writer.cc
@@ -28,28 +28,18 @@
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("page-serialization",
                                     "Writing MHTML contents to handle",
                                     TRACE_ID_LOCAL(this));
-  DCHECK(mhtml_write_start_time_.is_null());
-  mhtml_write_start_time_ = base::TimeTicks::Now();
-
+  is_writing_ = true;
   WriteContentsImpl(std::move(mhtml_contents));
 }
 
 void MHTMLHandleWriter::Finish(mojom::MhtmlSaveStatus save_status) {
   DCHECK(!RenderThread::IsMainThread())
       << "Should not run in the main renderer thread";
-
-  // Only record UMA if WriteContents has been called.
-  if (!mhtml_write_start_time_.is_null()) {
+  if (is_writing_) {
     TRACE_EVENT_NESTABLE_ASYNC_END0("page-serialization",
                                     "WriteContentsImpl (MHTMLHandleWriter)",
                                     TRACE_ID_LOCAL(this));
-    base::TimeDelta mhtml_write_time =
-        base::TimeTicks::Now() - mhtml_write_start_time_;
-    UMA_HISTOGRAM_TIMES(
-        "PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame",
-        mhtml_write_time);
   }
-
   Close();
 
   main_thread_task_runner_->PostTask(
diff --git a/content/renderer/mhtml_handle_writer.h b/content/renderer/mhtml_handle_writer.h
index d4d87f7..57f5e4b9 100644
--- a/content/renderer/mhtml_handle_writer.h
+++ b/content/renderer/mhtml_handle_writer.h
@@ -60,10 +60,9 @@
   virtual void Close() = 0;
 
  private:
-  base::TimeTicks mhtml_write_start_time_;
-
   scoped_refptr<base::TaskRunner> main_thread_task_runner_;
   MHTMLWriteCompleteCallback callback_;
+  bool is_writing_ = false;
 };
 
 // Wraps a base::File target to write MHTML contents to.
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 53481599..741d2e44 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -5354,7 +5354,6 @@
 void RenderFrameImpl::SerializeAsMHTML(mojom::SerializeAsMHTMLParamsPtr params,
                                        SerializeAsMHTMLCallback callback) {
   TRACE_EVENT0("page-serialization", "RenderFrameImpl::SerializeAsMHTML");
-  base::TimeTicks start_time = base::TimeTicks::Now();
 
   // Unpack payload.
   const WebString mhtml_boundary =
@@ -5398,14 +5397,6 @@
   // Note: the MHTML footer is written by the browser process, after the last
   // frame is serialized by a renderer process.
 
-  // Note: we assume RenderFrameImpl::OnWriteMHTMLComplete and the rest of
-  // this function will be fast enough to not need to be accounted for in this
-  // metric.
-  base::TimeDelta main_thread_use_time = base::TimeTicks::Now() - start_time;
-  UMA_HISTOGRAM_TIMES(
-      "PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame",
-      main_thread_use_time);
-
   MHTMLHandleWriterDelegate handle_delegate(
       *params,
       base::BindOnce(&RenderFrameImpl::OnWriteMHTMLComplete,
@@ -5435,8 +5426,6 @@
       std::make_move_iterator(serialized_resources_uri_digests.end()));
 
   // Notify the browser process about completion using the callback.
-  // Note: we assume this method is fast enough to not need to be accounted for
-  // in PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame.
   std::move(callback).Run(save_status, std::move(digests_of_new_parts));
 }
 
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java
index 109126dc4..1cf43e6 100644
--- a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java
@@ -4,8 +4,5 @@
 
 package org.chromium.content_shell_apk;
 
-import org.chromium.build.annotations.MainDex;
-
 /** One of the TestChildProcessService defined in the AndroidManifest.xml. */
-@MainDex
 public class TestChildProcessService0 extends TestChildProcessService {}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java
index b1137ab..689dc40 100644
--- a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java
@@ -4,8 +4,5 @@
 
 package org.chromium.content_shell_apk;
 
-import org.chromium.build.annotations.MainDex;
-
 /** One of the TestChildProcessService defined in the AndroidManifest.xml. */
-@MainDex
 public class TestChildProcessService1 extends TestChildProcessService {}
diff --git a/content/shell/browser/shell_federated_permission_context.cc b/content/shell/browser/shell_federated_permission_context.cc
index 08acda6..1bb8af1 100644
--- a/content/shell/browser/shell_federated_permission_context.cc
+++ b/content/shell/browser/shell_federated_permission_context.cc
@@ -46,7 +46,7 @@
 }
 
 // FederatedIdentityAutoReauthnPermissionContextDelegate
-bool ShellFederatedPermissionContext::HasAutoReauthnContentSetting() {
+bool ShellFederatedPermissionContext::IsAutoReauthnSettingEnabled() {
   return auto_reauthn_permission_;
 }
 
diff --git a/content/shell/browser/shell_federated_permission_context.h b/content/shell/browser/shell_federated_permission_context.h
index 3c611091..3e593f3 100644
--- a/content/shell/browser/shell_federated_permission_context.h
+++ b/content/shell/browser/shell_federated_permission_context.h
@@ -41,7 +41,7 @@
   bool ShouldCompleteRequestImmediately() const override;
 
   // FederatedIdentityAutoReauthnPermissionContextDelegate
-  bool HasAutoReauthnContentSetting() override;
+  bool IsAutoReauthnSettingEnabled() override;
   bool IsAutoReauthnEmbargoed(
       const url::Origin& relying_party_embedder) override;
   base::Time GetAutoReauthnEmbargoStartTime(
diff --git a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection.png b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection.png
index da2f31a8..6cb3d0f 100644
--- a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection.png
+++ b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_fuchsia.png b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_fuchsia.png
index 41112e3d9..ca75bf3c 100644
--- a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_fuchsia.png
+++ b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_fuchsia.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_linux.png b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_linux.png
index 5674219..680b2a73 100644
--- a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_linux.png
+++ b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_linux.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png
index a89fd3c8..0193e49 100644
--- a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png
+++ b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png
Binary files differ
diff --git a/google_apis/common/base_requests.cc b/google_apis/common/base_requests.cc
index a8a2d76..de6b2aa 100644
--- a/google_apis/common/base_requests.cc
+++ b/google_apis/common/base_requests.cc
@@ -76,11 +76,12 @@
 
     // Returns the reason of the first error.
     if (const base::Value::List* errors = error->FindList(kErrorErrorsKey)) {
-      const base::Value& first_error = (*errors)[0];
-      if (first_error.is_dict()) {
-        const std::string* reason = first_error.FindStringKey(kErrorReasonKey);
-        if (reason)
+      const base::Value::Dict* first_error = errors->front().GetIfDict();
+      if (first_error) {
+        const std::string* reason = first_error->FindString(kErrorReasonKey);
+        if (reason) {
           return *reason;
+        }
       }
     }
   }
diff --git a/google_apis/common/parser_util.cc b/google_apis/common/parser_util.cc
index 96770d3..e2677dd4 100644
--- a/google_apis/common/parser_util.cc
+++ b/google_apis/common/parser_util.cc
@@ -8,9 +8,11 @@
 
 bool IsResourceKindExpected(const base::Value& value,
                             const std::string& expected_kind) {
-  if (!value.is_dict())
+  const auto* dict = value.GetIfDict();
+  if (!dict) {
     return false;
-  const std::string* kind = value.FindStringKey(kApiResponseKindKey);
+  }
+  const std::string* kind = dict->FindString(kApiResponseKindKey);
   return kind && *kind == expected_kind;
 }
 
diff --git a/gpu/command_buffer/service/passthrough_discardable_manager.cc b/gpu/command_buffer/service/passthrough_discardable_manager.cc
index dcf220741..2c31ea0d 100644
--- a/gpu/command_buffer/service/passthrough_discardable_manager.cc
+++ b/gpu/command_buffer/service/passthrough_discardable_manager.cc
@@ -4,6 +4,7 @@
 
 #include "gpu/command_buffer/service/passthrough_discardable_manager.h"
 
+#include "base/trace_event/memory_dump_manager.h"
 #include "gpu/command_buffer/service/context_group.h"
 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h"
 #include "gpu/command_buffer/service/service_discardable_manager.h"
@@ -31,10 +32,57 @@
     : cache_(DiscardableCache::NO_AUTO_EVICT),
       cache_size_limit_(preferences.force_gpu_mem_discardable_limit_bytes
                             ? preferences.force_gpu_mem_discardable_limit_bytes
-                            : DiscardableCacheSizeLimit()) {}
+                            : DiscardableCacheSizeLimit()) {
+  // In certain cases, SingleThreadTaskRunner::CurrentDefaultHandle isn't set
+  // (Android Webview).  Don't register a dump provider in these cases.
+  if (base::SingleThreadTaskRunner::HasCurrentDefault()) {
+    base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
+        this, "gpu::PassthroughDiscardableManager",
+        base::SingleThreadTaskRunner::GetCurrentDefault());
+  }
+}
 
 PassthroughDiscardableManager::~PassthroughDiscardableManager() {
   DCHECK(cache_.empty());
+  base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
+      this);
+}
+
+bool PassthroughDiscardableManager::OnMemoryDump(
+    const base::trace_event::MemoryDumpArgs& args,
+    base::trace_event::ProcessMemoryDump* pmd) {
+  using base::trace_event::MemoryAllocatorDump;
+  using base::trace_event::MemoryDumpLevelOfDetail;
+
+  if (args.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND) {
+    std::string dump_name =
+        base::StringPrintf("gpu/discardable_cache/cache_0x%" PRIXPTR,
+                           reinterpret_cast<uintptr_t>(this));
+    MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(dump_name);
+    dump->AddScalar(MemoryAllocatorDump::kNameSize,
+                    MemoryAllocatorDump::kUnitsBytes, total_size_);
+
+    if (!cache_.empty()) {
+      MemoryAllocatorDump* dump_avg_size =
+          pmd->CreateAllocatorDump(dump_name + "/avg_image_size");
+      dump_avg_size->AddScalar("average_size", MemoryAllocatorDump::kUnitsBytes,
+                               total_size_ / cache_.size());
+    }
+
+    // Early out, no need for more detail in a BACKGROUND dump.
+    return true;
+  }
+
+  for (const auto& entry : cache_) {
+    std::string dump_name = base::StringPrintf(
+        "gpu/discardable_cache/cache_0x%" PRIXPTR "/entry_0x%" PRIXPTR,
+        reinterpret_cast<uintptr_t>(this),
+        reinterpret_cast<uintptr_t>(entry.second.unlocked_texture.get()));
+    MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(dump_name);
+    dump->AddScalar(MemoryAllocatorDump::kNameSize,
+                    MemoryAllocatorDump::kUnitsBytes, entry.second.size);
+  }
+  return true;
 }
 
 void PassthroughDiscardableManager::InitializeTexture(
diff --git a/gpu/command_buffer/service/passthrough_discardable_manager.h b/gpu/command_buffer/service/passthrough_discardable_manager.h
index c188a79f..86ba2985 100644
--- a/gpu/command_buffer/service/passthrough_discardable_manager.h
+++ b/gpu/command_buffer/service/passthrough_discardable_manager.h
@@ -7,6 +7,7 @@
 
 #include "base/containers/lru_cache.h"
 #include "base/memory/memory_pressure_listener.h"
+#include "base/trace_event/memory_dump_provider.h"
 #include "gpu/command_buffer/common/discardable_handle.h"
 #include "gpu/gpu_gles2_export.h"
 
@@ -17,7 +18,8 @@
 class ContextGroup;
 }  // namespace gles2
 
-class GPU_GLES2_EXPORT PassthroughDiscardableManager {
+class GPU_GLES2_EXPORT PassthroughDiscardableManager
+    : public base::trace_event::MemoryDumpProvider {
  public:
   explicit PassthroughDiscardableManager(const GpuPreferences& preferences);
 
@@ -25,7 +27,11 @@
   PassthroughDiscardableManager& operator=(
       const PassthroughDiscardableManager&) = delete;
 
-  ~PassthroughDiscardableManager();
+  ~PassthroughDiscardableManager() override;
+
+  // base::trace_event::MemoryDumpProvider implementation.
+  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
+                    base::trace_event::ProcessMemoryDump* pmd) override;
 
   void InitializeTexture(uint32_t client_id,
                          const gles2::ContextGroup* context_group,
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index 6d52af4..9345f4f9 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -749,6 +749,14 @@
   }
 }
 
+void SharedContextState::UseShaderCache(
+    absl::optional<gpu::raster::GrShaderCache::ScopedCacheUse>& cache_use)
+    const {
+  if (gr_shader_cache_) {
+    cache_use.emplace(gr_shader_cache_, gpu::kDisplayCompositorClientId);
+  }
+}
+
 gl::GLDisplay* SharedContextState::display() {
   return surface_.get()->GetGLDisplay();
 }
diff --git a/gpu/command_buffer/service/shared_context_state.h b/gpu/command_buffer/service/shared_context_state.h
index c2155b0..7552fbb 100644
--- a/gpu/command_buffer/service/shared_context_state.h
+++ b/gpu/command_buffer/service/shared_context_state.h
@@ -23,6 +23,7 @@
 #include "gpu/command_buffer/common/skia_utils.h"
 #include "gpu/command_buffer/service/gl_context_virtual_delegate.h"
 #include "gpu/command_buffer/service/gr_cache_controller.h"
+#include "gpu/command_buffer/service/gr_shader_cache.h"
 #include "gpu/command_buffer/service/memory_tracking.h"
 #include "gpu/config/gpu_preferences.h"
 #include "gpu/gpu_gles2_export.h"
@@ -126,6 +127,10 @@
 
   void StoreVkPipelineCacheIfNeeded();
 
+  void UseShaderCache(
+      absl::optional<gpu::raster::GrShaderCache::ScopedCacheUse>& cache_use)
+      const;
+
   gl::GLShareGroup* share_group() { return share_group_.get(); }
   gl::GLContext* context() { return context_.get(); }
   gl::GLContext* real_context() { return real_context_.get(); }
diff --git a/gpu/command_buffer/service/shared_image_interface_in_process.cc b/gpu/command_buffer/service/shared_image_interface_in_process.cc
index cc683de..805eb57f 100644
--- a/gpu/command_buffer/service/shared_image_interface_in_process.cc
+++ b/gpu/command_buffer/service/shared_image_interface_in_process.cc
@@ -14,12 +14,14 @@
 #include "gpu/command_buffer/service/command_buffer_task_executor.h"
 #include "gpu/command_buffer/service/display_compositor_memory_and_task_controller_on_gpu.h"
 #include "gpu/command_buffer/service/gpu_command_buffer_memory_tracker.h"
+#include "gpu/command_buffer/service/gr_shader_cache.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_factory.h"
 #include "gpu/command_buffer/service/single_task_sequence.h"
 #include "gpu/command_buffer/service/sync_point_manager.h"
 #include "gpu/config/gpu_driver_bug_workarounds.h"
 #include "gpu/config/gpu_feature_info.h"
 #include "gpu/config/gpu_preferences.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gl/gl_context.h"
 
 namespace gpu {
@@ -274,6 +276,11 @@
   if (!MakeContextCurrent())
     return;
 
+  // Creating a si with data can result in raster work. This will be a textureop
+  // that requires a program. See crbug.com/1442725.
+  absl::optional<gpu::raster::GrShaderCache::ScopedCacheUse> cache_use;
+  context_state_->UseShaderCache(cache_use);
+
   DCHECK(shared_image_factory_);
   if (!shared_image_factory_->CreateSharedImage(
           mailbox, format, size, color_space, surface_origin, alpha_type, usage,
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 24e4a50..f8b9aeb 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -65052,7 +65052,7 @@
         seconds: 120
       }
       build_numbers: YES
-      service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       task_template_canary_percentage {
         value: 5
       }
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
index 8174cdd..816c88b8 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -59,6 +59,7 @@
         "weetbix.enable_weetbix_exonerations": 100,
     },
     main_list_view = "try",
+    service_account = try_.DEFAULT_SERVICE_ACCOUNT,
     tryjob = try_.job(
         location_filters = [
             # Covers //fuchsia_web and //fuchsia changes, including
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/OWNERS b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/OWNERS
new file mode 100644
index 0000000..f0951e94
--- /dev/null
+++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/OWNERS
@@ -0,0 +1 @@
+vidhanj@google.com
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index a84a725..b82a1f7 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -188,6 +188,16 @@
   deps = [ "//base" ]
 }
 
+source_set("password_checkup_metrics") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "password_checkup_metrics.h",
+    "password_checkup_metrics.mm",
+  ]
+  public_deps = [ ":password_checkup_utils" ]
+  deps = [ "//base" ]
+}
+
 source_set("password_checkup_utils") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
diff --git a/ios/chrome/browser/passwords/password_checkup_metrics.h b/ios/chrome/browser/passwords/password_checkup_metrics.h
new file mode 100644
index 0000000..0c30cee
--- /dev/null
+++ b/ios/chrome/browser/passwords/password_checkup_metrics.h
@@ -0,0 +1,45 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CHECKUP_METRICS_H_
+#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CHECKUP_METRICS_H_
+
+#import "ios/chrome/browser/passwords/password_checkup_utils.h"
+
+namespace password_manager {
+
+// Logs the user action of changing an insecure password on its affiliated
+// website.
+void LogChangePasswordOnWebsite(WarningType context);
+
+// Logs the user action of editing an insecure password.
+void LogEditPassword(WarningType context);
+
+// Logs the user action of deleting an insecure password.
+void LogDeletePassword(WarningType context);
+
+// Logs the user action of revealing an insecure password.
+void LogRevealPassword(WarningType context);
+
+// Logs the user action of opening the list of password issues.
+void LogOpenPasswordIssuesList(WarningType context);
+
+// Logs the user action of muting a compromised credential warning.
+void LogMuteCompromisedWarning();
+
+// Logs the user action of unmuting a compromised credential warning.
+void LogUnmuteCompromisedWarning();
+
+// Logs the user action of starting a password check manually.
+void LogStartPasswordCheckManually();
+
+// Logs when a password check starts automatically.
+void LogStartPasswordCheckAutomatically();
+
+// Logs the user action of opening the password checkup home page.
+void LogOpenPasswordCheckupHomePage();
+
+}  // namespace password_manager
+
+#endif  // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CHECKUP_METRICS_H_
diff --git a/ios/chrome/browser/passwords/password_checkup_metrics.mm b/ios/chrome/browser/passwords/password_checkup_metrics.mm
new file mode 100644
index 0000000..935fe67
--- /dev/null
+++ b/ios/chrome/browser/passwords/password_checkup_metrics.mm
@@ -0,0 +1,135 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
+
+#import "base/metrics/histogram_functions.h"
+#import "base/notreached.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using password_manager::WarningType;
+
+namespace {
+
+const std::string kUserActionWithContextHistogram =
+    "PasswordManager.BulkCheck.UserAction.IOS";
+
+const char kGeneralUserActionHistogram[] =
+    "PasswordManager.BulkCheck.UserAction.IOS.General";
+
+// Enum representing the different types of interactions that a user can have
+// with Password Check on iOS for a specific type of insecure credential.
+//
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. It must be kept in sync with
+// PasswordCheckInteractionIOS in enums.xml.
+enum class PasswordCheckInteractionIOS {
+  kChangePasswordOnWebsite = 0,
+  kEditPassword = 1,
+  kRemovePassword = 2,
+  kShowPassword = 3,
+  kMuteWarning = 4,
+  kUnmuteWarning = 5,
+  kShowIssuesList = 6,
+  kMaxValue = kShowIssuesList,
+};
+
+// Enum representing the different types of interactions that a user can have
+// with Password Check on iOS not specific to a type of insecure credential.
+//
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. It must be kept in sync with
+// PasswordCheckInteractionIOSWithoutContext in enums.xml.
+enum class PasswordCheckInteractionIOSWithoutContext {
+  kAutomaticPasswordCheck = 0,
+  kManualPasswordCheck = 1,
+  kOpenCheckupHomepage = 2,
+  kMaxValue = kOpenCheckupHomepage,
+};
+
+// Gets the histogram name for the given context.
+std::string GetHistogramForContext(WarningType context) {
+  switch (context) {
+    case WarningType::kCompromisedPasswordsWarning:
+      return kUserActionWithContextHistogram + ".Compromised";
+    case WarningType::kReusedPasswordsWarning:
+      return kUserActionWithContextHistogram + ".Reused";
+    case WarningType::kWeakPasswordsWarning:
+      return kUserActionWithContextHistogram + ".Weak";
+    case WarningType::kDismissedWarningsWarning:
+      return kUserActionWithContextHistogram + ".MutedCompromised";
+    case WarningType::kNoInsecurePasswordsWarning:
+      NOTREACHED_NORETURN();
+  }
+}
+
+void LogPasswordCheckInteraction(PasswordCheckInteractionIOS interaction,
+                                 WarningType context) {
+  base::UmaHistogramEnumeration(kUserActionWithContextHistogram, interaction);
+  base::UmaHistogramEnumeration(GetHistogramForContext(context), interaction);
+}
+
+void LogGeneralPasswordCheckInteraction(
+    PasswordCheckInteractionIOSWithoutContext interaction) {
+  base::UmaHistogramEnumeration(kGeneralUserActionHistogram, interaction);
+}
+
+}  // namespace
+
+namespace password_manager {
+
+void LogChangePasswordOnWebsite(WarningType context) {
+  LogPasswordCheckInteraction(
+      PasswordCheckInteractionIOS::kChangePasswordOnWebsite, context);
+}
+
+void LogEditPassword(WarningType context) {
+  LogPasswordCheckInteraction(PasswordCheckInteractionIOS::kEditPassword,
+                              context);
+}
+
+void LogDeletePassword(WarningType context) {
+  LogPasswordCheckInteraction(PasswordCheckInteractionIOS::kRemovePassword,
+                              context);
+}
+
+void LogRevealPassword(WarningType context) {
+  LogPasswordCheckInteraction(PasswordCheckInteractionIOS::kShowPassword,
+                              context);
+}
+
+void LogOpenPasswordIssuesList(WarningType context) {
+  LogPasswordCheckInteraction(PasswordCheckInteractionIOS::kShowIssuesList,
+                              context);
+}
+
+void LogMuteCompromisedWarning() {
+  LogPasswordCheckInteraction(PasswordCheckInteractionIOS::kMuteWarning,
+                              WarningType::kCompromisedPasswordsWarning);
+}
+
+void LogUnmuteCompromisedWarning() {
+  LogPasswordCheckInteraction(PasswordCheckInteractionIOS::kUnmuteWarning,
+                              WarningType::kDismissedWarningsWarning);
+}
+
+void LogStartPasswordCheckManually() {
+  LogGeneralPasswordCheckInteraction(
+      PasswordCheckInteractionIOSWithoutContext::kManualPasswordCheck);
+}
+
+void LogStartPasswordCheckAutomatically() {
+  LogGeneralPasswordCheckInteraction(
+      PasswordCheckInteractionIOSWithoutContext::kAutomaticPasswordCheck);
+}
+
+void LogOpenPasswordCheckupHomePage() {
+  LogGeneralPasswordCheckInteraction(
+      PasswordCheckInteractionIOSWithoutContext::kOpenCheckupHomepage);
+}
+
+}  // namespace password_manager
diff --git a/ios/chrome/browser/passwords/password_checkup_utils_unittest.mm b/ios/chrome/browser/passwords/password_checkup_utils_unittest.mm
index aeb7f48..dfb8530 100644
--- a/ios/chrome/browser/passwords/password_checkup_utils_unittest.mm
+++ b/ios/chrome/browser/passwords/password_checkup_utils_unittest.mm
@@ -5,14 +5,17 @@
 #import "ios/chrome/browser/passwords/password_checkup_utils.h"
 
 #import "base/strings/string_piece.h"
+#import "base/test/bind.h"
 #import "base/test/scoped_feature_list.h"
 #import "components/keyed_service/core/service_access_type.h"
+#import "components/password_manager/core/browser/affiliation/fake_affiliation_service.h"
 #import "components/password_manager/core/browser/password_form.h"
 #import "components/password_manager/core/browser/password_manager_test_utils.h"
 #import "components/password_manager/core/browser/test_password_store.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/password_manager/core/common/password_manager_pref_names.h"
 #import "components/prefs/testing_pref_service.h"
+#import "ios/chrome/browser/passwords/ios_chrome_affiliation_service_factory.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager_factory.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
@@ -88,12 +91,20 @@
 class PasswordCheckupUtilsTest : public PlatformTest {
  protected:
   PasswordCheckupUtilsTest() {
+    feature_list_.InitAndEnableFeature(
+        password_manager::features::kPasswordsGrouping);
     TestChromeBrowserState::Builder builder;
     builder.AddTestingFactory(
         IOSChromePasswordStoreFactory::GetInstance(),
         base::BindRepeating(
             &password_manager::BuildPasswordStore<web::BrowserState,
                                                   TestPasswordStore>));
+    builder.AddTestingFactory(
+        IOSChromeAffiliationServiceFactory::GetInstance(),
+        base::BindRepeating(base::BindLambdaForTesting([](web::BrowserState*) {
+          return std::unique_ptr<KeyedService>(
+              std::make_unique<password_manager::FakeAffiliationService>());
+        })));
     browser_state_ = builder.Build();
     store_ =
         base::WrapRefCounted(static_cast<password_manager::TestPasswordStore*>(
@@ -111,6 +122,7 @@
   IOSChromePasswordCheckManager& manager() { return *manager_; }
 
  private:
+  base::test::ScopedFeatureList feature_list_;
   web::WebTaskEnvironment task_env_;
   std::unique_ptr<ChromeBrowserState> browser_state_;
   scoped_refptr<TestPasswordStore> store_;
diff --git a/ios/chrome/browser/settings/sync/utils/identity_error_util.mm b/ios/chrome/browser/settings/sync/utils/identity_error_util.mm
index a6b4187..63cf2e66 100644
--- a/ios/chrome/browser/settings/sync/utils/identity_error_util.mm
+++ b/ios/chrome/browser/settings/sync/utils/identity_error_util.mm
@@ -133,7 +133,7 @@
 SyncState GetSyncState(syncer::SyncService* sync_service) {
   syncer::SyncService::UserActionableError error_state =
       sync_service->GetUserActionableError();
-  if (sync_service->GetDisableReasons().Has(
+  if (sync_service->HasDisableReason(
           syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY)) {
     // Sync is disabled by administrator policy.
     return SyncState::kSyncDisabledByAdministrator;
diff --git a/ios/chrome/browser/sync/sync_setup_service.cc b/ios/chrome/browser/sync/sync_setup_service.cc
index 9a6c255e..1c43cba0 100644
--- a/ios/chrome/browser/sync/sync_setup_service.cc
+++ b/ios/chrome/browser/sync/sync_setup_service.cc
@@ -89,7 +89,7 @@
 }
 
 bool SyncSetupService::IsSyncRequested() const {
-  return !sync_service_->GetDisableReasons().Has(
+  return !sync_service_->HasDisableReason(
       syncer::SyncService::DISABLE_REASON_USER_CHOICE);
 }
 
diff --git a/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm b/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm
index 6571f49..7db765f2 100644
--- a/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm
+++ b/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm
@@ -44,6 +44,6 @@
 }
 
 bool IsSyncDisabledByPolicy(syncer::SyncService* sync_service) {
-  return sync_service->GetDisableReasons().Has(
+  return sync_service->HasDisableReason(
       syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
 }
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
index ef74e61c..15eeebf 100644
--- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
+++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
@@ -726,7 +726,7 @@
 // Returns YES if the user cannot turn on sync for enterprise policy reasons.
 - (BOOL)isSyncDisabledByAdministrator {
   DCHECK(self.syncService);
-  bool syncDisabledPolicy = self.syncService->GetDisableReasons().Has(
+  bool syncDisabledPolicy = self.syncService->HasDisableReason(
       syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
   bool syncTypesDisabledPolicy = IsManagedSyncDataType(
       self.syncService, syncer::UserSelectableType::kBookmarks);
diff --git a/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm b/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm
index 081905de..2bd13e9 100644
--- a/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm
+++ b/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm
@@ -61,7 +61,7 @@
       SyncServiceFactory::GetForBrowserState(browserState);
 
   BOOL shouldSkipSyncScreen =
-      syncService->GetDisableReasons().Has(
+      syncService->HasDisableReason(
           syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY) ||
       syncSetupService->IsFirstSetupComplete();
   if (shouldSkipSyncScreen) {
diff --git a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/OWNERS b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/OWNERS
new file mode 100644
index 0000000..f0951e94
--- /dev/null
+++ b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/OWNERS
@@ -0,0 +1 @@
+vidhanj@google.com
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/OWNERS b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/OWNERS
new file mode 100644
index 0000000..f0951e94
--- /dev/null
+++ b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/OWNERS
@@ -0,0 +1 @@
+vidhanj@google.com
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/OWNERS b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/OWNERS
new file mode 100644
index 0000000..f0951e94
--- /dev/null
+++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/OWNERS
@@ -0,0 +1 @@
+vidhanj@google.com
diff --git a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm
index 5d6d5f0..11e3272 100644
--- a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm
+++ b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm
@@ -400,8 +400,8 @@
 
 // Change the tableview's width constraint based on the screen's orientation.
 - (void)adjustTableViewWidthConstraint {
-  CGSize screenSize = [[UIScreen mainScreen] bounds].size;
-  BOOL isLandscape = screenSize.width > screenSize.height;
+  BOOL isLandscape =
+      UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation);
   _landscapeTableWidthConstraint.active = isLandscape;
   _portraitTableWidthConstraint.active = !isLandscape;
 }
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
index 394d6ba..02fb2b3b 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -666,7 +666,7 @@
 - (BOOL)isSyncDisabledByAdministrator {
   syncer::SyncService* syncService = SyncServiceFactory::GetForBrowserState(
       self.browser->GetBrowserState()->GetOriginalChromeBrowserState());
-  const bool syncDisabledPolicy = syncService->GetDisableReasons().Has(
+  const bool syncDisabledPolicy = syncService->HasDisableReason(
       syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
   const bool syncTypesDisabledPolicy = IsManagedSyncDataType(
       syncService, syncer::UserSelectableType::kReadingList);
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
index ed330851..23cabd9 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -279,7 +279,7 @@
 // Returns YES if the user cannot turn on sync for enterprise policy reasons.
 - (BOOL)isSyncDisabledByAdministrator {
   DCHECK(self.syncService);
-  if (self.syncService->GetDisableReasons().Has(
+  if (self.syncService->HasDisableReason(
           syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY)) {
     // Return YES if the SyncDisabled policy is enabled.
     return YES;
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
index 9fd4d13..64aa8043 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -887,7 +887,7 @@
 #pragma mark - Properties
 
 - (BOOL)isSyncDisabledByAdministrator {
-  return self.syncService->GetDisableReasons().Has(
+  return self.syncService->HasDisableReason(
       syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
 }
 
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn
index a5292025..1ff1076e 100644
--- a/ios/chrome/browser/ui/settings/password/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -13,9 +13,7 @@
   deps = [
     ":common",
     ":password_ui",
-    "//base",
     "//components/keyed_service/core",
-    "//components/password_manager/core/browser",
     "//components/password_manager/core/common:features",
     "//components/signin/public/identity_manager/objc",
     "//components/strings",
@@ -24,6 +22,7 @@
     "//ios/chrome/browser/favicon",
     "//ios/chrome/browser/net:crurl",
     "//ios/chrome/browser/passwords",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
     "//ios/chrome/browser/passwords:password_checkup_utils",
     "//ios/chrome/browser/passwords:save_passwords_consumer",
     "//ios/chrome/browser/shared/coordinator/alert",
@@ -97,6 +96,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/flags:system_flags",
     "//ios/chrome/browser/net:crurl",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/browser_state",
diff --git a/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn
index 8f20091..2adc1ad5 100644
--- a/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn
@@ -18,6 +18,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/net:crurl",
     "//ios/chrome/browser/passwords",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
     "//ios/chrome/browser/passwords:password_checkup_utils",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
     "//ios/chrome/browser/shared/model/browser",
@@ -52,6 +53,7 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/net:crurl",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
     "//ios/chrome/browser/passwords:password_checkup_utils",
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/ui/table_view/cells",
diff --git a/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_coordinator.mm
index d94b13f..d956642b 100644
--- a/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_coordinator.mm
@@ -7,6 +7,7 @@
 #import "ios/chrome/browser/net/crurl.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager_factory.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
@@ -64,6 +65,8 @@
 
 - (void)start {
   [super start];
+
+  password_manager::LogOpenPasswordCheckupHomePage();
   self.viewController = [[PasswordCheckupViewController alloc]
       initWithStyle:ChromeTableViewStyle()];
   self.viewController.handler = self;
@@ -94,6 +97,8 @@
 
 - (void)showPasswordIssuesWithWarningType:
     (password_manager::WarningType)warningType {
+  password_manager::LogOpenPasswordIssuesList(warningType);
+
   CHECK(!_passwordIssuesCoordinator);
   _passwordIssuesCoordinator = [[PasswordIssuesCoordinator alloc]
             initForWarningType:warningType
diff --git a/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_view_controller.mm
index cd10418..6d85949 100644
--- a/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_view_controller.mm
@@ -10,6 +10,7 @@
 #import "components/google/core/common/google_util.h"
 #import "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/net/crurl.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
 #import "ios/chrome/browser/passwords/password_checkup_utils.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h"
@@ -447,6 +448,7 @@
       break;
     case ItemTypeCheckPasswordsButton:
       if (_checkPasswordsButtonItem.isEnabled) {
+        password_manager::LogStartPasswordCheckManually();
         [self.delegate startPasswordCheck];
       }
       break;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
index 07aa4af0..67b590e 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
@@ -20,7 +20,6 @@
   ]
   deps = [
     ":password_details_ui",
-    "//base",
     "//components/autofill/core/common",
     "//components/password_manager/core/browser/form_parsing",
     "//components/password_manager/core/common:features",
@@ -29,6 +28,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/credential_provider_promo:features",
     "//ios/chrome/browser/passwords",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
     "//ios/chrome/browser/passwords:password_checkup_utils",
     "//ios/chrome/browser/shared/coordinator/alert",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
@@ -65,6 +65,8 @@
     "password_details_handler.h",
     "password_details_menu_item.h",
     "password_details_menu_item.mm",
+    "password_details_metrics_utils.h",
+    "password_details_metrics_utils.mm",
     "password_details_table_view_constants.h",
     "password_details_table_view_constants.mm",
     "password_details_table_view_controller+private.h",
@@ -82,6 +84,8 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/passwords",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
+    "//ios/chrome/browser/passwords:password_checkup_utils",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/ui/list_model:list_model",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
index 7913d581..a43d77d8 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
@@ -12,23 +12,23 @@
 #import "base/containers/cxx20_erase.h"
 #import "base/containers/flat_set.h"
 #import "base/memory/raw_ptr.h"
-#import "base/metrics/histogram_functions.h"
 #import "base/ranges/algorithm.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/password_manager/core/browser/password_form.h"
 #import "components/password_manager/core/browser/password_manager_features_util.h"
-#import "components/password_manager/core/browser/password_manager_metrics_util.h"
 #import "components/password_manager/core/browser/ui/credential_ui_entry.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/signin/public/identity_manager/account_info.h"
 #import "components/sync/base/features.h"
 #import "components/sync/driver/sync_service.h"
 #import "ios/chrome/browser/passwords/password_check_observer_bridge.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
 #import "ios/chrome/browser/passwords/password_checkup_utils.h"
 #import "ios/chrome/browser/ui/settings/password/account_storage_utils.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_consumer.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_mediator_delegate.h"
+#import "ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_delegate.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -205,11 +205,12 @@
 }
 
 - (void)removeCredential:(PasswordDetails*)password {
-  if (password.compromised) {
-    base::UmaHistogramEnumeration(
-        "PasswordManager.BulkCheck.UserAction",
-        password_manager::metrics_util::PasswordCheckInteraction::
-            kRemovePassword);
+  // When details was opened from the Password Manager, only log password
+  // check actions if the password is compromised.
+  if (password_manager::ShouldRecordPasswordCheckUserAction(
+          _context, password.compromised)) {
+    password_manager::LogDeletePassword(
+        password_manager::GetWarningTypeForDetailsContext(_context));
   }
 
   // Map from PasswordDetails to CredentialUIEntry. Should support blocklists.
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.h
new file mode 100644
index 0000000..bc52070b0
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.h
@@ -0,0 +1,29 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_DETAILS_PASSWORD_DETAILS_METRICS_UTILS_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_DETAILS_PASSWORD_DETAILS_METRICS_UTILS_H_
+
+#import "ios/chrome/browser/passwords/password_checkup_utils.h"
+#import "ios/chrome/browser/ui/settings/password/password_details/password_details.h"
+
+namespace password_manager {
+
+// Maps a DetailsContext to a WarningType for metrics
+// logging.
+WarningType GetWarningTypeForDetailsContext(DetailsContext details_context);
+
+// Whether Password Check User Actions in Password Details should be recorded.
+// `details_context` indicates if Password Details was opened from the Password
+// Manager, Password Check UI or other entry points. `is_password_compromised`
+// indicates if the credential upon which the user is acting is being displayed
+// as compromised. Actions should only be recorded for credentials displayed as
+// compromised and for credentials displayed in Password Details in one of the
+// contexts related to the Password Check UI.
+bool ShouldRecordPasswordCheckUserAction(DetailsContext details_context,
+                                         bool is_password_compromised);
+
+}  // namespace password_manager
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_DETAILS_PASSWORD_DETAILS_METRICS_UTILS_H_
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.mm
new file mode 100644
index 0000000..541ce2ff9
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.mm
@@ -0,0 +1,45 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace password_manager {
+
+WarningType GetWarningTypeForDetailsContext(DetailsContext details_context) {
+  switch (details_context) {
+      // Compromised issues are displayed as such both when navigating from the
+      // compromised UI in Password Checkup and from the Password Manager list.
+      // User actions in password details are only associated to other
+      // insecurity types (weak, reused, etc) when navigating from the
+      // corresponding Password Checkup UI.
+    case DetailsContext::kGeneral:
+    case DetailsContext::kCompromisedIssues:
+      return WarningType::kCompromisedPasswordsWarning;
+    case DetailsContext::kWeakIssues:
+      return WarningType::kWeakPasswordsWarning;
+    case DetailsContext::kReusedIssues:
+      return WarningType::kReusedPasswordsWarning;
+    case DetailsContext::kDismissedWarnings:
+      return WarningType::kDismissedWarningsWarning;
+  }
+}
+
+bool ShouldRecordPasswordCheckUserAction(DetailsContext details_context,
+                                         bool is_password_compromised) {
+  switch (details_context) {
+    case DetailsContext::kGeneral:
+      return is_password_compromised;
+    case DetailsContext::kCompromisedIssues:
+    case DetailsContext::kDismissedWarnings:
+    case DetailsContext::kReusedIssues:
+    case DetailsContext::kWeakIssues:
+      return true;
+  }
+}
+
+}  // namespace password_manager
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
index 54c10ce0..a1eb7b4 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
@@ -13,6 +13,7 @@
 #import "components/password_manager/core/common/password_manager_constants.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/sync/base/features.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
@@ -34,6 +35,7 @@
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_consumer.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_handler.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_menu_item.h"
+#import "ios/chrome/browser/ui/settings/password/password_details/password_details_metrics_utils.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_constants.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller+private.h"
 #import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_delegate.h"
@@ -50,16 +52,17 @@
 #error "This file requires ARC support."
 #endif
 
-namespace {
-
 using base::UmaHistogramEnumeration;
+using password_manager::GetWarningTypeForDetailsContext;
 using password_manager::constants::kMaxPasswordNoteLength;
+using password_manager::features::IsPasswordCheckupEnabled;
 using password_manager::metrics_util::LogPasswordNoteActionInSettings;
 using password_manager::metrics_util::LogPasswordSettingsReauthResult;
-using password_manager::metrics_util::PasswordCheckInteraction;
 using password_manager::metrics_util::PasswordNoteAction;
 using password_manager::metrics_util::ReauthResult;
 
+namespace {
+
 typedef NS_ENUM(NSInteger, SectionIdentifier) {
   SectionIdentifierPassword = kSectionIdentifierEnumZero,
   SectionIdentifierSite,
@@ -101,7 +104,7 @@
   switch (context) {
     case DetailsContext::kGeneral:
     case DetailsContext::kCompromisedIssues:
-      return password_manager::features::IsPasswordCheckupEnabled();
+      return IsPasswordCheckupEnabled();
     case DetailsContext::kDismissedWarnings:
     case DetailsContext::kReusedIssues:
     case DetailsContext::kWeakIssues:
@@ -111,7 +114,7 @@
 
 // Returns true if the "Restore Warning" button should be shown.
 bool ShouldAllowToRestoreWarning(DetailsContext context) {
-  return password_manager::features::IsPasswordCheckupEnabled() &&
+  return IsPasswordCheckupEnabled() &&
          context == DetailsContext::kDismissedWarnings;
 }
 
@@ -544,12 +547,17 @@
       if (!self.tableView.editing) {
         int passwordIndex = GetPasswordIndex(indexPath.section);
         DCHECK(self.applicationCommandsHandler);
-        DCHECK(self.passwords[passwordIndex].changePasswordURL.has_value());
+        PasswordDetails* passwordDetails = self.passwords[passwordIndex];
+        DCHECK(passwordDetails.changePasswordURL.has_value());
+
+        CHECK(password_manager::ShouldRecordPasswordCheckUserAction(
+            passwordDetails.context, passwordDetails.compromised));
+
+        password_manager::LogChangePasswordOnWebsite(
+            GetWarningTypeForDetailsContext(passwordDetails.context));
+
         OpenNewTabCommand* command = [OpenNewTabCommand
-            commandWithURLFromChrome:self.passwords[passwordIndex]
-                                         .changePasswordURL.value()];
-        UmaHistogramEnumeration("PasswordManager.BulkCheck.UserAction",
-                                PasswordCheckInteraction::kChangePassword);
+            commandWithURLFromChrome:passwordDetails.changePasswordURL.value()];
         [self.applicationCommandsHandler closeSettingsUIAndOpenURL:command];
       }
       break;
@@ -939,7 +947,7 @@
 // Reveals password to the user.
 - (void)showPasswordFor:(ReauthenticationReason)reason {
   switch (reason) {
-    case ReauthenticationReasonShow:
+    case ReauthenticationReasonShow: {
       self.passwordShown = YES;
       self.passwordDetailsInfoItems[_passwordIndexToReveal]
           .passwordTextItem.textFieldValue =
@@ -953,11 +961,18 @@
       [self reconfigureCellsForItems:@[
         self.passwordDetailsInfoItems[_passwordIndexToReveal].passwordTextItem
       ]];
-      if (self.passwords[_passwordIndexToReveal].compromised) {
-        UmaHistogramEnumeration("PasswordManager.BulkCheck.UserAction",
-                                PasswordCheckInteraction::kShowPassword);
+
+      PasswordDetails* passwordDetails = self.passwords[_passwordIndexToReveal];
+      DetailsContext detailsContext = passwordDetails.context;
+      // When details was opened from the Password Manager, only log password
+      // check actions if the password is compromised.
+      if (password_manager::ShouldRecordPasswordCheckUserAction(
+              detailsContext, passwordDetails.compromised)) {
+        password_manager::LogRevealPassword(
+            GetWarningTypeForDetailsContext(detailsContext));
       }
       break;
+    }
     case ReauthenticationReasonCopy: {
       NSString* copiedString =
           self.passwords[IsPasswordGroupingEnabled()
@@ -1472,12 +1487,18 @@
 - (void)didTapDismissWarningButtonAtPasswordIndex:(NSUInteger)passwordIndex {
   CHECK(passwordIndex >= 0 && passwordIndex < self.passwords.count);
   CHECK(self.delegate);
+
+  password_manager::LogMuteCompromisedWarning();
+
   [self.delegate dismissWarningForPassword:self.passwords[passwordIndex]];
 }
 
 - (void)didTapRestoreWarningButtonAtPasswordIndex:(NSUInteger)passwordIndex {
   CHECK(passwordIndex >= 0 && passwordIndex < self.passwords.count);
   CHECK(self.delegate);
+
+  password_manager::LogUnmuteCompromisedWarning();
+
   [self.delegate restoreWarningForCurrentPassword];
 }
 
@@ -1610,26 +1631,34 @@
 - (void)passwordEditingConfirmed {
   DCHECK(self.passwords.count == self.passwordDetailsInfoItems.count);
   for (NSUInteger i = 0; i < self.passwordDetailsInfoItems.count; i++) {
-    NSString* oldUsername = self.passwords[i].username;
-    NSString* oldPassword = self.passwords[i].password;
-    NSString* oldNote = self.passwords[i].note;
-    self.passwords[i].username =
-        self.passwordDetailsInfoItems[i].usernameTextItem.textFieldValue;
-    self.passwords[i].password =
-        self.passwordDetailsInfoItems[i].passwordTextItem.textFieldValue;
+    PasswordDetails* password = self.passwords[i];
+    NSString* oldUsername = password.username;
+    NSString* oldPassword = password.password;
+    NSString* oldNote = password.note;
+
+    PasswordDetailsInfoItem* passwordDetailsInfoItem =
+        self.passwordDetailsInfoItems[i];
+    password.username = passwordDetailsInfoItem.usernameTextItem.textFieldValue;
+    password.password = passwordDetailsInfoItem.passwordTextItem.textFieldValue;
     if (IsPasswordNotesWithBackupEnabled()) {
-      self.passwords[i].note =
-          self.passwordDetailsInfoItems[i].passwordNoteItem.text;
-      [self logChangeBetweenOldNote:oldNote currentNote:self.passwords[i].note];
+      password.note = passwordDetailsInfoItem.passwordNoteItem.text;
+      [self logChangeBetweenOldNote:oldNote currentNote:password.note];
     }
     [self.delegate passwordDetailsViewController:self
-                          didEditPasswordDetails:self.passwords[i]
+                          didEditPasswordDetails:password
                                  withOldUsername:oldUsername
                                      oldPassword:oldPassword
                                          oldNote:oldNote];
-    if (self.passwords[i].compromised) {
-      UmaHistogramEnumeration("PasswordManager.BulkCheck.UserAction",
-                              PasswordCheckInteraction::kEditPassword);
+
+    if (oldUsername != password.username || oldPassword != password.password) {
+      DetailsContext detailsContext = password.context;
+      // When details was opened from the Password Manager, only log password
+      // check actions if the password is compromised.
+      if (password_manager::ShouldRecordPasswordCheckUserAction(
+              detailsContext, password.compromised)) {
+        password_manager::LogEditPassword(
+            GetWarningTypeForDetailsContext(detailsContext));
+      }
     }
   }
   [self.delegate didFinishEditingPasswordDetails];
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn
index 946a9b00..0daa30e 100644
--- a/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn
@@ -58,7 +58,10 @@
     "//components/password_manager/core/common:features",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/net:crurl",
+    "//ios/chrome/browser/passwords:password_checkup_metrics",
+    "//ios/chrome/browser/passwords:password_checkup_utils",
     "//ios/chrome/browser/shared/ui/table_view",
+    "//ios/chrome/browser/shared/ui/table_view:utils",
     "//ios/chrome/browser/shared/ui/table_view/cells",
     "//ios/chrome/browser/ui/settings:settings_root",
     "//ios/chrome/browser/ui/settings/password:password_constants",
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm
index e7be0e6..5ed2276 100644
--- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm
@@ -99,6 +99,7 @@
 
 - (void)start {
   [super start];
+
   ChromeBrowserState* browserState = self.browser->GetBrowserState();
   self.mediator = [[PasswordIssuesMediator alloc]
         initForWarningType:_warningType
@@ -112,7 +113,7 @@
 
   PasswordIssuesTableViewController* passwordIssuesTableViewController =
       [[PasswordIssuesTableViewController alloc]
-          initWithStyle:ChromeTableViewStyle()];
+          initWithWarningType:_warningType];
   passwordIssuesTableViewController.imageDataSource = self.mediator;
   self.viewController = passwordIssuesTableViewController;
 
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.h b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.h
index 91bf329..3a4c301 100644
--- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.h
@@ -11,10 +11,19 @@
 
 @protocol PasswordIssuesPresenter;
 
+namespace password_manager {
+enum class WarningType;
+}
+
 // Screen with a list of compromised credentials.
 @interface PasswordIssuesTableViewController
     : SettingsRootTableViewController <PasswordIssuesConsumer>
 
+- (instancetype)initWithWarningType:(password_manager::WarningType)warningType
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)initWithStyle:(UITableViewStyle*)style NS_UNAVAILABLE;
+
 @property(nonatomic, weak) id<PasswordIssuesPresenter> presenter;
 
 // Data source for favicon images.
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.mm
index 91698fe..ae57b7a 100644
--- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.mm
@@ -7,8 +7,11 @@
 #import <UIKit/UIKit.h>
 #import "base/mac/foundation_util.h"
 #import "components/password_manager/core/common/password_manager_features.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
+#import "ios/chrome/browser/passwords/password_checkup_utils.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_favicon_data_source.h"
+#import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h"
 #import "ios/chrome/browser/ui/settings/password/password_issues/password_issue_content_item.h"
 #import "ios/chrome/browser/ui/settings/password/password_issues/password_issues_consumer.h"
 #import "ios/chrome/browser/ui/settings/password/password_issues/password_issues_presenter.h"
@@ -22,6 +25,7 @@
 #error "This file requires ARC support."
 #endif
 
+using password_manager::WarningType;
 using password_manager::features::IsPasswordCheckupEnabled;
 
 namespace {
@@ -66,12 +70,24 @@
   // Text displayed in the button for presenting dismissed compromised
   // credential warnings. When nil, no button is displayed.
   NSString* _dismissedWarningsButtonText;
+  // Type of insecure credentials displayed in the page.
+  WarningType _warningType;
 }
 
 @end
 
 @implementation PasswordIssuesTableViewController
 
+- (instancetype)initWithWarningType:(WarningType)warningType {
+  self = [super initWithStyle:ChromeTableViewStyle()];
+
+  if (self) {
+    _warningType = warningType;
+  }
+
+  return self;
+}
+
 #pragma mark - UIViewController
 
 - (void)viewDidLoad {
@@ -257,10 +273,13 @@
       break;
     }
     case ItemTypeDismissedCredentialsButton:
+      password_manager::LogOpenPasswordIssuesList(
+          WarningType::kDismissedWarningsWarning);
       [self.presenter presentDismissedCompromisedCredentials];
       break;
 
     case ItemTypeChangePassword:
+      password_manager::LogChangePasswordOnWebsite(_warningType);
       CrURL* changePasswordURL =
           [self changePasswordURLForPasswordInSection:indexPath.section];
       [self.presenter dismissAndOpenURL:changePasswordURL];
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller_unittest.mm
index 43b177d6..cdbea6fc 100644
--- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller_unittest.mm
@@ -10,6 +10,7 @@
 #import "base/test/scoped_feature_list.h"
 #import "components/password_manager/core/browser/ui/credential_ui_entry.h"
 #import "components/password_manager/core/common/password_manager_features.h"
+#import "ios/chrome/browser/passwords/password_checkup_utils.h"
 #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h"
 #import "ios/chrome/browser/ui/settings/password/password_issues/password_issue.h"
@@ -96,7 +97,8 @@
   ChromeTableViewController* InstantiateController() override {
     PasswordIssuesTableViewController* controller =
         [[PasswordIssuesTableViewController alloc]
-            initWithStyle:UITableViewStylePlain];
+            initWithWarningType:password_manager::WarningType::
+                                    kCompromisedPasswordsWarning];
     controller.presenter = presenter_;
     return controller;
   }
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
index cbed659..cba699d4 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
@@ -34,6 +34,7 @@
 #import "components/sync/driver/sync_user_settings.h"
 #import "ios/chrome/browser/flags/system_flags.h"
 #import "ios/chrome/browser/net/crurl.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h"
@@ -1954,9 +1955,8 @@
     case ItemTypeCheckForProblemsButton:
       if (self.passwordCheckState != PasswordCheckStateRunning) {
         [self.delegate startPasswordCheck];
+        password_manager::LogStartPasswordCheckManually();
         self.shouldFocusAccessibilityOnPasswordCheckStatus = YES;
-        UmaHistogramEnumeration("PasswordManager.BulkCheck.UserAction",
-                                PasswordCheckInteraction::kManualPasswordCheck);
       }
       break;
     case ItemTypeAddPasswordButton: {
diff --git a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
index 1a94d683..fdc72cf 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
@@ -4,11 +4,9 @@
 
 #import "ios/chrome/browser/ui/settings/password/passwords_coordinator.h"
 
-#import "base/metrics/histogram_functions.h"
 #import "base/metrics/user_metrics.h"
 #import "base/metrics/user_metrics_action.h"
 #import "components/keyed_service/core/service_access_type.h"
-#import "components/password_manager/core/browser/password_manager_metrics_util.h"
 #import "components/password_manager/core/browser/ui/credential_ui_entry.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/strings/grit/components_strings.h"
@@ -16,6 +14,7 @@
 #import "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager_factory.h"
+#import "ios/chrome/browser/passwords/password_checkup_metrics.h"
 #import "ios/chrome/browser/passwords/password_checkup_utils.h"
 #import "ios/chrome/browser/shared/coordinator/alert/action_sheet_coordinator.h"
 #import "ios/chrome/browser/shared/coordinator/alert/alert_coordinator.h"
@@ -128,10 +127,8 @@
 
 - (void)checkSavedPasswords {
   [self.mediator startPasswordCheck];
-  base::UmaHistogramEnumeration(
-      "PasswordManager.BulkCheck.UserAction",
-      password_manager::metrics_util::PasswordCheckInteraction::
-          kAutomaticPasswordCheck);
+
+  password_manager::LogStartPasswordCheckAutomatically();
 }
 
 - (UIViewController*)viewController {
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
index 98e7e699..115b03f 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
@@ -528,6 +528,8 @@
   [self waitForAppToIdle];
 
   // Recheck "Saved Passwords" and "Autofill Data".
+  [ChromeEarlGrey
+      waitForSufficientlyVisibleElementWithMatcher:ClearSavedPasswordsButton()];
   [[EarlGrey selectElementWithMatcher:ClearSavedPasswordsButton()]
       performAction:grey_tap()];
   [[[EarlGrey
diff --git a/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
index ea705b4d..280b3eac 100644
--- a/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
+++ b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
@@ -8,13 +8,11 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.build.annotations.MainDex;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @JNINamespace("media")
-@MainDex
 class CodecProfileLevelList {
     private static final String TAG = "CodecProfileLevelList";
 
diff --git a/media/base/android/java/src/org/chromium/media/HdrMetadata.java b/media/base/android/java/src/org/chromium/media/HdrMetadata.java
index db9a766..921990c6 100644
--- a/media/base/android/java/src/org/chromium/media/HdrMetadata.java
+++ b/media/base/android/java/src/org/chromium/media/HdrMetadata.java
@@ -11,13 +11,11 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
 @JNINamespace("media")
-@MainDex
 class HdrMetadata {
     private static final int MAX_CHROMATICITY = 50000; // Defined in CTA-861.3.
 
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
index f3c5cb4..7cff0bf 100644
--- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
@@ -21,7 +21,6 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 import java.nio.ByteBuffer;
 import java.util.LinkedList;
@@ -31,7 +30,6 @@
  * A MediaCodec wrapper for adapting the API and catching exceptions.
  */
 @JNINamespace("media")
-@MainDex
 class MediaCodecBridge {
     private static final String TAG = "MediaCodecBridge";
 
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java
index 2e250c9d..464bd092 100644
--- a/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java
+++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java
@@ -12,12 +12,10 @@
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.media.MediaCodecUtil.CodecCreationInfo;
 import org.chromium.media.MediaCodecUtil.MimeTypes;
 
 @JNINamespace("media")
-@MainDex
 class MediaCodecBridgeBuilder {
     private static final String TAG = "MediaCodecBridge";
 
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
index 43d88c721..c892d0d 100644
--- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
+++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -21,7 +21,6 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.compat.ApiHelperForN;
-import org.chromium.build.annotations.MainDex;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -33,7 +32,6 @@
  * A collection of MediaCodec utility functions.
  */
 @JNINamespace("media")
-@MainDex
 class MediaCodecUtil {
     private static final String TAG = "MediaCodecUtil";
 
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
index 592fa163..969fa3cc 100644
--- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
@@ -14,7 +14,6 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.media.MediaDrmSessionManager.SessionId;
 import org.chromium.media.MediaDrmSessionManager.SessionInfo;
 
@@ -55,7 +54,6 @@
  * MediaCodecAudioDecoders or MediaCodecVideoDecoders.
  */
 @JNINamespace("media")
-@MainDex
 @SuppressLint("WrongConstant")
 public class MediaDrmBridge {
     private static final String TAG = "media";
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java
index 4137fe2..c297d051 100644
--- a/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java
@@ -8,14 +8,12 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Origin isolated media drm scope id storage. Isolated origin is guranteed by native
  * implementation. Thus no origin information is stored here.
  */
 @JNINamespace("media")
-@MainDex
 class MediaDrmStorageBridge {
     private static final long INVALID_NATIVE_MEDIA_DRM_STORAGE_BRIDGE = -1;
 
diff --git a/media/video/h266_nalu_parser.cc b/media/video/h266_nalu_parser.cc
index f7a66ba..b8b54403 100644
--- a/media/video/h266_nalu_parser.cc
+++ b/media/video/h266_nalu_parser.cc
@@ -5,11 +5,11 @@
 #include "media/video/h266_nalu_parser.h"
 
 #include <stddef.h>
+
 #include <algorithm>
 #include <cmath>
 #include <cstring>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "media/base/decrypt_config.h"
 #include "media/video/bit_reader_macros.h"
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/impl/CoreImpl.java b/mojo/public/java/system/src/org/chromium/mojo/system/impl/CoreImpl.java
index 00927b1..e0a843f 100644
--- a/mojo/public/java/system/src/org/chromium/mojo/system/impl/CoreImpl.java
+++ b/mojo/public/java/system/src/org/chromium/mojo/system/impl/CoreImpl.java
@@ -9,7 +9,6 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.mojo.system.Core;
 import org.chromium.mojo.system.DataPipe;
 import org.chromium.mojo.system.DataPipe.ConsumerHandle;
@@ -36,7 +35,6 @@
  * Implementation of {@link Core}.
  */
 @JNINamespace("mojo::android")
-@MainDex
 public class CoreImpl implements Core {
     /**
      * Discard flag for the |MojoReadData| operation.
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/impl/WatcherImpl.java b/mojo/public/java/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
index 73730c3..8236b8a8 100644
--- a/mojo/public/java/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
+++ b/mojo/public/java/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
@@ -7,14 +7,12 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.mojo.system.Core;
 import org.chromium.mojo.system.Handle;
 import org.chromium.mojo.system.MojoResult;
 import org.chromium.mojo.system.Watcher;
 
 @JNINamespace("mojo::android")
-@MainDex
 class WatcherImpl implements Watcher {
     private long mImplPtr = WatcherImplJni.get().createWatcher(WatcherImpl.this);
     private Callback mCallback;
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 6292c33..11a8449 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2023-05-07 12:54 UTC
+# Last updated: 2023-05-08 12:55 UTC
 PinsListTimestamp
-1683464055
+1683550507
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index f83ec16..b74bffc4 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2023-05-07 12:54 UTC
+// Last updated: 2023-05-08 12:55 UTC
 //
 {
   "pinsets": [
diff --git a/net/proxy_resolution/proxy_resolver_mac.cc b/net/proxy_resolution/proxy_resolver_mac.cc
index 00ff1ad..e2411226 100644
--- a/net/proxy_resolution/proxy_resolver_mac.cc
+++ b/net/proxy_resolution/proxy_resolver_mac.cc
@@ -31,6 +31,10 @@
 #include <CoreServices/CoreServices.h>
 #endif
 
+#if LEAK_SANITIZER
+#include <sanitizer/lsan_interface.h>
+#endif
+
 namespace net {
 
 class NetworkAnonymizationKey;
@@ -272,6 +276,11 @@
   base::ScopedCFTypeRef<CFRunLoopSourceRef> runloop_source(
       CFNetworkExecuteProxyAutoConfigurationURL(
           pac_url_ref.get(), query_url_ref.get(), ResultCallback, &context));
+#if LEAK_SANITIZER
+  // CFNetworkExecuteProxyAutoConfigurationURL leaks the returned
+  // CFRunLoopSourceRef. Filed as FB12170226.
+  __lsan_ignore_object(runloop_source.get());
+#endif
   if (!runloop_source)
     return ERR_FAILED;
 
diff --git a/net/test/spawned_test_server/remote_test_server.cc b/net/test/spawned_test_server/remote_test_server.cc
index ad78e29..e09649a2 100644
--- a/net/test/spawned_test_server/remote_test_server.cc
+++ b/net/test/spawned_test_server/remote_test_server.cc
@@ -85,7 +85,7 @@
   if (!config)
     LOG(FATAL) << "Failed to parse " << config_path.value();
 
-  std::string* result = config->FindStringKey("spawner_url_base");
+  std::string* result = config->GetDict().FindString("spawner_url_base");
   if (!result)
     LOG(FATAL) << "spawner_url_base is not specified in the config";
 
diff --git a/remoting/host/chromeos/features.cc b/remoting/host/chromeos/features.cc
index d4efe0f..fad6eb71 100644
--- a/remoting/host/chromeos/features.cc
+++ b/remoting/host/chromeos/features.cc
@@ -17,6 +17,6 @@
 
 BASE_FEATURE(kEnableFrameSinkDesktopCapturerInCrd,
              "EnableFrameSinkDesktopCapturerInCrd",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 }  // namespace remoting::features
diff --git a/services/audio/public/java/src/org/chromium/audio/AudioFeatureList.java b/services/audio/public/java/src/org/chromium/audio/AudioFeatureList.java
index 9e120dd..ee104b0 100644
--- a/services/audio/public/java/src/org/chromium/audio/AudioFeatureList.java
+++ b/services/audio/public/java/src/org/chromium/audio/AudioFeatureList.java
@@ -7,14 +7,12 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Audio Service Features.
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("features")
-@MainDex
 public class AudioFeatureList {
     public static final String BLOCK_MIDI_BY_DEFAULT = "BlockMidiByDefault";
 
diff --git a/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java b/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java
index 9cc5f50d..2d4033e 100644
--- a/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java
+++ b/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java
@@ -7,14 +7,12 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Provides an API for querying the status of Device Service Features.
  */
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList exists.
 @JNINamespace("features")
-@MainDex
 public class DeviceFeatureList {
     public static final String ASYNC_SENSOR_CALLS = "AsyncSensorCalls";
     public static final String GENERIC_SENSOR_EXTRA_CLASSES = "GenericSensorExtraClasses";
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 06d0634c..550b01b 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -143,6 +143,8 @@
     "shared_dictionary/shared_dictionary_manager.h",
     "shared_dictionary/shared_dictionary_manager_in_memory.cc",
     "shared_dictionary/shared_dictionary_manager_in_memory.h",
+    "shared_dictionary/shared_dictionary_on_disk.cc",
+    "shared_dictionary/shared_dictionary_on_disk.h",
     "shared_dictionary/shared_dictionary_storage.cc",
     "shared_dictionary/shared_dictionary_storage.h",
     "shared_dictionary/shared_dictionary_storage_in_memory.cc",
@@ -419,6 +421,7 @@
     "shared_dictionary/shared_dictionary_data_pipe_writer_unittest.cc",
     "shared_dictionary/shared_dictionary_disk_cache_unittest.cc",
     "shared_dictionary/shared_dictionary_manager_unittest.cc",
+    "shared_dictionary/shared_dictionary_on_disk_unittest.cc",
     "shared_dictionary/shared_dictionary_writer_in_memory_unittest.cc",
     "shared_dictionary/shared_dictionary_writer_on_disk_unittest.cc",
     "socket_data_pump_unittest.cc",
diff --git a/services/network/shared_dictionary/shared_dictionary_on_disk.cc b/services/network/shared_dictionary/shared_dictionary_on_disk.cc
new file mode 100644
index 0000000..dbfd71b
--- /dev/null
+++ b/services/network/shared_dictionary/shared_dictionary_on_disk.cc
@@ -0,0 +1,104 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/shared_dictionary/shared_dictionary_on_disk.h"
+
+#include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
+#include "services/network/shared_dictionary/shared_dictionary_disk_cache.h"
+
+namespace network {
+
+SharedDictionaryOnDisk::SharedDictionaryOnDisk(
+    size_t size,
+    const net::SHA256HashValue& hash,
+    const base::UnguessableToken& disk_cache_key_token,
+    SharedDictionaryDiskCache* disk_cahe)
+    : size_(size), hash_(hash) {
+  auto split_callback = base::SplitOnceCallback(base::BindOnce(
+      &SharedDictionaryOnDisk::OnEntry, weak_factory_.GetWeakPtr()));
+  disk_cache::EntryResult result = disk_cahe->OpenOrCreateEntry(
+      disk_cache_key_token.ToString(),
+      /*create=*/false, std::move(split_callback.first));
+  if (result.net_error() != net::ERR_IO_PENDING) {
+    std::move(split_callback.second).Run(std::move(result));
+  }
+}
+
+SharedDictionaryOnDisk::~SharedDictionaryOnDisk() = default;
+
+int SharedDictionaryOnDisk::ReadAll(base::OnceCallback<void(int)> callback) {
+  if (state_ == State::kDone) {
+    return net::OK;
+  }
+  if (state_ == State::kFailed) {
+    return net::ERR_FAILED;
+  }
+  readall_callbacks_.push_back(std::move(callback));
+  return net::ERR_IO_PENDING;
+}
+
+scoped_refptr<net::IOBuffer> SharedDictionaryOnDisk::data() const {
+  CHECK_EQ(State::kDone, state_);
+  return data_.get();
+}
+
+size_t SharedDictionaryOnDisk::size() const {
+  return size_;
+}
+
+const net::SHA256HashValue& SharedDictionaryOnDisk::hash() const {
+  return hash_;
+}
+
+void SharedDictionaryOnDisk::OnEntry(disk_cache::EntryResult result) {
+  if (result.net_error() != net::OK) {
+    SetState(State::kFailed);
+    return;
+  }
+  entry_.reset(result.ReleaseEntry());
+  // The dictionary binary is stored in the second stream of disk cache entry
+  // (index = 1).
+  if (static_cast<size_t>(entry_->GetDataSize(/*index=*/1)) != size_) {
+    SetState(State::kFailed);
+    return;
+  }
+  data_ = base::MakeRefCounted<net::IOBufferWithSize>(size_);
+
+  auto split_callback = base::SplitOnceCallback(base::BindOnce(
+      &SharedDictionaryOnDisk::OnDataRead, weak_factory_.GetWeakPtr()));
+
+  int rv = entry_->ReadData(/*index=*/1,
+                            /*offset=*/0, data_.get(), size_,
+                            std::move(split_callback.first));
+  if (rv != net::ERR_IO_PENDING) {
+    std::move(split_callback.second).Run(rv);
+  }
+}
+
+void SharedDictionaryOnDisk::OnDataRead(int result) {
+  entry_.reset();
+
+  if (result < 0 || (base::checked_cast<size_t>(result) != size_)) {
+    SetState(State::kFailed);
+    return;
+  }
+  SetState(State::kDone);
+}
+
+void SharedDictionaryOnDisk::SetState(State state) {
+  CHECK_NE(State::kLoading, state);
+  CHECK_EQ(State::kLoading, state_);
+  state_ = state;
+  auto readall_callbacks = std::move(readall_callbacks_);
+  for (auto& readall_callback : readall_callbacks) {
+    if (state_ == State::kDone) {
+      std::move(readall_callback).Run(net::OK);
+    } else if (state_ == State::kFailed) {
+      std::move(readall_callback).Run(net::ERR_FAILED);
+    }
+  }
+}
+
+}  // namespace network
diff --git a/services/network/shared_dictionary/shared_dictionary_on_disk.h b/services/network/shared_dictionary/shared_dictionary_on_disk.h
new file mode 100644
index 0000000..555b678
--- /dev/null
+++ b/services/network/shared_dictionary/shared_dictionary_on_disk.h
@@ -0,0 +1,64 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_SHARED_DICTIONARY_SHARED_DICTIONARY_ON_DISK_H_
+#define SERVICES_NETWORK_SHARED_DICTIONARY_SHARED_DICTIONARY_ON_DISK_H_
+
+#include "services/network/shared_dictionary/shared_dictionary.h"
+
+#include "base/component_export.h"
+#include "base/unguessable_token.h"
+#include "net/base/hash_value.h"
+#include "net/disk_cache/disk_cache.h"
+
+namespace net {
+class IOBufferWithSize;
+}  // namespace net
+
+namespace network {
+
+class SharedDictionaryDiskCache;
+
+// A SharedDictionary that can be retrieved from the SharedDictionaryDiskCache.
+// This class starts loading the disk cache entry in the constructor. So
+// ReadAll() may synchronously return OK if the data has been loaded into memory
+// when the method is called.
+class COMPONENT_EXPORT(NETWORK_SERVICE) SharedDictionaryOnDisk
+    : public SharedDictionary {
+ public:
+  SharedDictionaryOnDisk(size_t size,
+                         const net::SHA256HashValue& hash,
+                         const base::UnguessableToken& disk_cache_key_token,
+                         SharedDictionaryDiskCache* disk_cahe);
+
+  ~SharedDictionaryOnDisk() override;
+
+  // SharedDictionary
+  int ReadAll(base::OnceCallback<void(int)> callback) override;
+  scoped_refptr<net::IOBuffer> data() const override;
+  size_t size() const override;
+  const net::SHA256HashValue& hash() const override;
+
+ private:
+  enum class State { kLoading, kDone, kFailed };
+
+  void OnEntry(disk_cache::EntryResult result);
+  void OnDataRead(int result);
+
+  void SetState(State state);
+
+  State state_ = State::kLoading;
+
+  const size_t size_;
+  const net::SHA256HashValue hash_;
+
+  std::vector<base::OnceCallback<void(int)>> readall_callbacks_;
+  disk_cache::ScopedEntryPtr entry_;
+  scoped_refptr<net::IOBufferWithSize> data_;
+  base::WeakPtrFactory<SharedDictionaryOnDisk> weak_factory_{this};
+};
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_SHARED_DICTIONARY_SHARED_DICTIONARY_ON_DISK_H_
diff --git a/services/network/shared_dictionary/shared_dictionary_on_disk_unittest.cc b/services/network/shared_dictionary/shared_dictionary_on_disk_unittest.cc
new file mode 100644
index 0000000..754814a
--- /dev/null
+++ b/services/network/shared_dictionary/shared_dictionary_on_disk_unittest.cc
@@ -0,0 +1,575 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/shared_dictionary/shared_dictionary_on_disk.h"
+
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/unguessable_token.h"
+#include "net/base/hash_value.h"
+#include "net/base/io_buffer.h"
+#include "net/disk_cache/mock/mock_backend_impl.h"
+#include "net/disk_cache/mock/mock_entry_impl.h"
+#include "services/network/shared_dictionary/shared_dictionary_disk_cache.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace network {
+namespace {
+
+const std::string kTestData = "hello world";
+
+class FakeSharedDictionaryDiskCache : public SharedDictionaryDiskCache {
+ public:
+  explicit FakeSharedDictionaryDiskCache() = default;
+  ~FakeSharedDictionaryDiskCache() override = default;
+  void Initialize() {
+    SharedDictionaryDiskCache::Initialize(base::FilePath(),
+#if BUILDFLAG(IS_ANDROID)
+                                          /*app_status_listener=*/nullptr,
+#endif  // BUILDFLAG(IS_ANDROID)
+                                          /*file_operations_factory=*/nullptr);
+  }
+  disk_cache::BackendMock* backend() { return mock_cache_ptr_; }
+
+ protected:
+  disk_cache::BackendResult CreateCacheBackend(
+      const base::FilePath& cache_directory_path,
+#if BUILDFLAG(IS_ANDROID)
+      base::android::ApplicationStatusListener* app_status_listener,
+#endif  // BUILDFLAG(IS_ANDROID)
+      scoped_refptr<disk_cache::BackendFileOperationsFactory>
+          file_operations_factory,
+      disk_cache::BackendResultCallback callback) override {
+    auto mock_cache =
+        std::make_unique<disk_cache::BackendMock>(net::CacheType::APP_CACHE);
+    mock_cache_ptr_ = mock_cache.get();
+    return disk_cache::BackendResult::Make(std::move(mock_cache));
+  }
+
+ private:
+  raw_ptr<disk_cache::BackendMock> mock_cache_ptr_;
+};
+
+TEST(SharedDictionaryOnDiskTest, AsyncOpenEntryAsyncReadData) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  disk_cache::EntryResultCallback open_entry_callback;
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        open_entry_callback = std::move(callback);
+        return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING);
+      });
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+  net::CompletionOnceCallback read_all_callback;
+  scoped_refptr<net::IOBuffer> buffer;
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        buffer = buf;
+        read_all_callback = std::move(callback);
+        return net::ERR_IO_PENDING;
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+  EXPECT_EQ(expected_size, dictionary->size());
+  EXPECT_EQ(hash, dictionary->hash());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::OK, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(open_entry_callback);
+  std::move(open_entry_callback)
+      .Run(disk_cache::EntryResult::MakeOpened(entry.release()));
+  ASSERT_TRUE(buffer);
+  ASSERT_TRUE(read_all_callback);
+  memcpy(buffer->data(), kTestData.c_str(), kTestData.size());
+  std::move(read_all_callback).Run(base::checked_cast<int>(expected_size));
+  EXPECT_TRUE(read_all_finished);
+  EXPECT_EQ(kTestData,
+            std::string(dictionary->data()->data(), dictionary->size()));
+
+  // ReadAll() synchronously returns OK now.
+  EXPECT_EQ(net::OK, dictionary->ReadAll(base::BindLambdaForTesting(
+                         [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, SyncOpenEntryAsyncReadData) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+  net::CompletionOnceCallback read_all_callback;
+  scoped_refptr<net::IOBuffer> buffer;
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        buffer = buf;
+        read_all_callback = std::move(callback);
+        return net::ERR_IO_PENDING;
+      });
+
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        return disk_cache::EntryResult::MakeOpened(entry.release());
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::OK, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(buffer);
+  ASSERT_TRUE(read_all_callback);
+  memcpy(buffer->data(), kTestData.c_str(), kTestData.size());
+  std::move(read_all_callback).Run(base::checked_cast<int>(expected_size));
+  EXPECT_TRUE(read_all_finished);
+  EXPECT_EQ(kTestData,
+            std::string(dictionary->data()->data(), dictionary->size()));
+
+  // ReadAll() synchronously returns OK now.
+  EXPECT_EQ(net::OK, dictionary->ReadAll(base::BindLambdaForTesting(
+                         [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, AsyncOpenEntrySyncReadData) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  disk_cache::EntryResultCallback open_entry_callback;
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        open_entry_callback = std::move(callback);
+        return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING);
+      });
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        memcpy(buf->data(), kTestData.c_str(), kTestData.size());
+        return base::checked_cast<int>(expected_size);
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::OK, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(open_entry_callback);
+  std::move(open_entry_callback)
+      .Run(disk_cache::EntryResult::MakeOpened(entry.release()));
+  EXPECT_TRUE(read_all_finished);
+  EXPECT_EQ(kTestData,
+            std::string(dictionary->data()->data(), dictionary->size()));
+
+  // ReadAll() synchronously returns OK now.
+  EXPECT_EQ(net::OK, dictionary->ReadAll(base::BindLambdaForTesting(
+                         [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, SyncOpenEntrySyncReadData) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        memcpy(buf->data(), kTestData.c_str(), kTestData.size());
+        return base::checked_cast<int>(expected_size);
+      });
+
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        return disk_cache::EntryResult::MakeOpened(entry.release());
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  // ReadAll() synchronously returns OK.
+  EXPECT_EQ(net::OK, dictionary->ReadAll(base::BindLambdaForTesting(
+                         [&](int rv) { ASSERT_TRUE(false); })));
+  EXPECT_EQ(kTestData,
+            std::string(dictionary->data()->data(), dictionary->size()));
+}
+
+TEST(SharedDictionaryOnDiskTest, AsyncOpenEntryFailure) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  disk_cache::EntryResultCallback open_entry_callback;
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        open_entry_callback = std::move(callback);
+        return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING);
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::ERR_FAILED, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(open_entry_callback);
+  std::move(open_entry_callback)
+      .Run(disk_cache::EntryResult::MakeError(net::ERR_FAILED));
+  EXPECT_TRUE(read_all_finished);
+
+  // ReadAll() synchronously returns ERR_FAILED now.
+  EXPECT_EQ(net::ERR_FAILED, dictionary->ReadAll(base::BindLambdaForTesting(
+                                 [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, SyncOpenEntryFailure) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        return disk_cache::EntryResult::MakeError(net::ERR_FAILED);
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  EXPECT_EQ(net::ERR_FAILED, dictionary->ReadAll(base::BindLambdaForTesting(
+                                 [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, AsyncOpenEntryAsyncReadDataFailure) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  disk_cache::EntryResultCallback open_entry_callback;
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        open_entry_callback = std::move(callback);
+        return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING);
+      });
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+  net::CompletionOnceCallback read_all_callback;
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        read_all_callback = std::move(callback);
+        return net::ERR_IO_PENDING;
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::ERR_FAILED, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(open_entry_callback);
+  std::move(open_entry_callback)
+      .Run(disk_cache::EntryResult::MakeOpened(entry.release()));
+  ASSERT_TRUE(read_all_callback);
+  std::move(read_all_callback).Run(net::ERR_FAILED);
+  EXPECT_TRUE(read_all_finished);
+
+  // ReadAll() synchronously returns ERR_FAILED now.
+  EXPECT_EQ(net::ERR_FAILED, dictionary->ReadAll(base::BindLambdaForTesting(
+                                 [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, AsyncOpenEntrySyncReadDataFailure) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  disk_cache::EntryResultCallback open_entry_callback;
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        open_entry_callback = std::move(callback);
+        return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING);
+      });
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        return net::ERR_FAILED;
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::ERR_FAILED, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(open_entry_callback);
+  std::move(open_entry_callback)
+      .Run(disk_cache::EntryResult::MakeOpened(entry.release()));
+  EXPECT_TRUE(read_all_finished);
+
+  // ReadAll() synchronously returns ERR_FAILED now.
+  EXPECT_EQ(net::ERR_FAILED, dictionary->ReadAll(base::BindLambdaForTesting(
+                                 [&](int rv) { ASSERT_TRUE(false); })));
+}
+TEST(SharedDictionaryOnDiskTest, SyncOpenEntryAsyncReadDataFailure) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+  net::CompletionOnceCallback read_all_callback;
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        read_all_callback = std::move(callback);
+        return net::ERR_IO_PENDING;
+      });
+
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        return disk_cache::EntryResult::MakeOpened(entry.release());
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::ERR_FAILED, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(read_all_callback);
+  std::move(read_all_callback).Run(net::ERR_FAILED);
+  EXPECT_TRUE(read_all_finished);
+
+  // ReadAll() synchronously returns ERR_FAILED now.
+  EXPECT_EQ(net::ERR_FAILED, dictionary->ReadAll(base::BindLambdaForTesting(
+                                 [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, SyncOpenEntrySyncReadDataFailure) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size;
+  });
+
+  EXPECT_CALL(*entry, ReadData)
+      .WillOnce([&](int index, int offset, net::IOBuffer* buf, int buf_len,
+                    net::CompletionOnceCallback callback) -> int {
+        EXPECT_EQ(1, index);
+        EXPECT_EQ(0, offset);
+        EXPECT_EQ(base::checked_cast<int>(expected_size), buf_len);
+        return net::ERR_FAILED;
+      });
+
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        return disk_cache::EntryResult::MakeOpened(entry.release());
+      });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  // ReadAll() synchronously returns ERR_FAILED.
+  EXPECT_EQ(net::ERR_FAILED, dictionary->ReadAll(base::BindLambdaForTesting(
+                                 [&](int rv) { ASSERT_TRUE(false); })));
+}
+
+TEST(SharedDictionaryOnDiskTest, UnexpectedDataSize) {
+  size_t expected_size = kTestData.size();
+  net::SHA256HashValue hash({{0x00, 0x01}});
+  base::UnguessableToken disk_cache_key_token =
+      base::UnguessableToken::Create();
+
+  auto disk_cache = std::make_unique<FakeSharedDictionaryDiskCache>();
+  disk_cache->Initialize();
+
+  disk_cache::EntryResultCallback open_entry_callback;
+  EXPECT_CALL(*disk_cache->backend(), OpenEntry)
+      .WillOnce([&](const std::string& key, net::RequestPriority priority,
+                    disk_cache::EntryResultCallback callback) {
+        open_entry_callback = std::move(callback);
+        return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING);
+      });
+
+  std::unique_ptr<disk_cache::EntryMock> entry =
+      std::make_unique<disk_cache::EntryMock>();
+
+  EXPECT_CALL(*entry, GetDataSize).WillOnce([&](int index) -> int32_t {
+    return expected_size + 1;  // Returns wrong size.
+  });
+
+  auto dictionary = std::make_unique<SharedDictionaryOnDisk>(
+      expected_size, hash, disk_cache_key_token, disk_cache.get());
+
+  bool read_all_finished = false;
+  EXPECT_EQ(net::ERR_IO_PENDING,
+            dictionary->ReadAll(base::BindLambdaForTesting([&](int rv) {
+              EXPECT_EQ(net::ERR_FAILED, rv);
+              read_all_finished = true;
+            })));
+
+  ASSERT_TRUE(open_entry_callback);
+  std::move(open_entry_callback)
+      .Run(disk_cache::EntryResult::MakeOpened(entry.release()));
+  EXPECT_TRUE(read_all_finished);
+}
+
+}  // namespace
+
+}  // namespace network
diff --git a/testing/buildbot/PRESUBMIT.py b/testing/buildbot/PRESUBMIT.py
index be24cc0..f2c1f27 100644
--- a/testing/buildbot/PRESUBMIT.py
+++ b/testing/buildbot/PRESUBMIT.py
@@ -56,6 +56,14 @@
 
 
 def CheckTests(input_api, output_api):
+  for f in input_api.AffectedFiles():
+    # If the only files changed here match //testing/buildbot/*.(pyl|json),
+    # then we can assume the unit tests are unaffected.
+    if (len(f.LocalPath().split(input_api.os_path.sep)) != 3
+        or not f.LocalPath().endswith(('.json', '.pyl'))):
+      break
+  else:
+    return []
   glob = input_api.os_path.join(input_api.PresubmitLocalPath(), '*test.py')
   tests = input_api.canned_checks.GetUnitTests(input_api,
                                                output_api,
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index f2bd1c8..fe543860 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5734,9 +5734,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5747,8 +5747,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -5899,9 +5899,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5912,8 +5912,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -6046,9 +6046,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6059,8 +6059,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 2f374f5..a26bef8 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -25539,9 +25539,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -25552,8 +25552,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -25704,9 +25704,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -25717,8 +25717,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -25851,9 +25851,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -25864,8 +25864,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index def565e..dfb231e 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -41594,9 +41594,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -41606,8 +41606,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -41759,9 +41759,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -41771,8 +41771,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -41906,9 +41906,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -41918,8 +41918,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -43383,9 +43383,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43395,8 +43395,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -43548,9 +43548,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43560,8 +43560,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -43695,9 +43695,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43707,8 +43707,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -44443,9 +44443,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44455,8 +44455,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 4590e50..896e317 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -9460,7 +9460,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -18116,12 +18116,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -18132,8 +18132,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -18301,12 +18301,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -18317,8 +18317,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
@@ -18463,12 +18463,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 115.0.5758.0",
+        "description": "Run with ash-chrome version 115.0.5759.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -18479,8 +18479,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v115.0.5758.0",
-              "revision": "version:115.0.5758.0"
+              "location": "lacros_version_skew_tests_v115.0.5759.0",
+              "revision": "version:115.0.5759.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 549ecf8..6a9f1b19 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2620,6 +2620,12 @@
       'Linux TSan Tests': {
         # These are slow on the TSan bots for some reason, crbug.com/1257927
         'swarming': {
+          'dimension_sets': [
+            {
+               # TODO(crbug.com/1412588): Move the remainder to Jammy.
+              'os': 'Ubuntu-22.04',
+            },
+          ],
           'shards': 32, # Adjusted for testing, see https://crbug.com/1179567
         },
       },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index adba743d..f0e58c2 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,16 +22,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5758.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5759.0/test_ash_chrome',
     ],
-    'description': 'Run with ash-chrome version 115.0.5758.0',
+    'description': 'Run with ash-chrome version 115.0.5759.0',
     'identifier': 'Lacros version skew testing ash canary',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v115.0.5758.0',
-          'revision': 'version:115.0.5758.0',
+          'location': 'lacros_version_skew_tests_v115.0.5759.0',
+          'revision': 'version:115.0.5759.0',
         },
       ],
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 2af418c3..1d34fd9 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3842,18 +3842,9 @@
             ],
             "experiments": [
                 {
-                    "name": "EnabledGroupOnlyBlueDotPromoEnabled2023_02_09",
+                    "name": "EnabledGroupAllDBPromosEnabled2023_05_08",
                     "params": {
-                        "user-group": "only-blue-dot-promo-enabled"
-                    },
-                    "enable_features": [
-                        "DefaultBrowserBlueDotPromo"
-                    ]
-                },
-                {
-                    "name": "ControlGroupAllDBPromosDisabled2023_02_09",
-                    "params": {
-                        "user-group": "all-db-promos-disabled"
+                        "user-group": "all-db-promos-enabled"
                     },
                     "enable_features": [
                         "DefaultBrowserBlueDotPromo"
@@ -4344,27 +4335,6 @@
             ]
         }
     ],
-    "DisableCanvasOverdrawOptimization": [
-        {
-            "platforms": [
-                "fuchsia",
-                "linux",
-                "mac",
-                "windows",
-                "chromeos",
-                "chromeos_lacros",
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "DisableCanvasOverdrawOptimization"
-                    ]
-                }
-            ]
-        }
-    ],
     "DisableGles2ForOopR": [
         {
             "platforms": [
@@ -4854,6 +4824,26 @@
             ]
         }
     ],
+    "EnableCrossSiteFlagNetworkIsolationKey": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "EnableCrossSiteFlagNetworkIsolationKey"
+                    ]
+                }
+            ]
+        }
+    ],
     "EnableEncryptedReportingClientForUpload": [
         {
             "platforms": [
@@ -4906,6 +4896,22 @@
             ]
         }
     ],
+    "EnableMSAAOnNewIntelGPUs": [
+        {
+            "platforms": [
+                "windows",
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "EnableMSAAOnNewIntelGPUs"
+                    ]
+                }
+            ]
+        }
+    ],
     "EnableOOPVDDisableVAAPILock": [
         {
             "platforms": [
@@ -8247,6 +8253,31 @@
             ]
         }
     ],
+    "MemoryCacheStrongReference": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "AllResourceTypesAllPages_20230426",
+                    "enable_features": [
+                        "MemoryCacheStrongReference"
+                    ],
+                    "disable_features": [
+                        "MemoryCacheStrongReferenceFilterImages",
+                        "MemoryCacheStrongReferenceFilterScripts",
+                        "MemoryCacheStrongReferenceSingleUnload"
+                    ]
+                }
+            ]
+        }
+    ],
     "MerchantWidePromotion": [
         {
             "platforms": [
@@ -10961,6 +10992,21 @@
             ]
         }
     ],
+    "ReduceToolbarUpdatesForSameDocNavigations": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ReduceToolbarUpdatesForSameDocNavigations"
+                    ]
+                }
+            ]
+        }
+    ],
     "ReduceUserAgentAndroidVersionDeviceModel": [
         {
             "platforms": [
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
index 852f7127..bb63c74 100644
--- a/third_party/android_deps/BUILD.gn
+++ b/third_party/android_deps/BUILD.gn
@@ -175,8 +175,6 @@
   jar_path = "libs/com_google_code_findbugs_jsr305/jsr305-3.0.2.jar"
   output_name = "com_google_code_findbugs_jsr305"
   supports_android = true
-
-  # Needed to break dependency cycle for errorprone_plugin_java.
   enable_bytecode_checks = false
 }
 
@@ -185,6 +183,7 @@
   jar_path = "libs/com_google_code_gson_gson/gson-2.9.0.jar"
   output_name = "com_google_code_gson_gson"
   supports_android = true
+  enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -192,6 +191,7 @@
   jar_path = "libs/com_google_dagger_dagger/dagger-2.30.jar"
   output_name = "com_google_dagger_dagger"
   supports_android = true
+  enable_bytecode_checks = false
   deps = [ ":javax_inject_javax_inject_java" ]
 }
 
@@ -228,11 +228,9 @@
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("com_google_errorprone_error_prone_annotations_java") {
-  jar_path = "libs/com_google_errorprone_error_prone_annotations/error_prone_annotations-2.14.0.jar"
+  jar_path = "libs/com_google_errorprone_error_prone_annotations/error_prone_annotations-2.18.0.jar"
   output_name = "com_google_errorprone_error_prone_annotations"
   supports_android = true
-
-  # Needed to break dependency cycle for errorprone_plugin_java.
   enable_bytecode_checks = false
 }
 
@@ -287,14 +285,12 @@
   jar_path = "libs/com_google_guava_failureaccess/failureaccess-1.0.1.jar"
   output_name = "com_google_guava_failureaccess"
   supports_android = true
-
-  # Needed to break dependency cycle for errorprone_plugin_java.
   enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("com_google_guava_guava_java") {
-  jar_path = "libs/com_google_guava_guava/guava-31.0.1-jre.jar"
+  jar_path = "libs/com_google_guava_guava/guava-31.1-jre.jar"
   output_name = "com_google_guava_guava"
   enable_bytecode_checks = false
   deps = [
@@ -317,8 +313,6 @@
   jar_path = "libs/com_google_guava_listenablefuture/listenablefuture-1.0.jar"
   output_name = "com_google_guava_listenablefuture"
   supports_android = true
-
-  # Needed to break dependency cycle for errorprone_plugin_java.
   enable_bytecode_checks = false
 }
 
@@ -328,8 +322,6 @@
       "libs/com_google_j2objc_j2objc_annotations/j2objc-annotations-1.3.jar"
   output_name = "com_google_j2objc_j2objc_annotations"
   supports_android = true
-
-  # Needed to break dependency cycle for errorprone_plugin_java.
   enable_bytecode_checks = false
 }
 
@@ -345,6 +337,7 @@
   jar_path = "libs/javax_annotation_jsr250_api/jsr250-api-1.0.jar"
   output_name = "javax_annotation_jsr250_api"
   supports_android = true
+  enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -352,6 +345,7 @@
   jar_path = "libs/javax_inject_javax_inject/javax.inject-1.jar"
   output_name = "javax_inject_javax_inject"
   supports_android = true
+  enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -359,6 +353,7 @@
   jar_path = "libs/org_checkerframework_checker_compat_qual/checker-compat-qual-2.5.5.jar"
   output_name = "org_checkerframework_checker_compat_qual"
   supports_android = true
+  enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -366,25 +361,22 @@
   jar_path = "libs/org_checkerframework_checker_qual/checker-qual-3.25.0.jar"
   output_name = "org_checkerframework_checker_qual"
   supports_android = true
-
-  # Needed to break dependency cycle for errorprone_plugin_java.
   enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("org_ow2_asm_asm_java") {
-  jar_path = "libs/org_ow2_asm_asm/asm-9.2.jar"
+  jar_path = "libs/org_ow2_asm_asm/asm-9.5.jar"
   output_name = "org_ow2_asm_asm"
   enable_bytecode_checks = false
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("org_ow2_asm_asm_commons_java") {
-  jar_path = "libs/org_ow2_asm_asm_commons/asm-commons-9.2.jar"
+  jar_path = "libs/org_ow2_asm_asm_commons/asm-commons-9.5.jar"
   output_name = "org_ow2_asm_asm_commons"
   enable_bytecode_checks = false
   deps = [
-    ":org_ow2_asm_asm_analysis_java",
     ":org_ow2_asm_asm_java",
     ":org_ow2_asm_asm_tree_java",
   ]
@@ -392,7 +384,7 @@
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("org_ow2_asm_asm_tree_java") {
-  jar_path = "libs/org_ow2_asm_asm_tree/asm-tree-9.2.jar"
+  jar_path = "libs/org_ow2_asm_asm_tree/asm-tree-9.5.jar"
   output_name = "org_ow2_asm_asm_tree"
   enable_bytecode_checks = false
   deps = [ ":org_ow2_asm_asm_java" ]
@@ -400,7 +392,7 @@
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("org_ow2_asm_asm_util_java") {
-  jar_path = "libs/org_ow2_asm_asm_util/asm-util-9.2.jar"
+  jar_path = "libs/org_ow2_asm_asm_util/asm-util-9.5.jar"
   output_name = "org_ow2_asm_asm_util"
   enable_bytecode_checks = false
   deps = [
@@ -459,7 +451,7 @@
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("com_google_auto_value_auto_value_annotations_java") {
-  jar_path = "libs/com_google_auto_value_auto_value_annotations/auto-value-annotations-1.9.jar"
+  jar_path = "libs/com_google_auto_value_auto_value_annotations/auto-value-annotations-1.10.1.jar"
   output_name = "com_google_auto_value_auto_value_annotations"
   enable_bytecode_checks = false
 
@@ -651,7 +643,7 @@
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("org_ow2_asm_asm_analysis_java") {
-  jar_path = "libs/org_ow2_asm_asm_analysis/asm-analysis-9.2.jar"
+  jar_path = "libs/org_ow2_asm_asm_analysis/asm-analysis-9.5.jar"
   output_name = "org_ow2_asm_asm_analysis"
   enable_bytecode_checks = false
 
@@ -684,6 +676,7 @@
     jar_path = "libs/android_arch_lifecycle_common/common-1.1.1.jar"
     output_name = "android_arch_lifecycle_common"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [ ":com_android_support_support_annotations_java" ]
   }
 
@@ -692,6 +685,7 @@
     jar_path = "libs/android_arch_lifecycle_common_java8/common-java8-1.1.1.jar"
     output_name = "android_arch_lifecycle_common_java8"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":android_arch_lifecycle_common_java",
       ":com_android_support_support_annotations_java",
@@ -702,6 +696,7 @@
   android_aar_prebuilt("android_arch_lifecycle_runtime_java") {
     aar_path = "libs/android_arch_lifecycle_runtime/runtime-1.1.1.aar"
     info_path = "libs/android_arch_lifecycle_runtime/android_arch_lifecycle_runtime.info"
+    enable_bytecode_checks = false
     deps = [
       ":android_arch_core_common_java",
       ":android_arch_lifecycle_common_java",
@@ -713,6 +708,7 @@
   android_aar_prebuilt("android_arch_lifecycle_viewmodel_java") {
     aar_path = "libs/android_arch_lifecycle_viewmodel/viewmodel-1.1.1.aar"
     info_path = "libs/android_arch_lifecycle_viewmodel/android_arch_lifecycle_viewmodel.info"
+    enable_bytecode_checks = false
     deps = [ ":com_android_support_support_annotations_java" ]
   }
 
@@ -720,6 +716,7 @@
   android_aar_prebuilt("com_android_support_asynclayoutinflater_java") {
     aar_path = "libs/com_android_support_asynclayoutinflater/asynclayoutinflater-28.0.0.aar"
     info_path = "libs/com_android_support_asynclayoutinflater/com_android_support_asynclayoutinflater.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_support_annotations_java",
       ":com_android_support_support_compat_java",
@@ -732,6 +729,7 @@
     jar_path = "libs/com_android_support_collections/collections-28.0.0.jar"
     output_name = "com_android_support_collections"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [ ":com_android_support_support_annotations_java" ]
   }
 
@@ -739,6 +737,7 @@
   android_aar_prebuilt("com_android_support_coordinatorlayout_java") {
     aar_path = "libs/com_android_support_coordinatorlayout/coordinatorlayout-28.0.0.aar"
     info_path = "libs/com_android_support_coordinatorlayout/com_android_support_coordinatorlayout.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_customview_java",
       ":com_android_support_support_annotations_java",
@@ -754,6 +753,7 @@
   android_aar_prebuilt("com_android_support_customview_java") {
     aar_path = "libs/com_android_support_customview/customview-28.0.0.aar"
     info_path = "libs/com_android_support_customview/com_android_support_customview.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_support_annotations_java",
       ":com_android_support_support_compat_java",
@@ -766,6 +766,7 @@
     aar_path = "libs/com_android_support_design/design-28.0.0.aar"
     info_path =
         "libs/com_android_support_design/com_android_support_design.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_appcompat_v7_java",
       ":com_android_support_cardview_v7_java",
@@ -784,6 +785,7 @@
   android_aar_prebuilt("com_android_support_drawerlayout_java") {
     aar_path = "libs/com_android_support_drawerlayout/drawerlayout-28.0.0.aar"
     info_path = "libs/com_android_support_drawerlayout/com_android_support_drawerlayout.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_customview_java",
       ":com_android_support_support_annotations_java",
@@ -796,6 +798,7 @@
   android_aar_prebuilt("com_android_support_interpolator_java") {
     aar_path = "libs/com_android_support_interpolator/interpolator-28.0.0.aar"
     info_path = "libs/com_android_support_interpolator/com_android_support_interpolator.info"
+    enable_bytecode_checks = false
     deps = [ ":com_android_support_support_annotations_java" ]
     resource_overlay = true
   }
@@ -804,6 +807,7 @@
   android_aar_prebuilt("com_android_support_localbroadcastmanager_java") {
     aar_path = "libs/com_android_support_localbroadcastmanager/localbroadcastmanager-28.0.0.aar"
     info_path = "libs/com_android_support_localbroadcastmanager/com_android_support_localbroadcastmanager.info"
+    enable_bytecode_checks = false
     deps = [ ":com_android_support_support_annotations_java" ]
     resource_overlay = true
   }
@@ -813,6 +817,7 @@
     aar_path = "libs/com_android_support_multidex/multidex-1.0.0.aar"
     info_path =
         "libs/com_android_support_multidex/com_android_support_multidex.info"
+    enable_bytecode_checks = false
     resource_overlay = true
   }
 
@@ -821,6 +826,7 @@
     jar_path = "libs/com_android_support_support_annotations/support-annotations-28.0.0.jar"
     output_name = "com_android_support_support_annotations"
     supports_android = true
+    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -828,6 +834,7 @@
     aar_path =
         "libs/com_android_support_support_compat/support-compat-28.0.0.aar"
     info_path = "libs/com_android_support_support_compat/com_android_support_support_compat.info"
+    enable_bytecode_checks = false
     deps = [
       ":android_arch_lifecycle_runtime_java",
       ":com_android_support_collections_java",
@@ -854,6 +861,7 @@
     aar_path =
         "libs/com_android_support_support_core_ui/support-core-ui-28.0.0.aar"
     info_path = "libs/com_android_support_support_core_ui/com_android_support_support_core_ui.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_asynclayoutinflater_java",
       ":com_android_support_coordinatorlayout_java",
@@ -875,6 +883,7 @@
   android_aar_prebuilt("com_android_support_support_core_utils_java") {
     aar_path = "libs/com_android_support_support_core_utils/support-core-utils-28.0.0.aar"
     info_path = "libs/com_android_support_support_core_utils/com_android_support_support_core_utils.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_documentfile_java",
       ":com_android_support_loader_java",
@@ -891,6 +900,7 @@
     aar_path =
         "libs/com_android_support_support_fragment/support-fragment-28.0.0.aar"
     info_path = "libs/com_android_support_support_fragment/com_android_support_support_fragment.info"
+    enable_bytecode_checks = false
     deps = [
       ":android_arch_lifecycle_viewmodel_java",
       ":com_android_support_loader_java",
@@ -906,6 +916,7 @@
   android_aar_prebuilt("com_android_support_support_v4_java") {
     aar_path = "libs/com_android_support_support_v4/support-v4-28.0.0.aar"
     info_path = "libs/com_android_support_support_v4/com_android_support_support_v4.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_support_compat_java",
       ":com_android_support_support_core_ui_java",
@@ -920,6 +931,7 @@
   android_aar_prebuilt("com_android_support_swiperefreshlayout_java") {
     aar_path = "libs/com_android_support_swiperefreshlayout/swiperefreshlayout-28.0.0.aar"
     info_path = "libs/com_android_support_swiperefreshlayout/com_android_support_swiperefreshlayout.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_interpolator_java",
       ":com_android_support_support_annotations_java",
@@ -933,6 +945,7 @@
     aar_path = "libs/com_android_support_viewpager/viewpager-28.0.0.aar"
     info_path =
         "libs/com_android_support_viewpager/com_android_support_viewpager.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_android_support_customview_java",
       ":com_android_support_support_annotations_java",
@@ -946,6 +959,7 @@
       "com_google_android_apps_common_testing_accessibility_framework_accessibility_test_framework_java") {
     aar_path = "libs/com_google_android_apps_common_testing_accessibility_framework_accessibility_test_framework/accessibility-test-framework-4.0.0.aar"
     info_path = "libs/com_google_android_apps_common_testing_accessibility_framework_accessibility_test_framework/com_google_android_accessibility_test_framework.info"
+    enable_bytecode_checks = false
     testonly = true
     deps = [
       ":com_google_errorprone_error_prone_annotations_java",
@@ -965,6 +979,7 @@
   android_aar_prebuilt("google_play_services_auth_java") {
     aar_path = "libs/com_google_android_gms_play_services_auth/play-services-auth-20.1.0.aar"
     info_path = "libs/com_google_android_gms_play_services_auth/com_google_android_gms_play_services_auth.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_auth_api_phone_java",
       ":google_play_services_auth_base_java",
@@ -980,6 +995,7 @@
   android_aar_prebuilt("google_play_services_auth_api_phone_java") {
     aar_path = "libs/com_google_android_gms_play_services_auth_api_phone/play-services-auth-api-phone-18.0.1.aar"
     info_path = "libs/com_google_android_gms_play_services_auth_api_phone/com_google_android_gms_play_services_auth_api_phone.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -991,6 +1007,7 @@
   android_aar_prebuilt("google_play_services_auth_base_java") {
     aar_path = "libs/com_google_android_gms_play_services_auth_base/play-services-auth-base-18.0.2.aar"
     info_path = "libs/com_google_android_gms_play_services_auth_base/com_google_android_gms_play_services_auth_base.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1003,6 +1020,7 @@
   android_aar_prebuilt("google_play_services_base_java") {
     aar_path = "libs/com_google_android_gms_play_services_base/play-services-base-18.0.1.aar"
     info_path = "libs/com_google_android_gms_play_services_base/com_google_android_gms_play_services_base.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_basement_java",
       ":google_play_services_tasks_java",
@@ -1018,6 +1036,7 @@
   android_aar_prebuilt("google_play_services_basement_java") {
     aar_path = "libs/com_google_android_gms_play_services_basement/play-services-basement-18.1.0.aar"
     info_path = "libs/com_google_android_gms_play_services_basement/com_google_android_gms_play_services_basement.info"
+    enable_bytecode_checks = false
     deps = [
       "//third_party/androidx:androidx_collection_collection_java",
       "//third_party/androidx:androidx_core_core_java",
@@ -1043,6 +1062,7 @@
   android_aar_prebuilt("google_play_services_cast_java") {
     aar_path = "libs/com_google_android_gms_play_services_cast/play-services-cast-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_cast/com_google_android_gms_play_services_cast.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1057,6 +1077,7 @@
   android_aar_prebuilt("google_play_services_cast_framework_java") {
     aar_path = "libs/com_google_android_gms_play_services_cast_framework/play-services-cast-framework-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_cast_framework/com_google_android_gms_play_services_cast_framework.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1075,6 +1096,7 @@
   android_aar_prebuilt("google_play_services_gcm_java") {
     aar_path = "libs/com_google_android_gms_play_services_gcm/play-services-gcm-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_gcm/com_google_android_gms_play_services_gcm.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1090,6 +1112,7 @@
   android_aar_prebuilt("google_play_services_iid_java") {
     aar_path = "libs/com_google_android_gms_play_services_iid/play-services-iid-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_iid/com_google_android_gms_play_services_iid.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1104,6 +1127,7 @@
   android_aar_prebuilt("google_play_services_instantapps_java") {
     aar_path = "libs/com_google_android_gms_play_services_instantapps/play-services-instantapps-18.0.1.aar"
     info_path = "libs/com_google_android_gms_play_services_instantapps/com_google_android_gms_play_services_instantapps.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1115,6 +1139,7 @@
   android_aar_prebuilt("google_play_services_location_java") {
     aar_path = "libs/com_google_android_gms_play_services_location/play-services-location-19.0.1.aar"
     info_path = "libs/com_google_android_gms_play_services_location/com_google_android_gms_play_services_location.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1127,6 +1152,7 @@
   android_aar_prebuilt("google_play_services_tasks_java") {
     aar_path = "libs/com_google_android_gms_play_services_tasks/play-services-tasks-18.0.2.aar"
     info_path = "libs/com_google_android_gms_play_services_tasks/com_google_android_gms_play_services_tasks.info"
+    enable_bytecode_checks = false
     deps = [ ":google_play_services_basement_java" ]
   }
 
@@ -1134,6 +1160,7 @@
   android_aar_prebuilt("google_play_services_vision_java") {
     aar_path = "libs/com_google_android_gms_play_services_vision/play-services-vision-20.1.3.aar"
     info_path = "libs/com_google_android_gms_play_services_vision/com_google_android_gms_play_services_vision.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1145,6 +1172,7 @@
   android_aar_prebuilt("google_play_services_vision_common_java") {
     aar_path = "libs/com_google_android_gms_play_services_vision_common/play-services-vision-common-19.1.3.aar"
     info_path = "libs/com_google_android_gms_play_services_vision_common/com_google_android_gms_play_services_vision_common.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_play_services_base_java",
       ":google_play_services_basement_java",
@@ -1159,6 +1187,7 @@
     aar_path =
         "libs/com_google_android_material_material/material-1.7.0-alpha02.aar"
     info_path = "libs/com_google_android_material_material/com_google_android_material_material.info"
+    enable_bytecode_checks = false
 
     # Target is swapped out when internal code is enabled.
     # Please depend on //third_party/android_deps:material_design_java instead.
@@ -1181,9 +1210,6 @@
       "//third_party/androidx:androidx_viewpager2_viewpager2_java",
     ]
 
-    # Needed until next material update, see crbug.com/1349521.
-    enable_bytecode_checks = false
-
     # Reduce binary size. https:crbug.com/954584
     ignore_proguard_configs = true
     proguard_configs = [ "material_design.flags" ]
@@ -1203,6 +1229,7 @@
   android_aar_prebuilt("com_google_android_play_feature_delivery_java") {
     aar_path = "libs/com_google_android_play_feature_delivery/feature-delivery-2.0.1.aar"
     info_path = "libs/com_google_android_play_feature_delivery/com_google_android_play_feature_delivery.info"
+    enable_bytecode_checks = false
     deps = [
       ":com_google_android_play_core_common_java",
       ":google_play_services_basement_java",
@@ -1214,6 +1241,7 @@
   android_aar_prebuilt("google_firebase_firebase_iid_java") {
     aar_path = "libs/com_google_firebase_firebase_iid/firebase-iid-21.0.1.aar"
     info_path = "libs/com_google_firebase_firebase_iid/com_google_firebase_firebase_iid.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_firebase_firebase_common_java",
       ":google_firebase_firebase_components_java",
@@ -1234,6 +1262,7 @@
   android_aar_prebuilt("google_firebase_firebase_messaging_java") {
     aar_path = "libs/com_google_firebase_firebase_messaging/firebase-messaging-21.0.1.aar"
     info_path = "libs/com_google_firebase_firebase_messaging/com_google_firebase_firebase_messaging.info"
+    enable_bytecode_checks = false
     deps = [
       ":google_android_datatransport_transport_api_java",
       ":google_firebase_firebase_common_java",
@@ -1251,10 +1280,6 @@
       "//third_party/androidx:androidx_collection_collection_java",
       "//third_party/androidx:androidx_core_core_java",
     ]
-
-    # We removed the datatransport dependency to reduce binary size.
-    # The library works without it as it's only used for logging.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -1262,6 +1287,7 @@
     jar_path = "libs/com_google_guava_guava_android/guava-31.1-android.jar"
     output_name = "com_google_guava_guava_android"
     supports_android = true
+    enable_bytecode_checks = false
 
     # Target is swapped out when internal code is enabled.
     # Please depend on //third_party/android_deps:guava_android_java instead.
@@ -1295,6 +1321,7 @@
     jar_path = "libs/com_google_protobuf_protobuf_javalite/protobuf-javalite-3.21.1.jar"
     output_name = "com_google_protobuf_protobuf_javalite"
     supports_android = true
+    enable_bytecode_checks = false
 
     # Target is swapped out when internal code is enabled.
     # Please depend on //third_party/android_deps:protobuf_lite_runtime_java instead.
@@ -1317,10 +1344,8 @@
         "libs/com_googlecode_java_diff_utils_diffutils/diffutils-1.3.0.jar"
     output_name = "com_googlecode_java_diff_utils_diffutils"
     supports_android = true
-    testonly = true
-
-    # Needed to break dependency cycle for errorprone_plugin_java.
     enable_bytecode_checks = false
+    testonly = true
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -1329,6 +1354,7 @@
         "libs/com_squareup_wire_wire_runtime_jvm/wire-runtime-jvm-4.5.1.jar"
     output_name = "com_squareup_wire_wire_runtime_jvm"
     supports_android = true
+    enable_bytecode_checks = false
     testonly = true
     deps = [
       ":com_squareup_okio_okio_jvm_java",
@@ -1342,6 +1368,7 @@
     jar_path = "libs/io_grpc_grpc_api/grpc-api-1.49.0.jar"
     output_name = "io_grpc_grpc_api"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":com_google_code_findbugs_jsr305_java",
       ":com_google_errorprone_error_prone_annotations_java",
@@ -1357,6 +1384,7 @@
   android_aar_prebuilt("io_grpc_grpc_binder_java") {
     aar_path = "libs/io_grpc_grpc_binder/grpc-binder-1.49.0.aar"
     info_path = "libs/io_grpc_grpc_binder/io_grpc_grpc_binder.info"
+    enable_bytecode_checks = false
     deps = [
       ":io_grpc_grpc_core_java",
       "//third_party/android_deps:guava_android_java",
@@ -1371,6 +1399,7 @@
     jar_path = "libs/io_grpc_grpc_context/grpc-context-1.49.0.jar"
     output_name = "io_grpc_grpc_context"
     supports_android = true
+    enable_bytecode_checks = false
 
     # https://crbug.com/1412551
     requires_android = true
@@ -1381,6 +1410,7 @@
     jar_path = "libs/io_grpc_grpc_protobuf_lite/grpc-protobuf-lite-1.49.0.jar"
     output_name = "io_grpc_grpc_protobuf_lite"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":com_google_code_findbugs_jsr305_java",
       ":io_grpc_grpc_api_java",
@@ -1397,6 +1427,7 @@
     jar_path = "libs/io_grpc_grpc_stub/grpc-stub-1.49.0.jar"
     output_name = "io_grpc_grpc_stub"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":com_google_errorprone_error_prone_annotations_java",
       ":io_grpc_grpc_api_java",
@@ -1412,6 +1443,7 @@
     jar_path = "libs/javax_annotation_javax_annotation_api/javax.annotation-api-1.3.2.jar"
     output_name = "javax_annotation_javax_annotation_api"
     supports_android = true
+    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -1419,6 +1451,7 @@
     jar_path = "libs/org_ccil_cowan_tagsoup_tagsoup/tagsoup-1.2.1.jar"
     output_name = "org_ccil_cowan_tagsoup_tagsoup"
     supports_android = true
+    enable_bytecode_checks = false
     testonly = true
   }
 
@@ -1427,6 +1460,7 @@
     jar_path = "libs/org_checkerframework_checker_util/checker-util-3.25.0.jar"
     output_name = "org_checkerframework_checker_util"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [ ":org_checkerframework_checker_qual_java" ]
   }
 
@@ -1435,8 +1469,6 @@
     jar_path = "libs/org_codehaus_mojo_animal_sniffer_annotations/animal-sniffer-annotations-1.21.jar"
     output_name = "org_codehaus_mojo_animal_sniffer_annotations"
     supports_android = true
-
-    # Needed to break dependency cycle for errorprone_plugin_java.
     enable_bytecode_checks = false
   }
 
@@ -1453,6 +1485,7 @@
     jar_path = "libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/kotlin-stdlib-jdk7-1.8.20.jar"
     output_name = "org_jetbrains_kotlin_kotlin_stdlib_jdk7"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [ "//third_party/kotlin_stdlib:kotlin_stdlib_java" ]
   }
 
@@ -1461,6 +1494,7 @@
     jar_path = "libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/kotlin-stdlib-jdk8-1.8.20.jar"
     output_name = "org_jetbrains_kotlin_kotlin_stdlib_jdk8"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":org_jetbrains_kotlin_kotlin_stdlib_jdk7_java",
       "//third_party/kotlin_stdlib:kotlin_stdlib_java",
@@ -1472,6 +1506,7 @@
     jar_path = "libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/kotlinx-coroutines-android-1.6.4.jar"
     output_name = "org_jetbrains_kotlinx_kotlinx_coroutines_android"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":org_jetbrains_kotlin_kotlin_stdlib_jdk8_java",
       ":org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_java",
@@ -1484,6 +1519,7 @@
     jar_path = "libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/kotlinx-coroutines-core-jvm-1.6.4.jar"
     output_name = "org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":org_jetbrains_kotlin_kotlin_stdlib_jdk8_java",
       "//third_party/kotlin_stdlib:kotlin_stdlib_java",
@@ -1495,6 +1531,7 @@
     jar_path = "libs/org_jetbrains_kotlinx_kotlinx_coroutines_guava/kotlinx-coroutines-guava-1.6.4.jar"
     output_name = "org_jetbrains_kotlinx_kotlinx_coroutines_guava"
     supports_android = true
+    enable_bytecode_checks = false
     deps = [
       ":org_jetbrains_kotlin_kotlin_stdlib_jdk8_java",
       ":org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_java",
@@ -1508,6 +1545,7 @@
     jar_path = "libs/org_jsoup_jsoup/jsoup-1.15.1.jar"
     output_name = "org_jsoup_jsoup"
     supports_android = true
+    enable_bytecode_checks = false
     testonly = true
   }
 
@@ -1516,6 +1554,7 @@
     jar_path = "libs/org_mockito_mockito_android/mockito-android-5.3.1.jar"
     output_name = "org_mockito_mockito_android"
     supports_android = true
+    enable_bytecode_checks = false
     testonly = true
     deps = [
       ":org_mockito_mockito_core_java",
@@ -1531,6 +1570,7 @@
     jar_path = "libs/org_mockito_mockito_core/mockito-core-5.3.1.jar"
     output_name = "org_mockito_mockito_core"
     supports_android = true
+    enable_bytecode_checks = false
     testonly = true
     deps = [
       ":net_bytebuddy_byte_buddy_agent_java",
@@ -1538,9 +1578,6 @@
       ":org_objenesis_objenesis_java",
     ]
 
-    # Can't find org.opentest4j.AssertionFailedError classes.
-    enable_bytecode_checks = false
-
     # Uses java.time which does not exist until API 26.
     # Modifications are added in third_party/mockito.
     jar_excluded_patterns = [
@@ -1554,20 +1591,22 @@
     jar_path = "libs/org_mockito_mockito_subclass/mockito-subclass-5.3.1.jar"
     output_name = "org_mockito_mockito_subclass"
     supports_android = true
+    enable_bytecode_checks = false
     testonly = true
     deps = [ ":org_mockito_mockito_core_java" ]
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_robolectric_java") {
-    jar_path = "libs/org_robolectric_robolectric/robolectric-4.8.1.jar"
+    jar_path = "libs/org_robolectric_robolectric/robolectric-4.10.2.jar"
     output_name = "org_robolectric_robolectric"
     enable_bytecode_checks = false
     testonly = true
     deps = [
       ":javax_annotation_javax_annotation_api_java",
       ":javax_inject_javax_inject_java",
-      ":org_bouncycastle_bcprov_jdk15on_java",
+      ":org_bouncycastle_bcprov_jdk18on_java",
+      ":org_conscrypt_conscrypt_openjdk_uber_java",
       ":org_robolectric_annotations_java",
       ":org_robolectric_junit_java",
       ":org_robolectric_pluginapi_java",
@@ -1585,7 +1624,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_shadows_playservices_java") {
-    jar_path = "libs/org_robolectric_shadows_playservices/shadows-playservices-4.8.1.jar"
+    jar_path = "libs/org_robolectric_shadows_playservices/shadows-playservices-4.10.2.jar"
     output_name = "org_robolectric_shadows_playservices"
     enable_bytecode_checks = false
     testonly = true
@@ -1598,7 +1637,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_utils_java") {
-    jar_path = "libs/org_robolectric_utils/utils-4.8.1.jar"
+    jar_path = "libs/org_robolectric_utils/utils-4.10.2.jar"
     output_name = "org_robolectric_utils"
     enable_bytecode_checks = false
     testonly = true
@@ -1618,6 +1657,7 @@
     jar_path = "libs/android_arch_core_common/common-1.1.1.jar"
     output_name = "android_arch_core_common"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1632,6 +1672,7 @@
   android_aar_prebuilt("android_arch_core_runtime_java") {
     aar_path = "libs/android_arch_core_runtime/runtime-1.1.1.aar"
     info_path = "libs/android_arch_core_runtime/android_arch_core_runtime.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1649,6 +1690,7 @@
   android_aar_prebuilt("android_arch_lifecycle_livedata_java") {
     aar_path = "libs/android_arch_lifecycle_livedata/livedata-1.1.1.aar"
     info_path = "libs/android_arch_lifecycle_livedata/android_arch_lifecycle_livedata.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1668,6 +1710,7 @@
     aar_path =
         "libs/android_arch_lifecycle_livedata_core/livedata-core-1.1.1.aar"
     info_path = "libs/android_arch_lifecycle_livedata_core/android_arch_lifecycle_livedata_core.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1686,6 +1729,7 @@
   android_aar_prebuilt("com_android_support_animated_vector_drawable_java") {
     aar_path = "libs/com_android_support_animated_vector_drawable/animated-vector-drawable-28.0.0.aar"
     info_path = "libs/com_android_support_animated_vector_drawable/com_android_support_animated_vector_drawable.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1704,6 +1748,7 @@
   android_aar_prebuilt("com_android_support_appcompat_v7_java") {
     aar_path = "libs/com_android_support_appcompat_v7/appcompat-v7-28.0.0.aar"
     info_path = "libs/com_android_support_appcompat_v7/com_android_support_appcompat_v7.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1728,6 +1773,7 @@
   android_aar_prebuilt("com_android_support_cardview_v7_java") {
     aar_path = "libs/com_android_support_cardview_v7/cardview-v7-28.0.0.aar"
     info_path = "libs/com_android_support_cardview_v7/com_android_support_cardview_v7.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1743,6 +1789,7 @@
   android_aar_prebuilt("com_android_support_cursoradapter_java") {
     aar_path = "libs/com_android_support_cursoradapter/cursoradapter-28.0.0.aar"
     info_path = "libs/com_android_support_cursoradapter/com_android_support_cursoradapter.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1758,6 +1805,7 @@
   android_aar_prebuilt("com_android_support_documentfile_java") {
     aar_path = "libs/com_android_support_documentfile/documentfile-28.0.0.aar"
     info_path = "libs/com_android_support_documentfile/com_android_support_documentfile.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1774,6 +1822,7 @@
     aar_path = "libs/com_android_support_loader/loader-28.0.0.aar"
     info_path =
         "libs/com_android_support_loader/com_android_support_loader.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1794,6 +1843,7 @@
   android_aar_prebuilt("com_android_support_print_java") {
     aar_path = "libs/com_android_support_print/print-28.0.0.aar"
     info_path = "libs/com_android_support_print/com_android_support_print.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1810,6 +1860,7 @@
     aar_path =
         "libs/com_android_support_recyclerview_v7/recyclerview-v7-28.0.0.aar"
     info_path = "libs/com_android_support_recyclerview_v7/com_android_support_recyclerview_v7.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1829,6 +1880,7 @@
   android_aar_prebuilt("com_android_support_slidingpanelayout_java") {
     aar_path = "libs/com_android_support_slidingpanelayout/slidingpanelayout-28.0.0.aar"
     info_path = "libs/com_android_support_slidingpanelayout/com_android_support_slidingpanelayout.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1848,6 +1900,7 @@
   android_aar_prebuilt("com_android_support_support_media_compat_java") {
     aar_path = "libs/com_android_support_support_media_compat/support-media-compat-28.0.0.aar"
     info_path = "libs/com_android_support_support_media_compat/com_android_support_support_media_compat.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1870,6 +1923,7 @@
   android_aar_prebuilt("com_android_support_support_vector_drawable_java") {
     aar_path = "libs/com_android_support_support_vector_drawable/support-vector-drawable-28.0.0.aar"
     info_path = "libs/com_android_support_support_vector_drawable/com_android_support_support_vector_drawable.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1888,6 +1942,7 @@
   android_aar_prebuilt("com_android_support_transition_java") {
     aar_path = "libs/com_android_support_transition/transition-28.0.0.aar"
     info_path = "libs/com_android_support_transition/com_android_support_transition.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1907,6 +1962,7 @@
   android_aar_prebuilt("com_android_support_versionedparcelable_java") {
     aar_path = "libs/com_android_support_versionedparcelable/versionedparcelable-28.0.0.aar"
     info_path = "libs/com_android_support_versionedparcelable/com_android_support_versionedparcelable.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1933,6 +1989,7 @@
     jar_path = "libs/com_google_android_annotations/annotations-4.1.1.4.jar"
     output_name = "com_google_android_annotations"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1946,6 +2003,7 @@
   android_aar_prebuilt("google_android_datatransport_transport_api_java") {
     aar_path = "libs/com_google_android_datatransport_transport_api/transport-api-2.2.1.aar"
     info_path = "libs/com_google_android_datatransport_transport_api/com_google_android_datatransport_transport_api.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1960,6 +2018,7 @@
   android_aar_prebuilt("google_play_services_clearcut_java") {
     aar_path = "libs/com_google_android_gms_play_services_clearcut/play-services-clearcut-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_clearcut/com_google_android_gms_play_services_clearcut.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1980,6 +2039,7 @@
   android_aar_prebuilt("google_play_services_cloud_messaging_java") {
     aar_path = "libs/com_google_android_gms_play_services_cloud_messaging/play-services-cloud-messaging-16.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_cloud_messaging/com_google_android_gms_play_services_cloud_messaging.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -1997,6 +2057,7 @@
   android_aar_prebuilt("google_play_services_flags_java") {
     aar_path = "libs/com_google_android_gms_play_services_flags/play-services-flags-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_flags/com_google_android_gms_play_services_flags.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2014,6 +2075,7 @@
   android_aar_prebuilt("google_play_services_phenotype_java") {
     aar_path = "libs/com_google_android_gms_play_services_phenotype/play-services-phenotype-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_phenotype/com_google_android_gms_play_services_phenotype.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2033,6 +2095,7 @@
   android_aar_prebuilt("google_play_services_places_placereport_java") {
     aar_path = "libs/com_google_android_gms_play_services_places_placereport/play-services-places-placereport-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_places_placereport/com_google_android_gms_play_services_places_placereport.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2047,6 +2110,7 @@
   android_aar_prebuilt("google_play_services_stats_java") {
     aar_path = "libs/com_google_android_gms_play_services_stats/play-services-stats-17.0.0.aar"
     info_path = "libs/com_google_android_gms_play_services_stats/com_google_android_gms_play_services_stats.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2064,6 +2128,7 @@
   android_aar_prebuilt("com_google_android_play_core_common_java") {
     aar_path = "libs/com_google_android_play_core_common/core-common-2.0.2.aar"
     info_path = "libs/com_google_android_play_core_common/com_google_android_play_core_common.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2078,6 +2143,7 @@
     jar_path = "libs/com_google_firebase_firebase_annotations/firebase-annotations-16.0.0.jar"
     output_name = "com_google_firebase_firebase_annotations"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2092,6 +2158,7 @@
     aar_path =
         "libs/com_google_firebase_firebase_common/firebase-common-19.5.0.aar"
     info_path = "libs/com_google_firebase_firebase_common/com_google_firebase_firebase_common.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2104,16 +2171,13 @@
       ":google_play_services_basement_java",
       ":google_play_services_tasks_java",
     ]
-
-    # Ignore missing kotlin.KotlinVersion definition in
-    # com.google.firebase.platforminfo.KotlinDetector.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   android_aar_prebuilt("google_firebase_firebase_components_java") {
     aar_path = "libs/com_google_firebase_firebase_components/firebase-components-16.1.0.aar"
     info_path = "libs/com_google_firebase_firebase_components/com_google_firebase_firebase_components.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2125,9 +2189,6 @@
       ":google_firebase_firebase_annotations_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
-
-    # Can't find com.google.firebase.components.Component$ComponentType.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -2135,6 +2196,7 @@
     jar_path = "libs/com_google_firebase_firebase_encoders/firebase-encoders-16.1.0.jar"
     output_name = "com_google_firebase_firebase_encoders"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2152,6 +2214,7 @@
   android_aar_prebuilt("google_firebase_firebase_encoders_json_java") {
     aar_path = "libs/com_google_firebase_firebase_encoders_json/firebase-encoders-json-17.1.0.aar"
     info_path = "libs/com_google_firebase_firebase_encoders_json/com_google_firebase_firebase_encoders_json.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2169,6 +2232,7 @@
   android_aar_prebuilt("google_firebase_firebase_iid_interop_java") {
     aar_path = "libs/com_google_firebase_firebase_iid_interop/firebase-iid-interop-17.0.0.aar"
     info_path = "libs/com_google_firebase_firebase_iid_interop/com_google_firebase_firebase_iid_interop.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2186,6 +2250,7 @@
   android_aar_prebuilt("google_firebase_firebase_installations_java") {
     aar_path = "libs/com_google_firebase_firebase_installations/firebase-installations-16.3.5.aar"
     info_path = "libs/com_google_firebase_firebase_installations/com_google_firebase_firebase_installations.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2199,15 +2264,13 @@
       ":google_firebase_firebase_installations_interop_java",
       ":google_play_services_tasks_java",
     ]
-
-    # Can't find com.google.auto.value.AutoValue$Builder.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   android_aar_prebuilt("google_firebase_firebase_installations_interop_java") {
     aar_path = "libs/com_google_firebase_firebase_installations_interop/firebase-installations-interop-16.0.1.aar"
     info_path = "libs/com_google_firebase_firebase_installations_interop/com_google_firebase_firebase_installations_interop.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2219,15 +2282,13 @@
       ":google_firebase_firebase_annotations_java",
       ":google_play_services_tasks_java",
     ]
-
-    # Can't find com.google.auto.value.AutoValue$Builder.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   android_aar_prebuilt("google_firebase_firebase_measurement_connector_java") {
     aar_path = "libs/com_google_firebase_firebase_measurement_connector/firebase-measurement-connector-18.0.0.aar"
     info_path = "libs/com_google_firebase_firebase_measurement_connector/com_google_firebase_firebase_measurement_connector.info"
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2243,6 +2304,7 @@
     jar_path = "libs/com_squareup_javawriter/javawriter-2.1.1.jar"
     output_name = "com_squareup_javawriter"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2258,6 +2320,7 @@
     jar_path = "libs/com_squareup_okio_okio_jvm/okio-jvm-3.0.0.jar"
     output_name = "com_squareup_okio_okio_jvm"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2277,6 +2340,7 @@
     jar_path = "libs/io_grpc_grpc_core/grpc-core-1.49.0.jar"
     output_name = "io_grpc_grpc_core"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2303,6 +2367,7 @@
     jar_path = "libs/io_perfmark_perfmark_api/perfmark-api-0.25.0.jar"
     output_name = "io_perfmark_perfmark_api"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2317,6 +2382,7 @@
     jar_path = "libs/net_bytebuddy_byte_buddy/byte-buddy-1.14.4.jar"
     output_name = "net_bytebuddy_byte_buddy"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2325,9 +2391,6 @@
       "//third_party/androidx:*",
     ]
     testonly = true
-
-    # Can't find com.sun.jna / dalvik.system classes.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -2335,6 +2398,7 @@
     jar_path = "libs/net_bytebuddy_byte_buddy_agent/byte-buddy-agent-1.14.4.jar"
     output_name = "net_bytebuddy_byte_buddy_agent"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2343,15 +2407,12 @@
       "//third_party/androidx:*",
     ]
     testonly = true
-
-    # Can't find com.sun.jna / dalvik.system classes.
-    enable_bytecode_checks = false
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-  java_prebuilt("org_bouncycastle_bcprov_jdk15on_java") {
-    jar_path = "libs/org_bouncycastle_bcprov_jdk15on/bcprov-jdk15on-1.68.jar"
-    output_name = "org_bouncycastle_bcprov_jdk15on"
+  java_prebuilt("org_bouncycastle_bcprov_jdk18on_java") {
+    jar_path = "libs/org_bouncycastle_bcprov_jdk18on/bcprov-jdk18on-1.72.jar"
+    output_name = "org_bouncycastle_bcprov_jdk18on"
     enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
@@ -2368,6 +2429,7 @@
     jar_path = "libs/org_hamcrest_hamcrest/hamcrest-2.2.jar"
     output_name = "org_hamcrest_hamcrest"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2383,6 +2445,7 @@
     jar_path = "libs/org_objenesis_objenesis/objenesis-3.3.jar"
     output_name = "org_objenesis_objenesis"
     supports_android = true
+    enable_bytecode_checks = false
 
     # To remove visibility constraint, add this dependency to
     # //third_party/android_deps/build.gradle.
@@ -2395,7 +2458,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_annotations_java") {
-    jar_path = "libs/org_robolectric_annotations/annotations-4.8.1.jar"
+    jar_path = "libs/org_robolectric_annotations/annotations-4.10.2.jar"
     output_name = "org_robolectric_annotations"
     enable_bytecode_checks = false
 
@@ -2411,7 +2474,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_junit_java") {
-    jar_path = "libs/org_robolectric_junit/junit-4.8.1.jar"
+    jar_path = "libs/org_robolectric_junit/junit-4.10.2.jar"
     output_name = "org_robolectric_junit"
     enable_bytecode_checks = false
 
@@ -2434,7 +2497,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_nativeruntime_java") {
-    jar_path = "libs/org_robolectric_nativeruntime/nativeruntime-4.8.1.jar"
+    jar_path = "libs/org_robolectric_nativeruntime/nativeruntime-4.10.2.jar"
     output_name = "org_robolectric_nativeruntime"
     enable_bytecode_checks = false
 
@@ -2447,14 +2510,32 @@
     testonly = true
     deps = [
       ":com_google_guava_guava_java",
+      ":org_robolectric_nativeruntime_dist_compat_java",
       ":org_robolectric_utils_java",
+      ":org_robolectric_utils_reflector_java",
     ]
     is_robolectric = true
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+  java_prebuilt("org_robolectric_nativeruntime_dist_compat_java") {
+    jar_path = "libs/org_robolectric_nativeruntime_dist_compat/nativeruntime-dist-compat-1.0.1.jar"
+    output_name = "org_robolectric_nativeruntime_dist_compat"
+    enable_bytecode_checks = false
+
+    # To remove visibility constraint, add this dependency to
+    # //third_party/android_deps/build.gradle.
+    visibility = [
+      ":*",
+      "//third_party/androidx:*",
+    ]
+    testonly = true
+    is_robolectric = true
+  }
+
+  # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_pluginapi_java") {
-    jar_path = "libs/org_robolectric_pluginapi/pluginapi-4.8.1.jar"
+    jar_path = "libs/org_robolectric_pluginapi/pluginapi-4.10.2.jar"
     output_name = "org_robolectric_pluginapi"
     enable_bytecode_checks = false
 
@@ -2474,7 +2555,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_plugins_maven_dependency_resolver_java") {
-    jar_path = "libs/org_robolectric_plugins_maven_dependency_resolver/plugins-maven-dependency-resolver-4.8.1.jar"
+    jar_path = "libs/org_robolectric_plugins_maven_dependency_resolver/plugins-maven-dependency-resolver-4.10.2.jar"
     output_name = "org_robolectric_plugins_maven_dependency_resolver"
     enable_bytecode_checks = false
 
@@ -2495,7 +2576,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_resources_java") {
-    jar_path = "libs/org_robolectric_resources/resources-4.8.1.jar"
+    jar_path = "libs/org_robolectric_resources/resources-4.10.2.jar"
     output_name = "org_robolectric_resources"
     enable_bytecode_checks = false
 
@@ -2517,7 +2598,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_sandbox_java") {
-    jar_path = "libs/org_robolectric_sandbox/sandbox-4.8.1.jar"
+    jar_path = "libs/org_robolectric_sandbox/sandbox-4.10.2.jar"
     output_name = "org_robolectric_sandbox"
     enable_bytecode_checks = false
 
@@ -2544,7 +2625,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_shadowapi_java") {
-    jar_path = "libs/org_robolectric_shadowapi/shadowapi-4.8.1.jar"
+    jar_path = "libs/org_robolectric_shadowapi/shadowapi-4.10.2.jar"
     output_name = "org_robolectric_shadowapi"
     enable_bytecode_checks = false
 
@@ -2565,7 +2646,7 @@
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_shadows_framework_java") {
     jar_path =
-        "libs/org_robolectric_shadows_framework/shadows-framework-4.8.1.jar"
+        "libs/org_robolectric_shadows_framework/shadows-framework-4.10.2.jar"
     output_name = "org_robolectric_shadows_framework"
     enable_bytecode_checks = false
 
@@ -2597,7 +2678,7 @@
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_robolectric_utils_reflector_java") {
-    jar_path = "libs/org_robolectric_utils_reflector/utils-reflector-4.8.1.jar"
+    jar_path = "libs/org_robolectric_utils_reflector/utils-reflector-4.10.2.jar"
     output_name = "org_robolectric_utils_reflector"
     enable_bytecode_checks = false
 
diff --git a/third_party/android_deps/additional_readme_paths.json b/third_party/android_deps/additional_readme_paths.json
index f919c80..e27daee 100644
--- a/third_party/android_deps/additional_readme_paths.json
+++ b/third_party/android_deps/additional_readme_paths.json
@@ -123,7 +123,7 @@
     "libs/net_bytebuddy_byte_buddy",
     "libs/net_bytebuddy_byte_buddy_agent",
     "libs/net_ltgt_gradle_incap_incap",
-    "libs/org_bouncycastle_bcprov_jdk15on",
+    "libs/org_bouncycastle_bcprov_jdk18on",
     "libs/org_ccil_cowan_tagsoup_tagsoup",
     "libs/org_checkerframework_checker_compat_qual",
     "libs/org_checkerframework_checker_qual",
@@ -153,6 +153,7 @@
     "libs/org_robolectric_annotations",
     "libs/org_robolectric_junit",
     "libs/org_robolectric_nativeruntime",
+    "libs/org_robolectric_nativeruntime_dist_compat",
     "libs/org_robolectric_pluginapi",
     "libs/org_robolectric_plugins_maven_dependency_resolver",
     "libs/org_robolectric_resources",
diff --git a/third_party/android_deps/build.gradle b/third_party/android_deps/build.gradle
index 6d41e45..1ba34c0e 100644
--- a/third_party/android_deps/build.gradle
+++ b/third_party/android_deps/build.gradle
@@ -192,7 +192,7 @@
     // Depended on by downstream guava_java rewrite.
     androidTestCompile "org.checkerframework:checker-qual:3.25.0"
 
-    String robolectricVersion = '4.8.1'
+    String robolectricVersion = '4.10.2'
     // Use testCompile to avoid having support_android = true set on
     // robolectric dependencies.
     testCompile "org.robolectric:robolectric:${robolectricVersion}"
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
index 2a97fae..17604b5 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
+++ b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
@@ -516,10 +516,6 @@
                 """.stripIndent(/* forceGroovyBehavior */ true))
             if (dependency.supportsAndroid) {
                 sb.append('  supports_android = true\n')
-            } else {
-                // Save some time by not validating classpaths of desktop .jars. Also required to break a dependency
-                // cycle for errorprone.
-                sb.append('  enable_bytecode_checks = false\n')
             }
         } else if (dependency.extension == 'aar') {
             sb.append("""\
@@ -532,7 +528,16 @@
                 java_group("${targetName}") {
             """.stripIndent(/* forceGroovyBehavior */ true))
         } else {
-            throw new IllegalStateException('Dependency type should be JAR or AAR')
+            throw new IllegalStateException('Dependency type should be JAR or AAR or group')
+        }
+
+        // Skip jdeps analysis of direct deps for third-party prebuilt targets. Many of these targets from maven are
+        // missing direct dependencies for its code, but this code is typically not called in practice and is removed
+        // by R8. Rely on R8's TraceReferences check to catch any actually missing dependencies. Although it would be
+        // helpful to have the full list of correct direct deps for these prebuilt targets, in practice it is too
+        // onerous to maintain for each third party maven prebuilt target.
+        if (dependency.extension == 'jar' || dependency.extension == 'aar') {
+            sb.append('  enable_bytecode_checks = false\n')
         }
 
         sb.append(generateBuildTargetVisibilityDeclaration(dependency))
@@ -692,9 +697,6 @@
             case 'androidx_privacysandbox_ads_ads_adservices':
                 sb.append('  alternative_android_sdk_dep = "//third_party/android_sdk:android_privacy_sandbox_sdk_java"\n')
                 break
-            case 'androidx_room_room_runtime':
-                sb.append('  enable_bytecode_checks = false\n')
-                break
             case 'androidx_transition_transition':
                 // Not specified in the POM, compileOnly dependency not supposed to be used unless
                 // the library is present: b/70887421
@@ -719,9 +721,6 @@
             case 'com_google_android_material_material':
                 sb.with {
                     append('\n')
-                    append('  # Needed until next material update, see crbug.com/1349521.\n')
-                    append('  enable_bytecode_checks = false\n')
-                    append('\n')
                     append('  # Reduce binary size. https:crbug.com/954584\n')
                     append('  ignore_proguard_configs = true\n')
                     append('  proguard_configs = ["material_design.flags"]\n')
@@ -800,18 +799,6 @@
                     append('  jar_excluded_patterns += ["*/ListenableFuture.class"]\n')
                 }
                 break
-            case 'com_google_code_findbugs_jsr305':
-            case 'com_google_errorprone_error_prone_annotations':
-            case 'com_google_guava_failureaccess':
-            case 'com_google_j2objc_j2objc_annotations':
-            case 'com_google_guava_listenablefuture':
-            case 'com_googlecode_java_diff_utils_diffutils':
-            case 'org_checkerframework_checker_qual':
-            case 'org_codehaus_mojo_animal_sniffer_annotations':
-                sb.append('\n')
-                sb.append('  # Needed to break dependency cycle for errorprone_plugin_java.\n')
-                sb.append('  enable_bytecode_checks = false\n')
-                break
             case 'androidx_test_rules':
                 // Target needs Android SDK deps which exist in third_party/android_sdk.
                 sb.append('''\
@@ -823,11 +810,6 @@
                 |
                 |'''.stripMargin())
                 break
-            case 'androidx_test_espresso_espresso_contrib':
-            case 'androidx_test_espresso_espresso_web':
-            case 'androidx_window_window':
-                sb.append('  enable_bytecode_checks = false\n')
-                break
             case 'net_sf_kxml_kxml2':
                 sb.append('  # Target needs to exclude *xmlpull* files as already included in Android SDK.\n')
                 sb.append('  jar_excluded_patterns = [ "*xmlpull*" ]\n')
@@ -870,21 +852,12 @@
                     append('  ]')
                 }
                 break
-            case 'androidx_slidingpanelayout_slidingpanelayout':
-            case 'androidx_window_window_java':
-                // Every target that has a dep on androidx_window_window will need these checks turned off.
-                sb.append('  enable_bytecode_checks = false\n')
-                break
             case 'androidx_credentials_credentials':
                 sb.append('\n')
                 // We are overriding 1.0.0-SNAPSHOT to 1.2.0-alpha03 which has different deps.
                 // TODO(1433052): remove after 1.2.0 becomes part of the normal release structure.
                 sb.append('  deps += [":androidx_core_core_java"]\n')
                 break
-            case 'androidx_asynclayoutinflater_asynclayoutinflater':
-                sb.append('\n')
-                sb.append('  # References AppCompatActivity using reflection, if exists.\n')
-                sb.append('  enable_bytecode_checks = false\n')
             case 'androidx_startup_startup_runtime':
                 sb.append('  # Keeps emoji2 code. See http://crbug.com/1205141\n')
                 sb.append('  ignore_proguard_configs = true\n')
@@ -895,32 +868,6 @@
                 sb.append('    "//third_party/android_deps:*"\n')
                 sb.append('  ]')
                 break
-            case 'com_android_tools_desugar_jdk_libs_configuration':
-                sb.append('  enable_bytecode_checks = false\n')
-                break
-            case 'com_google_firebase_firebase_common':
-                sb.append('\n')
-                sb.append('  # Ignore missing kotlin.KotlinVersion definition in\n')
-                sb.append('  # com.google.firebase.platforminfo.KotlinDetector.\n')
-                sb.append('  enable_bytecode_checks = false\n')
-                break
-            case 'com_google_firebase_firebase_components':
-                sb.append('\n')
-                sb.append('  # Can\'t find com.google.firebase.components.Component$ComponentType.\n')
-                sb.append('  enable_bytecode_checks = false\n')
-                break
-            case 'com_google_firebase_firebase_installations':
-            case 'com_google_firebase_firebase_installations_interop':
-                sb.append('\n')
-                sb.append('  # Can\'t find com.google.auto.value.AutoValue$Builder.\n')
-                sb.append('  enable_bytecode_checks = false\n')
-                break
-            case 'com_google_firebase_firebase_messaging':
-                sb.append('\n')
-                sb.append('  # We removed the datatransport dependency to reduce binary size.\n')
-                sb.append('  # The library works without it as it\'s only used for logging.\n')
-                sb.append('  enable_bytecode_checks = false\n')
-                break
             case 'com_android_tools_sdk_common':
             case 'com_android_tools_common':
             case 'com_android_tools_layoutlib_layoutlib_api':
@@ -930,11 +877,6 @@
                 sb.append('  # this for other purposes, change buildCompileNoDeps in build.gradle.\n')
                 sb.append('  visibility = [ "//build/android/unused_resources:*" ]\n')
                 break
-            case 'net_bytebuddy_byte_buddy_agent':
-            case 'net_bytebuddy_byte_buddy':
-                sb.append('  # Can\'t find com.sun.jna / dalvik.system classes.\n')
-                sb.append('  enable_bytecode_checks = false\n')
-                break
             case 'org_jetbrains_kotlinx_kotlinx_coroutines_android':
             case 'org_jetbrains_kotlinx_kotlinx_coroutines_guava':
                 sb.append('requires_android = true')
@@ -944,8 +886,6 @@
                 sb.append('  requires_android = true\n')
                 break
             case 'org_mockito_mockito_core':
-                sb.append('  # Can\'t find org.opentest4j.AssertionFailedError classes.\n')
-                sb.append('  enable_bytecode_checks = false\n')
                 sb.append('  # Uses java.time which does not exist until API 26.\n')
                 sb.append('  # Modifications are added in third_party/mockito.\n')
                 sb.append('  jar_excluded_patterns = [\n')
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
index 5532f45..debaeefd 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
+++ b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
@@ -116,6 +116,11 @@
             url: 'https://github.com/bcgit/bc-java',
             licensePath: 'licenses/Bouncy_Castle-2015.txt',
             licenseName: 'MIT'),
+        org_bouncycastle_bcprov_jdk18on: new PropertyOverride(
+            cpePrefix: 'cpe:/a:bouncycastle:legion-of-the-bouncy-castle:1.72',
+            url: 'https://github.com/bcgit/bc-java',
+            licensePath: 'licenses/Bouncy_Castle-2015.txt',
+            licenseName: 'MIT'),
         org_codehaus_mojo_animal_sniffer_annotations: new PropertyOverride(
             url: 'http://www.mojohaus.org/animal-sniffer/animal-sniffer-annotations/',
             description: 'Animal Sniffer Annotations allow marking methods which Animal Sniffer should ignore ' +
@@ -219,6 +224,9 @@
         org_robolectric_nativeruntime: new PropertyOverride(
             licensePath: 'licenses/Codehaus_License-2009.txt',
             licenseName: 'MIT'),
+        org_robolectric_nativeruntime_dist_compat: new PropertyOverride(
+            licensePath: 'licenses/Codehaus_License-2009.txt',
+            licenseName: 'MIT'),
         org_robolectric_pluginapi: new PropertyOverride(
             licensePath: 'licenses/Codehaus_License-2009.txt',
             licenseName: 'MIT'),
diff --git a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/README.chromium b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/README.chromium
index 8304de3..bf5fba4 100644
--- a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/README.chromium
+++ b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/README.chromium
@@ -1,7 +1,7 @@
 Name: AutoValue Annotations
 Short Name: auto-value-annotations
 URL: https://github.com/google/auto/tree/master/value
-Version: 1.9
+Version: 1.10.1
 License: Apache 2.0
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/cipd.yaml b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/cipd.yaml
index 31273ee8..f3fdc69 100644
--- a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/cipd.yaml
+++ b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@1.9.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@1.10.1.cr1
 package: chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations
 description: "AutoValue Annotations"
 data:
-- file: auto-value-annotations-1.9.jar
+- file: auto-value-annotations-1.10.1.jar
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/README.chromium b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/README.chromium
index a9b1129..2232ad23 100644
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/README.chromium
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/README.chromium
@@ -1,7 +1,7 @@
 Name: error-prone annotations
 Short Name: error_prone_annotations
 URL: https://errorprone.info/
-Version: 2.14.0
+Version: 2.18.0
 License: Apache 2.0
 License File: LICENSE
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/cipd.yaml b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/cipd.yaml
index 86f36a48..13a4c3cc 100644
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/cipd.yaml
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@2.14.0.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@2.18.0.cr1
 package: chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations
 description: "error-prone annotations"
 data:
-- file: error_prone_annotations-2.14.0.jar
+- file: error_prone_annotations-2.18.0.jar
diff --git a/third_party/android_deps/libs/com_google_guava_guava/README.chromium b/third_party/android_deps/libs/com_google_guava_guava/README.chromium
index a0277182..503a8a8 100644
--- a/third_party/android_deps/libs/com_google_guava_guava/README.chromium
+++ b/third_party/android_deps/libs/com_google_guava_guava/README.chromium
@@ -1,7 +1,7 @@
 Name: Guava: Google Core Libraries for Java
 Short Name: guava
 URL: https://github.com/google/guava
-Version: 31.0.1-jre
+Version: 31.1-jre
 License: Apache 2.0
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/com_google_guava_guava/cipd.yaml b/third_party/android_deps/libs/com_google_guava_guava/cipd.yaml
index 627f211..d261f90503 100644
--- a/third_party/android_deps/libs/com_google_guava_guava/cipd.yaml
+++ b/third_party/android_deps/libs/com_google_guava_guava/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@31.0.1-jre.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@31.1-jre.cr1
 package: chromium/third_party/android_deps/libs/com_google_guava_guava
 description: "Guava: Google Core Libraries for Java"
 data:
-- file: guava-31.0.1-jre.jar
+- file: guava-31.1-jre.jar
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/3pp.pb b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/3pp/3pp.pb
similarity index 100%
rename from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/3pp.pb
rename to third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/3pp/3pp.pb
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/fetch.py b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/3pp/fetch.py
similarity index 98%
rename from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/fetch.py
rename to third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/3pp/fetch.py
index 851dd64..7122ad6 100755
--- a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/3pp/fetch.py
@@ -14,7 +14,7 @@
 
 _REPO_URL = 'https://repo.maven.apache.org/maven2'
 _GROUP_NAME = 'org/bouncycastle'
-_MODULE_NAME = 'bcprov-jdk15on'
+_MODULE_NAME = 'bcprov-jdk18on'
 _FILE_EXT = 'jar'
 _OVERRIDE_LATEST = None
 _PATCH_VERSION = 'cr1'
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/LICENSE b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/LICENSE
similarity index 100%
rename from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/LICENSE
rename to third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/LICENSE
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/OWNERS b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/OWNERS
similarity index 100%
rename from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/OWNERS
rename to third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/OWNERS
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/README.chromium b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/README.chromium
similarity index 65%
rename from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/README.chromium
rename to third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/README.chromium
index f1436bd..22f08f4 100644
--- a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/README.chromium
+++ b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/README.chromium
@@ -1,14 +1,14 @@
 Name: Bouncy Castle Provider
-Short Name: bcprov-jdk15on
+Short Name: bcprov-jdk18on
 URL: https://github.com/bcgit/bc-java
-Version: 1.68
+Version: 1.72
 License: MIT
 License File: NOT_SHIPPED
-CPEPrefix: cpe:/a:bouncycastle:legion-of-the-bouncy-castle:1.68
+CPEPrefix: cpe:/a:bouncycastle:legion-of-the-bouncy-castle:1.72
 Security Critical: no
 
 Description:
-The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for JDK 1.5 and up.
+The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for JDK 1.8 and up.
 
 Local Modifications:
 No modifications.
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/cipd.yaml b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/cipd.yaml
similarity index 73%
rename from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/cipd.yaml
rename to third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/cipd.yaml
index 5b67e28..7051504 100644
--- a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/cipd.yaml
+++ b/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@1.68.cr1
-package: chromium/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on
+# cipd create --pkg-def cipd.yaml -tag version:2@1.72.cr1
+package: chromium/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk18on
 description: "Bouncy Castle Provider"
 data:
-- file: bcprov-jdk15on-1.68.jar
+- file: bcprov-jdk18on-1.72.jar
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm/README.chromium b/third_party/android_deps/libs/org_ow2_asm_asm/README.chromium
index 310f30e..8308fb7 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm/README.chromium
+++ b/third_party/android_deps/libs/org_ow2_asm_asm/README.chromium
@@ -1,7 +1,7 @@
 Name: asm
 Short Name: asm
 URL: http://asm.ow2.io/
-Version: 9.2
+Version: 9.5
 License: BSD
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm/cipd.yaml b/third_party/android_deps/libs/org_ow2_asm_asm/cipd.yaml
index b9032a5..b18eba0a 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm/cipd.yaml
+++ b/third_party/android_deps/libs/org_ow2_asm_asm/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@9.2.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@9.5.cr1
 package: chromium/third_party/android_deps/libs/org_ow2_asm_asm
 description: "asm"
 data:
-- file: asm-9.2.jar
+- file: asm-9.5.jar
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/README.chromium b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/README.chromium
index be91647..ca5d893 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/README.chromium
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/README.chromium
@@ -1,7 +1,7 @@
 Name: asm-analysis
 Short Name: asm-analysis
 URL: http://asm.ow2.io/
-Version: 9.2
+Version: 9.5
 License: BSD
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/cipd.yaml b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/cipd.yaml
index dd4400e..9d7d700 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/cipd.yaml
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@9.2.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@9.5.cr1
 package: chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis
 description: "asm-analysis"
 data:
-- file: asm-analysis-9.2.jar
+- file: asm-analysis-9.5.jar
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_commons/README.chromium b/third_party/android_deps/libs/org_ow2_asm_asm_commons/README.chromium
index 8ddeded..a65fb81 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_commons/README.chromium
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_commons/README.chromium
@@ -1,7 +1,7 @@
 Name: asm-commons
 Short Name: asm-commons
 URL: http://asm.ow2.io/
-Version: 9.2
+Version: 9.5
 License: BSD
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_commons/cipd.yaml b/third_party/android_deps/libs/org_ow2_asm_asm_commons/cipd.yaml
index 6c5a733..b6b19843 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_commons/cipd.yaml
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_commons/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@9.2.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@9.5.cr1
 package: chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons
 description: "asm-commons"
 data:
-- file: asm-commons-9.2.jar
+- file: asm-commons-9.5.jar
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_tree/README.chromium b/third_party/android_deps/libs/org_ow2_asm_asm_tree/README.chromium
index 68ff5fa..a5861c9 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_tree/README.chromium
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_tree/README.chromium
@@ -1,7 +1,7 @@
 Name: asm-tree
 Short Name: asm-tree
 URL: http://asm.ow2.io/
-Version: 9.2
+Version: 9.5
 License: BSD
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_tree/cipd.yaml b/third_party/android_deps/libs/org_ow2_asm_asm_tree/cipd.yaml
index 270b1485..0b1b14a 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_tree/cipd.yaml
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_tree/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@9.2.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@9.5.cr1
 package: chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree
 description: "asm-tree"
 data:
-- file: asm-tree-9.2.jar
+- file: asm-tree-9.5.jar
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_util/README.chromium b/third_party/android_deps/libs/org_ow2_asm_asm_util/README.chromium
index 5c8724252..4dd6e9a 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_util/README.chromium
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_util/README.chromium
@@ -1,7 +1,7 @@
 Name: asm-util
 Short Name: asm-util
 URL: http://asm.ow2.io/
-Version: 9.2
+Version: 9.5
 License: BSD
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_util/cipd.yaml b/third_party/android_deps/libs/org_ow2_asm_asm_util/cipd.yaml
index 23bff93..45a8b9f 100644
--- a/third_party/android_deps/libs/org_ow2_asm_asm_util/cipd.yaml
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_util/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@9.2.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@9.5.cr1
 package: chromium/third_party/android_deps/libs/org_ow2_asm_asm_util
 description: "asm-util"
 data:
-- file: asm-util-9.2.jar
+- file: asm-util-9.5.jar
diff --git a/third_party/android_deps/libs/org_robolectric_annotations/README.chromium b/third_party/android_deps/libs/org_robolectric_annotations/README.chromium
index aeca79a..66d856bc 100644
--- a/third_party/android_deps/libs/org_robolectric_annotations/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_annotations/README.chromium
@@ -1,7 +1,7 @@
 Name: annotations
 Short Name: annotations
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_annotations/cipd.yaml b/third_party/android_deps/libs/org_robolectric_annotations/cipd.yaml
index 88843ba..ce25556f 100644
--- a/third_party/android_deps/libs/org_robolectric_annotations/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_annotations/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_annotations
 description: "annotations"
 data:
-- file: annotations-4.8.1.jar
+- file: annotations-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_junit/README.chromium b/third_party/android_deps/libs/org_robolectric_junit/README.chromium
index 115d2a51..5383d2c5 100644
--- a/third_party/android_deps/libs/org_robolectric_junit/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_junit/README.chromium
@@ -1,7 +1,7 @@
 Name: junit
 Short Name: junit
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_junit/cipd.yaml b/third_party/android_deps/libs/org_robolectric_junit/cipd.yaml
index 8b40192..6738bb4 100644
--- a/third_party/android_deps/libs/org_robolectric_junit/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_junit/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_junit
 description: "junit"
 data:
-- file: junit-4.8.1.jar
+- file: junit-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_nativeruntime/README.chromium b/third_party/android_deps/libs/org_robolectric_nativeruntime/README.chromium
index b837dd9..b6993d5 100644
--- a/third_party/android_deps/libs/org_robolectric_nativeruntime/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime/README.chromium
@@ -1,7 +1,7 @@
 Name: nativeruntime
 Short Name: nativeruntime
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_nativeruntime/cipd.yaml b/third_party/android_deps/libs/org_robolectric_nativeruntime/cipd.yaml
index 9f40612f..0597591c 100644
--- a/third_party/android_deps/libs/org_robolectric_nativeruntime/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_nativeruntime
 description: "nativeruntime"
 data:
-- file: nativeruntime-4.8.1.jar
+- file: nativeruntime-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/3pp.pb b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/3pp/3pp.pb
similarity index 100%
copy from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/3pp.pb
copy to third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/3pp/3pp.pb
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/3pp/fetch.py
similarity index 96%
copy from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/fetch.py
copy to third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/3pp/fetch.py
index 851dd64..8ee89de 100755
--- a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/3pp/fetch.py
@@ -13,8 +13,8 @@
 import urllib.request
 
 _REPO_URL = 'https://repo.maven.apache.org/maven2'
-_GROUP_NAME = 'org/bouncycastle'
-_MODULE_NAME = 'bcprov-jdk15on'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'nativeruntime-dist-compat'
 _FILE_EXT = 'jar'
 _OVERRIDE_LATEST = None
 _PATCH_VERSION = 'cr1'
diff --git a/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/LICENSE b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/LICENSE
new file mode 100644
index 0000000..370fb55
--- /dev/null
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2009 codehaus.org.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/OWNERS b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/OWNERS
similarity index 100%
copy from third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on/OWNERS
copy to third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/OWNERS
diff --git a/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/README.chromium b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/README.chromium
new file mode 100644
index 0000000..64303b4
--- /dev/null
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/README.chromium
@@ -0,0 +1,14 @@
+Name: Robolectric Nativeruntime Distribution Compat
+Short Name: nativeruntime-dist-compat
+URL: https://source.android.com/
+Version: 1.0.1
+License: MIT
+License File: NOT_SHIPPED
+CPEPrefix: unknown
+Security Critical: no
+
+Description:
+Robolectric Nativeruntime Distribution Compat
+
+Local Modifications:
+No modifications.
diff --git a/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/cipd.yaml b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/cipd.yaml
new file mode 100644
index 0000000..317a129
--- /dev/null
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat/cipd.yaml
@@ -0,0 +1,10 @@
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# To create CIPD package run the following command.
+# cipd create --pkg-def cipd.yaml -tag version:2@1.0.1.cr1
+package: chromium/third_party/android_deps/libs/org_robolectric_nativeruntime_dist_compat
+description: "Robolectric Nativeruntime Distribution Compat"
+data:
+- file: nativeruntime-dist-compat-1.0.1.jar
diff --git a/third_party/android_deps/libs/org_robolectric_pluginapi/README.chromium b/third_party/android_deps/libs/org_robolectric_pluginapi/README.chromium
index 90ba001..0bbc55b 100644
--- a/third_party/android_deps/libs/org_robolectric_pluginapi/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_pluginapi/README.chromium
@@ -1,7 +1,7 @@
 Name: pluginapi
 Short Name: pluginapi
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_pluginapi/cipd.yaml b/third_party/android_deps/libs/org_robolectric_pluginapi/cipd.yaml
index d419f246..9114135 100644
--- a/third_party/android_deps/libs/org_robolectric_pluginapi/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_pluginapi/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_pluginapi
 description: "pluginapi"
 data:
-- file: pluginapi-4.8.1.jar
+- file: pluginapi-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/README.chromium b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/README.chromium
index 4f1a222..e45e7ce 100644
--- a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/README.chromium
@@ -1,7 +1,7 @@
 Name: maven-dependency-resolver
 Short Name: plugins-maven-dependency-resolver
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/cipd.yaml b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/cipd.yaml
index e40a239..ee530fd 100644
--- a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver
 description: "maven-dependency-resolver"
 data:
-- file: plugins-maven-dependency-resolver-4.8.1.jar
+- file: plugins-maven-dependency-resolver-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_resources/README.chromium b/third_party/android_deps/libs/org_robolectric_resources/README.chromium
index 8025291..6bec6e3 100644
--- a/third_party/android_deps/libs/org_robolectric_resources/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_resources/README.chromium
@@ -1,7 +1,7 @@
 Name: resources
 Short Name: resources
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_resources/cipd.yaml b/third_party/android_deps/libs/org_robolectric_resources/cipd.yaml
index 68c36ea..c47b98b7 100644
--- a/third_party/android_deps/libs/org_robolectric_resources/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_resources/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_resources
 description: "resources"
 data:
-- file: resources-4.8.1.jar
+- file: resources-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_robolectric/README.chromium b/third_party/android_deps/libs/org_robolectric_robolectric/README.chromium
index 20253ea..eedc4fd 100644
--- a/third_party/android_deps/libs/org_robolectric_robolectric/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_robolectric/README.chromium
@@ -1,7 +1,7 @@
 Name: robolectric
 Short Name: robolectric
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_robolectric/cipd.yaml b/third_party/android_deps/libs/org_robolectric_robolectric/cipd.yaml
index 6dfca55..28e4a91 100644
--- a/third_party/android_deps/libs/org_robolectric_robolectric/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_robolectric/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_robolectric
 description: "robolectric"
 data:
-- file: robolectric-4.8.1.jar
+- file: robolectric-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_sandbox/README.chromium b/third_party/android_deps/libs/org_robolectric_sandbox/README.chromium
index 6c2f61b6..530536e 100644
--- a/third_party/android_deps/libs/org_robolectric_sandbox/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_sandbox/README.chromium
@@ -1,7 +1,7 @@
 Name: sandbox
 Short Name: sandbox
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_sandbox/cipd.yaml b/third_party/android_deps/libs/org_robolectric_sandbox/cipd.yaml
index 26eeac1f..5367ed48 100644
--- a/third_party/android_deps/libs/org_robolectric_sandbox/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_sandbox/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_sandbox
 description: "sandbox"
 data:
-- file: sandbox-4.8.1.jar
+- file: sandbox-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_shadowapi/README.chromium b/third_party/android_deps/libs/org_robolectric_shadowapi/README.chromium
index e69c3899..46b8019b 100644
--- a/third_party/android_deps/libs/org_robolectric_shadowapi/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_shadowapi/README.chromium
@@ -1,7 +1,7 @@
 Name: shadowapi
 Short Name: shadowapi
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_shadowapi/cipd.yaml b/third_party/android_deps/libs/org_robolectric_shadowapi/cipd.yaml
index 7fdab9a..7f57d4dc 100644
--- a/third_party/android_deps/libs/org_robolectric_shadowapi/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_shadowapi/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_shadowapi
 description: "shadowapi"
 data:
-- file: shadowapi-4.8.1.jar
+- file: shadowapi-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_framework/README.chromium b/third_party/android_deps/libs/org_robolectric_shadows_framework/README.chromium
index b347f5da..dbaa7f3 100644
--- a/third_party/android_deps/libs/org_robolectric_shadows_framework/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_shadows_framework/README.chromium
@@ -1,7 +1,7 @@
 Name: framework
 Short Name: shadows-framework
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_framework/cipd.yaml b/third_party/android_deps/libs/org_robolectric_shadows_framework/cipd.yaml
index 4ee742b3..d079b83 100644
--- a/third_party/android_deps/libs/org_robolectric_shadows_framework/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_shadows_framework/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_shadows_framework
 description: "framework"
 data:
-- file: shadows-framework-4.8.1.jar
+- file: shadows-framework-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_playservices/README.chromium b/third_party/android_deps/libs/org_robolectric_shadows_playservices/README.chromium
index ced6929b..104928ed 100644
--- a/third_party/android_deps/libs/org_robolectric_shadows_playservices/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_shadows_playservices/README.chromium
@@ -1,7 +1,7 @@
 Name: playservices
 Short Name: shadows-playservices
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_playservices/cipd.yaml b/third_party/android_deps/libs/org_robolectric_shadows_playservices/cipd.yaml
index e551091..534d741c 100644
--- a/third_party/android_deps/libs/org_robolectric_shadows_playservices/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_shadows_playservices/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices
 description: "playservices"
 data:
-- file: shadows-playservices-4.8.1.jar
+- file: shadows-playservices-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_utils/README.chromium b/third_party/android_deps/libs/org_robolectric_utils/README.chromium
index c16cc5d3..d338434a 100644
--- a/third_party/android_deps/libs/org_robolectric_utils/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_utils/README.chromium
@@ -1,7 +1,7 @@
 Name: utils
 Short Name: utils
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_utils/cipd.yaml b/third_party/android_deps/libs/org_robolectric_utils/cipd.yaml
index 197ed29..e045e4ff 100644
--- a/third_party/android_deps/libs/org_robolectric_utils/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_utils/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_utils
 description: "utils"
 data:
-- file: utils-4.8.1.jar
+- file: utils-4.10.2.jar
diff --git a/third_party/android_deps/libs/org_robolectric_utils_reflector/README.chromium b/third_party/android_deps/libs/org_robolectric_utils_reflector/README.chromium
index 7d82f45..dc26c04 100644
--- a/third_party/android_deps/libs/org_robolectric_utils_reflector/README.chromium
+++ b/third_party/android_deps/libs/org_robolectric_utils_reflector/README.chromium
@@ -1,7 +1,7 @@
 Name: reflector
 Short Name: utils-reflector
 URL: http://robolectric.org
-Version: 4.8.1
+Version: 4.10.2
 License: MIT
 License File: NOT_SHIPPED
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_robolectric_utils_reflector/cipd.yaml b/third_party/android_deps/libs/org_robolectric_utils_reflector/cipd.yaml
index 79665d7e..0fe7028 100644
--- a/third_party/android_deps/libs/org_robolectric_utils_reflector/cipd.yaml
+++ b/third_party/android_deps/libs/org_robolectric_utils_reflector/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@4.8.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@4.10.2.cr1
 package: chromium/third_party/android_deps/libs/org_robolectric_utils_reflector
 description: "reflector"
 data:
-- file: utils-reflector-4.8.1.jar
+- file: utils-reflector-4.10.2.jar
diff --git a/third_party/bidimapper/README.chromium b/third_party/bidimapper/README.chromium
index 94ee79a..61a2bbfa 100644
--- a/third_party/bidimapper/README.chromium
+++ b/third_party/bidimapper/README.chromium
@@ -1,10 +1,10 @@
 Name: Implementation of WebDriver BiDi standard
 Short Name: chromium-bidi
-URL: https://github.com/GoogleChromeLabs/chromium-bidi/archive/cf61814923d6ce44ba198d2296003028e17a472b.zip
+URL: https://github.com/GoogleChromeLabs/chromium-bidi/archive/175fa98da68f37a5194b5f54b286abbfd5402437.zip
 Version: 0
-Date: 2023-04-12
-Revision: cf61814923d6ce44ba198d2296003028e17a472b
-SHA-512: 72c6c5cd5ade0b586b6789ef06c4c2b50c02b31a0173f0f780962b9c777c7652681714bd442ec11402cd47b9866f03a546a29af081bfc1ab5ef552969c7d12d5
+Date: 2023-05-08
+Revision: 175fa98da68f37a5194b5f54b286abbfd5402437
+SHA-512: 39f4f9df108166afec30818e22d6bba122d33c6d7dc92c71178a99624c84e5f7624c59b53b94b9653380694aff83f1543420be2d2a2d57fb96a05f1c7b93e074
 License: Apache 2.0
 License File: LICENSE
 Security Critical: no
diff --git a/third_party/bidimapper/mapper.js b/third_party/bidimapper/mapper.js
index 2f9012b5..f4796a4f 100644
--- a/third_party/bidimapper/mapper.js
+++ b/third_party/bidimapper/mapper.js
@@ -1,4 +1,4 @@
-var mapperTab=function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t={},s={},n={},r={},a={},i={},o={};!function(e){var t;Object.defineProperty(e,"__esModule",{value:!0}),e.getParsedType=e.ZodParsedType=e.objectUtil=e.util=void 0,function(e){e.assertEqual=e=>e,e.assertIs=function(e){},e.assertNever=function(e){throw new Error},e.arrayToEnum=e=>{const t={};for(const s of e)t[s]=s;return t},e.getValidEnumValues=t=>{const s=e.objectKeys(t).filter((e=>"number"!=typeof t[t[e]])),n={};for(const e of s)n[e]=t[e];return e.objectValues(n)},e.objectValues=t=>e.objectKeys(t).map((function(e){return t[e]})),e.objectKeys="function"==typeof Object.keys?e=>Object.keys(e):e=>{const t=[];for(const s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.push(s);return t},e.find=(e,t)=>{for(const s of e)if(t(s))return s},e.isInteger="function"==typeof Number.isInteger?e=>Number.isInteger(e):e=>"number"==typeof e&&isFinite(e)&&Math.floor(e)===e,e.joinValues=function(e,t=" | "){return e.map((e=>"string"==typeof e?`'${e}'`:e)).join(t)},e.jsonStringifyReplacer=(e,t)=>"bigint"==typeof t?t.toString():t}(t=e.util||(e.util={})),(e.objectUtil||(e.objectUtil={})).mergeShapes=(e,t)=>({...e,...t}),e.ZodParsedType=t.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]);e.getParsedType=t=>{switch(typeof t){case"undefined":return e.ZodParsedType.undefined;case"string":return e.ZodParsedType.string;case"number":return isNaN(t)?e.ZodParsedType.nan:e.ZodParsedType.number;case"boolean":return e.ZodParsedType.boolean;case"function":return e.ZodParsedType.function;case"bigint":return e.ZodParsedType.bigint;case"symbol":return e.ZodParsedType.symbol;case"object":return Array.isArray(t)?e.ZodParsedType.array:null===t?e.ZodParsedType.null:t.then&&"function"==typeof t.then&&t.catch&&"function"==typeof t.catch?e.ZodParsedType.promise:"undefined"!=typeof Map&&t instanceof Map?e.ZodParsedType.map:"undefined"!=typeof Set&&t instanceof Set?e.ZodParsedType.set:"undefined"!=typeof Date&&t instanceof Date?e.ZodParsedType.date:e.ZodParsedType.object;default:return e.ZodParsedType.unknown}}}(o);var d={};Object.defineProperty(d,"__esModule",{value:!0}),d.ZodError=d.quotelessJson=d.ZodIssueCode=void 0;const c=o;d.ZodIssueCode=c.util.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);d.quotelessJson=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class u extends Error{constructor(e){super(),this.issues=[],this.addIssue=e=>{this.issues=[...this.issues,e]},this.addIssues=(e=[])=>{this.issues=[...this.issues,...e]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}get errors(){return this.issues}format(e){const t=e||function(e){return e.message},s={_errors:[]},n=e=>{for(const r of e.issues)if("invalid_union"===r.code)r.unionErrors.map(n);else if("invalid_return_type"===r.code)n(r.returnTypeError);else if("invalid_arguments"===r.code)n(r.argumentsError);else if(0===r.path.length)s._errors.push(t(r));else{let e=s,n=0;for(;n<r.path.length;){const s=r.path[n];n===r.path.length-1?(e[s]=e[s]||{_errors:[]},e[s]._errors.push(t(r))):e[s]=e[s]||{_errors:[]},e=e[s],n++}}};return n(this),s}toString(){return this.message}get message(){return JSON.stringify(this.issues,c.util.jsonStringifyReplacer,2)}get isEmpty(){return 0===this.issues.length}flatten(e=(e=>e.message)){const t={},s=[];for(const n of this.issues)n.path.length>0?(t[n.path[0]]=t[n.path[0]]||[],t[n.path[0]].push(e(n))):s.push(e(n));return{formErrors:s,fieldErrors:t}}get formErrors(){return this.flatten()}}d.ZodError=u,u.create=e=>new u(e),Object.defineProperty(i,"__esModule",{value:!0});const l=o,p=d;i.default=(e,t)=>{let s;switch(e.code){case p.ZodIssueCode.invalid_type:s=e.received===l.ZodParsedType.undefined?"Required":`Expected ${e.expected}, received ${e.received}`;break;case p.ZodIssueCode.invalid_literal:s=`Invalid literal value, expected ${JSON.stringify(e.expected,l.util.jsonStringifyReplacer)}`;break;case p.ZodIssueCode.unrecognized_keys:s=`Unrecognized key(s) in object: ${l.util.joinValues(e.keys,", ")}`;break;case p.ZodIssueCode.invalid_union:s="Invalid input";break;case p.ZodIssueCode.invalid_union_discriminator:s=`Invalid discriminator value. Expected ${l.util.joinValues(e.options)}`;break;case p.ZodIssueCode.invalid_enum_value:s=`Invalid enum value. Expected ${l.util.joinValues(e.options)}, received '${e.received}'`;break;case p.ZodIssueCode.invalid_arguments:s="Invalid function arguments";break;case p.ZodIssueCode.invalid_return_type:s="Invalid function return type";break;case p.ZodIssueCode.invalid_date:s="Invalid date";break;case p.ZodIssueCode.invalid_string:"object"==typeof e.validation?"includes"in e.validation?(s=`Invalid input: must include "${e.validation.includes}"`,"number"==typeof e.validation.position&&(s=`${s} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?s=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?s=`Invalid input: must end with "${e.validation.endsWith}"`:l.util.assertNever(e.validation):s="regex"!==e.validation?`Invalid ${e.validation}`:"Invalid";break;case p.ZodIssueCode.too_small:s="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:"date"===e.type?`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:"Invalid input";break;case p.ZodIssueCode.too_big:s="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"bigint"===e.type?`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"date"===e.type?`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:"Invalid input";break;case p.ZodIssueCode.custom:s="Invalid input";break;case p.ZodIssueCode.invalid_intersection_types:s="Intersection results could not be merged";break;case p.ZodIssueCode.not_multiple_of:s=`Number must be a multiple of ${e.multipleOf}`;break;case p.ZodIssueCode.not_finite:s="Number must be finite";break;default:s=t.defaultError,l.util.assertNever(e)}return{message:s}};var h=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.getErrorMap=a.setErrorMap=a.defaultErrorMap=void 0;const m=h(i);a.defaultErrorMap=m.default;let g=m.default;a.setErrorMap=function(e){g=e},a.getErrorMap=function(){return g};var f={};!function(t){var s=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isAsync=t.isValid=t.isDirty=t.isAborted=t.OK=t.DIRTY=t.INVALID=t.ParseStatus=t.addIssueToContext=t.EMPTY_PATH=t.makeIssue=void 0;const n=a,r=s(i);t.makeIssue=e=>{const{data:t,path:s,errorMaps:n,issueData:r}=e,a=[...s,...r.path||[]],i={...r,path:a};let o="";const d=n.filter((e=>!!e)).slice().reverse();for(const e of d)o=e(i,{data:t,defaultError:o}).message;return{...r,path:a,message:r.message||o}},t.EMPTY_PATH=[],t.addIssueToContext=function(e,s){const a=(0,t.makeIssue)({issueData:s,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,(0,n.getErrorMap)(),r.default].filter((e=>!!e))});e.common.issues.push(a)};class o{constructor(){this.value="valid"}dirty(){"valid"===this.value&&(this.value="dirty")}abort(){"aborted"!==this.value&&(this.value="aborted")}static mergeArray(e,s){const n=[];for(const r of s){if("aborted"===r.status)return t.INVALID;"dirty"===r.status&&e.dirty(),n.push(r.value)}return{status:e.value,value:n}}static async mergeObjectAsync(e,t){const s=[];for(const e of t)s.push({key:await e.key,value:await e.value});return o.mergeObjectSync(e,s)}static mergeObjectSync(e,s){const n={};for(const r of s){const{key:s,value:a}=r;if("aborted"===s.status)return t.INVALID;if("aborted"===a.status)return t.INVALID;"dirty"===s.status&&e.dirty(),"dirty"===a.status&&e.dirty(),(void 0!==a.value||r.alwaysSet)&&(n[s.value]=a.value)}return{status:e.value,value:n}}}t.ParseStatus=o,t.INVALID=Object.freeze({status:"aborted"});t.DIRTY=e=>({status:"dirty",value:e});t.OK=e=>({status:"valid",value:e});t.isAborted=e=>"aborted"===e.status;t.isDirty=e=>"dirty"===e.status;t.isValid=e=>"valid"===e.status;t.isAsync=e=>"undefined"!=typeof Promise&&e instanceof Promise}(f);var v={};Object.defineProperty(v,"__esModule",{value:!0});var y,x={},b={};y=b,Object.defineProperty(y,"__esModule",{value:!0}),y.errorUtil=void 0,function(e){e.errToObj=e=>"string"==typeof e?{message:e}:e||{},e.toString=e=>"string"==typeof e?e:null==e?void 0:e.message}(y.errorUtil||(y.errorUtil={})),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.discriminatedUnion=e.date=e.boolean=e.bigint=e.array=e.any=e.coerce=e.ZodFirstPartyTypeKind=e.late=e.ZodSchema=e.Schema=e.custom=e.ZodPipeline=e.ZodBranded=e.BRAND=e.ZodNaN=e.ZodCatch=e.ZodDefault=e.ZodNullable=e.ZodOptional=e.ZodTransformer=e.ZodEffects=e.ZodPromise=e.ZodNativeEnum=e.ZodEnum=e.ZodLiteral=e.ZodLazy=e.ZodFunction=e.ZodSet=e.ZodMap=e.ZodRecord=e.ZodTuple=e.ZodIntersection=e.ZodDiscriminatedUnion=e.ZodUnion=e.ZodObject=e.ZodArray=e.ZodVoid=e.ZodNever=e.ZodUnknown=e.ZodAny=e.ZodNull=e.ZodUndefined=e.ZodSymbol=e.ZodDate=e.ZodBoolean=e.ZodBigInt=e.ZodNumber=e.ZodString=e.ZodType=void 0,e.NEVER=e.void=e.unknown=e.union=e.undefined=e.tuple=e.transformer=e.symbol=e.string=e.strictObject=e.set=e.record=e.promise=e.preprocess=e.pipeline=e.ostring=e.optional=e.onumber=e.oboolean=e.object=e.number=e.nullable=e.null=e.never=e.nativeEnum=e.nan=e.map=e.literal=e.lazy=e.intersection=e.instanceof=e.function=e.enum=e.effect=void 0;const t=a,s=b,n=f,r=o,i=d;class c{constructor(e,t,s,n){this._cachedPath=[],this.parent=e,this.data=t,this._path=s,this._key=n}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const u=(e,t)=>{if((0,n.isValid)(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const t=new i.ZodError(e.common.issues);return this._error=t,this._error}}};function l(e){if(!e)return{};const{errorMap:t,invalid_type_error:s,required_error:n,description:r}=e;if(t&&(s||n))throw new Error('Can\'t use "invalid_type_error" or "required_error" in conjunction with custom error map.');if(t)return{errorMap:t,description:r};return{errorMap:(e,t)=>"invalid_type"!==e.code?{message:t.defaultError}:void 0===t.data?{message:null!=n?n:t.defaultError}:{message:null!=s?s:t.defaultError},description:r}}class p{constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(e){return(0,r.getParsedType)(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:(0,r.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new n.ParseStatus,ctx:{common:e.parent.common,data:e.data,parsedType:(0,r.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if((0,n.isAsync)(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const s=this.safeParse(e,t);if(s.success)return s.data;throw s.error}safeParse(e,t){var s;const n={common:{issues:[],async:null!==(s=null==t?void 0:t.async)&&void 0!==s&&s,contextualErrorMap:null==t?void 0:t.errorMap},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,r.getParsedType)(e)},a=this._parseSync({data:e,path:n.path,parent:n});return u(n,a)}async parseAsync(e,t){const s=await this.safeParseAsync(e,t);if(s.success)return s.data;throw s.error}async safeParseAsync(e,t){const s={common:{issues:[],contextualErrorMap:null==t?void 0:t.errorMap,async:!0},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,r.getParsedType)(e)},a=this._parse({data:e,path:s.path,parent:s}),i=await((0,n.isAsync)(a)?a:Promise.resolve(a));return u(s,i)}refine(e,t){const s=e=>"string"==typeof t||void 0===t?{message:t}:"function"==typeof t?t(e):t;return this._refinement(((t,n)=>{const r=e(t),a=()=>n.addIssue({code:i.ZodIssueCode.custom,...s(t)});return"undefined"!=typeof Promise&&r instanceof Promise?r.then((e=>!!e||(a(),!1))):!!r||(a(),!1)}))}refinement(e,t){return this._refinement(((s,n)=>!!e(s)||(n.addIssue("function"==typeof t?t(s,n):t),!1)))}_refinement(e){return new te({schema:this,typeName:ce.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}optional(){return se.create(this,this._def)}nullable(){return ne.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return j.create(this,this._def)}promise(){return ee.create(this,this._def)}or(e){return L.create([this,e],this._def)}and(e){return $.create(this,e,this._def)}transform(e){return new te({...l(this._def),schema:this,typeName:ce.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t="function"==typeof e?e:()=>e;return new re({...l(this._def),innerType:this,defaultValue:t,typeName:ce.ZodDefault})}brand(){return new oe({typeName:ce.ZodBranded,type:this,...l(this._def)})}catch(e){const t="function"==typeof e?e:()=>e;return new ae({...l(this._def),innerType:this,catchValue:t,typeName:ce.ZodCatch})}describe(e){return new(0,this.constructor)({...this._def,description:e})}pipe(e){return de.create(this,e)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}e.ZodType=p,e.Schema=p,e.ZodSchema=p;const h=/^c[^\s-]{8,}$/i,m=/^[a-z][a-z0-9]*$/,g=/[0-9A-HJKMNP-TV-Z]{26}/,v=/^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i,y=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/,x=/^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u,C=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,w=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;class _ extends p{constructor(){super(...arguments),this._regex=(e,t,n)=>this.refinement((t=>e.test(t)),{validation:t,code:i.ZodIssueCode.invalid_string,...s.errorUtil.errToObj(n)}),this.nonempty=e=>this.min(1,s.errorUtil.errToObj(e)),this.trim=()=>new _({...this._def,checks:[...this._def.checks,{kind:"trim"}]}),this.toLowerCase=()=>new _({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]}),this.toUpperCase=()=>new _({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}_parse(e){this._def.coerce&&(e.data=String(e.data));if(this._getType(e)!==r.ZodParsedType.string){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.string,received:t.parsedType}),n.INVALID}const t=new n.ParseStatus;let s;for(const c of this._def.checks)if("min"===c.kind)e.data.length<c.value&&(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_small,minimum:c.value,type:"string",inclusive:!0,exact:!1,message:c.message}),t.dirty());else if("max"===c.kind)e.data.length>c.value&&(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_big,maximum:c.value,type:"string",inclusive:!0,exact:!1,message:c.message}),t.dirty());else if("length"===c.kind){const r=e.data.length>c.value,a=e.data.length<c.value;(r||a)&&(s=this._getOrReturnCtx(e,s),r?(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_big,maximum:c.value,type:"string",inclusive:!0,exact:!0,message:c.message}):a&&(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_small,minimum:c.value,type:"string",inclusive:!0,exact:!0,message:c.message}),t.dirty())}else if("email"===c.kind)y.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"email",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty());else if("emoji"===c.kind)x.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"emoji",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty());else if("uuid"===c.kind)v.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"uuid",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty());else if("cuid"===c.kind)h.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"cuid",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty());else if("cuid2"===c.kind)m.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"cuid2",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty());else if("ulid"===c.kind)g.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"ulid",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty());else if("url"===c.kind)try{new URL(e.data)}catch(r){s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"url",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty()}else if("regex"===c.kind){c.regex.lastIndex=0;c.regex.test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"regex",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty())}else if("trim"===c.kind)e.data=e.data.trim();else if("includes"===c.kind)e.data.includes(c.value,c.position)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_string,validation:{includes:c.value,position:c.position},message:c.message}),t.dirty());else if("toLowerCase"===c.kind)e.data=e.data.toLowerCase();else if("toUpperCase"===c.kind)e.data=e.data.toUpperCase();else if("startsWith"===c.kind)e.data.startsWith(c.value)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_string,validation:{startsWith:c.value},message:c.message}),t.dirty());else if("endsWith"===c.kind)e.data.endsWith(c.value)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_string,validation:{endsWith:c.value},message:c.message}),t.dirty());else if("datetime"===c.kind){((d=c).precision?d.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${d.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${d.precision}}Z$`):0===d.precision?d.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):d.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$")).test(e.data)||(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_string,validation:"datetime",message:c.message}),t.dirty())}else"ip"===c.kind?(a=e.data,("v4"!==(o=c.version)&&o||!C.test(a))&&("v6"!==o&&o||!w.test(a))&&(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{validation:"ip",code:i.ZodIssueCode.invalid_string,message:c.message}),t.dirty())):r.util.assertNever(c);var a,o,d;return{status:t.value,value:e.data}}_addCheck(e){return new _({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...s.errorUtil.errToObj(e)})}url(e){return this._addCheck({kind:"url",...s.errorUtil.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...s.errorUtil.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...s.errorUtil.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...s.errorUtil.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...s.errorUtil.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...s.errorUtil.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...s.errorUtil.errToObj(e)})}datetime(e){var t;return"string"==typeof e?this._addCheck({kind:"datetime",precision:null,offset:!1,message:e}):this._addCheck({kind:"datetime",precision:void 0===(null==e?void 0:e.precision)?null:null==e?void 0:e.precision,offset:null!==(t=null==e?void 0:e.offset)&&void 0!==t&&t,...s.errorUtil.errToObj(null==e?void 0:e.message)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...s.errorUtil.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:null==t?void 0:t.position,...s.errorUtil.errToObj(null==t?void 0:t.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...s.errorUtil.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...s.errorUtil.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...s.errorUtil.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...s.errorUtil.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...s.errorUtil.errToObj(t)})}get isDatetime(){return!!this._def.checks.find((e=>"datetime"===e.kind))}get isEmail(){return!!this._def.checks.find((e=>"email"===e.kind))}get isURL(){return!!this._def.checks.find((e=>"url"===e.kind))}get isEmoji(){return!!this._def.checks.find((e=>"emoji"===e.kind))}get isUUID(){return!!this._def.checks.find((e=>"uuid"===e.kind))}get isCUID(){return!!this._def.checks.find((e=>"cuid"===e.kind))}get isCUID2(){return!!this._def.checks.find((e=>"cuid2"===e.kind))}get isULID(){return!!this._def.checks.find((e=>"ulid"===e.kind))}get isIP(){return!!this._def.checks.find((e=>"ip"===e.kind))}get minLength(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}function I(e,t){const s=(e.toString().split(".")[1]||"").length,n=(t.toString().split(".")[1]||"").length,r=s>n?s:n;return parseInt(e.toFixed(r).replace(".",""))%parseInt(t.toFixed(r).replace(".",""))/Math.pow(10,r)}e.ZodString=_,_.create=e=>{var t;return new _({checks:[],typeName:ce.ZodString,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...l(e)})};class S extends p{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){this._def.coerce&&(e.data=Number(e.data));if(this._getType(e)!==r.ZodParsedType.number){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.number,received:t.parsedType}),n.INVALID}let t;const s=new n.ParseStatus;for(const a of this._def.checks)if("int"===a.kind)r.util.isInteger(e.data)||(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:"integer",received:"float",message:a.message}),s.dirty());else if("min"===a.kind){(a.inclusive?e.data<a.value:e.data<=a.value)&&(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty())}else if("max"===a.kind){(a.inclusive?e.data>a.value:e.data>=a.value)&&(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty())}else"multipleOf"===a.kind?0!==I(e.data,a.value)&&(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):"finite"===a.kind?Number.isFinite(e.data)||(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.not_finite,message:a.message}),s.dirty()):r.util.assertNever(a);return{status:s.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,s.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,s.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,s.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,s.errorUtil.toString(t))}setLimit(e,t,n,r){return new S({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:n,message:s.errorUtil.toString(r)}]})}_addCheck(e){return new S({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:s.errorUtil.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:s.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:s.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:s.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:s.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:s.errorUtil.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:s.errorUtil.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:s.errorUtil.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:s.errorUtil.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find((e=>"int"===e.kind||"multipleOf"===e.kind&&r.util.isInteger(e.value)))}get isFinite(){let e=null,t=null;for(const s of this._def.checks){if("finite"===s.kind||"int"===s.kind||"multipleOf"===s.kind)return!0;"min"===s.kind?(null===t||s.value>t)&&(t=s.value):"max"===s.kind&&(null===e||s.value<e)&&(e=s.value)}return Number.isFinite(t)&&Number.isFinite(e)}}e.ZodNumber=S,S.create=e=>new S({checks:[],typeName:ce.ZodNumber,coerce:(null==e?void 0:e.coerce)||!1,...l(e)});class E extends p{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){this._def.coerce&&(e.data=BigInt(e.data));if(this._getType(e)!==r.ZodParsedType.bigint){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.bigint,received:t.parsedType}),n.INVALID}let t;const s=new n.ParseStatus;for(const a of this._def.checks)if("min"===a.kind){(a.inclusive?e.data<a.value:e.data<=a.value)&&(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.too_small,type:"bigint",minimum:a.value,inclusive:a.inclusive,message:a.message}),s.dirty())}else if("max"===a.kind){(a.inclusive?e.data>a.value:e.data>=a.value)&&(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),s.dirty())}else"multipleOf"===a.kind?e.data%a.value!==BigInt(0)&&(t=this._getOrReturnCtx(e,t),(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):r.util.assertNever(a);return{status:s.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,s.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,s.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,s.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,s.errorUtil.toString(t))}setLimit(e,t,n,r){return new E({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:n,message:s.errorUtil.toString(r)}]})}_addCheck(e){return new E({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:s.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:s.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:s.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:s.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:s.errorUtil.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}e.ZodBigInt=E,E.create=e=>{var t;return new E({checks:[],typeName:ce.ZodBigInt,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...l(e)})};class T extends p{_parse(e){this._def.coerce&&(e.data=Boolean(e.data));if(this._getType(e)!==r.ZodParsedType.boolean){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.boolean,received:t.parsedType}),n.INVALID}return(0,n.OK)(e.data)}}e.ZodBoolean=T,T.create=e=>new T({typeName:ce.ZodBoolean,coerce:(null==e?void 0:e.coerce)||!1,...l(e)});class P extends p{_parse(e){this._def.coerce&&(e.data=new Date(e.data));if(this._getType(e)!==r.ZodParsedType.date){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.date,received:t.parsedType}),n.INVALID}if(isNaN(e.data.getTime())){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_date}),n.INVALID}const t=new n.ParseStatus;let s;for(const a of this._def.checks)"min"===a.kind?e.data.getTime()<a.value&&(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_small,message:a.message,inclusive:!0,exact:!1,minimum:a.value,type:"date"}),t.dirty()):"max"===a.kind?e.data.getTime()>a.value&&(s=this._getOrReturnCtx(e,s),(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),t.dirty()):r.util.assertNever(a);return{status:t.value,value:new Date(e.data.getTime())}}_addCheck(e){return new P({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:s.errorUtil.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:s.errorUtil.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return null!=e?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return null!=e?new Date(e):null}}e.ZodDate=P,P.create=e=>new P({checks:[],coerce:(null==e?void 0:e.coerce)||!1,typeName:ce.ZodDate,...l(e)});class k extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.symbol){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.symbol,received:t.parsedType}),n.INVALID}return(0,n.OK)(e.data)}}e.ZodSymbol=k,k.create=e=>new k({typeName:ce.ZodSymbol,...l(e)});class N extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.undefined,received:t.parsedType}),n.INVALID}return(0,n.OK)(e.data)}}e.ZodUndefined=N,N.create=e=>new N({typeName:ce.ZodUndefined,...l(e)});class Z extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.null){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.null,received:t.parsedType}),n.INVALID}return(0,n.OK)(e.data)}}e.ZodNull=Z,Z.create=e=>new Z({typeName:ce.ZodNull,...l(e)});class O extends p{constructor(){super(...arguments),this._any=!0}_parse(e){return(0,n.OK)(e.data)}}e.ZodAny=O,O.create=e=>new O({typeName:ce.ZodAny,...l(e)});class M extends p{constructor(){super(...arguments),this._unknown=!0}_parse(e){return(0,n.OK)(e.data)}}e.ZodUnknown=M,M.create=e=>new M({typeName:ce.ZodUnknown,...l(e)});class D extends p{_parse(e){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.never,received:t.parsedType}),n.INVALID}}e.ZodNever=D,D.create=e=>new D({typeName:ce.ZodNever,...l(e)});class R extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.void,received:t.parsedType}),n.INVALID}return(0,n.OK)(e.data)}}e.ZodVoid=R,R.create=e=>new R({typeName:ce.ZodVoid,...l(e)});class j extends p{_parse(e){const{ctx:t,status:s}=this._processInputParams(e),a=this._def;if(t.parsedType!==r.ZodParsedType.array)return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.array,received:t.parsedType}),n.INVALID;if(null!==a.exactLength){const e=t.data.length>a.exactLength.value,r=t.data.length<a.exactLength.value;(e||r)&&((0,n.addIssueToContext)(t,{code:e?i.ZodIssueCode.too_big:i.ZodIssueCode.too_small,minimum:r?a.exactLength.value:void 0,maximum:e?a.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:a.exactLength.message}),s.dirty())}if(null!==a.minLength&&t.data.length<a.minLength.value&&((0,n.addIssueToContext)(t,{code:i.ZodIssueCode.too_small,minimum:a.minLength.value,type:"array",inclusive:!0,exact:!1,message:a.minLength.message}),s.dirty()),null!==a.maxLength&&t.data.length>a.maxLength.value&&((0,n.addIssueToContext)(t,{code:i.ZodIssueCode.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),s.dirty()),t.common.async)return Promise.all([...t.data].map(((e,s)=>a.type._parseAsync(new c(t,e,t.path,s))))).then((e=>n.ParseStatus.mergeArray(s,e)));const o=[...t.data].map(((e,s)=>a.type._parseSync(new c(t,e,t.path,s))));return n.ParseStatus.mergeArray(s,o)}get element(){return this._def.type}min(e,t){return new j({...this._def,minLength:{value:e,message:s.errorUtil.toString(t)}})}max(e,t){return new j({...this._def,maxLength:{value:e,message:s.errorUtil.toString(t)}})}length(e,t){return new j({...this._def,exactLength:{value:e,message:s.errorUtil.toString(t)}})}nonempty(e){return this.min(1,e)}}function A(e){if(e instanceof z){const t={};for(const s in e.shape){const n=e.shape[s];t[s]=se.create(A(n))}return new z({...e._def,shape:()=>t})}return e instanceof j?new j({...e._def,type:A(e.element)}):e instanceof se?se.create(A(e.unwrap())):e instanceof ne?ne.create(A(e.unwrap())):e instanceof F?F.create(e.items.map((e=>A(e)))):e}e.ZodArray=j,j.create=(e,t)=>new j({type:e,minLength:null,maxLength:null,exactLength:null,typeName:ce.ZodArray,...l(t)});class z extends p{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(null!==this._cached)return this._cached;const e=this._def.shape(),t=r.util.objectKeys(e);return this._cached={shape:e,keys:t}}_parse(e){if(this._getType(e)!==r.ZodParsedType.object){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.object,received:t.parsedType}),n.INVALID}const{status:t,ctx:s}=this._processInputParams(e),{shape:a,keys:o}=this._getCached(),d=[];if(!(this._def.catchall instanceof D&&"strip"===this._def.unknownKeys))for(const e in s.data)o.includes(e)||d.push(e);const u=[];for(const e of o){const t=a[e],n=s.data[e];u.push({key:{status:"valid",value:e},value:t._parse(new c(s,n,s.path,e)),alwaysSet:e in s.data})}if(this._def.catchall instanceof D){const e=this._def.unknownKeys;if("passthrough"===e)for(const e of d)u.push({key:{status:"valid",value:e},value:{status:"valid",value:s.data[e]}});else if("strict"===e)d.length>0&&((0,n.addIssueToContext)(s,{code:i.ZodIssueCode.unrecognized_keys,keys:d}),t.dirty());else if("strip"!==e)throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const e=this._def.catchall;for(const t of d){const n=s.data[t];u.push({key:{status:"valid",value:t},value:e._parse(new c(s,n,s.path,t)),alwaysSet:t in s.data})}}return s.common.async?Promise.resolve().then((async()=>{const e=[];for(const t of u){const s=await t.key;e.push({key:s,value:await t.value,alwaysSet:t.alwaysSet})}return e})).then((e=>n.ParseStatus.mergeObjectSync(t,e))):n.ParseStatus.mergeObjectSync(t,u)}get shape(){return this._def.shape()}strict(e){return s.errorUtil.errToObj,new z({...this._def,unknownKeys:"strict",...void 0!==e?{errorMap:(t,n)=>{var r,a,i,o;const d=null!==(i=null===(a=(r=this._def).errorMap)||void 0===a?void 0:a.call(r,t,n).message)&&void 0!==i?i:n.defaultError;return"unrecognized_keys"===t.code?{message:null!==(o=s.errorUtil.errToObj(e).message)&&void 0!==o?o:d}:{message:d}}}:{}})}strip(){return new z({...this._def,unknownKeys:"strip"})}passthrough(){return new z({...this._def,unknownKeys:"passthrough"})}extend(e){return new z({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new z({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:ce.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new z({...this._def,catchall:e})}pick(e){const t={};return r.util.objectKeys(e).forEach((s=>{e[s]&&this.shape[s]&&(t[s]=this.shape[s])})),new z({...this._def,shape:()=>t})}omit(e){const t={};return r.util.objectKeys(this.shape).forEach((s=>{e[s]||(t[s]=this.shape[s])})),new z({...this._def,shape:()=>t})}deepPartial(){return A(this)}partial(e){const t={};return r.util.objectKeys(this.shape).forEach((s=>{const n=this.shape[s];e&&!e[s]?t[s]=n:t[s]=n.optional()})),new z({...this._def,shape:()=>t})}required(e){const t={};return r.util.objectKeys(this.shape).forEach((s=>{if(e&&!e[s])t[s]=this.shape[s];else{let e=this.shape[s];for(;e instanceof se;)e=e._def.innerType;t[s]=e}})),new z({...this._def,shape:()=>t})}keyof(){return Y(r.util.objectKeys(this.shape))}}e.ZodObject=z,z.create=(e,t)=>new z({shape:()=>e,unknownKeys:"strip",catchall:D.create(),typeName:ce.ZodObject,...l(t)}),z.strictCreate=(e,t)=>new z({shape:()=>e,unknownKeys:"strict",catchall:D.create(),typeName:ce.ZodObject,...l(t)}),z.lazycreate=(e,t)=>new z({shape:e,unknownKeys:"strip",catchall:D.create(),typeName:ce.ZodObject,...l(t)});class L extends p{_parse(e){const{ctx:t}=this._processInputParams(e),s=this._def.options;if(t.common.async)return Promise.all(s.map((async e=>{const s={...t,common:{...t.common,issues:[]},parent:null};return{result:await e._parseAsync({data:t.data,path:t.path,parent:s}),ctx:s}}))).then((function(e){for(const t of e)if("valid"===t.result.status)return t.result;for(const s of e)if("dirty"===s.result.status)return t.common.issues.push(...s.ctx.common.issues),s.result;const s=e.map((e=>new i.ZodError(e.ctx.common.issues)));return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_union,unionErrors:s}),n.INVALID}));{let e;const r=[];for(const n of s){const s={...t,common:{...t.common,issues:[]},parent:null},a=n._parseSync({data:t.data,path:t.path,parent:s});if("valid"===a.status)return a;"dirty"!==a.status||e||(e={result:a,ctx:s}),s.common.issues.length&&r.push(s.common.issues)}if(e)return t.common.issues.push(...e.ctx.common.issues),e.result;const a=r.map((e=>new i.ZodError(e)));return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_union,unionErrors:a}),n.INVALID}}get options(){return this._def.options}}e.ZodUnion=L,L.create=(e,t)=>new L({options:e,typeName:ce.ZodUnion,...l(t)});const B=e=>e instanceof H?B(e.schema):e instanceof te?B(e.innerType()):e instanceof G?[e.value]:e instanceof Q?e.options:e instanceof X?Object.keys(e.enum):e instanceof re?B(e._def.innerType):e instanceof N?[void 0]:e instanceof Z?[null]:null;class V extends p{_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==r.ZodParsedType.object)return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.object,received:t.parsedType}),n.INVALID;const s=this.discriminator,a=t.data[s],o=this.optionsMap.get(a);return o?t.common.async?o._parseAsync({data:t.data,path:t.path,parent:t}):o._parseSync({data:t.data,path:t.path,parent:t}):((0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[s]}),n.INVALID)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,s){const n=new Map;for(const s of t){const t=B(s.shape[e]);if(!t)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const r of t){if(n.has(r))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(r)}`);n.set(r,s)}}return new V({typeName:ce.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:n,...l(s)})}}function U(e,t){const s=(0,r.getParsedType)(e),n=(0,r.getParsedType)(t);if(e===t)return{valid:!0,data:e};if(s===r.ZodParsedType.object&&n===r.ZodParsedType.object){const s=r.util.objectKeys(t),n=r.util.objectKeys(e).filter((e=>-1!==s.indexOf(e))),a={...e,...t};for(const s of n){const n=U(e[s],t[s]);if(!n.valid)return{valid:!1};a[s]=n.data}return{valid:!0,data:a}}if(s===r.ZodParsedType.array&&n===r.ZodParsedType.array){if(e.length!==t.length)return{valid:!1};const s=[];for(let n=0;n<e.length;n++){const r=U(e[n],t[n]);if(!r.valid)return{valid:!1};s.push(r.data)}return{valid:!0,data:s}}return s===r.ZodParsedType.date&&n===r.ZodParsedType.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}e.ZodDiscriminatedUnion=V;class $ extends p{_parse(e){const{status:t,ctx:s}=this._processInputParams(e),r=(e,r)=>{if((0,n.isAborted)(e)||(0,n.isAborted)(r))return n.INVALID;const a=U(e.value,r.value);return a.valid?(((0,n.isDirty)(e)||(0,n.isDirty)(r))&&t.dirty(),{status:t.value,value:a.data}):((0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_intersection_types}),n.INVALID)};return s.common.async?Promise.all([this._def.left._parseAsync({data:s.data,path:s.path,parent:s}),this._def.right._parseAsync({data:s.data,path:s.path,parent:s})]).then((([e,t])=>r(e,t))):r(this._def.left._parseSync({data:s.data,path:s.path,parent:s}),this._def.right._parseSync({data:s.data,path:s.path,parent:s}))}}e.ZodIntersection=$,$.create=(e,t,s)=>new $({left:e,right:t,typeName:ce.ZodIntersection,...l(s)});class F extends p{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==r.ZodParsedType.array)return(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.array,received:s.parsedType}),n.INVALID;if(s.data.length<this._def.items.length)return(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.INVALID;!this._def.rest&&s.data.length>this._def.items.length&&((0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());const a=[...s.data].map(((e,t)=>{const n=this._def.items[t]||this._def.rest;return n?n._parse(new c(s,e,s.path,t)):null})).filter((e=>!!e));return s.common.async?Promise.all(a).then((e=>n.ParseStatus.mergeArray(t,e))):n.ParseStatus.mergeArray(t,a)}get items(){return this._def.items}rest(e){return new F({...this._def,rest:e})}}e.ZodTuple=F,F.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new F({items:e,typeName:ce.ZodTuple,rest:null,...l(t)})};class q extends p{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==r.ZodParsedType.object)return(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.object,received:s.parsedType}),n.INVALID;const a=[],o=this._def.keyType,d=this._def.valueType;for(const e in s.data)a.push({key:o._parse(new c(s,e,s.path,e)),value:d._parse(new c(s,s.data[e],s.path,e))});return s.common.async?n.ParseStatus.mergeObjectAsync(t,a):n.ParseStatus.mergeObjectSync(t,a)}get element(){return this._def.valueType}static create(e,t,s){return new q(t instanceof p?{keyType:e,valueType:t,typeName:ce.ZodRecord,...l(s)}:{keyType:_.create(),valueType:e,typeName:ce.ZodRecord,...l(t)})}}e.ZodRecord=q;class W extends p{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==r.ZodParsedType.map)return(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.map,received:s.parsedType}),n.INVALID;const a=this._def.keyType,o=this._def.valueType,d=[...s.data.entries()].map((([e,t],n)=>({key:a._parse(new c(s,e,s.path,[n,"key"])),value:o._parse(new c(s,t,s.path,[n,"value"]))})));if(s.common.async){const e=new Map;return Promise.resolve().then((async()=>{for(const s of d){const r=await s.key,a=await s.value;if("aborted"===r.status||"aborted"===a.status)return n.INVALID;"dirty"!==r.status&&"dirty"!==a.status||t.dirty(),e.set(r.value,a.value)}return{status:t.value,value:e}}))}{const e=new Map;for(const s of d){const r=s.key,a=s.value;if("aborted"===r.status||"aborted"===a.status)return n.INVALID;"dirty"!==r.status&&"dirty"!==a.status||t.dirty(),e.set(r.value,a.value)}return{status:t.value,value:e}}}}e.ZodMap=W,W.create=(e,t,s)=>new W({valueType:t,keyType:e,typeName:ce.ZodMap,...l(s)});class K extends p{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==r.ZodParsedType.set)return(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.set,received:s.parsedType}),n.INVALID;const a=this._def;null!==a.minSize&&s.data.size<a.minSize.value&&((0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_small,minimum:a.minSize.value,type:"set",inclusive:!0,exact:!1,message:a.minSize.message}),t.dirty()),null!==a.maxSize&&s.data.size>a.maxSize.value&&((0,n.addIssueToContext)(s,{code:i.ZodIssueCode.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),t.dirty());const o=this._def.valueType;function d(e){const s=new Set;for(const r of e){if("aborted"===r.status)return n.INVALID;"dirty"===r.status&&t.dirty(),s.add(r.value)}return{status:t.value,value:s}}const u=[...s.data.values()].map(((e,t)=>o._parse(new c(s,e,s.path,t))));return s.common.async?Promise.all(u).then((e=>d(e))):d(u)}min(e,t){return new K({...this._def,minSize:{value:e,message:s.errorUtil.toString(t)}})}max(e,t){return new K({...this._def,maxSize:{value:e,message:s.errorUtil.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}e.ZodSet=K,K.create=(e,t)=>new K({valueType:e,minSize:null,maxSize:null,typeName:ce.ZodSet,...l(t)});class J extends p{constructor(){super(...arguments),this.validate=this.implement}_parse(e){const{ctx:s}=this._processInputParams(e);if(s.parsedType!==r.ZodParsedType.function)return(0,n.addIssueToContext)(s,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.function,received:s.parsedType}),n.INVALID;function a(e,r){return(0,n.makeIssue)({data:e,path:s.path,errorMaps:[s.common.contextualErrorMap,s.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:i.ZodIssueCode.invalid_arguments,argumentsError:r}})}function o(e,r){return(0,n.makeIssue)({data:e,path:s.path,errorMaps:[s.common.contextualErrorMap,s.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:i.ZodIssueCode.invalid_return_type,returnTypeError:r}})}const d={errorMap:s.common.contextualErrorMap},c=s.data;return this._def.returns instanceof ee?(0,n.OK)((async(...e)=>{const t=new i.ZodError([]),s=await this._def.args.parseAsync(e,d).catch((s=>{throw t.addIssue(a(e,s)),t})),n=await c(...s);return await this._def.returns._def.type.parseAsync(n,d).catch((e=>{throw t.addIssue(o(n,e)),t}))})):(0,n.OK)(((...e)=>{const t=this._def.args.safeParse(e,d);if(!t.success)throw new i.ZodError([a(e,t.error)]);const s=c(...t.data),n=this._def.returns.safeParse(s,d);if(!n.success)throw new i.ZodError([o(s,n.error)]);return n.data}))}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new J({...this._def,args:F.create(e).rest(M.create())})}returns(e){return new J({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,t,s){return new J({args:e||F.create([]).rest(M.create()),returns:t||M.create(),typeName:ce.ZodFunction,...l(s)})}}e.ZodFunction=J;class H extends p{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}e.ZodLazy=H,H.create=(e,t)=>new H({getter:e,typeName:ce.ZodLazy,...l(t)});class G extends p{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{received:t.data,code:i.ZodIssueCode.invalid_literal,expected:this._def.value}),n.INVALID}return{status:"valid",value:e.data}}get value(){return this._def.value}}function Y(e,t){return new Q({values:e,typeName:ce.ZodEnum,...l(t)})}e.ZodLiteral=G,G.create=(e,t)=>new G({value:e,typeName:ce.ZodLiteral,...l(t)});class Q extends p{_parse(e){if("string"!=typeof e.data){const t=this._getOrReturnCtx(e),s=this._def.values;return(0,n.addIssueToContext)(t,{expected:r.util.joinValues(s),received:t.parsedType,code:i.ZodIssueCode.invalid_type}),n.INVALID}if(-1===this._def.values.indexOf(e.data)){const t=this._getOrReturnCtx(e),s=this._def.values;return(0,n.addIssueToContext)(t,{received:t.data,code:i.ZodIssueCode.invalid_enum_value,options:s}),n.INVALID}return(0,n.OK)(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values)e[t]=t;return e}get Values(){const e={};for(const t of this._def.values)e[t]=t;return e}get Enum(){const e={};for(const t of this._def.values)e[t]=t;return e}extract(e){return Q.create(e)}exclude(e){return Q.create(this.options.filter((t=>!e.includes(t))))}}e.ZodEnum=Q,Q.create=Y;class X extends p{_parse(e){const t=r.util.getValidEnumValues(this._def.values),s=this._getOrReturnCtx(e);if(s.parsedType!==r.ZodParsedType.string&&s.parsedType!==r.ZodParsedType.number){const e=r.util.objectValues(t);return(0,n.addIssueToContext)(s,{expected:r.util.joinValues(e),received:s.parsedType,code:i.ZodIssueCode.invalid_type}),n.INVALID}if(-1===t.indexOf(e.data)){const e=r.util.objectValues(t);return(0,n.addIssueToContext)(s,{received:s.data,code:i.ZodIssueCode.invalid_enum_value,options:e}),n.INVALID}return(0,n.OK)(e.data)}get enum(){return this._def.values}}e.ZodNativeEnum=X,X.create=(e,t)=>new X({values:e,typeName:ce.ZodNativeEnum,...l(t)});class ee extends p{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==r.ZodParsedType.promise&&!1===t.common.async)return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.promise,received:t.parsedType}),n.INVALID;const s=t.parsedType===r.ZodParsedType.promise?t.data:Promise.resolve(t.data);return(0,n.OK)(s.then((e=>this._def.type.parseAsync(e,{path:t.path,errorMap:t.common.contextualErrorMap}))))}}e.ZodPromise=ee,ee.create=(e,t)=>new ee({type:e,typeName:ce.ZodPromise,...l(t)});class te extends p{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ce.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:s}=this._processInputParams(e),a=this._def.effect||null;if("preprocess"===a.type){const e=a.transform(s.data);return s.common.async?Promise.resolve(e).then((e=>this._def.schema._parseAsync({data:e,path:s.path,parent:s}))):this._def.schema._parseSync({data:e,path:s.path,parent:s})}const i={addIssue:e=>{(0,n.addIssueToContext)(s,e),e.fatal?t.abort():t.dirty()},get path(){return s.path}};if(i.addIssue=i.addIssue.bind(i),"refinement"===a.type){const e=e=>{const t=a.refinement(e,i);if(s.common.async)return Promise.resolve(t);if(t instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return e};if(!1===s.common.async){const r=this._def.schema._parseSync({data:s.data,path:s.path,parent:s});return"aborted"===r.status?n.INVALID:("dirty"===r.status&&t.dirty(),e(r.value),{status:t.value,value:r.value})}return this._def.schema._parseAsync({data:s.data,path:s.path,parent:s}).then((s=>"aborted"===s.status?n.INVALID:("dirty"===s.status&&t.dirty(),e(s.value).then((()=>({status:t.value,value:s.value}))))))}if("transform"===a.type){if(!1===s.common.async){const e=this._def.schema._parseSync({data:s.data,path:s.path,parent:s});if(!(0,n.isValid)(e))return e;const r=a.transform(e.value,i);if(r instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:r}}return this._def.schema._parseAsync({data:s.data,path:s.path,parent:s}).then((e=>(0,n.isValid)(e)?Promise.resolve(a.transform(e.value,i)).then((e=>({status:t.value,value:e}))):e))}r.util.assertNever(a)}}e.ZodEffects=te,e.ZodTransformer=te,te.create=(e,t,s)=>new te({schema:e,typeName:ce.ZodEffects,effect:t,...l(s)}),te.createWithPreprocess=(e,t,s)=>new te({schema:t,effect:{type:"preprocess",transform:e},typeName:ce.ZodEffects,...l(s)});class se extends p{_parse(e){return this._getType(e)===r.ZodParsedType.undefined?(0,n.OK)(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodOptional=se,se.create=(e,t)=>new se({innerType:e,typeName:ce.ZodOptional,...l(t)});class ne extends p{_parse(e){return this._getType(e)===r.ZodParsedType.null?(0,n.OK)(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodNullable=ne,ne.create=(e,t)=>new ne({innerType:e,typeName:ce.ZodNullable,...l(t)});class re extends p{_parse(e){const{ctx:t}=this._processInputParams(e);let s=t.data;return t.parsedType===r.ZodParsedType.undefined&&(s=this._def.defaultValue()),this._def.innerType._parse({data:s,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}e.ZodDefault=re,re.create=(e,t)=>new re({innerType:e,typeName:ce.ZodDefault,defaultValue:"function"==typeof t.default?t.default:()=>t.default,...l(t)});class ae extends p{_parse(e){const{ctx:t}=this._processInputParams(e),s={...t,common:{...t.common,issues:[]}},r=this._def.innerType._parse({data:s.data,path:s.path,parent:{...s}});return(0,n.isAsync)(r)?r.then((e=>({status:"valid",value:"valid"===e.status?e.value:this._def.catchValue({get error(){return new i.ZodError(s.common.issues)},input:s.data})}))):{status:"valid",value:"valid"===r.status?r.value:this._def.catchValue({get error(){return new i.ZodError(s.common.issues)},input:s.data})}}removeCatch(){return this._def.innerType}}e.ZodCatch=ae,ae.create=(e,t)=>new ae({innerType:e,typeName:ce.ZodCatch,catchValue:"function"==typeof t.catch?t.catch:()=>t.catch,...l(t)});class ie extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.nan){const t=this._getOrReturnCtx(e);return(0,n.addIssueToContext)(t,{code:i.ZodIssueCode.invalid_type,expected:r.ZodParsedType.nan,received:t.parsedType}),n.INVALID}return{status:"valid",value:e.data}}}e.ZodNaN=ie,ie.create=e=>new ie({typeName:ce.ZodNaN,...l(e)}),e.BRAND=Symbol("zod_brand");class oe extends p{_parse(e){const{ctx:t}=this._processInputParams(e),s=t.data;return this._def.type._parse({data:s,path:t.path,parent:t})}unwrap(){return this._def.type}}e.ZodBranded=oe;class de extends p{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.common.async){return(async()=>{const e=await this._def.in._parseAsync({data:s.data,path:s.path,parent:s});return"aborted"===e.status?n.INVALID:"dirty"===e.status?(t.dirty(),(0,n.DIRTY)(e.value)):this._def.out._parseAsync({data:e.value,path:s.path,parent:s})})()}{const e=this._def.in._parseSync({data:s.data,path:s.path,parent:s});return"aborted"===e.status?n.INVALID:"dirty"===e.status?(t.dirty(),{status:"dirty",value:e.value}):this._def.out._parseSync({data:e.value,path:s.path,parent:s})}}static create(e,t){return new de({in:e,out:t,typeName:ce.ZodPipeline})}}e.ZodPipeline=de;var ce;e.custom=(e,t={},s)=>e?O.create().superRefine(((n,r)=>{var a,i;if(!e(n)){const e="function"==typeof t?t(n):"string"==typeof t?{message:t}:t,o=null===(i=null!==(a=e.fatal)&&void 0!==a?a:s)||void 0===i||i,d="string"==typeof e?{message:e}:e;r.addIssue({code:"custom",...d,fatal:o})}})):O.create(),e.late={object:z.lazycreate},function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline"}(ce=e.ZodFirstPartyTypeKind||(e.ZodFirstPartyTypeKind={}));e.instanceof=(t,s={message:`Input not instance of ${t.name}`})=>(0,e.custom)((e=>e instanceof t),s);const ue=_.create;e.string=ue;const le=S.create;e.number=le;const pe=ie.create;e.nan=pe;const he=E.create;e.bigint=he;const me=T.create;e.boolean=me;const ge=P.create;e.date=ge;const fe=k.create;e.symbol=fe;const ve=N.create;e.undefined=ve;const ye=Z.create;e.null=ye;const xe=O.create;e.any=xe;const be=M.create;e.unknown=be;const Ce=D.create;e.never=Ce;const we=R.create;e.void=we;const _e=j.create;e.array=_e;const Ie=z.create;e.object=Ie;const Se=z.strictCreate;e.strictObject=Se;const Ee=L.create;e.union=Ee;const Te=V.create;e.discriminatedUnion=Te;const Pe=$.create;e.intersection=Pe;const ke=F.create;e.tuple=ke;const Ne=q.create;e.record=Ne;const Ze=W.create;e.map=Ze;const Oe=K.create;e.set=Oe;const Me=J.create;e.function=Me;const De=H.create;e.lazy=De;const Re=G.create;e.literal=Re;const je=Q.create;e.enum=je;const Ae=X.create;e.nativeEnum=Ae;const ze=ee.create;e.promise=ze;const Le=te.create;e.effect=Le,e.transformer=Le;const Be=se.create;e.optional=Be;const Ve=ne.create;e.nullable=Ve;const Ue=te.createWithPreprocess;e.preprocess=Ue;const $e=de.create;e.pipeline=$e;e.ostring=()=>ue().optional();e.onumber=()=>le().optional();e.oboolean=()=>me().optional(),e.coerce={string:e=>_.create({...e,coerce:!0}),number:e=>S.create({...e,coerce:!0}),boolean:e=>T.create({...e,coerce:!0}),bigint:e=>E.create({...e,coerce:!0}),date:e=>P.create({...e,coerce:!0})},e.NEVER=n.INVALID}(x),function(t){var s=e&&e.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[s]}})}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),n=e&&e.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),n(a,t),n(f,t),n(v,t),n(o,t),n(x,t),n(d,t)}(r),function(t){var s=e&&e.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[s]}})}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),n=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&s(t,e,r);return n(t,e),t},i=e&&e.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),t.z=void 0;const o=a(r);t.z=o,i(r,t),t.default=o}(n);var C={};!function(e){var t,s,n,r,a,i;Object.defineProperty(e,"__esModule",{value:!0}),e.CDP=e.Network=e.Log=e.BrowsingContext=e.Script=e.Message=void 0,function(e){let t;!function(e){e.InvalidArgument="invalid argument",e.InvalidSessionId="invalid session id",e.NoSuchAlert="no such alert",e.NoSuchFrame="no such frame",e.NoSuchNode="no such node",e.NoSuchScript="no such script",e.SessionNotCreated="session not created",e.UnknownCommand="unknown command",e.UnknownError="unknown error",e.UnsupportedOperation="unsupported operation"}(t=e.ErrorCode||(e.ErrorCode={}));class s{error;message;stacktrace;constructor(e,t,s){this.error=e,this.message=t,this.stacktrace=s}toErrorResponse(e){return{id:e,error:this.error,message:this.message,stacktrace:this.stacktrace}}}e.ErrorResponse=s;e.InvalidArgumentException=class extends s{constructor(e,s){super(t.InvalidArgument,e,s)}};e.InvalidSessionIdException=class extends s{constructor(e,s){super(t.InvalidSessionId,e,s)}};e.NoSuchAlertException=class extends s{constructor(e,s){super(t.NoSuchAlert,e,s)}};e.NoSuchFrameException=class extends s{constructor(e){super(t.NoSuchFrame,e)}};e.NoSuchNodeException=class extends s{constructor(e,s){super(t.NoSuchNode,e,s)}};e.NoSuchScriptException=class extends s{constructor(e,s){super(t.NoSuchScript,e,s)}};e.SessionNotCreatedException=class extends s{constructor(e,s){super(t.SessionNotCreated,e,s)}};e.UnknownCommandException=class extends s{constructor(e,s){super(t.UnknownCommand,e,s)}};e.UnknownErrorException=class extends s{constructor(e,s){super(t.UnknownError,e,s)}};e.UnsupportedOperationException=class extends s{constructor(e,s){super(t.UnsupportedOperation,e,s)}}}(e.Message||(e.Message={})),((t=e.Script||(e.Script={})).EventNames||(t.EventNames={})).MessageEvent="script.message",t.AllEvents="script",s=e.BrowsingContext||(e.BrowsingContext={}),(n=s.EventNames||(s.EventNames={})).LoadEvent="browsingContext.load",n.DomContentLoadedEvent="browsingContext.domContentLoaded",n.ContextCreatedEvent="browsingContext.contextCreated",n.ContextDestroyedEvent="browsingContext.contextDestroyed",s.AllEvents="browsingContext",(r=e.Log||(e.Log={})).AllEvents="log",function(e){e.LogEntryAddedEvent="log.entryAdded"}(r.EventNames||(r.EventNames={})),(a=e.Network||(e.Network={})).AllEvents="network",function(e){e.BeforeRequestSentEvent="network.beforeRequestSent",e.ResponseCompletedEvent="network.responseCompleted",e.FetchErrorEvent="network.fetchError"}(a.EventNames||(a.EventNames={})),(i=e.CDP||(e.CDP={})).AllEvents="cdp",function(e){e.EventReceivedEvent="cdp.eventReceived"}(i.EventNames||(i.EventNames={}))}(C),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Session=e.CDP=e.BrowsingContext=e.Script=e.CommonDataTypes=e.parseObject=void 0;const t=n,s=C;function r(e,t){const n=t.safeParse(e);if(n.success)return n.data;const r=n.error.errors.map((e=>`${e.message} in ${e.path.map((e=>JSON.stringify(e))).join("/")}.`)).join(" ");throw new s.Message.InvalidArgumentException(r)}var a;e.parseObject=r,function(e){e.SharedReferenceSchema=t.z.object({sharedId:t.z.string().min(1)}),e.RemoteReferenceSchema=t.z.object({handle:t.z.string().min(1)});const s=t.z.object({type:t.z.literal("undefined")}),n=t.z.object({type:t.z.literal("null")}),r=t.z.object({type:t.z.literal("string"),value:t.z.string()}),a=t.z.enum(["NaN","-0","Infinity","-Infinity"]),i=t.z.object({type:t.z.literal("number"),value:t.z.union([a,t.z.number()])}),o=t.z.object({type:t.z.literal("boolean"),value:t.z.boolean()}),d=t.z.object({type:t.z.literal("bigint"),value:t.z.string()}),c=t.z.union([s,n,r,i,o,d]);e.LocalValueSchema=t.z.lazy((()=>t.z.union([c,p,h,g,f,v,y])));const u=t.z.union([e.SharedReferenceSchema,e.RemoteReferenceSchema,e.LocalValueSchema]),l=t.z.array(u),p=t.z.lazy((()=>t.z.object({type:t.z.literal("array"),value:l}))),h=t.z.object({type:t.z.literal("date"),value:t.z.string().min(1)}),m=t.z.lazy((()=>t.z.tuple([t.z.union([t.z.string(),u]),u]))),g=t.z.object({type:t.z.literal("map"),value:t.z.array(m)}),f=t.z.object({type:t.z.literal("object"),value:t.z.array(m)}),v=t.z.lazy((()=>t.z.object({type:t.z.literal("regexp"),value:t.z.object({pattern:t.z.string(),flags:t.z.string().optional()})}))),y=t.z.lazy((()=>t.z.object({type:t.z.literal("set"),value:l})));e.BrowsingContextSchema=t.z.string(),e.MaxDepthSchema=t.z.number().int().nonnegative().max(9007199254740991)}(a=e.CommonDataTypes||(e.CommonDataTypes={})),function(e){const s=t.z.enum(["window","dedicated-worker","shared-worker","service-worker","worker","paint-worklet","audio-worklet","worklet"]);e.GetRealmsParametersSchema=t.z.object({context:a.BrowsingContextSchema.optional(),type:s.optional()}),e.parseGetRealmsParams=function(t){return r(t,e.GetRealmsParametersSchema)};const n=t.z.object({context:a.BrowsingContextSchema,sandbox:t.z.string().optional()}),i=t.z.object({realm:t.z.string().min(1)}),o=t.z.union([i,n]),d=t.z.enum(["root","none"]),c=t.z.object({expression:t.z.string(),awaitPromise:t.z.boolean(),target:o,resultOwnership:d.optional()});e.parseEvaluateParams=function(e){return r(e,c)};const u=t.z.object({target:o,handles:t.z.array(t.z.string())});e.parseDisownParams=function(e){return r(e,u)},e.PreloadScriptSchema=t.z.string(),e.AddPreloadScriptParametersSchema=t.z.object({expression:t.z.string(),sandbox:t.z.string().optional(),context:a.BrowsingContextSchema.optional()}),e.parseAddPreloadScriptParams=function(t){return r(t,e.AddPreloadScriptParametersSchema)},e.RemovePreloadScriptParametersSchema=t.z.object({script:e.PreloadScriptSchema}),e.parseRemovePreloadScriptParams=function(t){return r(t,e.RemovePreloadScriptParametersSchema)};const l=t.z.string(),p=t.z.object({channel:l,maxDepth:t.z.number().int().min(1).max(1).optional(),ownership:d.optional()});e.ChannelSchema=t.z.object({type:t.z.literal("channel"),value:p});const h=t.z.union([a.RemoteReferenceSchema,a.SharedReferenceSchema,a.LocalValueSchema,e.ChannelSchema]),m=t.z.object({functionDeclaration:t.z.string(),target:o,arguments:t.z.array(h).optional(),this:h.optional(),awaitPromise:t.z.boolean(),resultOwnership:d.optional()});e.parseCallFunctionParams=function(e){return r(e,m)}}(e.Script||(e.Script={})),function(e){const s=t.z.object({maxDepth:a.MaxDepthSchema.optional(),root:a.BrowsingContextSchema.optional()});e.parseGetTreeParams=function(e){return r(e,s)};const n=t.z.enum(["none","interactive","complete"]),i=t.z.object({context:a.BrowsingContextSchema,url:t.z.string().url(),wait:n.optional()});e.parseNavigateParams=function(e){return r(e,i)};const o=t.z.object({type:t.z.enum(["tab","window"]),referenceContext:a.BrowsingContextSchema.optional()});e.parseCreateParams=function(e){return r(e,o)};const d=t.z.object({context:a.BrowsingContextSchema});e.parseCloseParams=function(e){return r(e,d)};const c=t.z.object({context:a.BrowsingContextSchema});e.parseCaptureScreenshotParams=function(e){return r(e,c)};const u=t.z.object({height:t.z.number().min(0).default(27.94).optional(),width:t.z.number().min(0).default(21.59).optional()}),l=t.z.object({bottom:t.z.number().min(0).default(1).optional(),left:t.z.number().min(0).default(1).optional(),right:t.z.number().min(0).default(1).optional(),top:t.z.number().min(0).default(1).optional()}),p=t.z.array(t.z.union([t.z.string().min(1),t.z.number().int().nonnegative()])).refine((e=>e.every((e=>{const t=String(e).match(/^(?:(?:\d+)|(?:\d+[-])|(?:[-]\d+)|(?:(?<start>\d+)[-](?<end>\d+)))$/),{start:s,end:n}=t?.groups??{};return!(s&&n&&Number(s)>Number(n))&&t})))),h=t.z.object({context:a.BrowsingContextSchema,background:t.z.boolean().default(!1).optional(),margin:l.optional(),orientation:t.z.enum(["portrait","landscape"]).default("portrait").optional(),page:u.optional(),pageRanges:p.default([]).optional(),scale:t.z.number().min(.1).max(2).default(1).optional(),shrinkToFit:t.z.boolean().default(!0).optional()});e.parsePrintParams=function(e){return r(e,h)}}(e.BrowsingContext||(e.BrowsingContext={})),function(e){const s=t.z.object({cdpMethod:t.z.string(),cdpParams:t.z.object({}).passthrough(),cdpSession:t.z.string().optional()});e.parseSendCommandParams=function(e){return r(e,s)};const n=t.z.object({context:a.BrowsingContextSchema});e.parseGetSessionParams=function(e){return r(e,n)}}(e.CDP||(e.CDP={})),function(e){const n=t.z.enum([s.BrowsingContext.AllEvents,...Object.values(s.BrowsingContext.EventNames),s.Log.AllEvents,...Object.values(s.Log.EventNames),s.CDP.AllEvents,...Object.values(s.CDP.EventNames),s.Network.AllEvents,...Object.values(s.Network.EventNames),s.Script.AllEvents,...Object.values(s.Script.EventNames)]),i=t.z.object({events:t.z.array(n),contexts:t.z.array(a.BrowsingContextSchema).optional()});e.parseSubscribeParams=function(e){return r(e,i)}}(e.Session||(e.Session={}))}(s);var w={},_={},I=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(_,"__esModule",{value:!0}),_.EventEmitter=void 0;const S=I((function(e){return{all:e=e||new Map,on:function(t,s){var n=e.get(t);n?n.push(s):e.set(t,[s])},off:function(t,s){var n=e.get(t);n&&(s?n.splice(n.indexOf(s)>>>0,1):e.set(t,[]))},emit:function(t,s){var n=e.get(t);n&&n.slice().map((function(e){e(s)})),(n=e.get("*"))&&n.slice().map((function(e){e(t,s)}))}}}));_.EventEmitter=class{#e=(0,S.default)();on(e,t){return this.#e.on(e,t),this}once(e,t){const s=n=>{t(n),this.off(e,s)};return this.on(e,s)}off(e,t){return this.#e.off(e,t),this}emit(e,t){this.#e.emit(e,t)}};var E={},T={};!function(e){var t;Object.defineProperty(e,"__esModule",{value:!0}),e.LogType=void 0,(t=e.LogType||(e.LogType={})).bidi="BiDi Messages",t.browsingContexts="Browsing Contexts",t.cdp="CDP",t.system="System"}(T),Object.defineProperty(E,"__esModule",{value:!0}),E.ProcessingQueue=void 0;const P=T;E.ProcessingQueue=class{#t;#s;#n;#r=[];#a=!1;constructor(e,t=(()=>Promise.resolve()),s){this.#t=t,this.#n=e,this.#s=s}add(e){this.#r.push(e),this.#i()}async#i(){if(!this.#a){for(this.#a=!0;this.#r.length>0;){const e=this.#r.shift();void 0!==e&&await e.then((e=>this.#n(e))).catch((e=>{this.#s?.(P.LogType.system,"Event was not processed:",e),this.#t(e)}))}this.#a=!1}}};var k={},N={},Z={},O={};Object.defineProperty(O,"__esModule",{value:!0}),O.inchesFromCm=void 0,O.inchesFromCm=function(e){return e/2.54};var M={};Object.defineProperty(M,"__esModule",{value:!0}),M.Deferred=void 0;class D{#o=!1;#d;#c=()=>{};#u=()=>{};get isFinished(){return this.#o}constructor(){this.#d=new Promise(((e,t)=>{this.#c=e,this.#u=t})),this.#d.catch((()=>{}))}then(e,t){return this.#d.then(e,t)}catch(e){return this.#d.catch(e)}resolve(e){this.#o=!0,this.#c(e)}reject(e){this.#o=!0,this.#u(e)}finally(e){return this.#d.finally(e)}[Symbol.toStringTag]="Promise"}M.Deferred=D;var R={},j={};!function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.ScriptEvaluator=e.SHARED_ID_DIVIDER=void 0;const t=C;e.SHARED_ID_DIVIDER="_element_";class s{#l;constructor(e){this.#l=e}static async stringifyObject(e,t){return(await t.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>String(e))),awaitPromise:!1,arguments:[e],returnByValue:!0,executionContextId:t.executionContextId})).result.value}async serializeCdpObject(e,t,n){const r=s.#p(e),a=await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e)),awaitPromise:!1,arguments:[r],generateWebDriverValue:!0,executionContextId:n.executionContextId});return n.cdpToBidiValue(a,t)}async scriptEvaluate(e,t,s,n){const r=await e.cdpClient.sendCommand("Runtime.evaluate",{contextId:e.executionContextId,expression:t,awaitPromise:s,generateWebDriverValue:!0});return r.exceptionDetails?{exceptionDetails:await this.#h(r.exceptionDetails,0,n,e),type:"exception",realm:e.realmId}:{type:"success",result:e.cdpToBidiValue(r,n),realm:e.realmId}}async callFunction(e,s,n,r,a,i){const o=`(...args)=>{ return _callFunction((\n${s}\n), args);\n\t      function _callFunction(f, args) {\n\t        const deserializedThis = args.shift();\n\t        const deserializedArgs = args;\n\t        return f.apply(deserializedThis, deserializedArgs);\n\t      }}`,d=[await this.#m(n,e)];let c;d.push(...await Promise.all(r.map((async t=>this.#m(t,e)))));try{c=await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:o,awaitPromise:a,arguments:d,generateWebDriverValue:!0,executionContextId:e.executionContextId})}catch(e){if(-32e3===e.code&&["Could not find object with given id","Argument should belong to the same JavaScript world as target object"].includes(e.message))throw new t.Message.InvalidArgumentException("Handle was not found.");throw e}return c.exceptionDetails?{exceptionDetails:await this.#h(c.exceptionDetails,1,i,e),type:"exception",realm:e.realmId}:{type:"success",result:e.cdpToBidiValue(c,i),realm:e.realmId}}static#p(e){return void 0!==e.objectId?{objectId:e.objectId}:void 0!==e.unserializableValue?{unserializableValue:e.unserializableValue}:{value:e.value}}async#m(s,n){if("sharedId"in s){const[r,a]=s.sharedId.split(e.SHARED_ID_DIVIDER),i=parseInt(a??"");if(isNaN(i)||void 0===i||void 0===r)throw new t.Message.InvalidArgumentException(`SharedId "${s.sharedId}" should have format "{navigableId}${e.SHARED_ID_DIVIDER}{backendNodeId}".`);if(n.navigableId!==r)throw new t.Message.NoSuchNodeException(`SharedId "${s.sharedId}" belongs to different document. Current document is ${n.navigableId}.`);try{return{objectId:(await n.cdpClient.sendCommand("DOM.resolveNode",{backendNodeId:i,executionContextId:n.executionContextId})).object.objectId}}catch(e){if(-32e3===e.code&&"No node with given id found"===e.message)throw new t.Message.NoSuchNodeException(`SharedId "${s.sharedId}" was not found.`);throw e}}if("handle"in s)return{objectId:s.handle};switch(s.type){case"undefined":return{unserializableValue:"undefined"};case"null":return{unserializableValue:"null"};case"string":return{value:s.value};case"number":return"NaN"===s.value?{unserializableValue:"NaN"}:"-0"===s.value?{unserializableValue:"-0"}:"Infinity"===s.value?{unserializableValue:"Infinity"}:"-Infinity"===s.value?{unserializableValue:"-Infinity"}:{value:s.value};case"boolean":return{value:Boolean(s.value)};case"bigint":return{unserializableValue:`BigInt(${JSON.stringify(s.value)})`};case"date":return{unserializableValue:`new Date(Date.parse(${JSON.stringify(s.value)}))`};case"regexp":return{unserializableValue:`new RegExp(${JSON.stringify(s.value.pattern)}, ${JSON.stringify(s.value.flags)})`};case"map":{const e=await this.#g(s.value,n);return{objectId:(await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t=new Map;for(let s=0;s<e.length;s+=2)t.set(e[s],e[s+1]);return t})),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:n.executionContextId})).result.objectId}}case"object":{const e=await this.#g(s.value,n);return{objectId:(await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t={};for(let s=0;s<e.length;s+=2){t[e[s]]=e[s+1]}return t})),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:n.executionContextId})).result.objectId}}case"array":{const e=await this.#f(s.value,n);return{objectId:(await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>e)),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:n.executionContextId})).result.objectId}}case"set":{const e=await this.#f(s.value,n);return{objectId:(await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>new Set(e))),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:n.executionContextId})).result.objectId}}case"channel":{const e=(await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((()=>{const e=[];let t=null;return{async getMessage(){const s=e.length>0?Promise.resolve():new Promise((e=>{t=e}));return await s,e.shift()},sendMessage(s){e.push(s),null!==t&&(t(),t=null)}}})),returnByValue:!1,executionContextId:n.executionContextId,generateWebDriverValue:!1})).result.objectId;this.#v(s,e,n);return{objectId:(await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e.sendMessage)),arguments:[{objectId:e}],returnByValue:!1,executionContextId:n.executionContextId,generateWebDriverValue:!1})).result.objectId}}default:throw new Error(`Value ${JSON.stringify(s)} is not deserializable.`)}}async#g(e,t){const s=[];for(const n of e){const e=n[0],r=n[1];let a;a="string"==typeof e?{value:e}:await this.#m(e,t);const i=await this.#m(r,t);s.push(a),s.push(i)}return s}async#f(e,t){const s=[];for(const n of e)s.push(await this.#m(n,t));return s}async#v(e,s,n){const r=e.value.channel;for(;;){const a=await n.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((async e=>e.getMessage())),arguments:[{objectId:s}],awaitPromise:!0,executionContextId:n.executionContextId,generateWebDriverValue:!0});this.#l.registerEvent({method:t.Script.EventNames.MessageEvent,params:{channel:r,data:n.cdpToBidiValue(a,e.value.ownership??"none"),source:{realm:n.realmId,context:n.browsingContextId}}},n.browsingContextId)}}async#h(e,t,n,r){const a=e.stackTrace?.callFrames.map((e=>({url:e.url,functionName:e.functionName,lineNumber:e.lineNumber-t,columnNumber:e.columnNumber}))),i=await this.serializeCdpObject(e.exception,n,r),o=await s.stringifyObject(e.exception,r);return{exception:i,columnNumber:e.columnNumber,lineNumber:e.lineNumber-t,stackTrace:{callFrames:a||[]},text:o||e.text}}}e.ScriptEvaluator=s}(j),Object.defineProperty(R,"__esModule",{value:!0}),R.Realm=void 0;const A=j;R.Realm=class{#y;#x;#b;#C;#w;#_;#I;#S;#l;#E;sandbox;cdpSessionId;constructor(e,t,s,n,r,a,i,o,d,c,u){this.#b=s,this.#C=n,this.#w=r,this.sandbox=o,this.#_=a,this.#I=i,this.cdpSessionId=d,this.#S=c,this.#y=e,this.#x=t,this.#l=u,this.#E=new A.ScriptEvaluator(this.#l),this.#y.realmMap.set(this.#b,this)}async disown(e){if(this.#y.knownHandlesToRealm.get(e)===this.realmId){try{await this.cdpClient.sendCommand("Runtime.releaseObject",{objectId:e})}catch(e){if(-32e3!==e.code||"Invalid remote object id"!==e.message)throw e}this.#y.knownHandlesToRealm.delete(e)}}cdpToBidiValue(e,t){const s=e.result.webDriverValue,n=this.webDriverValueToBiDi(s);if(e.result.objectId){const s=e.result.objectId;"root"===t?(n.handle=s,this.#y.knownHandlesToRealm.set(s,this.realmId)):this.cdpClient.sendCommand("Runtime.releaseObject",{objectId:s})}return n}webDriverValueToBiDi(e){const t=e;if("platformobject"===t.type)return{type:"object"};const s=t.value;if(void 0===s)return t;if("node"===t.type&&(Object.hasOwn(s,"backendNodeId")&&(s.sharedId=`${this.navigableId}${A.SHARED_ID_DIVIDER}${s.backendNodeId}`,delete s.backendNodeId),Object.hasOwn(s,"children")))for(const e in s.children)s.children[e]=this.webDriverValueToBiDi(s.children[e]);if(["array","set"].includes(e.type))for(const e in s)s[e]=this.webDriverValueToBiDi(s[e]);if(["object","map"].includes(e.type))for(const e in s)s[e]=[this.webDriverValueToBiDi(s[e][0]),this.webDriverValueToBiDi(s[e][1])];return t}toBiDi(){return{realm:this.realmId,origin:this.origin,type:this.type,context:this.browsingContextId,...void 0===this.sandbox?{}:{sandbox:this.sandbox}}}get realmId(){return this.#b}get navigableId(){return this.#x.findContext(this.#C)?.navigableId??"UNKNOWN"}get browsingContextId(){return this.#C}get executionContextId(){return this.#w}get origin(){return this.#_}get type(){return this.#I}get cdpClient(){return this.#S}async callFunction(e,t,s,n,r){const a=this.#x.getKnownContext(this.browsingContextId);return await a.awaitUnblocked(),{result:await this.#E.callFunction(this,e,t,s,n,r)}}async scriptEvaluate(e,t,s){const n=this.#x.getKnownContext(this.browsingContextId);return await n.awaitUnblocked(),{result:await this.#E.scriptEvaluate(this,e,t,s)}}async serializeCdpObject(e,t){return this.#E.serializeCdpObject(e,t,this)}async stringifyObject(e){return A.ScriptEvaluator.stringifyObject(e,this)}},Object.defineProperty(Z,"__esModule",{value:!0}),Z.BrowsingContextImpl=void 0;const z=O,L=C,B=T,V=M,U=R;class ${#T={documentInitialized:new V.Deferred,Page:{navigatedWithinDocument:new V.Deferred,lifecycleEvent:{DOMContentLoaded:new V.Deferred,load:new V.Deferred}}};#P;#k;#l;#N=new Map;#y;#Z="about:blank";#O=null;#M;#D;#x;#s;get#R(){if(void 0===this.#D)throw new Error(`No default realm for browsing context ${this.#P}`);return this.#D}constructor(e,t,s,n,r,a,i){this.#M=e,this.#y=t,this.#P=s,this.#k=n,this.#l=r,this.#x=a,this.#s=i,this.#j()}static create(e,t,s,n,r,a,i){const o=new $(e,t,s,n,r,a,i);a.addContext(o),r.registerEvent({method:L.BrowsingContext.EventNames.ContextCreatedEvent,params:o.serializeToBidiValue()},o.contextId)}get navigableId(){return this.#O}updateCdpTarget(e){this.#M=e,this.#j()}async delete(){if(await this.#A(),this.#y.deleteRealms({browsingContextId:this.contextId}),null!==this.parentId){this.#x.getKnownContext(this.parentId).#N.delete(this.contextId)}this.#l.registerEvent({method:L.BrowsingContext.EventNames.ContextDestroyedEvent,params:this.serializeToBidiValue()},this.contextId),this.#x.removeContext(this.contextId)}async#A(){await Promise.all(this.children.map((e=>e.delete())))}get contextId(){return this.#P}get parentId(){return this.#k}get cdpTarget(){return this.#M}get children(){return Array.from(this.#N.values())}get url(){return this.#Z}addChild(e){this.#N.set(e.contextId,e)}async awaitLoaded(){await this.#T.Page.lifecycleEvent.load}async awaitUnblocked(){return this.#M.targetUnblocked}serializeToBidiValue(e=0,t=!0){return{context:this.#P,url:this.url,children:e>0?this.children.map((t=>t.serializeToBidiValue(e-1,!1))):null,...t?{parent:this.#k}:{}}}#j(){this.#M.cdpClient.on("Target.targetInfoChanged",(e=>{this.contextId===e.targetInfo.targetId&&(this.#Z=e.targetInfo.url)})),this.#M.cdpClient.on("Page.frameNavigated",(async e=>{this.contextId===e.frame.id&&(this.#Z=e.frame.url+(e.frame.urlFragment??""),await this.#A(),this.#y.deleteRealms({browsingContextId:this.contextId}))})),this.#M.cdpClient.on("Page.navigatedWithinDocument",(e=>{this.contextId===e.frameId&&(this.#Z=e.url,this.#T.Page.navigatedWithinDocument.resolve(e))})),this.#M.cdpClient.on("Page.lifecycleEvent",(e=>{if(this.contextId!==e.frameId)return;const t=(new Date).getTime();if("init"===e.name&&(this.#z(e.loaderId),this.#T.documentInitialized.resolve()),"commit"!==e.name){if(e.loaderId===this.#O)switch(e.name){case"DOMContentLoaded":this.#T.Page.lifecycleEvent.DOMContentLoaded.resolve(e),this.#l.registerEvent({method:L.BrowsingContext.EventNames.DomContentLoadedEvent,params:{context:this.contextId,navigation:this.#O,timestamp:t,url:this.#Z}},this.contextId);break;case"load":this.#T.Page.lifecycleEvent.load.resolve(e),this.#l.registerEvent({method:L.BrowsingContext.EventNames.LoadEvent,params:{context:this.contextId,navigation:this.#O,timestamp:t,url:this.#Z}},this.contextId)}}else this.#O=e.loaderId})),this.#M.cdpClient.on("Runtime.executionContextCreated",(e=>{if(e.context.auxData.frameId!==this.contextId)return;if(!["default","isolated"].includes(e.context.auxData.type))return;const t=new U.Realm(this.#y,this.#x,e.context.uniqueId,this.contextId,e.context.id,this.#L(e),"window","isolated"===e.context.auxData.type?e.context.name:void 0,this.#M.cdpSessionId,this.#M.cdpClient,this.#l);e.context.auxData.isDefault&&(this.#D=t)})),this.#M.cdpClient.on("Runtime.executionContextDestroyed",(e=>{this.#y.deleteRealms({cdpSessionId:this.#M.cdpSessionId,executionContextId:e.executionContextId})}))}#L(e){return"isolated"===e.context.auxData.type?this.#R.origin:["://",""].includes(e.context.origin)?"null":e.context.origin}#z(e){void 0!==e&&this.#O!==e?(this.#T.documentInitialized.isFinished?this.#T.documentInitialized=new V.Deferred:this.#s?.(B.LogType.browsingContexts,"Document changed"),this.#T.Page.lifecycleEvent.DOMContentLoaded.isFinished?this.#T.Page.lifecycleEvent.DOMContentLoaded=new V.Deferred:this.#s?.(B.LogType.browsingContexts,"Document changed"),this.#T.Page.lifecycleEvent.load.isFinished?this.#T.Page.lifecycleEvent.load=new V.Deferred:this.#s?.(B.LogType.browsingContexts,"Document changed"),this.#O=e):this.#T.Page.navigatedWithinDocument.isFinished&&(this.#T.Page.navigatedWithinDocument=new V.Deferred)}async navigate(e,t){await this.awaitUnblocked();const s=await this.#M.cdpClient.sendCommand("Page.navigate",{url:e,frameId:this.contextId});if(s.errorText)throw new L.Message.UnknownErrorException(s.errorText);switch(this.#z(s.loaderId),t){case"none":break;case"interactive":void 0===s.loaderId?await this.#T.Page.navigatedWithinDocument:await this.#T.Page.lifecycleEvent.DOMContentLoaded;break;case"complete":void 0===s.loaderId?await this.#T.Page.navigatedWithinDocument:await this.#T.Page.lifecycleEvent.load}return{result:{navigation:s.loaderId||null,url:e}}}async getOrCreateSandbox(e){if(void 0===e||""===e)return this.#R;let t=this.#y.findRealms({browsingContextId:this.contextId,sandbox:e});if(0===t.length&&(await this.#M.cdpClient.sendCommand("Page.createIsolatedWorld",{frameId:this.contextId,worldName:e}),t=this.#y.findRealms({browsingContextId:this.contextId,sandbox:e})),1!==t.length)throw Error(`Sandbox ${e} wasn't created.`);return t[0]}async captureScreenshot(){const[,e]=await Promise.all([this.#M.cdpClient.sendCommand("Page.bringToFront"),this.#M.cdpClient.sendCommand("Page.captureScreenshot",{})]);return{result:{data:e.data}}}async print(e){const t={printBackground:e.background,landscape:"landscape"===e.orientation,pageRanges:e.pageRanges?.join(",")??"",scale:e.scale,preferCSSPageSize:!e.shrinkToFit};e.margin?.bottom&&(t.marginBottom=(0,z.inchesFromCm)(e.margin.bottom)),e.margin?.left&&(t.marginLeft=(0,z.inchesFromCm)(e.margin.left)),e.margin?.right&&(t.marginRight=(0,z.inchesFromCm)(e.margin.right)),e.margin?.top&&(t.marginTop=(0,z.inchesFromCm)(e.margin.top)),e.page?.height&&(t.paperHeight=(0,z.inchesFromCm)(e.page.height)),e.page?.width&&(t.paperWidth=(0,z.inchesFromCm)(e.page.width));return{result:{data:(await this.#M.cdpClient.sendCommand("Page.printToPDF",t)).data}}}async addPreloadScript(e){return{result:{script:(await this.#M.cdpClient.sendCommand("Page.addScriptToEvaluateOnNewDocument",{source:`(${e.expression})();`,worldName:e.sandbox})).identifier}}}}Z.BrowsingContextImpl=$;var F={},q={},W={};Object.defineProperty(W,"__esModule",{value:!0}),W.getRemoteValuesText=W.logMessageFormatter=void 0;const K=["%s","%d","%i","%f","%o","%O","%c"];function J(e){return K.some((t=>e.includes(t)))}function H(e){let t="";const s=e[0].value.toString(),n=e.slice(1,void 0),r=s.split(new RegExp(K.map((e=>`(${e})`)).join("|"),"g"));for(const s of r)if(void 0!==s&&""!==s)if(J(s)){const r=n.shift();if(void 0===r)throw new Error(`Less value is provided: "${Q(e,!1)}"`);"%s"===s?t+=Y(r):"%d"===s||"%i"===s?"bigint"===r.type||"number"===r.type||"string"===r.type?t+=parseInt(r.value.toString(),10):t+="NaN":"%f"===s?"bigint"===r.type||"number"===r.type||"string"===r.type?t+=parseFloat(r.value.toString()):t+="NaN":t+=G(r)}else t+=s;if(n.length>0)throw new Error(`More value is provided: "${Q(e,!1)}"`);return t}function G(e){if("array"!==e.type&&"bigint"!==e.type&&"date"!==e.type&&"number"!==e.type&&"object"!==e.type&&"string"!==e.type)return Y(e);if("bigint"===e.type)return`${e.value.toString()}n`;if("number"===e.type)return e.value.toString();if(["date","string"].includes(e.type))return JSON.stringify(e.value);if("object"===e.type)return`{${e.value.map((e=>`${JSON.stringify(e[0])}:${G(e[1])}`)).join(",")}}`;if("array"===e.type)return`[${e.value?.map((e=>G(e))).join(",")??""}]`;throw Error(`Invalid value type: ${e.toString()}`)}function Y(e){if(!Object.hasOwn(e,"value"))return e.type;switch(e.type){case"string":case"number":case"boolean":case"bigint":return String(e.value);case"regexp":return`/${e.value.pattern}/${e.value.flags??""}`;case"date":return new Date(e.value).toString();case"object":return`Object(${e.value?.length??""})`;case"array":return`Array(${e.value?.length??""})`;case"map":return`Map(${e.value.length})`;case"set":return`Set(${e.value.length})`;case"node":return"node";default:return e.type}}function Q(e,t){const s=e[0];return s?"string"===s.type&&J(s.value.toString())&&t?H(e):e.map((e=>Y(e))).join(" "):""}W.logMessageFormatter=H,W.getRemoteValuesText=Q,Object.defineProperty(q,"__esModule",{value:!0}),q.LogManager=void 0;const X=C,ee=W;function te(e){const t=e?.callFrames.map((e=>({columnNumber:e.columnNumber,functionName:e.functionName,lineNumber:e.lineNumber,url:e.url})));return t?{callFrames:t}:void 0}class se{#l;#y;#M;constructor(e,t,s){this.#M=e,this.#y=t,this.#l=s}static create(e,t,s){const n=new se(e,t,s);return n.#B(),n}#B(){this.#V()}#V(){this.#M.cdpClient.on("Runtime.consoleAPICalled",(e=>{const t=this.#y.findRealm({cdpSessionId:this.#M.cdpSessionId,executionContextId:e.executionContextId}),s=void 0===t?Promise.resolve(e.args):Promise.all(e.args.map((e=>t.serializeCdpObject(e,"none"))));this.#l.registerPromiseEvent(s.then((s=>{return{method:X.Log.EventNames.LogEntryAddedEvent,params:{level:(n=e.type,["assert","error"].includes(n)?"error":["debug","trace"].includes(n)?"debug":["warn","warning"].includes(n)?"warn":"info"),source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:(0,ee.getRemoteValuesText)(s,!0),timestamp:Math.round(e.timestamp),stackTrace:te(e.stackTrace),type:"console",method:"warning"===e.type?"warn":e.type,args:s}};var n})),t?.browsingContextId??"UNKNOWN",X.Log.EventNames.LogEntryAddedEvent)})),this.#M.cdpClient.on("Runtime.exceptionThrown",(e=>{const t=this.#y.findRealm({cdpSessionId:this.#M.cdpSessionId,executionContextId:e.exceptionDetails.executionContextId}),s=(async()=>e.exceptionDetails.exception?void 0===t?JSON.stringify(e.exceptionDetails.exception):t.stringifyObject(e.exceptionDetails.exception):e.exceptionDetails.text)();this.#l.registerPromiseEvent(s.then((s=>({method:X.Log.EventNames.LogEntryAddedEvent,params:{level:"error",source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:s,timestamp:Math.round(e.timestamp),stackTrace:te(e.exceptionDetails.stackTrace),type:"javascript"}}))),t?.browsingContextId??"UNKNOWN",X.Log.EventNames.LogEntryAddedEvent)}))}}q.LogManager=se;var ne={},re={};Object.defineProperty(re,"__esModule",{value:!0}),re.NetworkRequest=void 0;const ae=M,ie=C;class oe{static#U="UNKNOWN";requestId;#l;#$;#F;#q;#W;#K;#J;constructor(e,t){this.requestId=e,this.#l=t,this.#K=new ae.Deferred,this.#J=new ae.Deferred}onRequestWillBeSentEvent(e){if(void 0!==this.#$)throw new Error("RequestWillBeSentEvent is already set");this.#$=e,void 0!==this.#F&&this.#K.resolve(),this.#H()}onRequestWillBeSentExtraInfoEvent(e){if(void 0!==this.#F)throw new Error("RequestWillBeSentExtraInfoEvent is already set");this.#F=e,void 0!==this.#$&&this.#K.resolve()}onResponseReceivedEvent(e){if(void 0!==this.#q)throw new Error("ResponseReceivedEvent is already set");this.#q=e,void 0!==this.#W&&this.#J.resolve(),this.#G()}onResponseReceivedEventExtraInfo(e){if(void 0!==this.#W)throw new Error("ResponseReceivedExtraInfoEvent is already set");this.#W=e,void 0!==this.#q&&this.#J.resolve()}onLoadingFailedEvent(e){this.#K.resolve(),this.#J.reject(e);const t={...this.#Y(),errorText:e.errorText};this.#l.registerEvent({method:ie.Network.EventNames.FetchErrorEvent,params:t},this.#$?.frameId??null)}#H(){this.#Q()||this.#l.registerPromiseEvent(this.#K.then((()=>this.#X())),this.#$?.frameId??null,ie.Network.EventNames.BeforeRequestSentEvent)}#X(){if(void 0===this.#$)throw new Error("RequestWillBeSentEvent is not set");const e={...this.#Y(),initiator:{type:this.#ee()}};return{method:ie.Network.EventNames.BeforeRequestSentEvent,params:e}}#Y(){return{context:this.#$?.frameId??null,navigation:this.#$?.loaderId??null,redirectCount:0,request:this.#te(),timestamp:Math.round(1e3*(this.#$?.wallTime??0))}}#te(){const e=void 0===this.#F?[]:oe.#se(this.#F.associatedCookies);return{request:this.#$?.requestId??oe.#U,url:this.#$?.request.url??oe.#U,method:this.#$?.request.method??oe.#U,headers:Object.keys(this.#$?.request.headers??[]).map((e=>({name:e,value:this.#$?.request.headers[e]}))),cookies:e,headersSize:-1,bodySize:0,timings:{timeOrigin:0,requestTime:0,redirectStart:0,redirectEnd:0,fetchStart:0,dnsStart:0,dnsEnd:0,connectStart:0,connectEnd:0,tlsStart:0,tlsEnd:0,requestStart:0,responseStart:0,responseEnd:0}}}#ee(){switch(this.#$?.initiator.type){case"parser":case"script":case"preflight":return this.#$?.initiator.type;default:return"other"}}static#ne(e){switch(e){case"Strict":return"strict";case"Lax":return"lax";default:return"none"}}static#se(e){return e.map((e=>({name:e.cookie.name,value:e.cookie.value,domain:e.cookie.domain,path:e.cookie.path,expires:e.cookie.expires,size:e.cookie.size,httpOnly:e.cookie.httpOnly,secure:e.cookie.secure,sameSite:oe.#ne(e.cookie.sameSite)})))}#G(){this.#Q()||this.#l.registerPromiseEvent(this.#J.then((()=>this.#re())),this.#q?.frameId??null,ie.Network.EventNames.ResponseCompletedEvent)}#re(){if(void 0===this.#q)throw new Error("ResponseReceivedEvent is not set");if(void 0===this.#$)throw new Error("RequestWillBeSentEvent is not set");return{method:ie.Network.EventNames.ResponseCompletedEvent,params:{...this.#Y(),response:{url:this.#q.response.url,protocol:this.#q.response.protocol,status:this.#q.response.status,statusText:this.#q.response.statusText,fromCache:this.#q.response.fromDiskCache||this.#q.response.fromPrefetchCache,headers:this.#ae(this.#q.response.headers),mimeType:this.#q.response.mimeType,bytesReceived:this.#q.response.encodedDataLength,headersSize:this.#W?.headersText?.length??-1,bodySize:-1,content:{size:-1}}}}}#ae(e){return Object.keys(e).map((t=>({name:t,value:e[t]})))}#Q(){return this.#$?.request.url.endsWith("/favicon.ico")??!1}}re.NetworkRequest=oe,Object.defineProperty(ne,"__esModule",{value:!0}),ne.NetworkProcessor=void 0;const de=re;class ce{#l;#ie=new Map;constructor(e){this.#l=e}static async create(e,t){const s=new ce(t);return e.on("Network.requestWillBeSent",(e=>{s.#oe(e.requestId).onRequestWillBeSentEvent(e)})),e.on("Network.requestWillBeSentExtraInfo",(e=>{s.#oe(e.requestId).onRequestWillBeSentExtraInfoEvent(e)})),e.on("Network.responseReceived",(e=>{s.#oe(e.requestId).onResponseReceivedEvent(e)})),e.on("Network.responseReceivedExtraInfo",(e=>{s.#oe(e.requestId).onResponseReceivedEventExtraInfo(e)})),e.on("Network.loadingFailed",(e=>{s.#oe(e.requestId).onLoadingFailedEvent(e)})),await e.sendCommand("Network.enable"),s}#oe(e){if(!this.#ie.has(e)){const t=new de.NetworkRequest(e,this.#l);this.#ie.set(e,t)}return this.#ie.get(e)}}ne.NetworkProcessor=ce,Object.defineProperty(F,"__esModule",{value:!0}),F.CdpTarget=void 0;const ue=q,le=C,pe=M,he=ne;class me{#de;#ce;#S;#l;#ue;#le;static create(e,t,s,n,r){const a=new me(e,t,s,r);return ue.LogManager.create(a,n,r),a.#pe(),a.#he(),a}constructor(e,t,s,n){this.#ce=e,this.#S=t,this.#ue=s,this.#l=n,this.#le=!1,this.#de=new pe.Deferred}get targetUnblocked(){return this.#de}get targetId(){return this.#ce}get cdpClient(){return this.#S}get cdpSessionId(){return this.#ue}async#he(){this.#l.isNetworkDomainEnabled&&await this.enableNetworkDomain(),await this.#S.sendCommand("Runtime.enable"),await this.#S.sendCommand("Page.enable"),await this.#S.sendCommand("Page.setLifecycleEventsEnabled",{enabled:!0}),await this.#S.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),await this.#S.sendCommand("Runtime.runIfWaitingForDebugger"),this.#de.resolve()}async enableNetworkDomain(){this.#le||(this.#le=!0,await he.NetworkProcessor.create(this.cdpClient,this.#l))}#pe(){this.#S.on("*",((e,t)=>{this.#l.registerEvent({method:le.CDP.EventNames.EventReceivedEvent,params:{cdpMethod:e,cdpParams:t||{},cdpSession:this.#ue}},null)}))}}F.CdpTarget=me,Object.defineProperty(N,"__esModule",{value:!0}),N.BrowsingContextProcessor=void 0;const ge=C,fe=T,ve=Z,ye=F;N.BrowsingContextProcessor=class{#x;#me;#l;#s;#y;#ge;constructor(e,t,s,n,r,a){this.#x=r,this.#me=t,this.#l=n,this.#s=a,this.#y=e,this.#ge=s,this.#pe(this.#me.browserClient())}#pe(e){e.on("Target.attachedToTarget",(async t=>{await this.#fe(t,e)})),e.on("Target.detachedFromTarget",(async e=>{await this.#ve(e)})),e.on("Page.frameAttached",(e=>{this.#ye(e)})),e.on("Page.frameDetached",(async e=>{await this.#xe(e)}))}#ye(e){const t=this.#x.findContext(e.parentFrameId);void 0!==t&&ve.BrowsingContextImpl.create(t.cdpTarget,this.#y,e.frameId,e.parentFrameId,this.#l,this.#x,this.#s)}async#xe(e){"swap"!==e.reason&&await(this.#x.findContext(e.frameId)?.delete())}async#fe(e,t){const{sessionId:s,targetInfo:n}=e,r=this.#me.getCdpClient(s);if(!this.#be(n))return await r.sendCommand("Runtime.runIfWaitingForDebugger"),void await t.sendCommand("Target.detachFromTarget",e);this.#s?.(fe.LogType.browsingContexts,"AttachedToTarget event received:",JSON.stringify(e,null,2)),this.#pe(r);const a=ye.CdpTarget.create(n.targetId,r,s,this.#y,this.#l);this.#x.hasKnownContext(n.targetId)?this.#x.getKnownContext(n.targetId).updateCdpTarget(a):ve.BrowsingContextImpl.create(a,this.#y,n.targetId,null,this.#l,this.#x,this.#s)}async#ve(e){const t=e.targetId;await(this.#x.findContext(t)?.delete())}process_browsingContext_getTree(e){return{result:{contexts:(void 0===e.root?this.#x.getTopLevelContexts():[this.#x.getKnownContext(e.root)]).map((t=>t.serializeToBidiValue(e.maxDepth??Number.MAX_VALUE)))}}}async process_browsingContext_create(e){const t=this.#me.browserClient();let s;if(void 0!==e.referenceContext&&(s=this.#x.getKnownContext(e.referenceContext),null!==s.parentId))throw new ge.Message.InvalidArgumentException("referenceContext should be a top-level context");const n=(await t.sendCommand("Target.createTarget",{url:"about:blank",newWindow:"window"===e.type})).targetId,r=this.#x.getKnownContext(n);return await r.awaitLoaded(),{result:r.serializeToBidiValue(1)}}async process_browsingContext_navigate(e){return this.#x.getKnownContext(e.context).navigate(e.url,void 0===e.wait?"none":e.wait)}async process_browsingContext_captureScreenshot(e){return this.#x.getKnownContext(e.context).captureScreenshot()}async process_browsingContext_print(e){return this.#x.getKnownContext(e.context).print(e)}async#Ce(e){if("realm"in e)return this.#y.getRealm({realmId:e.realm});return this.#x.getKnownContext(e.context).getOrCreateSandbox(e.sandbox)}async process_script_addPreloadScript(e){const t=[],s=[];return e.context?t.push(this.#x.getKnownContext(e.context)):t.push(...this.#x.getAllContexts()),s.push(...await Promise.all(t.map((t=>t.addPreloadScript(e))))),s[0]}async process_script_removePreloadScript(e){throw new ge.Message.UnknownErrorException("Not implemented.")}async process_script_evaluate(e){return(await this.#Ce(e.target)).scriptEvaluate(e.expression,e.awaitPromise,e.resultOwnership??"none")}process_script_getRealms(e){void 0!==e.context&&this.#x.getKnownContext(e.context);const t=this.#y.findRealms({browsingContextId:e.context,type:e.type}).map((e=>e.toBiDi()));return{result:{realms:t}}}async process_script_callFunction(e){return(await this.#Ce(e.target)).callFunction(e.functionDeclaration,e.this||{type:"undefined"},e.arguments||[],e.awaitPromise,e.resultOwnership??"none")}async process_script_disown(e){const t=await this.#Ce(e.target);return await Promise.all(e.handles.map((async e=>t.disown(e)))),{result:{}}}async process_browsingContext_close(e){const t=this.#me.browserClient();if(null!==this.#x.getKnownContext(e.context).parentId)throw new ge.Message.InvalidArgumentException("Not a top-level browsing context cannot be closed.");const s=new Promise((s=>{const n=r=>{r.targetId===e.context&&(t.off("Target.detachedFromTarget",n),s())};t.on("Target.detachedFromTarget",n)}));return await t.sendCommand("Target.closeTarget",{targetId:e.context}),await s,{result:{}}}#be(e){return e.targetId!==this.#ge&&["page","iframe"].includes(e.type)}async process_cdp_sendCommand(e){const t=e.cdpSession?this.#me.getCdpClient(e.cdpSession):this.#me.browserClient();return{result:await t.sendCommand(e.cdpMethod,e.cdpParams),cdpSession:e.cdpSession}}process_cdp_getSession(e){const t=e.context,s=this.#x.getKnownContext(t).cdpTarget.cdpSessionId;return void 0===s?{result:{cdpSession:null}}:{result:{cdpSession:s}}}};var xe={};Object.defineProperty(xe,"__esModule",{value:!0}),xe.OutgoingBidiMessage=void 0;class be{#we;#_e;constructor(e,t){this.#we=e,this.#_e=t}static async createFromPromise(e,t){return e.then((e=>new be(e,t)))}static createResolved(e,t){return Promise.resolve(new be(e,t))}get message(){return this.#we}get channel(){return this.#_e}}xe.OutgoingBidiMessage=be,Object.defineProperty(k,"__esModule",{value:!0}),k.CommandProcessor=void 0;const Ce=C,we=T,_e=_,Ie=N,Se=xe;class Ee{parseAddPreloadScriptParams(e){return e}parseRemovePreloadScriptParams(e){return e}parseGetRealmsParams(e){return e}parseCallFunctionParams(e){return e}parseEvaluateParams(e){return e}parseDisownParams(e){return e}parseSendCommandParams(e){return e}parseGetSessionParams(e){return e}parseSubscribeParams(e){return e}parseNavigateParams(e){return e}parseGetTreeParams(e){return e}parseCreateParams(e){return e}parseCloseParams(e){return e}parseCaptureScreenshotParams(e){return e}parsePrintParams(e){return e}}class Te extends _e.EventEmitter{#Ie;#l;#Se;#s;constructor(e,t,s,n,r=new Ee,a,i){super(),this.#l=s,this.#s=i,this.#Ie=new Ie.BrowsingContextProcessor(e,t,n,s,a,i),this.#Se=r}static#Ee(){return{result:{ready:!1,message:"already connected"}}}async#Te(e,t){return await this.#l.subscribe(e.events,e.contexts??[null],t),{result:{}}}async#Pe(e,t){return await this.#l.unsubscribe(e.events,e.contexts??[null],t),{result:{}}}async#ke(e){switch(e.method){case"session.status":return Te.#Ee();case"session.subscribe":return this.#Te(this.#Se.parseSubscribeParams(e.params),e.channel??null);case"session.unsubscribe":return this.#Pe(this.#Se.parseSubscribeParams(e.params),e.channel??null);case"browsingContext.create":return this.#Ie.process_browsingContext_create(this.#Se.parseCreateParams(e.params));case"browsingContext.close":return this.#Ie.process_browsingContext_close(this.#Se.parseCloseParams(e.params));case"browsingContext.getTree":return this.#Ie.process_browsingContext_getTree(this.#Se.parseGetTreeParams(e.params));case"browsingContext.navigate":return this.#Ie.process_browsingContext_navigate(this.#Se.parseNavigateParams(e.params));case"browsingContext.captureScreenshot":return this.#Ie.process_browsingContext_captureScreenshot(this.#Se.parseCaptureScreenshotParams(e.params));case"browsingContext.print":return this.#Ie.process_browsingContext_print(this.#Se.parsePrintParams(e.params));case"script.addPreloadScript":return this.#Ie.process_script_addPreloadScript(this.#Se.parseAddPreloadScriptParams(e.params));case"script.removePreloadScript":return this.#Ie.process_script_removePreloadScript(this.#Se.parseRemovePreloadScriptParams(e.params));case"script.getRealms":return this.#Ie.process_script_getRealms(this.#Se.parseGetRealmsParams(e.params));case"script.callFunction":return this.#Ie.process_script_callFunction(this.#Se.parseCallFunctionParams(e.params));case"script.evaluate":return this.#Ie.process_script_evaluate(this.#Se.parseEvaluateParams(e.params));case"script.disown":return this.#Ie.process_script_disown(this.#Se.parseDisownParams(e.params));case"cdp.sendCommand":return this.#Ie.process_cdp_sendCommand(this.#Se.parseSendCommandParams(e.params));case"cdp.getSession":return this.#Ie.process_cdp_getSession(this.#Se.parseGetSessionParams(e.params));default:throw new Ce.Message.UnknownCommandException(`Unknown command '${e.method}'.`)}}async processCommand(e){try{const t=await this.#ke(e),s={id:e.id,...t};this.emit("response",Se.OutgoingBidiMessage.createResolved(s,e.channel??null))}catch(t){if(t instanceof Ce.Message.ErrorResponse){const s=t;this.emit("response",Se.OutgoingBidiMessage.createResolved(s.toErrorResponse(e.id),e.channel??null))}else{const s=t;this.#s?.(we.LogType.bidi,s),this.emit("response",Se.OutgoingBidiMessage.createResolved(new Ce.Message.ErrorResponse(Ce.Message.ErrorCode.UnknownError,s.message).toErrorResponse(e.id),e.channel??null))}}}}k.CommandProcessor=Te;var Pe={};Object.defineProperty(Pe,"__esModule",{value:!0}),Pe.BrowsingContextStorage=void 0;const ke=C;Pe.BrowsingContextStorage=class{#Ne=new Map;getTopLevelContexts(){return Array.from(this.#Ne.values()).filter((e=>null===e.parentId))}getAllContexts(){return Array.from(this.#Ne.values())}removeContext(e){this.#Ne.delete(e)}addContext(e){this.#Ne.set(e.contextId,e),null!==e.parentId&&this.getKnownContext(e.parentId).addChild(e)}hasKnownContext(e){return this.#Ne.has(e)}findContext(e){return this.#Ne.get(e)}getKnownContext(e){const t=this.findContext(e);if(void 0===t)throw new ke.Message.NoSuchFrameException(`Context ${e} not found`);return t}};var Ne={},Ze={};Object.defineProperty(Ze,"__esModule",{value:!0}),Ze.Buffer=void 0;Ze.Buffer=class{#Ze;#Oe=[];#Me;constructor(e,t=(()=>{})){this.#Ze=e,this.#Me=t}get(){return this.#Oe}add(e){for(this.#Oe.push(e);this.#Oe.length>this.#Ze;){const e=this.#Oe.shift();void 0!==e&&this.#Me(e)}}};var Oe={};Object.defineProperty(Oe,"__esModule",{value:!0}),Oe.IdWrapper=void 0;class Me{static#De=0;#Re;constructor(){this.#Re=++Me.#De}get id(){return this.#Re}}Oe.IdWrapper=Me;var De={};Object.defineProperty(De,"__esModule",{value:!0}),De.SubscriptionManager=De.unrollEvents=De.cartesianProduct=void 0;const Re=C;function je(...e){return e.reduce(((e,t)=>e.flatMap((e=>t.map((t=>[e,t].flat()))))))}function Ae(e){const t=[];for(const s of e)switch(s){case Re.BrowsingContext.AllEvents:t.push(...Object.values(Re.BrowsingContext.EventNames));break;case Re.CDP.AllEvents:t.push(...Object.values(Re.CDP.EventNames));break;case Re.Log.AllEvents:t.push(...Object.values(Re.Log.EventNames));break;case Re.Network.AllEvents:t.push(...Object.values(Re.Network.EventNames));break;case Re.Script.AllEvents:t.push(...Object.values(Re.Script.EventNames));break;default:t.push(s)}return t}De.cartesianProduct=je,De.unrollEvents=Ae;De.SubscriptionManager=class{#je=0;#Ae=new Map;#x;constructor(e){this.#x=e}getChannelsSubscribedToEvent(e,t){return Array.from(this.#Ae.keys()).map((s=>({priority:this.#ze(e,t,s),channel:s}))).filter((({priority:e})=>null!==e)).sort(((e,t)=>e.priority-t.priority)).map((({channel:e})=>e))}#ze(e,t,s){const n=this.#Ae.get(s);if(void 0===n)return null;const r=this.#Le(t),a=[...new Set([null,r])].map((t=>n.get(t)?.get(e))).filter((e=>void 0!==e));return 0===a.length?null:Math.min(...a)}#Le(e){if(null===e)return null;const t=this.#x.findContext(e)?.parentId??null;return null!==t?this.#Le(t):e}subscribe(e,t,s){if(t=this.#Le(t),e===Re.BrowsingContext.AllEvents)return void Object.values(Re.BrowsingContext.EventNames).map((e=>this.subscribe(e,t,s)));if(e===Re.CDP.AllEvents)return void Object.values(Re.CDP.EventNames).map((e=>this.subscribe(e,t,s)));if(e===Re.Log.AllEvents)return void Object.values(Re.Log.EventNames).map((e=>this.subscribe(e,t,s)));if(e===Re.Network.AllEvents)return void Object.values(Re.Network.EventNames).map((e=>this.subscribe(e,t,s)));if(e===Re.Script.AllEvents)return void Object.values(Re.Script.EventNames).map((e=>this.subscribe(e,t,s)));this.#Ae.has(s)||this.#Ae.set(s,new Map);const n=this.#Ae.get(s);n.has(t)||n.set(t,new Map);const r=n.get(t);r.has(e)||r.set(e,this.#je++)}unsubscribeAll(e,t,s){for(const e of t)null!==e&&this.#x.getKnownContext(e);je(Ae(e),t).map((([e,t])=>this.#Be(e,t,s))).forEach((e=>e()))}unsubscribe(e,t,s){this.unsubscribeAll([e],[t],s)}#Be(e,t,s){if(t=this.#Le(t),!this.#Ae.has(s))throw new Re.Message.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const n=this.#Ae.get(s);if(!n.has(t))throw new Re.Message.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const r=n.get(t);if(!r.has(e))throw new Re.Message.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);return()=>{r.delete(e),0===r.size&&n.delete(e),0===n.size&&this.#Ae.delete(s)}}},Object.defineProperty(Ne,"__esModule",{value:!0}),Ne.EventManager=void 0;const ze=Ze,Le=Oe,Be=xe,Ve=De;class Ue{#Ve;#P;#Ue;constructor(e,t){this.#Ve=new Le.IdWrapper,this.#P=t,this.#Ue=e}get id(){return this.#Ve.id}get contextId(){return this.#P}get event(){return this.#Ue}}const $e=new Map([["log.entryAdded",100]]);class Fe{static#$e="network";#Fe=new Map;#qe=new Map;#We=new Map;#Ke;#Je;#He;constructor(e){this.#Je=e,this.#Ke=new Ve.SubscriptionManager(e.getBrowsingContextStorage()),this.#He=!1}get isNetworkDomainEnabled(){return this.#He}static#Ge(e,t,s){return JSON.stringify({eventName:e,browsingContext:t,channel:s})}registerEvent(e,t){this.registerPromiseEvent(Promise.resolve(e),t,e.method)}registerPromiseEvent(e,t,s){const n=new Ue(e,t),r=this.#Ke.getChannelsSubscribedToEvent(s,t);this.#Ye(n,s);for(const t of r)this.#Je.emitOutgoingMessage(Be.OutgoingBidiMessage.createFromPromise(e,t)),this.#Qe(n,t,s)}async subscribe(e,t,s){for(const e of t)null!==e&&this.#Je.getBrowsingContextStorage().getKnownContext(e);for(const n of e)for(const e of t){await this.#Xe(n,e),this.#Ke.subscribe(n,e,s);for(const t of this.#et(n,e,s))this.#Je.emitOutgoingMessage(Be.OutgoingBidiMessage.createFromPromise(t.event,s)),this.#Qe(t,s,n)}}async#Xe(e,t){e.startsWith(Fe.#$e)&&(null===t?(this.#He=!0,await Promise.all(this.#Je.getBrowsingContextStorage().getAllContexts().map((e=>e.cdpTarget.enableNetworkDomain())))):await this.#Je.getBrowsingContextStorage().getKnownContext(t).cdpTarget.enableNetworkDomain())}unsubscribe(e,t,s){this.#Ke.unsubscribeAll(e,t,s)}#Ye(e,t){if(!$e.has(t))return;const s=Fe.#Ge(t,e.contextId);this.#qe.has(s)||this.#qe.set(s,new ze.Buffer($e.get(t))),this.#qe.get(s).add(e),this.#Fe.has(t)||this.#Fe.set(t,new Set),this.#Fe.get(t).add(e.contextId)}#Qe(e,t,s){if(!$e.has(s))return;const n=Fe.#Ge(s,e.contextId,t);this.#We.set(n,Math.max(this.#We.get(n)??0,e.id))}#et(e,t,s){const n=Fe.#Ge(e,t),r=Fe.#Ge(e,t,s),a=this.#We.get(r)??-1/0,i=this.#qe.get(n)?.get().filter((e=>e.id>a))??[];return null===t&&Array.from(this.#Fe.get(e)?.keys()??[]).filter((e=>null!==e&&this.#Je.getBrowsingContextStorage().hasKnownContext(e))).map((t=>this.#et(e,t,s))).forEach((e=>i.push(...e))),i.sort(((e,t)=>e.id-t.id))}}Ne.EventManager=Fe;var qe={};Object.defineProperty(qe,"__esModule",{value:!0}),qe.RealmStorage=void 0;const We=C;qe.RealmStorage=class{#tt=new Map;#st=new Map;get knownHandlesToRealm(){return this.#tt}get realmMap(){return this.#st}findRealms(e){return Array.from(this.#st.values()).filter((t=>(void 0===e.realmId||e.realmId===t.realmId)&&((void 0===e.browsingContextId||e.browsingContextId===t.browsingContextId)&&((void 0===e.navigableId||e.navigableId===t.navigableId)&&((void 0===e.executionContextId||e.executionContextId===t.executionContextId)&&((void 0===e.origin||e.origin===t.origin)&&((void 0===e.type||e.type===t.type)&&((void 0===e.sandbox||e.sandbox===t.sandbox)&&(void 0===e.cdpSessionId||e.cdpSessionId===t.cdpSessionId)))))))))}findRealm(e){const t=this.findRealms(e);if(1===t.length)return t[0]}getRealm(e){const t=this.findRealm(e);if(void 0===t)throw new We.Message.NoSuchFrameException(`Realm ${JSON.stringify(e)} not found`);return t}deleteRealms(e){this.findRealms(e).map((e=>{this.#st.delete(e.realmId),Array.from(this.#tt.entries()).filter((([,t])=>t===e.realmId)).map((([e])=>this.#tt.delete(e)))}))}},Object.defineProperty(w,"__esModule",{value:!0}),w.BidiServer=void 0;const Ke=_,Je=E,He=k,Ge=Pe,Ye=Ne,Qe=qe;class Xe extends Ke.EventEmitter{#nt;#rt;#at;#x;#y;#s;#it=e=>{this.#at.processCommand(e)};#ot=async e=>{const t=e.message;null!==e.channel&&(t.channel=e.channel),await this.#rt.sendMessage(t)};constructor(e,t,s,n,r){super(),this.#s=r,this.#x=new Ge.BrowsingContextStorage,this.#y=new Qe.RealmStorage,this.#nt=new Je.ProcessingQueue(this.#ot,(()=>Promise.resolve()),this.#s),this.#rt=e,this.#rt.setOnMessage(this.#it),this.#at=new He.CommandProcessor(this.#y,t,new Ye.EventManager(this),s,n,this.#x,this.#s),this.#at.on("response",(e=>{this.emitOutgoingMessage(e)}))}static async createAndStart(e,t,s,n,r){const a=new Xe(e,t,s,n,r),i=t.browserClient();return await i.sendCommand("Target.setDiscoverTargets",{discover:!0}),await i.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),await a.topLevelContextsLoaded(),a}async topLevelContextsLoaded(){await Promise.all(this.#x.getTopLevelContexts().map((e=>e.awaitLoaded())))}emitOutgoingMessage(e){this.#nt.add(e)}close(){this.#rt.close()}getBrowsingContextStorage(){return this.#x}}w.BidiServer=Xe;var et={},tt={};Object.defineProperty(tt,"__esModule",{value:!0}),tt.CdpClient=void 0;const st=_;class nt extends st.EventEmitter{#me;#dt;constructor(e,t){super(),this.#me=e,this.#dt=t}static create(e,t){return new nt(e,t)}sendCommand(e,...t){const s=t[0];return this.#me.sendCommand(e,s,this.#dt)}}tt.CdpClient=nt;var rt={};Object.defineProperty(rt,"__esModule",{value:!0}),rt.CdpConnection=void 0;const at=tt;rt.CdpConnection=class{#rt;#ct;#ut=new Map;#lt=new Map;#pt;#ht=0;constructor(e,t=(()=>{})){this.#rt=e,this.#pt=t,this.#rt.setOnMessage(this.#mt),this.#ct=at.CdpClient.create(this,null)}close(){this.#rt.close();for(const[,{reject:e}]of this.#lt)e(new Error("Disconnected"));this.#lt.clear(),this.#ut.clear()}browserClient(){return this.#ct}getCdpClient(e){const t=this.#ut.get(e);if(!t)throw new Error("Unknown CDP session ID");return t}sendCommand(e,t,s){return new Promise(((n,r)=>{const a=this.#ht++;this.#lt.set(a,{resolve:n,reject:r});const i={id:a,method:e,params:t};s&&(i.sessionId=s);const o=JSON.stringify(i),d=JSON.stringify(i,null,2);this.#rt.sendMessage(o),this.#pt("sent ▸",d)}))}#mt=e=>{const t=JSON.parse(e),s=JSON.stringify(t,null,2);if(this.#pt("received ◂",s),"Target.attachedToTarget"===t.method){const{sessionId:e}=t.params;this.#ut.set(e,at.CdpClient.create(this,e))}else if("Target.detachedFromTarget"===t.method){const{sessionId:e}=t.params;this.#ut.get(e)&&this.#ut.delete(e)}if(void 0!==t.id){const e=this.#lt.get(t.id);e&&(t.result?e.resolve(t.result):t.error&&e.reject(t.error))}else if(t.method){const e=t.sessionId?this.#ut.get(t.sessionId):this.#ct;e&&e.emit(t.method,t.params||{})}}};var it={};Object.defineProperty(it,"__esModule",{value:!0}),it.WebSocketTransport=void 0;it.WebSocketTransport=class{#mt=null;#gt;constructor(e){this.#gt=e,this.#gt.on("message",(e=>{this.#mt?.(e)}))}setOnMessage(e){this.#mt=e}sendMessage(e){this.#gt.send(e)}close(){this.#mt=null,this.#gt.close()}},function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.WebSocketTransport=e.CdpConnection=e.CdpClient=void 0;var t=tt;Object.defineProperty(e,"CdpClient",{enumerable:!0,get:function(){return t.CdpClient}});var s=rt;Object.defineProperty(e,"CdpConnection",{enumerable:!0,get:function(){return s.CdpConnection}});var n=it;Object.defineProperty(e,"WebSocketTransport",{enumerable:!0,get:function(){return n.WebSocketTransport}})}(et);var ot={};Object.defineProperty(ot,"__esModule",{value:!0}),ot.log=ot.generatePage=void 0;const dt=T;function ct(e){const t=`${e}_log`,s=document.getElementById(t);if(s)return s;const n=document.getElementById("details"),r=document.createElement("div");r.className="divider",n.appendChild(r);const a=document.createElement("div");return a.className="item",a.innerHTML=`<h3>${e}</h3><div id="${t}" class="log"></div>`,n.appendChild(a),document.getElementById(t)}ot.generatePage=function(){globalThis.document?.documentElement&&(window.document.documentElement.innerHTML='<!DOCTYPE html><title>BiDi-CDP Mapper</title><style>body{font-family: Roboto, serif; font-size: 13px; color: #202124;}.log{padding: 12px; font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace; font-size: 11px; line-height: 180%; background: #f1f3f4; border-radius: 4px;}.pre{overflow-wrap: break-word; padding: 10px;}.card{margin: 60px auto; padding: 2px 0; max-width: 900px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15), 0 1px 6px rgba(0, 0, 0, 0.2); border-radius: 8px;}.divider{height: 1px; background: #f0f0f0;}.item{padding: 16px 20px;}</style><div class="card"><div class="item"><h1>BiDi-CDP Mapper is controlling this tab</h1><p>Closing or reloading it will stop the BiDi process. <a target="_blank" title="BiDi-CDP Mapper GitHub Repository" href="https://github.com/GoogleChromeLabs/chromium-bidi">Details.</a></p></div><div class="divider"></div><details id="details"><summary class="item">Debug information</summary></details></div>',ct(dt.LogType.system),ct(dt.LogType.bidi),ct(dt.LogType.browsingContexts),ct(dt.LogType.cdp))},ot.log=function(t,...s){if(!globalThis.document?.documentElement)return;e.window?.sendDebugMessage?.(JSON.stringify({logType:t,messages:s}));const n=ct(t),r=document.createElement("div");r.className="pre",r.textContent=s.join(" "),n.appendChild(r)};
+var mapperTab=function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e){if(e.__esModule)return e;var t=e.default;if("function"==typeof t){var n=function e(){if(this instanceof e){var n=[null];return n.push.apply(n,arguments),new(Function.bind.apply(t,n))}return t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach((function(t){var s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,s.get?s:{enumerable:!0,get:function(){return e[t]}})})),n}var n={},s={},r={},a={},i={},o={},d={};!function(e){var t;Object.defineProperty(e,"__esModule",{value:!0}),e.getParsedType=e.ZodParsedType=e.objectUtil=e.util=void 0,function(e){e.assertEqual=e=>e,e.assertIs=function(e){},e.assertNever=function(e){throw new Error},e.arrayToEnum=e=>{const t={};for(const n of e)t[n]=n;return t},e.getValidEnumValues=t=>{const n=e.objectKeys(t).filter((e=>"number"!=typeof t[t[e]])),s={};for(const e of n)s[e]=t[e];return e.objectValues(s)},e.objectValues=t=>e.objectKeys(t).map((function(e){return t[e]})),e.objectKeys="function"==typeof Object.keys?e=>Object.keys(e):e=>{const t=[];for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t},e.find=(e,t)=>{for(const n of e)if(t(n))return n},e.isInteger="function"==typeof Number.isInteger?e=>Number.isInteger(e):e=>"number"==typeof e&&isFinite(e)&&Math.floor(e)===e,e.joinValues=function(e,t=" | "){return e.map((e=>"string"==typeof e?`'${e}'`:e)).join(t)},e.jsonStringifyReplacer=(e,t)=>"bigint"==typeof t?t.toString():t}(t=e.util||(e.util={})),(e.objectUtil||(e.objectUtil={})).mergeShapes=(e,t)=>({...e,...t}),e.ZodParsedType=t.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]);e.getParsedType=t=>{switch(typeof t){case"undefined":return e.ZodParsedType.undefined;case"string":return e.ZodParsedType.string;case"number":return isNaN(t)?e.ZodParsedType.nan:e.ZodParsedType.number;case"boolean":return e.ZodParsedType.boolean;case"function":return e.ZodParsedType.function;case"bigint":return e.ZodParsedType.bigint;case"symbol":return e.ZodParsedType.symbol;case"object":return Array.isArray(t)?e.ZodParsedType.array:null===t?e.ZodParsedType.null:t.then&&"function"==typeof t.then&&t.catch&&"function"==typeof t.catch?e.ZodParsedType.promise:"undefined"!=typeof Map&&t instanceof Map?e.ZodParsedType.map:"undefined"!=typeof Set&&t instanceof Set?e.ZodParsedType.set:"undefined"!=typeof Date&&t instanceof Date?e.ZodParsedType.date:e.ZodParsedType.object;default:return e.ZodParsedType.unknown}}}(d);var c={};Object.defineProperty(c,"__esModule",{value:!0}),c.ZodError=c.quotelessJson=c.ZodIssueCode=void 0;const u=d;c.ZodIssueCode=u.util.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);c.quotelessJson=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class l extends Error{constructor(e){super(),this.issues=[],this.addIssue=e=>{this.issues=[...this.issues,e]},this.addIssues=(e=[])=>{this.issues=[...this.issues,...e]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}get errors(){return this.issues}format(e){const t=e||function(e){return e.message},n={_errors:[]},s=e=>{for(const r of e.issues)if("invalid_union"===r.code)r.unionErrors.map(s);else if("invalid_return_type"===r.code)s(r.returnTypeError);else if("invalid_arguments"===r.code)s(r.argumentsError);else if(0===r.path.length)n._errors.push(t(r));else{let e=n,s=0;for(;s<r.path.length;){const n=r.path[s];s===r.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(r))):e[n]=e[n]||{_errors:[]},e=e[n],s++}}};return s(this),n}toString(){return this.message}get message(){return JSON.stringify(this.issues,u.util.jsonStringifyReplacer,2)}get isEmpty(){return 0===this.issues.length}flatten(e=(e=>e.message)){const t={},n=[];for(const s of this.issues)s.path.length>0?(t[s.path[0]]=t[s.path[0]]||[],t[s.path[0]].push(e(s))):n.push(e(s));return{formErrors:n,fieldErrors:t}}get formErrors(){return this.flatten()}}c.ZodError=l,l.create=e=>new l(e),Object.defineProperty(o,"__esModule",{value:!0});const p=d,h=c;o.default=(e,t)=>{let n;switch(e.code){case h.ZodIssueCode.invalid_type:n=e.received===p.ZodParsedType.undefined?"Required":`Expected ${e.expected}, received ${e.received}`;break;case h.ZodIssueCode.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,p.util.jsonStringifyReplacer)}`;break;case h.ZodIssueCode.unrecognized_keys:n=`Unrecognized key(s) in object: ${p.util.joinValues(e.keys,", ")}`;break;case h.ZodIssueCode.invalid_union:n="Invalid input";break;case h.ZodIssueCode.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${p.util.joinValues(e.options)}`;break;case h.ZodIssueCode.invalid_enum_value:n=`Invalid enum value. Expected ${p.util.joinValues(e.options)}, received '${e.received}'`;break;case h.ZodIssueCode.invalid_arguments:n="Invalid function arguments";break;case h.ZodIssueCode.invalid_return_type:n="Invalid function return type";break;case h.ZodIssueCode.invalid_date:n="Invalid date";break;case h.ZodIssueCode.invalid_string:"object"==typeof e.validation?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,"number"==typeof e.validation.position&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:p.util.assertNever(e.validation):n="regex"!==e.validation?`Invalid ${e.validation}`:"Invalid";break;case h.ZodIssueCode.too_small:n="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:"date"===e.type?`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:"Invalid input";break;case h.ZodIssueCode.too_big:n="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"bigint"===e.type?`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"date"===e.type?`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:"Invalid input";break;case h.ZodIssueCode.custom:n="Invalid input";break;case h.ZodIssueCode.invalid_intersection_types:n="Intersection results could not be merged";break;case h.ZodIssueCode.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case h.ZodIssueCode.not_finite:n="Number must be finite";break;default:n=t.defaultError,p.util.assertNever(e)}return{message:n}};var m=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(i,"__esModule",{value:!0}),i.getErrorMap=i.setErrorMap=i.defaultErrorMap=void 0;const g=m(o);i.defaultErrorMap=g.default;let f=g.default;i.setErrorMap=function(e){f=e},i.getErrorMap=function(){return f};var v={};!function(t){var n=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isAsync=t.isValid=t.isDirty=t.isAborted=t.OK=t.DIRTY=t.INVALID=t.ParseStatus=t.addIssueToContext=t.EMPTY_PATH=t.makeIssue=void 0;const s=i,r=n(o);t.makeIssue=e=>{const{data:t,path:n,errorMaps:s,issueData:r}=e,a=[...n,...r.path||[]],i={...r,path:a};let o="";const d=s.filter((e=>!!e)).slice().reverse();for(const e of d)o=e(i,{data:t,defaultError:o}).message;return{...r,path:a,message:r.message||o}},t.EMPTY_PATH=[],t.addIssueToContext=function(e,n){const a=(0,t.makeIssue)({issueData:n,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,(0,s.getErrorMap)(),r.default].filter((e=>!!e))});e.common.issues.push(a)};class a{constructor(){this.value="valid"}dirty(){"valid"===this.value&&(this.value="dirty")}abort(){"aborted"!==this.value&&(this.value="aborted")}static mergeArray(e,n){const s=[];for(const r of n){if("aborted"===r.status)return t.INVALID;"dirty"===r.status&&e.dirty(),s.push(r.value)}return{status:e.value,value:s}}static async mergeObjectAsync(e,t){const n=[];for(const e of t)n.push({key:await e.key,value:await e.value});return a.mergeObjectSync(e,n)}static mergeObjectSync(e,n){const s={};for(const r of n){const{key:n,value:a}=r;if("aborted"===n.status)return t.INVALID;if("aborted"===a.status)return t.INVALID;"dirty"===n.status&&e.dirty(),"dirty"===a.status&&e.dirty(),(void 0!==a.value||r.alwaysSet)&&(s[n.value]=a.value)}return{status:e.value,value:s}}}t.ParseStatus=a,t.INVALID=Object.freeze({status:"aborted"});t.DIRTY=e=>({status:"dirty",value:e});t.OK=e=>({status:"valid",value:e});t.isAborted=e=>"aborted"===e.status;t.isDirty=e=>"dirty"===e.status;t.isValid=e=>"valid"===e.status;t.isAsync=e=>"undefined"!=typeof Promise&&e instanceof Promise}(v);var y={};Object.defineProperty(y,"__esModule",{value:!0});var b,x={},C={};b=C,Object.defineProperty(b,"__esModule",{value:!0}),b.errorUtil=void 0,function(e){e.errToObj=e=>"string"==typeof e?{message:e}:e||{},e.toString=e=>"string"==typeof e?e:null==e?void 0:e.message}(b.errorUtil||(b.errorUtil={})),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.discriminatedUnion=e.date=e.boolean=e.bigint=e.array=e.any=e.coerce=e.ZodFirstPartyTypeKind=e.late=e.ZodSchema=e.Schema=e.custom=e.ZodPipeline=e.ZodBranded=e.BRAND=e.ZodNaN=e.ZodCatch=e.ZodDefault=e.ZodNullable=e.ZodOptional=e.ZodTransformer=e.ZodEffects=e.ZodPromise=e.ZodNativeEnum=e.ZodEnum=e.ZodLiteral=e.ZodLazy=e.ZodFunction=e.ZodSet=e.ZodMap=e.ZodRecord=e.ZodTuple=e.ZodIntersection=e.ZodDiscriminatedUnion=e.ZodUnion=e.ZodObject=e.ZodArray=e.ZodVoid=e.ZodNever=e.ZodUnknown=e.ZodAny=e.ZodNull=e.ZodUndefined=e.ZodSymbol=e.ZodDate=e.ZodBoolean=e.ZodBigInt=e.ZodNumber=e.ZodString=e.ZodType=void 0,e.NEVER=e.void=e.unknown=e.union=e.undefined=e.tuple=e.transformer=e.symbol=e.string=e.strictObject=e.set=e.record=e.promise=e.preprocess=e.pipeline=e.ostring=e.optional=e.onumber=e.oboolean=e.object=e.number=e.nullable=e.null=e.never=e.nativeEnum=e.nan=e.map=e.literal=e.lazy=e.intersection=e.instanceof=e.function=e.enum=e.effect=void 0;const t=i,n=C,s=v,r=d,a=c;class o{constructor(e,t,n,s){this._cachedPath=[],this.parent=e,this.data=t,this._path=n,this._key=s}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const u=(e,t)=>{if((0,s.isValid)(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const t=new a.ZodError(e.common.issues);return this._error=t,this._error}}};function l(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:s,description:r}=e;if(t&&(n||s))throw new Error('Can\'t use "invalid_type_error" or "required_error" in conjunction with custom error map.');if(t)return{errorMap:t,description:r};return{errorMap:(e,t)=>"invalid_type"!==e.code?{message:t.defaultError}:void 0===t.data?{message:null!=s?s:t.defaultError}:{message:null!=n?n:t.defaultError},description:r}}class p{constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(e){return(0,r.getParsedType)(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:(0,r.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new s.ParseStatus,ctx:{common:e.parent.common,data:e.data,parsedType:(0,r.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if((0,s.isAsync)(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const n=this.safeParse(e,t);if(n.success)return n.data;throw n.error}safeParse(e,t){var n;const s={common:{issues:[],async:null!==(n=null==t?void 0:t.async)&&void 0!==n&&n,contextualErrorMap:null==t?void 0:t.errorMap},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,r.getParsedType)(e)},a=this._parseSync({data:e,path:s.path,parent:s});return u(s,a)}async parseAsync(e,t){const n=await this.safeParseAsync(e,t);if(n.success)return n.data;throw n.error}async safeParseAsync(e,t){const n={common:{issues:[],contextualErrorMap:null==t?void 0:t.errorMap,async:!0},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,r.getParsedType)(e)},a=this._parse({data:e,path:n.path,parent:n}),i=await((0,s.isAsync)(a)?a:Promise.resolve(a));return u(n,i)}refine(e,t){const n=e=>"string"==typeof t||void 0===t?{message:t}:"function"==typeof t?t(e):t;return this._refinement(((t,s)=>{const r=e(t),i=()=>s.addIssue({code:a.ZodIssueCode.custom,...n(t)});return"undefined"!=typeof Promise&&r instanceof Promise?r.then((e=>!!e||(i(),!1))):!!r||(i(),!1)}))}refinement(e,t){return this._refinement(((n,s)=>!!e(n)||(s.addIssue("function"==typeof t?t(n,s):t),!1)))}_refinement(e){return new ne({schema:this,typeName:ue.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}optional(){return se.create(this,this._def)}nullable(){return re.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return A.create(this,this._def)}promise(){return te.create(this,this._def)}or(e){return B.create([this,e],this._def)}and(e){return F.create(this,e,this._def)}transform(e){return new ne({...l(this._def),schema:this,typeName:ue.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t="function"==typeof e?e:()=>e;return new ae({...l(this._def),innerType:this,defaultValue:t,typeName:ue.ZodDefault})}brand(){return new de({typeName:ue.ZodBranded,type:this,...l(this._def)})}catch(e){const t="function"==typeof e?e:()=>e;return new ie({...l(this._def),innerType:this,catchValue:t,typeName:ue.ZodCatch})}describe(e){return new(0,this.constructor)({...this._def,description:e})}pipe(e){return ce.create(this,e)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}e.ZodType=p,e.Schema=p,e.ZodSchema=p;const h=/^c[^\s-]{8,}$/i,m=/^[a-z][a-z0-9]*$/,g=/[0-9A-HJKMNP-TV-Z]{26}/,f=/^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i,y=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/,b=/^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u,x=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,w=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;function _(e,t){return!("v4"!==t&&t||!x.test(e))||!("v6"!==t&&t||!w.test(e))}class I extends p{constructor(){super(...arguments),this._regex=(e,t,s)=>this.refinement((t=>e.test(t)),{validation:t,code:a.ZodIssueCode.invalid_string,...n.errorUtil.errToObj(s)}),this.nonempty=e=>this.min(1,n.errorUtil.errToObj(e)),this.trim=()=>new I({...this._def,checks:[...this._def.checks,{kind:"trim"}]}),this.toLowerCase=()=>new I({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]}),this.toUpperCase=()=>new I({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}_parse(e){this._def.coerce&&(e.data=String(e.data));if(this._getType(e)!==r.ZodParsedType.string){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.string,received:t.parsedType}),s.INVALID}const t=new s.ParseStatus;let n;for(const o of this._def.checks)if("min"===o.kind)e.data.length<o.value&&(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_small,minimum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),t.dirty());else if("max"===o.kind)e.data.length>o.value&&(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),t.dirty());else if("length"===o.kind){const r=e.data.length>o.value,i=e.data.length<o.value;(r||i)&&(n=this._getOrReturnCtx(e,n),r?(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!0,message:o.message}):i&&(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_small,minimum:o.value,type:"string",inclusive:!0,exact:!0,message:o.message}),t.dirty())}else if("email"===o.kind)y.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"email",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty());else if("emoji"===o.kind)b.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"emoji",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty());else if("uuid"===o.kind)f.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"uuid",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty());else if("cuid"===o.kind)h.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"cuid",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty());else if("cuid2"===o.kind)m.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"cuid2",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty());else if("ulid"===o.kind)g.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"ulid",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty());else if("url"===o.kind)try{new URL(e.data)}catch(r){n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"url",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty()}else if("regex"===o.kind){o.regex.lastIndex=0;o.regex.test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"regex",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty())}else if("trim"===o.kind)e.data=e.data.trim();else if("includes"===o.kind)e.data.includes(o.value,o.position)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_string,validation:{includes:o.value,position:o.position},message:o.message}),t.dirty());else if("toLowerCase"===o.kind)e.data=e.data.toLowerCase();else if("toUpperCase"===o.kind)e.data=e.data.toUpperCase();else if("startsWith"===o.kind)e.data.startsWith(o.value)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_string,validation:{startsWith:o.value},message:o.message}),t.dirty());else if("endsWith"===o.kind)e.data.endsWith(o.value)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_string,validation:{endsWith:o.value},message:o.message}),t.dirty());else if("datetime"===o.kind){((i=o).precision?i.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${i.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${i.precision}}Z$`):0===i.precision?i.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):i.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$")).test(e.data)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_string,validation:"datetime",message:o.message}),t.dirty())}else"ip"===o.kind?_(e.data,o.version)||(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{validation:"ip",code:a.ZodIssueCode.invalid_string,message:o.message}),t.dirty()):r.util.assertNever(o);var i;return{status:t.value,value:e.data}}_addCheck(e){return new I({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...n.errorUtil.errToObj(e)})}url(e){return this._addCheck({kind:"url",...n.errorUtil.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...n.errorUtil.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...n.errorUtil.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...n.errorUtil.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...n.errorUtil.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...n.errorUtil.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...n.errorUtil.errToObj(e)})}datetime(e){var t;return"string"==typeof e?this._addCheck({kind:"datetime",precision:null,offset:!1,message:e}):this._addCheck({kind:"datetime",precision:void 0===(null==e?void 0:e.precision)?null:null==e?void 0:e.precision,offset:null!==(t=null==e?void 0:e.offset)&&void 0!==t&&t,...n.errorUtil.errToObj(null==e?void 0:e.message)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...n.errorUtil.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:null==t?void 0:t.position,...n.errorUtil.errToObj(null==t?void 0:t.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...n.errorUtil.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...n.errorUtil.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...n.errorUtil.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...n.errorUtil.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...n.errorUtil.errToObj(t)})}get isDatetime(){return!!this._def.checks.find((e=>"datetime"===e.kind))}get isEmail(){return!!this._def.checks.find((e=>"email"===e.kind))}get isURL(){return!!this._def.checks.find((e=>"url"===e.kind))}get isEmoji(){return!!this._def.checks.find((e=>"emoji"===e.kind))}get isUUID(){return!!this._def.checks.find((e=>"uuid"===e.kind))}get isCUID(){return!!this._def.checks.find((e=>"cuid"===e.kind))}get isCUID2(){return!!this._def.checks.find((e=>"cuid2"===e.kind))}get isULID(){return!!this._def.checks.find((e=>"ulid"===e.kind))}get isIP(){return!!this._def.checks.find((e=>"ip"===e.kind))}get minLength(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}function S(e,t){const n=(e.toString().split(".")[1]||"").length,s=(t.toString().split(".")[1]||"").length,r=n>s?n:s;return parseInt(e.toFixed(r).replace(".",""))%parseInt(t.toFixed(r).replace(".",""))/Math.pow(10,r)}e.ZodString=I,I.create=e=>{var t;return new I({checks:[],typeName:ue.ZodString,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...l(e)})};class T extends p{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){this._def.coerce&&(e.data=Number(e.data));if(this._getType(e)!==r.ZodParsedType.number){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.number,received:t.parsedType}),s.INVALID}let t;const n=new s.ParseStatus;for(const i of this._def.checks)if("int"===i.kind)r.util.isInteger(e.data)||(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:"integer",received:"float",message:i.message}),n.dirty());else if("min"===i.kind){(i.inclusive?e.data<i.value:e.data<=i.value)&&(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.too_small,minimum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),n.dirty())}else if("max"===i.kind){(i.inclusive?e.data>i.value:e.data>=i.value)&&(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.too_big,maximum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),n.dirty())}else"multipleOf"===i.kind?0!==S(e.data,i.value)&&(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.not_multiple_of,multipleOf:i.value,message:i.message}),n.dirty()):"finite"===i.kind?Number.isFinite(e.data)||(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.not_finite,message:i.message}),n.dirty()):r.util.assertNever(i);return{status:n.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,n.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,n.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,n.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,n.errorUtil.toString(t))}setLimit(e,t,s,r){return new T({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:s,message:n.errorUtil.toString(r)}]})}_addCheck(e){return new T({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:n.errorUtil.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:n.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:n.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:n.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:n.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:n.errorUtil.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:n.errorUtil.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:n.errorUtil.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:n.errorUtil.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find((e=>"int"===e.kind||"multipleOf"===e.kind&&r.util.isInteger(e.value)))}get isFinite(){let e=null,t=null;for(const n of this._def.checks){if("finite"===n.kind||"int"===n.kind||"multipleOf"===n.kind)return!0;"min"===n.kind?(null===t||n.value>t)&&(t=n.value):"max"===n.kind&&(null===e||n.value<e)&&(e=n.value)}return Number.isFinite(t)&&Number.isFinite(e)}}e.ZodNumber=T,T.create=e=>new T({checks:[],typeName:ue.ZodNumber,coerce:(null==e?void 0:e.coerce)||!1,...l(e)});class E extends p{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){this._def.coerce&&(e.data=BigInt(e.data));if(this._getType(e)!==r.ZodParsedType.bigint){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.bigint,received:t.parsedType}),s.INVALID}let t;const n=new s.ParseStatus;for(const i of this._def.checks)if("min"===i.kind){(i.inclusive?e.data<i.value:e.data<=i.value)&&(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.too_small,type:"bigint",minimum:i.value,inclusive:i.inclusive,message:i.message}),n.dirty())}else if("max"===i.kind){(i.inclusive?e.data>i.value:e.data>=i.value)&&(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.too_big,type:"bigint",maximum:i.value,inclusive:i.inclusive,message:i.message}),n.dirty())}else"multipleOf"===i.kind?e.data%i.value!==BigInt(0)&&(t=this._getOrReturnCtx(e,t),(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.not_multiple_of,multipleOf:i.value,message:i.message}),n.dirty()):r.util.assertNever(i);return{status:n.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,n.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,n.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,n.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,n.errorUtil.toString(t))}setLimit(e,t,s,r){return new E({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:s,message:n.errorUtil.toString(r)}]})}_addCheck(e){return new E({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:n.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:n.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:n.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:n.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:n.errorUtil.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}e.ZodBigInt=E,E.create=e=>{var t;return new E({checks:[],typeName:ue.ZodBigInt,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...l(e)})};class P extends p{_parse(e){this._def.coerce&&(e.data=Boolean(e.data));if(this._getType(e)!==r.ZodParsedType.boolean){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.boolean,received:t.parsedType}),s.INVALID}return(0,s.OK)(e.data)}}e.ZodBoolean=P,P.create=e=>new P({typeName:ue.ZodBoolean,coerce:(null==e?void 0:e.coerce)||!1,...l(e)});class k extends p{_parse(e){this._def.coerce&&(e.data=new Date(e.data));if(this._getType(e)!==r.ZodParsedType.date){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.date,received:t.parsedType}),s.INVALID}if(isNaN(e.data.getTime())){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_date}),s.INVALID}const t=new s.ParseStatus;let n;for(const i of this._def.checks)"min"===i.kind?e.data.getTime()<i.value&&(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_small,message:i.message,inclusive:!0,exact:!1,minimum:i.value,type:"date"}),t.dirty()):"max"===i.kind?e.data.getTime()>i.value&&(n=this._getOrReturnCtx(e,n),(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_big,message:i.message,inclusive:!0,exact:!1,maximum:i.value,type:"date"}),t.dirty()):r.util.assertNever(i);return{status:t.value,value:new Date(e.data.getTime())}}_addCheck(e){return new k({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:n.errorUtil.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:n.errorUtil.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return null!=e?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return null!=e?new Date(e):null}}e.ZodDate=k,k.create=e=>new k({checks:[],coerce:(null==e?void 0:e.coerce)||!1,typeName:ue.ZodDate,...l(e)});class N extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.symbol){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.symbol,received:t.parsedType}),s.INVALID}return(0,s.OK)(e.data)}}e.ZodSymbol=N,N.create=e=>new N({typeName:ue.ZodSymbol,...l(e)});class Z extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.undefined,received:t.parsedType}),s.INVALID}return(0,s.OK)(e.data)}}e.ZodUndefined=Z,Z.create=e=>new Z({typeName:ue.ZodUndefined,...l(e)});class O extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.null){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.null,received:t.parsedType}),s.INVALID}return(0,s.OK)(e.data)}}e.ZodNull=O,O.create=e=>new O({typeName:ue.ZodNull,...l(e)});class M extends p{constructor(){super(...arguments),this._any=!0}_parse(e){return(0,s.OK)(e.data)}}e.ZodAny=M,M.create=e=>new M({typeName:ue.ZodAny,...l(e)});class D extends p{constructor(){super(...arguments),this._unknown=!0}_parse(e){return(0,s.OK)(e.data)}}e.ZodUnknown=D,D.create=e=>new D({typeName:ue.ZodUnknown,...l(e)});class R extends p{_parse(e){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.never,received:t.parsedType}),s.INVALID}}e.ZodNever=R,R.create=e=>new R({typeName:ue.ZodNever,...l(e)});class j extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.void,received:t.parsedType}),s.INVALID}return(0,s.OK)(e.data)}}e.ZodVoid=j,j.create=e=>new j({typeName:ue.ZodVoid,...l(e)});class A extends p{_parse(e){const{ctx:t,status:n}=this._processInputParams(e),i=this._def;if(t.parsedType!==r.ZodParsedType.array)return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.array,received:t.parsedType}),s.INVALID;if(null!==i.exactLength){const e=t.data.length>i.exactLength.value,r=t.data.length<i.exactLength.value;(e||r)&&((0,s.addIssueToContext)(t,{code:e?a.ZodIssueCode.too_big:a.ZodIssueCode.too_small,minimum:r?i.exactLength.value:void 0,maximum:e?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),n.dirty())}if(null!==i.minLength&&t.data.length<i.minLength.value&&((0,s.addIssueToContext)(t,{code:a.ZodIssueCode.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),n.dirty()),null!==i.maxLength&&t.data.length>i.maxLength.value&&((0,s.addIssueToContext)(t,{code:a.ZodIssueCode.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),n.dirty()),t.common.async)return Promise.all([...t.data].map(((e,n)=>i.type._parseAsync(new o(t,e,t.path,n))))).then((e=>s.ParseStatus.mergeArray(n,e)));const d=[...t.data].map(((e,n)=>i.type._parseSync(new o(t,e,t.path,n))));return s.ParseStatus.mergeArray(n,d)}get element(){return this._def.type}min(e,t){return new A({...this._def,minLength:{value:e,message:n.errorUtil.toString(t)}})}max(e,t){return new A({...this._def,maxLength:{value:e,message:n.errorUtil.toString(t)}})}length(e,t){return new A({...this._def,exactLength:{value:e,message:n.errorUtil.toString(t)}})}nonempty(e){return this.min(1,e)}}function z(e){if(e instanceof L){const t={};for(const n in e.shape){const s=e.shape[n];t[n]=se.create(z(s))}return new L({...e._def,shape:()=>t})}return e instanceof A?new A({...e._def,type:z(e.element)}):e instanceof se?se.create(z(e.unwrap())):e instanceof re?re.create(z(e.unwrap())):e instanceof q?q.create(e.items.map((e=>z(e)))):e}e.ZodArray=A,A.create=(e,t)=>new A({type:e,minLength:null,maxLength:null,exactLength:null,typeName:ue.ZodArray,...l(t)});class L extends p{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(null!==this._cached)return this._cached;const e=this._def.shape(),t=r.util.objectKeys(e);return this._cached={shape:e,keys:t}}_parse(e){if(this._getType(e)!==r.ZodParsedType.object){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.object,received:t.parsedType}),s.INVALID}const{status:t,ctx:n}=this._processInputParams(e),{shape:i,keys:d}=this._getCached(),c=[];if(!(this._def.catchall instanceof R&&"strip"===this._def.unknownKeys))for(const e in n.data)d.includes(e)||c.push(e);const u=[];for(const e of d){const t=i[e],s=n.data[e];u.push({key:{status:"valid",value:e},value:t._parse(new o(n,s,n.path,e)),alwaysSet:e in n.data})}if(this._def.catchall instanceof R){const e=this._def.unknownKeys;if("passthrough"===e)for(const e of c)u.push({key:{status:"valid",value:e},value:{status:"valid",value:n.data[e]}});else if("strict"===e)c.length>0&&((0,s.addIssueToContext)(n,{code:a.ZodIssueCode.unrecognized_keys,keys:c}),t.dirty());else if("strip"!==e)throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const e=this._def.catchall;for(const t of c){const s=n.data[t];u.push({key:{status:"valid",value:t},value:e._parse(new o(n,s,n.path,t)),alwaysSet:t in n.data})}}return n.common.async?Promise.resolve().then((async()=>{const e=[];for(const t of u){const n=await t.key;e.push({key:n,value:await t.value,alwaysSet:t.alwaysSet})}return e})).then((e=>s.ParseStatus.mergeObjectSync(t,e))):s.ParseStatus.mergeObjectSync(t,u)}get shape(){return this._def.shape()}strict(e){return n.errorUtil.errToObj,new L({...this._def,unknownKeys:"strict",...void 0!==e?{errorMap:(t,s)=>{var r,a,i,o;const d=null!==(i=null===(a=(r=this._def).errorMap)||void 0===a?void 0:a.call(r,t,s).message)&&void 0!==i?i:s.defaultError;return"unrecognized_keys"===t.code?{message:null!==(o=n.errorUtil.errToObj(e).message)&&void 0!==o?o:d}:{message:d}}}:{}})}strip(){return new L({...this._def,unknownKeys:"strip"})}passthrough(){return new L({...this._def,unknownKeys:"passthrough"})}extend(e){return new L({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new L({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:ue.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new L({...this._def,catchall:e})}pick(e){const t={};return r.util.objectKeys(e).forEach((n=>{e[n]&&this.shape[n]&&(t[n]=this.shape[n])})),new L({...this._def,shape:()=>t})}omit(e){const t={};return r.util.objectKeys(this.shape).forEach((n=>{e[n]||(t[n]=this.shape[n])})),new L({...this._def,shape:()=>t})}deepPartial(){return z(this)}partial(e){const t={};return r.util.objectKeys(this.shape).forEach((n=>{const s=this.shape[n];e&&!e[n]?t[n]=s:t[n]=s.optional()})),new L({...this._def,shape:()=>t})}required(e){const t={};return r.util.objectKeys(this.shape).forEach((n=>{if(e&&!e[n])t[n]=this.shape[n];else{let e=this.shape[n];for(;e instanceof se;)e=e._def.innerType;t[n]=e}})),new L({...this._def,shape:()=>t})}keyof(){return Q(r.util.objectKeys(this.shape))}}e.ZodObject=L,L.create=(e,t)=>new L({shape:()=>e,unknownKeys:"strip",catchall:R.create(),typeName:ue.ZodObject,...l(t)}),L.strictCreate=(e,t)=>new L({shape:()=>e,unknownKeys:"strict",catchall:R.create(),typeName:ue.ZodObject,...l(t)}),L.lazycreate=(e,t)=>new L({shape:e,unknownKeys:"strip",catchall:R.create(),typeName:ue.ZodObject,...l(t)});class B extends p{_parse(e){const{ctx:t}=this._processInputParams(e),n=this._def.options;if(t.common.async)return Promise.all(n.map((async e=>{const n={...t,common:{...t.common,issues:[]},parent:null};return{result:await e._parseAsync({data:t.data,path:t.path,parent:n}),ctx:n}}))).then((function(e){for(const t of e)if("valid"===t.result.status)return t.result;for(const n of e)if("dirty"===n.result.status)return t.common.issues.push(...n.ctx.common.issues),n.result;const n=e.map((e=>new a.ZodError(e.ctx.common.issues)));return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_union,unionErrors:n}),s.INVALID}));{let e;const r=[];for(const s of n){const n={...t,common:{...t.common,issues:[]},parent:null},a=s._parseSync({data:t.data,path:t.path,parent:n});if("valid"===a.status)return a;"dirty"!==a.status||e||(e={result:a,ctx:n}),n.common.issues.length&&r.push(n.common.issues)}if(e)return t.common.issues.push(...e.ctx.common.issues),e.result;const i=r.map((e=>new a.ZodError(e)));return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_union,unionErrors:i}),s.INVALID}}get options(){return this._def.options}}e.ZodUnion=B,B.create=(e,t)=>new B({options:e,typeName:ue.ZodUnion,...l(t)});const V=e=>e instanceof G?V(e.schema):e instanceof ne?V(e.innerType()):e instanceof Y?[e.value]:e instanceof X?e.options:e instanceof ee?Object.keys(e.enum):e instanceof ae?V(e._def.innerType):e instanceof Z?[void 0]:e instanceof O?[null]:null;class U extends p{_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==r.ZodParsedType.object)return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.object,received:t.parsedType}),s.INVALID;const n=this.discriminator,i=t.data[n],o=this.optionsMap.get(i);return o?t.common.async?o._parseAsync({data:t.data,path:t.path,parent:t}):o._parseSync({data:t.data,path:t.path,parent:t}):((0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[n]}),s.INVALID)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,n){const s=new Map;for(const n of t){const t=V(n.shape[e]);if(!t)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const r of t){if(s.has(r))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(r)}`);s.set(r,n)}}return new U({typeName:ue.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:s,...l(n)})}}function $(e,t){const n=(0,r.getParsedType)(e),s=(0,r.getParsedType)(t);if(e===t)return{valid:!0,data:e};if(n===r.ZodParsedType.object&&s===r.ZodParsedType.object){const n=r.util.objectKeys(t),s=r.util.objectKeys(e).filter((e=>-1!==n.indexOf(e))),a={...e,...t};for(const n of s){const s=$(e[n],t[n]);if(!s.valid)return{valid:!1};a[n]=s.data}return{valid:!0,data:a}}if(n===r.ZodParsedType.array&&s===r.ZodParsedType.array){if(e.length!==t.length)return{valid:!1};const n=[];for(let s=0;s<e.length;s++){const r=$(e[s],t[s]);if(!r.valid)return{valid:!1};n.push(r.data)}return{valid:!0,data:n}}return n===r.ZodParsedType.date&&s===r.ZodParsedType.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}e.ZodDiscriminatedUnion=U;class F extends p{_parse(e){const{status:t,ctx:n}=this._processInputParams(e),r=(e,r)=>{if((0,s.isAborted)(e)||(0,s.isAborted)(r))return s.INVALID;const i=$(e.value,r.value);return i.valid?(((0,s.isDirty)(e)||(0,s.isDirty)(r))&&t.dirty(),{status:t.value,value:i.data}):((0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_intersection_types}),s.INVALID)};return n.common.async?Promise.all([this._def.left._parseAsync({data:n.data,path:n.path,parent:n}),this._def.right._parseAsync({data:n.data,path:n.path,parent:n})]).then((([e,t])=>r(e,t))):r(this._def.left._parseSync({data:n.data,path:n.path,parent:n}),this._def.right._parseSync({data:n.data,path:n.path,parent:n}))}}e.ZodIntersection=F,F.create=(e,t,n)=>new F({left:e,right:t,typeName:ue.ZodIntersection,...l(n)});class q extends p{_parse(e){const{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==r.ZodParsedType.array)return(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.array,received:n.parsedType}),s.INVALID;if(n.data.length<this._def.items.length)return(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),s.INVALID;!this._def.rest&&n.data.length>this._def.items.length&&((0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());const i=[...n.data].map(((e,t)=>{const s=this._def.items[t]||this._def.rest;return s?s._parse(new o(n,e,n.path,t)):null})).filter((e=>!!e));return n.common.async?Promise.all(i).then((e=>s.ParseStatus.mergeArray(t,e))):s.ParseStatus.mergeArray(t,i)}get items(){return this._def.items}rest(e){return new q({...this._def,rest:e})}}e.ZodTuple=q,q.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new q({items:e,typeName:ue.ZodTuple,rest:null,...l(t)})};class W extends p{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==r.ZodParsedType.object)return(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.object,received:n.parsedType}),s.INVALID;const i=[],d=this._def.keyType,c=this._def.valueType;for(const e in n.data)i.push({key:d._parse(new o(n,e,n.path,e)),value:c._parse(new o(n,n.data[e],n.path,e))});return n.common.async?s.ParseStatus.mergeObjectAsync(t,i):s.ParseStatus.mergeObjectSync(t,i)}get element(){return this._def.valueType}static create(e,t,n){return new W(t instanceof p?{keyType:e,valueType:t,typeName:ue.ZodRecord,...l(n)}:{keyType:I.create(),valueType:e,typeName:ue.ZodRecord,...l(t)})}}e.ZodRecord=W;class K extends p{_parse(e){const{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==r.ZodParsedType.map)return(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.map,received:n.parsedType}),s.INVALID;const i=this._def.keyType,d=this._def.valueType,c=[...n.data.entries()].map((([e,t],s)=>({key:i._parse(new o(n,e,n.path,[s,"key"])),value:d._parse(new o(n,t,n.path,[s,"value"]))})));if(n.common.async){const e=new Map;return Promise.resolve().then((async()=>{for(const n of c){const r=await n.key,a=await n.value;if("aborted"===r.status||"aborted"===a.status)return s.INVALID;"dirty"!==r.status&&"dirty"!==a.status||t.dirty(),e.set(r.value,a.value)}return{status:t.value,value:e}}))}{const e=new Map;for(const n of c){const r=n.key,a=n.value;if("aborted"===r.status||"aborted"===a.status)return s.INVALID;"dirty"!==r.status&&"dirty"!==a.status||t.dirty(),e.set(r.value,a.value)}return{status:t.value,value:e}}}}e.ZodMap=K,K.create=(e,t,n)=>new K({valueType:t,keyType:e,typeName:ue.ZodMap,...l(n)});class J extends p{_parse(e){const{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==r.ZodParsedType.set)return(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.set,received:n.parsedType}),s.INVALID;const i=this._def;null!==i.minSize&&n.data.size<i.minSize.value&&((0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),t.dirty()),null!==i.maxSize&&n.data.size>i.maxSize.value&&((0,s.addIssueToContext)(n,{code:a.ZodIssueCode.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),t.dirty());const d=this._def.valueType;function c(e){const n=new Set;for(const r of e){if("aborted"===r.status)return s.INVALID;"dirty"===r.status&&t.dirty(),n.add(r.value)}return{status:t.value,value:n}}const u=[...n.data.values()].map(((e,t)=>d._parse(new o(n,e,n.path,t))));return n.common.async?Promise.all(u).then((e=>c(e))):c(u)}min(e,t){return new J({...this._def,minSize:{value:e,message:n.errorUtil.toString(t)}})}max(e,t){return new J({...this._def,maxSize:{value:e,message:n.errorUtil.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}e.ZodSet=J,J.create=(e,t)=>new J({valueType:e,minSize:null,maxSize:null,typeName:ue.ZodSet,...l(t)});class H extends p{constructor(){super(...arguments),this.validate=this.implement}_parse(e){const{ctx:n}=this._processInputParams(e);if(n.parsedType!==r.ZodParsedType.function)return(0,s.addIssueToContext)(n,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.function,received:n.parsedType}),s.INVALID;function i(e,r){return(0,s.makeIssue)({data:e,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:a.ZodIssueCode.invalid_arguments,argumentsError:r}})}function o(e,r){return(0,s.makeIssue)({data:e,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:a.ZodIssueCode.invalid_return_type,returnTypeError:r}})}const d={errorMap:n.common.contextualErrorMap},c=n.data;return this._def.returns instanceof te?(0,s.OK)((async(...e)=>{const t=new a.ZodError([]),n=await this._def.args.parseAsync(e,d).catch((n=>{throw t.addIssue(i(e,n)),t})),s=await c(...n);return await this._def.returns._def.type.parseAsync(s,d).catch((e=>{throw t.addIssue(o(s,e)),t}))})):(0,s.OK)(((...e)=>{const t=this._def.args.safeParse(e,d);if(!t.success)throw new a.ZodError([i(e,t.error)]);const n=c(...t.data),s=this._def.returns.safeParse(n,d);if(!s.success)throw new a.ZodError([o(n,s.error)]);return s.data}))}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new H({...this._def,args:q.create(e).rest(D.create())})}returns(e){return new H({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,t,n){return new H({args:e||q.create([]).rest(D.create()),returns:t||D.create(),typeName:ue.ZodFunction,...l(n)})}}e.ZodFunction=H;class G extends p{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}e.ZodLazy=G,G.create=(e,t)=>new G({getter:e,typeName:ue.ZodLazy,...l(t)});class Y extends p{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{received:t.data,code:a.ZodIssueCode.invalid_literal,expected:this._def.value}),s.INVALID}return{status:"valid",value:e.data}}get value(){return this._def.value}}function Q(e,t){return new X({values:e,typeName:ue.ZodEnum,...l(t)})}e.ZodLiteral=Y,Y.create=(e,t)=>new Y({value:e,typeName:ue.ZodLiteral,...l(t)});class X extends p{_parse(e){if("string"!=typeof e.data){const t=this._getOrReturnCtx(e),n=this._def.values;return(0,s.addIssueToContext)(t,{expected:r.util.joinValues(n),received:t.parsedType,code:a.ZodIssueCode.invalid_type}),s.INVALID}if(-1===this._def.values.indexOf(e.data)){const t=this._getOrReturnCtx(e),n=this._def.values;return(0,s.addIssueToContext)(t,{received:t.data,code:a.ZodIssueCode.invalid_enum_value,options:n}),s.INVALID}return(0,s.OK)(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values)e[t]=t;return e}get Values(){const e={};for(const t of this._def.values)e[t]=t;return e}get Enum(){const e={};for(const t of this._def.values)e[t]=t;return e}extract(e){return X.create(e)}exclude(e){return X.create(this.options.filter((t=>!e.includes(t))))}}e.ZodEnum=X,X.create=Q;class ee extends p{_parse(e){const t=r.util.getValidEnumValues(this._def.values),n=this._getOrReturnCtx(e);if(n.parsedType!==r.ZodParsedType.string&&n.parsedType!==r.ZodParsedType.number){const e=r.util.objectValues(t);return(0,s.addIssueToContext)(n,{expected:r.util.joinValues(e),received:n.parsedType,code:a.ZodIssueCode.invalid_type}),s.INVALID}if(-1===t.indexOf(e.data)){const e=r.util.objectValues(t);return(0,s.addIssueToContext)(n,{received:n.data,code:a.ZodIssueCode.invalid_enum_value,options:e}),s.INVALID}return(0,s.OK)(e.data)}get enum(){return this._def.values}}e.ZodNativeEnum=ee,ee.create=(e,t)=>new ee({values:e,typeName:ue.ZodNativeEnum,...l(t)});class te extends p{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==r.ZodParsedType.promise&&!1===t.common.async)return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.promise,received:t.parsedType}),s.INVALID;const n=t.parsedType===r.ZodParsedType.promise?t.data:Promise.resolve(t.data);return(0,s.OK)(n.then((e=>this._def.type.parseAsync(e,{path:t.path,errorMap:t.common.contextualErrorMap}))))}}e.ZodPromise=te,te.create=(e,t)=>new te({type:e,typeName:ue.ZodPromise,...l(t)});class ne extends p{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ue.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:n}=this._processInputParams(e),a=this._def.effect||null;if("preprocess"===a.type){const e=a.transform(n.data);return n.common.async?Promise.resolve(e).then((e=>this._def.schema._parseAsync({data:e,path:n.path,parent:n}))):this._def.schema._parseSync({data:e,path:n.path,parent:n})}const i={addIssue:e=>{(0,s.addIssueToContext)(n,e),e.fatal?t.abort():t.dirty()},get path(){return n.path}};if(i.addIssue=i.addIssue.bind(i),"refinement"===a.type){const e=e=>{const t=a.refinement(e,i);if(n.common.async)return Promise.resolve(t);if(t instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return e};if(!1===n.common.async){const r=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});return"aborted"===r.status?s.INVALID:("dirty"===r.status&&t.dirty(),e(r.value),{status:t.value,value:r.value})}return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then((n=>"aborted"===n.status?s.INVALID:("dirty"===n.status&&t.dirty(),e(n.value).then((()=>({status:t.value,value:n.value}))))))}if("transform"===a.type){if(!1===n.common.async){const e=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});if(!(0,s.isValid)(e))return e;const r=a.transform(e.value,i);if(r instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:r}}return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then((e=>(0,s.isValid)(e)?Promise.resolve(a.transform(e.value,i)).then((e=>({status:t.value,value:e}))):e))}r.util.assertNever(a)}}e.ZodEffects=ne,e.ZodTransformer=ne,ne.create=(e,t,n)=>new ne({schema:e,typeName:ue.ZodEffects,effect:t,...l(n)}),ne.createWithPreprocess=(e,t,n)=>new ne({schema:t,effect:{type:"preprocess",transform:e},typeName:ue.ZodEffects,...l(n)});class se extends p{_parse(e){return this._getType(e)===r.ZodParsedType.undefined?(0,s.OK)(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodOptional=se,se.create=(e,t)=>new se({innerType:e,typeName:ue.ZodOptional,...l(t)});class re extends p{_parse(e){return this._getType(e)===r.ZodParsedType.null?(0,s.OK)(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodNullable=re,re.create=(e,t)=>new re({innerType:e,typeName:ue.ZodNullable,...l(t)});class ae extends p{_parse(e){const{ctx:t}=this._processInputParams(e);let n=t.data;return t.parsedType===r.ZodParsedType.undefined&&(n=this._def.defaultValue()),this._def.innerType._parse({data:n,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}e.ZodDefault=ae,ae.create=(e,t)=>new ae({innerType:e,typeName:ue.ZodDefault,defaultValue:"function"==typeof t.default?t.default:()=>t.default,...l(t)});class ie extends p{_parse(e){const{ctx:t}=this._processInputParams(e),n={...t,common:{...t.common,issues:[]}},r=this._def.innerType._parse({data:n.data,path:n.path,parent:{...n}});return(0,s.isAsync)(r)?r.then((e=>({status:"valid",value:"valid"===e.status?e.value:this._def.catchValue({get error(){return new a.ZodError(n.common.issues)},input:n.data})}))):{status:"valid",value:"valid"===r.status?r.value:this._def.catchValue({get error(){return new a.ZodError(n.common.issues)},input:n.data})}}removeCatch(){return this._def.innerType}}e.ZodCatch=ie,ie.create=(e,t)=>new ie({innerType:e,typeName:ue.ZodCatch,catchValue:"function"==typeof t.catch?t.catch:()=>t.catch,...l(t)});class oe extends p{_parse(e){if(this._getType(e)!==r.ZodParsedType.nan){const t=this._getOrReturnCtx(e);return(0,s.addIssueToContext)(t,{code:a.ZodIssueCode.invalid_type,expected:r.ZodParsedType.nan,received:t.parsedType}),s.INVALID}return{status:"valid",value:e.data}}}e.ZodNaN=oe,oe.create=e=>new oe({typeName:ue.ZodNaN,...l(e)}),e.BRAND=Symbol("zod_brand");class de extends p{_parse(e){const{ctx:t}=this._processInputParams(e),n=t.data;return this._def.type._parse({data:n,path:t.path,parent:t})}unwrap(){return this._def.type}}e.ZodBranded=de;class ce extends p{_parse(e){const{status:t,ctx:n}=this._processInputParams(e);if(n.common.async){return(async()=>{const e=await this._def.in._parseAsync({data:n.data,path:n.path,parent:n});return"aborted"===e.status?s.INVALID:"dirty"===e.status?(t.dirty(),(0,s.DIRTY)(e.value)):this._def.out._parseAsync({data:e.value,path:n.path,parent:n})})()}{const e=this._def.in._parseSync({data:n.data,path:n.path,parent:n});return"aborted"===e.status?s.INVALID:"dirty"===e.status?(t.dirty(),{status:"dirty",value:e.value}):this._def.out._parseSync({data:e.value,path:n.path,parent:n})}}static create(e,t){return new ce({in:e,out:t,typeName:ue.ZodPipeline})}}e.ZodPipeline=ce;var ue;e.custom=(e,t={},n)=>e?M.create().superRefine(((s,r)=>{var a,i;if(!e(s)){const e="function"==typeof t?t(s):"string"==typeof t?{message:t}:t,o=null===(i=null!==(a=e.fatal)&&void 0!==a?a:n)||void 0===i||i,d="string"==typeof e?{message:e}:e;r.addIssue({code:"custom",...d,fatal:o})}})):M.create(),e.late={object:L.lazycreate},function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline"}(ue=e.ZodFirstPartyTypeKind||(e.ZodFirstPartyTypeKind={}));e.instanceof=(t,n={message:`Input not instance of ${t.name}`})=>(0,e.custom)((e=>e instanceof t),n);const le=I.create;e.string=le;const pe=T.create;e.number=pe;const he=oe.create;e.nan=he;const me=E.create;e.bigint=me;const ge=P.create;e.boolean=ge;const fe=k.create;e.date=fe;const ve=N.create;e.symbol=ve;const ye=Z.create;e.undefined=ye;const be=O.create;e.null=be;const xe=M.create;e.any=xe;const Ce=D.create;e.unknown=Ce;const we=R.create;e.never=we;const _e=j.create;e.void=_e;const Ie=A.create;e.array=Ie;const Se=L.create;e.object=Se;const Te=L.strictCreate;e.strictObject=Te;const Ee=B.create;e.union=Ee;const Pe=U.create;e.discriminatedUnion=Pe;const ke=F.create;e.intersection=ke;const Ne=q.create;e.tuple=Ne;const Ze=W.create;e.record=Ze;const Oe=K.create;e.map=Oe;const Me=J.create;e.set=Me;const De=H.create;e.function=De;const Re=G.create;e.lazy=Re;const je=Y.create;e.literal=je;const Ae=X.create;e.enum=Ae;const ze=ee.create;e.nativeEnum=ze;const Le=te.create;e.promise=Le;const Be=ne.create;e.effect=Be,e.transformer=Be;const Ve=se.create;e.optional=Ve;const Ue=re.create;e.nullable=Ue;const $e=ne.createWithPreprocess;e.preprocess=$e;const Fe=ce.create;e.pipeline=Fe;e.ostring=()=>le().optional();e.onumber=()=>pe().optional();e.oboolean=()=>ge().optional(),e.coerce={string:e=>I.create({...e,coerce:!0}),number:e=>T.create({...e,coerce:!0}),boolean:e=>P.create({...e,coerce:!0}),bigint:e=>E.create({...e,coerce:!0}),date:e=>k.create({...e,coerce:!0})},e.NEVER=s.INVALID}(x),function(t){var n=e&&e.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),s=e&&e.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),s(i,t),s(v,t),s(y,t),s(d,t),s(x,t),s(c,t)}(a),function(t){var n=e&&e.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),s=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return s(t,e),t},i=e&&e.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),t.z=void 0;const o=r(a);t.z=o,i(a,t),t.default=o}(r);var w={};!function(e){var t,n,s,r,a,i;Object.defineProperty(e,"__esModule",{value:!0}),e.CDP=e.Network=e.Log=e.BrowsingContext=e.Script=e.Message=void 0,function(e){let t;!function(e){e.InvalidArgument="invalid argument",e.InvalidSessionId="invalid session id",e.NoSuchAlert="no such alert",e.NoSuchFrame="no such frame",e.NoSuchHandle="no such handle",e.NoSuchNode="no such node",e.NoSuchScript="no such script",e.SessionNotCreated="session not created",e.UnknownCommand="unknown command",e.UnknownError="unknown error",e.UnsupportedOperation="unsupported operation"}(t=e.ErrorCode||(e.ErrorCode={}));class n{error;message;stacktrace;constructor(e,t,n){this.error=e,this.message=t,this.stacktrace=n}toErrorResponse(e){return{id:e,error:this.error,message:this.message,stacktrace:this.stacktrace}}}e.ErrorResponse=n;e.InvalidArgumentException=class extends n{constructor(e,n){super(t.InvalidArgument,e,n)}};e.NoSuchHandleException=class extends n{constructor(e,n){super(t.NoSuchHandle,e,n)}};e.InvalidSessionIdException=class extends n{constructor(e,n){super(t.InvalidSessionId,e,n)}};e.NoSuchAlertException=class extends n{constructor(e,n){super(t.NoSuchAlert,e,n)}};e.NoSuchFrameException=class extends n{constructor(e){super(t.NoSuchFrame,e)}};e.NoSuchNodeException=class extends n{constructor(e,n){super(t.NoSuchNode,e,n)}};e.NoSuchScriptException=class extends n{constructor(e,n){super(t.NoSuchScript,e,n)}};e.SessionNotCreatedException=class extends n{constructor(e,n){super(t.SessionNotCreated,e,n)}};e.UnknownCommandException=class extends n{constructor(e,n){super(t.UnknownCommand,e,n)}};e.UnknownErrorException=class extends n{constructor(e,n){super(t.UnknownError,e,n)}};e.UnsupportedOperationException=class extends n{constructor(e,n){super(t.UnsupportedOperation,e,n)}}}(e.Message||(e.Message={})),((t=e.Script||(e.Script={})).EventNames||(t.EventNames={})).MessageEvent="script.message",t.AllEvents="script",n=e.BrowsingContext||(e.BrowsingContext={}),(s=n.EventNames||(n.EventNames={})).LoadEvent="browsingContext.load",s.DomContentLoadedEvent="browsingContext.domContentLoaded",s.ContextCreatedEvent="browsingContext.contextCreated",s.ContextDestroyedEvent="browsingContext.contextDestroyed",n.AllEvents="browsingContext",(r=e.Log||(e.Log={})).AllEvents="log",function(e){e.LogEntryAddedEvent="log.entryAdded"}(r.EventNames||(r.EventNames={})),(a=e.Network||(e.Network={})).AllEvents="network",function(e){e.BeforeRequestSentEvent="network.beforeRequestSent",e.ResponseCompletedEvent="network.responseCompleted",e.FetchErrorEvent="network.fetchError"}(a.EventNames||(a.EventNames={})),(i=e.CDP||(e.CDP={})).AllEvents="cdp",function(e){e.EventReceivedEvent="cdp.eventReceived"}(i.EventNames||(i.EventNames={}))}(w),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Session=e.CDP=e.BrowsingContext=e.Script=e.CommonDataTypes=e.parseObject=void 0;const t=r,n=w;function s(e,t){const s=t.safeParse(e);if(s.success)return s.data;const r=s.error.errors.map((e=>`${e.message} in ${e.path.map((e=>JSON.stringify(e))).join("/")}.`)).join(" ");throw new n.Message.InvalidArgumentException(r)}var a;e.parseObject=s,function(e){e.SharedReferenceSchema=t.z.object({sharedId:t.z.string().min(1),handle:t.z.string().optional()}),e.RemoteReferenceSchema=t.z.object({handle:t.z.string().min(1)});const n=t.z.object({type:t.z.literal("undefined")}),s=t.z.object({type:t.z.literal("null")}),r=t.z.object({type:t.z.literal("string"),value:t.z.string()}),a=t.z.enum(["NaN","-0","Infinity","-Infinity"]),i=t.z.object({type:t.z.literal("number"),value:t.z.union([a,t.z.number()])}),o=t.z.object({type:t.z.literal("boolean"),value:t.z.boolean()}),d=t.z.object({type:t.z.literal("bigint"),value:t.z.string()}),c=t.z.union([n,s,r,i,o,d]);e.LocalValueSchema=t.z.lazy((()=>t.z.union([c,p,h,g,f,v,y])));const u=t.z.union([e.SharedReferenceSchema,e.RemoteReferenceSchema,e.LocalValueSchema]),l=t.z.array(u),p=t.z.object({type:t.z.literal("array"),value:l}),h=t.z.object({type:t.z.literal("date"),value:t.z.string().min(1)}),m=t.z.tuple([t.z.union([t.z.string(),u]),u]),g=t.z.object({type:t.z.literal("map"),value:t.z.array(m)}),f=t.z.object({type:t.z.literal("object"),value:t.z.array(m)}),v=t.z.object({type:t.z.literal("regexp"),value:t.z.object({pattern:t.z.string(),flags:t.z.string().optional()})}),y=t.z.lazy((()=>t.z.object({type:t.z.literal("set"),value:l})));e.BrowsingContextSchema=t.z.string(),e.MaxDepthSchema=t.z.number().int().nonnegative().max(9007199254740991)}(a=e.CommonDataTypes||(e.CommonDataTypes={})),function(e){const n=t.z.enum(["window","dedicated-worker","shared-worker","service-worker","worker","paint-worklet","audio-worklet","worklet"]);e.GetRealmsParametersSchema=t.z.object({context:a.BrowsingContextSchema.optional(),type:n.optional()}),e.parseGetRealmsParams=function(t){return s(t,e.GetRealmsParametersSchema)};const r=t.z.object({context:a.BrowsingContextSchema,sandbox:t.z.string().optional()}),i=t.z.object({realm:t.z.string().min(1)}),o=t.z.union([i,r]),d=t.z.enum(["root","none"]),c=t.z.object({expression:t.z.string(),awaitPromise:t.z.boolean(),target:o,resultOwnership:d.optional()});e.parseEvaluateParams=function(e){return s(e,c)};const u=t.z.object({target:o,handles:t.z.array(t.z.string())});e.parseDisownParams=function(e){return s(e,u)};const l=t.z.string(),p=t.z.object({channel:l,maxDepth:t.z.number().int().min(1).max(1).optional(),ownership:d.optional()});e.ChannelValueSchema=t.z.object({type:t.z.literal("channel"),value:p}),e.PreloadScriptSchema=t.z.string(),e.AddPreloadScriptParametersSchema=t.z.object({functionDeclaration:t.z.string(),arguments:t.z.array(e.ChannelValueSchema).optional(),sandbox:t.z.string().optional(),context:a.BrowsingContextSchema.optional()}),e.parseAddPreloadScriptParams=function(t){return s(t,e.AddPreloadScriptParametersSchema)},e.RemovePreloadScriptParametersSchema=t.z.object({script:e.PreloadScriptSchema}),e.parseRemovePreloadScriptParams=function(t){return s(t,e.RemovePreloadScriptParametersSchema)};const h=t.z.union([a.RemoteReferenceSchema,a.SharedReferenceSchema,a.LocalValueSchema,e.ChannelValueSchema]),m=t.z.object({functionDeclaration:t.z.string(),target:o,arguments:t.z.array(h).optional(),this:h.optional(),awaitPromise:t.z.boolean(),resultOwnership:d.optional()});e.parseCallFunctionParams=function(e){return s(e,m)}}(e.Script||(e.Script={})),function(e){const n=t.z.object({maxDepth:a.MaxDepthSchema.optional(),root:a.BrowsingContextSchema.optional()});e.parseGetTreeParams=function(e){return s(e,n)};const r=t.z.enum(["none","interactive","complete"]),i=t.z.object({context:a.BrowsingContextSchema,url:t.z.string().url(),wait:r.optional()});e.parseNavigateParams=function(e){return s(e,i)};const o=t.z.object({type:t.z.enum(["tab","window"]),referenceContext:a.BrowsingContextSchema.optional()});e.parseCreateParams=function(e){return s(e,o)};const d=t.z.object({context:a.BrowsingContextSchema});e.parseCloseParams=function(e){return s(e,d)};const c=t.z.object({context:a.BrowsingContextSchema});e.parseCaptureScreenshotParams=function(e){return s(e,c)};const u=t.z.object({height:t.z.number().min(0).default(27.94).optional(),width:t.z.number().min(0).default(21.59).optional()}),l=t.z.object({bottom:t.z.number().min(0).default(1).optional(),left:t.z.number().min(0).default(1).optional(),right:t.z.number().min(0).default(1).optional(),top:t.z.number().min(0).default(1).optional()}),p=t.z.array(t.z.union([t.z.string().min(1),t.z.number().int().nonnegative()])).refine((e=>e.every((e=>{const t=String(e).match(/^(?:(?:\d+)|(?:\d+[-])|(?:[-]\d+)|(?:(?<start>\d+)[-](?<end>\d+)))$/),{start:n,end:s}=t?.groups??{};return!(n&&s&&Number(n)>Number(s))&&t})))),h=t.z.object({context:a.BrowsingContextSchema,background:t.z.boolean().default(!1).optional(),margin:l.optional(),orientation:t.z.enum(["portrait","landscape"]).default("portrait").optional(),page:u.optional(),pageRanges:p.default([]).optional(),scale:t.z.number().min(.1).max(2).default(1).optional(),shrinkToFit:t.z.boolean().default(!0).optional()});e.parsePrintParams=function(e){return s(e,h)}}(e.BrowsingContext||(e.BrowsingContext={})),function(e){const n=t.z.object({cdpMethod:t.z.string(),cdpParams:t.z.object({}).passthrough(),cdpSession:t.z.string().optional()});e.parseSendCommandParams=function(e){return s(e,n)};const r=t.z.object({context:a.BrowsingContextSchema});e.parseGetSessionParams=function(e){return s(e,r)}}(e.CDP||(e.CDP={})),function(e){const r=t.z.enum([n.BrowsingContext.AllEvents,...Object.values(n.BrowsingContext.EventNames),n.Log.AllEvents,...Object.values(n.Log.EventNames),n.CDP.AllEvents,...Object.values(n.CDP.EventNames),n.Network.AllEvents,...Object.values(n.Network.EventNames),n.Script.AllEvents,...Object.values(n.Script.EventNames)]),i=t.z.object({events:t.z.array(r),contexts:t.z.array(a.BrowsingContextSchema).optional()});e.parseSubscribeParams=function(e){return s(e,i)}}(e.Session||(e.Session={}))}(s);var _={},I={},S=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(I,"__esModule",{value:!0}),I.EventEmitter=void 0;const T=S((function(e){return{all:e=e||new Map,on:function(t,n){var s=e.get(t);s?s.push(n):e.set(t,[n])},off:function(t,n){var s=e.get(t);s&&(n?s.splice(s.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var s=e.get(t);s&&s.slice().map((function(e){e(n)})),(s=e.get("*"))&&s.slice().map((function(e){e(t,n)}))}}}));I.EventEmitter=class{#e=(0,T.default)();on(e,t){return this.#e.on(e,t),this}once(e,t){const n=s=>{t(s),this.off(e,n)};return this.on(e,n)}off(e,t){return this.#e.off(e,t),this}emit(e,t){this.#e.emit(e,t)}};var E={},P={};!function(e){var t;Object.defineProperty(e,"__esModule",{value:!0}),e.LogType=void 0,(t=e.LogType||(e.LogType={})).bidi="BiDi Messages",t.browsingContexts="Browsing Contexts",t.cdp="CDP",t.system="System"}(P),Object.defineProperty(E,"__esModule",{value:!0}),E.ProcessingQueue=void 0;const k=P;E.ProcessingQueue=class{#t;#n;#s;#r=[];#a=!1;constructor(e,t=(()=>Promise.resolve()),n){this.#t=t,this.#s=e,this.#n=n}add(e){this.#r.push(e),this.#i()}async#i(){if(!this.#a){for(this.#a=!0;this.#r.length>0;){const e=this.#r.shift();void 0!==e&&await e.then((e=>this.#s(e))).catch((e=>{this.#n?.(k.LogType.system,"Event was not processed:",e),this.#t(e)}))}this.#a=!1}}};var N={},Z={},O={},M={};Object.defineProperty(M,"__esModule",{value:!0}),M.inchesFromCm=void 0,M.inchesFromCm=function(e){return e/2.54};var D={};Object.defineProperty(D,"__esModule",{value:!0}),D.Deferred=void 0;class R{#o=!1;#d;#c=()=>{};#u=()=>{};get isFinished(){return this.#o}constructor(){this.#d=new Promise(((e,t)=>{this.#c=e,this.#u=t})),this.#d.catch((()=>{}))}then(e,t){return this.#d.then(e,t)}catch(e){return this.#d.catch(e)}resolve(e){this.#o=!0,this.#c(e)}reject(e){this.#o=!0,this.#u(e)}finally(e){return this.#d.finally(e)}[Symbol.toStringTag]="Promise"}D.Deferred=R;var j={},A={};!function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.ScriptEvaluator=e.SHARED_ID_DIVIDER=void 0;const t=w;e.SHARED_ID_DIVIDER="_element_";class n{#l;constructor(e){this.#l=e}static async stringifyObject(e,t){return(await t.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>String(e))),awaitPromise:!1,arguments:[e],returnByValue:!0,executionContextId:t.executionContextId})).result.value}async serializeCdpObject(e,t,s){const r=n.#p(e),a=await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e)),awaitPromise:!1,arguments:[r],generateWebDriverValue:!0,executionContextId:s.executionContextId});return s.cdpToBidiValue(a,t)}async scriptEvaluate(e,t,n,s){const r=await e.cdpClient.sendCommand("Runtime.evaluate",{contextId:e.executionContextId,expression:t,awaitPromise:n,generateWebDriverValue:!0});return r.exceptionDetails?{exceptionDetails:await this.#h(r.exceptionDetails,0,s,e),type:"exception",realm:e.realmId}:{type:"success",result:e.cdpToBidiValue(r,s),realm:e.realmId}}async callFunction(e,n,s,r,a,i){const o=`(...args)=>{ return _callFunction((\n${n}\n), args);\n      function _callFunction(f, args) {\n        const deserializedThis = args.shift();\n        const deserializedArgs = args;\n        return f.apply(deserializedThis, deserializedArgs);\n      }}`,d=[await this.#m(s,e)];let c;d.push(...await Promise.all(r.map((async t=>this.#m(t,e)))));try{c=await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:o,awaitPromise:a,arguments:d,generateWebDriverValue:!0,executionContextId:e.executionContextId})}catch(e){if(-32e3===e.code&&["Could not find object with given id","Argument should belong to the same JavaScript world as target object","Invalid remote object id"].includes(e.message))throw new t.Message.NoSuchHandleException("Handle was not found.");throw e}return c.exceptionDetails?{exceptionDetails:await this.#h(c.exceptionDetails,1,i,e),type:"exception",realm:e.realmId}:{type:"success",result:e.cdpToBidiValue(c,i),realm:e.realmId}}static#p(e){return void 0!==e.objectId?{objectId:e.objectId}:void 0!==e.unserializableValue?{unserializableValue:e.unserializableValue}:{value:e.value}}async#m(n,s){if("sharedId"in n){const[r,a]=n.sharedId.split(e.SHARED_ID_DIVIDER),i=parseInt(a??"");if(isNaN(i)||void 0===i||void 0===r)throw new t.Message.InvalidArgumentException(`SharedId "${n.sharedId}" should have format "{navigableId}${e.SHARED_ID_DIVIDER}{backendNodeId}".`);if(s.navigableId!==r)throw new t.Message.NoSuchNodeException(`SharedId "${n.sharedId}" belongs to different document. Current document is ${s.navigableId}.`);try{return{objectId:(await s.cdpClient.sendCommand("DOM.resolveNode",{backendNodeId:i,executionContextId:s.executionContextId})).object.objectId}}catch(e){if(-32e3===e.code&&"No node with given id found"===e.message)throw new t.Message.NoSuchNodeException(`SharedId "${n.sharedId}" was not found.`);throw e}}if("handle"in n)return{objectId:n.handle};switch(n.type){case"undefined":return{unserializableValue:"undefined"};case"null":return{unserializableValue:"null"};case"string":return{value:n.value};case"number":return"NaN"===n.value?{unserializableValue:"NaN"}:"-0"===n.value?{unserializableValue:"-0"}:"Infinity"===n.value?{unserializableValue:"Infinity"}:"-Infinity"===n.value?{unserializableValue:"-Infinity"}:{value:n.value};case"boolean":return{value:Boolean(n.value)};case"bigint":return{unserializableValue:`BigInt(${JSON.stringify(n.value)})`};case"date":return{unserializableValue:`new Date(Date.parse(${JSON.stringify(n.value)}))`};case"regexp":return{unserializableValue:`new RegExp(${JSON.stringify(n.value.pattern)}, ${JSON.stringify(n.value.flags)})`};case"map":{const e=await this.#g(n.value,s),t=await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t=new Map;for(let n=0;n<e.length;n+=2)t.set(e[n],e[n+1]);return t})),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:s.executionContextId});return{objectId:t.result.objectId}}case"object":{const e=await this.#g(n.value,s),t=await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t={};for(let n=0;n<e.length;n+=2){t[e[n]]=e[n+1]}return t})),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:s.executionContextId});return{objectId:t.result.objectId}}case"array":{const e=await this.#f(n.value,s);return{objectId:(await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>e)),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:s.executionContextId})).result.objectId}}case"set":{const e=await this.#f(n.value,s);return{objectId:(await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>new Set(e))),awaitPromise:!1,arguments:e,returnByValue:!1,executionContextId:s.executionContextId})).result.objectId}}case"channel":{const e=(await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((()=>{const e=[];let t=null;return{async getMessage(){const n=e.length>0?Promise.resolve():new Promise((e=>{t=e}));return await n,e.shift()},sendMessage(n){e.push(n),null!==t&&(t(),t=null)}}})),returnByValue:!1,executionContextId:s.executionContextId,generateWebDriverValue:!1})).result.objectId;this.#v(n,e,s);return{objectId:(await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e.sendMessage)),arguments:[{objectId:e}],returnByValue:!1,executionContextId:s.executionContextId,generateWebDriverValue:!1})).result.objectId}}default:throw new Error(`Value ${JSON.stringify(n)} is not deserializable.`)}}async#g(e,t){const n=[];for(const[s,r]of e){let e;e="string"==typeof s?{value:s}:await this.#m(s,t);const a=await this.#m(r,t);n.push(e),n.push(a)}return n}async#f(e,t){return Promise.all(e.map((e=>this.#m(e,t))))}async#v(e,n,s){const r=e.value.channel;for(;;){const a=await s.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((async e=>e.getMessage())),arguments:[{objectId:n}],awaitPromise:!0,executionContextId:s.executionContextId,generateWebDriverValue:!0});this.#l.registerEvent({method:t.Script.EventNames.MessageEvent,params:{channel:r,data:s.cdpToBidiValue(a,e.value.ownership??"none"),source:{realm:s.realmId,context:s.browsingContextId}}},s.browsingContextId)}}async#h(e,t,s,r){const a=e.stackTrace?.callFrames.map((e=>({url:e.url,functionName:e.functionName,lineNumber:e.lineNumber-t,columnNumber:e.columnNumber}))),i=await this.serializeCdpObject(e.exception,s,r),o=await n.stringifyObject(e.exception,r);return{exception:i,columnNumber:e.columnNumber,lineNumber:e.lineNumber-t,stackTrace:{callFrames:a||[]},text:o||e.text}}}e.ScriptEvaluator=n}(A),Object.defineProperty(j,"__esModule",{value:!0}),j.Realm=void 0;const z=A;j.Realm=class{#y;#b;#x;#C;#w;#_;#I;#S;#l;#T;sandbox;cdpSessionId;constructor(e,t,n,s,r,a,i,o,d,c,u){this.#x=n,this.#C=s,this.#w=r,this.sandbox=o,this.#_=a,this.#I=i,this.cdpSessionId=d,this.#S=c,this.#y=e,this.#b=t,this.#l=u,this.#T=new z.ScriptEvaluator(this.#l),this.#y.realmMap.set(this.#x,this)}async disown(e){if(this.#y.knownHandlesToRealm.get(e)===this.realmId){try{await this.cdpClient.sendCommand("Runtime.releaseObject",{objectId:e})}catch(e){if(-32e3!==e.code||"Invalid remote object id"!==e.message)throw e}this.#y.knownHandlesToRealm.delete(e)}}cdpToBidiValue(e,t){const n=e.result.webDriverValue,s=this.webDriverValueToBiDi(n);if(e.result.objectId){const n=e.result.objectId;"root"===t?(s.handle=n,this.#y.knownHandlesToRealm.set(n,this.realmId)):this.cdpClient.sendCommand("Runtime.releaseObject",{objectId:n})}return s}webDriverValueToBiDi(e){const t=e;if("platformobject"===t.type)return{type:"object"};const n=t.value;if(void 0===n)return t;if("node"===t.type&&(Object.hasOwn(n,"backendNodeId")&&(t.sharedId=`${this.navigableId}${z.SHARED_ID_DIVIDER}${n.backendNodeId}`,delete n.backendNodeId),Object.hasOwn(n,"children")))for(const e in n.children)n.children[e]=this.webDriverValueToBiDi(n.children[e]);if(["array","set"].includes(e.type))for(const e in n)n[e]=this.webDriverValueToBiDi(n[e]);if(["object","map"].includes(e.type))for(const e in n)n[e]=[this.webDriverValueToBiDi(n[e][0]),this.webDriverValueToBiDi(n[e][1])];return t}toBiDi(){return{realm:this.realmId,origin:this.origin,type:this.type,context:this.browsingContextId,...void 0===this.sandbox?{}:{sandbox:this.sandbox}}}get realmId(){return this.#x}get navigableId(){return this.#b.findContext(this.#C)?.navigableId??"UNKNOWN"}get browsingContextId(){return this.#C}get executionContextId(){return this.#w}get origin(){return this.#_}get type(){return this.#I}get cdpClient(){return this.#S}async callFunction(e,t,n,s,r){const a=this.#b.getContext(this.browsingContextId);return await a.awaitUnblocked(),{result:await this.#T.callFunction(this,e,t,n,s,r)}}async scriptEvaluate(e,t,n){const s=this.#b.getContext(this.browsingContextId);return await s.awaitUnblocked(),{result:await this.#T.scriptEvaluate(this,e,t,n)}}async serializeCdpObject(e,t){return this.#T.serializeCdpObject(e,t,this)}async stringifyObject(e){return z.ScriptEvaluator.stringifyObject(e,this)}},Object.defineProperty(O,"__esModule",{value:!0}),O.BrowsingContextImpl=void 0;const L=M,B=w,V=P,U=D,$=j;class F{#E;#P;#k=new Set;#b;#N={documentInitialized:new U.Deferred,Page:{navigatedWithinDocument:new U.Deferred,lifecycleEvent:{DOMContentLoaded:new U.Deferred,load:new U.Deferred}}};#Z="about:blank";#l;#y;#O=null;#M;#D;#n;constructor(e,t,n,s,r,a,i){this.#M=e,this.#y=t,this.#E=n,this.#P=s,this.#l=r,this.#b=a,this.#n=i}static create(e,t,n,s,r,a,i){const o=new F(e,t,n,s,r,a,i);return o.#R(),a.addContext(o),o.isTopLevelContext()||o.parent.addChild(o.id),r.registerEvent({method:B.BrowsingContext.EventNames.ContextCreatedEvent,params:o.serializeToBidiValue()},o.id),o}get navigableId(){return this.#O}delete(){this.#j(),this.#y.deleteRealms({browsingContextId:this.id}),this.isTopLevelContext()||this.parent.#k.delete(this.id),this.#l.registerEvent({method:B.BrowsingContext.EventNames.ContextDestroyedEvent,params:this.serializeToBidiValue()},this.id),this.#b.deleteContextById(this.id)}get id(){return this.#E}get parentId(){return this.#P}get parent(){return null===this.parentId?null:this.#b.getContext(this.parentId)}get directChildren(){return[...this.#k].map((e=>this.#b.getContext(e)))}get allChildren(){const e=this.directChildren;return e.concat(...e.map((e=>e.allChildren)))}isTopLevelContext(){return null===this.#P}addChild(e){this.#k.add(e)}#j(){this.directChildren.map((e=>e.delete()))}get#A(){if(void 0===this.#D)throw new Error(`No default realm for browsing context ${this.#E}`);return this.#D}get cdpTarget(){return this.#M}updateCdpTarget(e){this.#M=e,this.#R()}get url(){return this.#Z}async awaitLoaded(){await this.#N.Page.lifecycleEvent.load}awaitUnblocked(){return this.#M.targetUnblocked}async getOrCreateSandbox(e){if(void 0===e||""===e)return this.#A;let t=this.#y.findRealms({browsingContextId:this.id,sandbox:e});if(0===t.length&&(await this.#M.cdpClient.sendCommand("Page.createIsolatedWorld",{frameId:this.id,worldName:e}),t=this.#y.findRealms({browsingContextId:this.id,sandbox:e})),1!==t.length)throw Error(`Sandbox ${e} wasn't created.`);return t[0]}serializeToBidiValue(e=0,t=!0){return{context:this.#E,url:this.url,children:e>0?this.directChildren.map((t=>t.serializeToBidiValue(e-1,!1))):null,...t?{parent:this.#P}:{}}}#R(){this.#M.cdpClient.on("Target.targetInfoChanged",(e=>{this.id===e.targetInfo.targetId&&(this.#Z=e.targetInfo.url)})),this.#M.cdpClient.on("Page.frameNavigated",(e=>{this.id===e.frame.id&&(this.#Z=e.frame.url+(e.frame.urlFragment??""),this.#j())})),this.#M.cdpClient.on("Page.navigatedWithinDocument",(e=>{this.id===e.frameId&&(this.#Z=e.url,this.#N.Page.navigatedWithinDocument.resolve(e))})),this.#M.cdpClient.on("Page.lifecycleEvent",(e=>{if(this.id!==e.frameId)return;const t=(new Date).getTime();if("init"===e.name&&(this.#z(e.loaderId),this.#N.documentInitialized.resolve()),"commit"!==e.name){if(e.loaderId===this.#O)switch(e.name){case"DOMContentLoaded":this.#N.Page.lifecycleEvent.DOMContentLoaded.resolve(e),this.#l.registerEvent({method:B.BrowsingContext.EventNames.DomContentLoadedEvent,params:{context:this.id,navigation:this.#O,timestamp:t,url:this.#Z}},this.id);break;case"load":this.#N.Page.lifecycleEvent.load.resolve(e),this.#l.registerEvent({method:B.BrowsingContext.EventNames.LoadEvent,params:{context:this.id,navigation:this.#O,timestamp:t,url:this.#Z}},this.id)}}else this.#O=e.loaderId})),this.#M.cdpClient.on("Runtime.executionContextCreated",(e=>{if(e.context.auxData.frameId!==this.id)return;if(!["default","isolated"].includes(e.context.auxData.type))return;const t=new $.Realm(this.#y,this.#b,e.context.uniqueId,this.id,e.context.id,this.#L(e),"window","isolated"===e.context.auxData.type?e.context.name:void 0,this.#M.cdpSessionId,this.#M.cdpClient,this.#l);e.context.auxData.isDefault&&(this.#D=t)})),this.#M.cdpClient.on("Runtime.executionContextDestroyed",(e=>{this.#y.deleteRealms({cdpSessionId:this.#M.cdpSessionId,executionContextId:e.executionContextId})})),this.#M.cdpClient.on("Runtime.executionContextsCleared",(()=>{this.#y.deleteRealms({cdpSessionId:this.#M.cdpSessionId})}))}#L(e){return"isolated"===e.context.auxData.type?this.#A.origin:["://",""].includes(e.context.origin)?"null":e.context.origin}#z(e){void 0!==e&&this.#O!==e?(this.#N.documentInitialized.isFinished?this.#N.documentInitialized=new U.Deferred:this.#n?.(V.LogType.browsingContexts,"Document changed"),this.#N.Page.lifecycleEvent.DOMContentLoaded.isFinished?this.#N.Page.lifecycleEvent.DOMContentLoaded=new U.Deferred:this.#n?.(V.LogType.browsingContexts,"Document changed"),this.#N.Page.lifecycleEvent.load.isFinished?this.#N.Page.lifecycleEvent.load=new U.Deferred:this.#n?.(V.LogType.browsingContexts,"Document changed"),this.#O=e):this.#N.Page.navigatedWithinDocument.isFinished&&(this.#N.Page.navigatedWithinDocument=new U.Deferred)}async navigate(e,t){await this.awaitUnblocked();const n=await this.#M.cdpClient.sendCommand("Page.navigate",{url:e,frameId:this.id});if(n.errorText)throw new B.Message.UnknownErrorException(n.errorText);switch(this.#z(n.loaderId),t){case"none":break;case"interactive":void 0===n.loaderId?await this.#N.Page.navigatedWithinDocument:await this.#N.Page.lifecycleEvent.DOMContentLoaded;break;case"complete":void 0===n.loaderId?await this.#N.Page.navigatedWithinDocument:await this.#N.Page.lifecycleEvent.load}return{result:{navigation:n.loaderId||null,url:e}}}async captureScreenshot(){const[,e]=await Promise.all([this.#M.cdpClient.sendCommand("Page.bringToFront"),this.#M.cdpClient.sendCommand("Page.captureScreenshot",{})]);return{result:{data:e.data}}}async print(e){const t={printBackground:e.background,landscape:"landscape"===e.orientation,pageRanges:e.pageRanges?.join(",")??"",scale:e.scale,preferCSSPageSize:!e.shrinkToFit};e.margin?.bottom&&(t.marginBottom=(0,L.inchesFromCm)(e.margin.bottom)),e.margin?.left&&(t.marginLeft=(0,L.inchesFromCm)(e.margin.left)),e.margin?.right&&(t.marginRight=(0,L.inchesFromCm)(e.margin.right)),e.margin?.top&&(t.marginTop=(0,L.inchesFromCm)(e.margin.top)),e.page?.height&&(t.paperHeight=(0,L.inchesFromCm)(e.page.height)),e.page?.width&&(t.paperWidth=(0,L.inchesFromCm)(e.page.width));return{result:{data:(await this.#M.cdpClient.sendCommand("Page.printToPDF",t)).data}}}}O.BrowsingContextImpl=F;var q={},W={},K={};Object.defineProperty(K,"__esModule",{value:!0}),K.getRemoteValuesText=K.logMessageFormatter=void 0;const J=["%s","%d","%i","%f","%o","%O","%c"];function H(e){return J.some((t=>e.includes(t)))}function G(e){let t="";const n=e[0].value.toString(),s=e.slice(1,void 0),r=n.split(new RegExp(J.map((e=>`(${e})`)).join("|"),"g"));for(const n of r)if(void 0!==n&&""!==n)if(H(n)){const r=s.shift();if(void 0===r)throw new Error(`Less value is provided: "${X(e,!1)}"`);"%s"===n?t+=Q(r):"%d"===n||"%i"===n?"bigint"===r.type||"number"===r.type||"string"===r.type?t+=parseInt(r.value.toString(),10):t+="NaN":"%f"===n?"bigint"===r.type||"number"===r.type||"string"===r.type?t+=parseFloat(r.value.toString()):t+="NaN":t+=Y(r)}else t+=n;if(s.length>0)throw new Error(`More value is provided: "${X(e,!1)}"`);return t}function Y(e){if("array"!==e.type&&"bigint"!==e.type&&"date"!==e.type&&"number"!==e.type&&"object"!==e.type&&"string"!==e.type)return Q(e);if("bigint"===e.type)return`${e.value.toString()}n`;if("number"===e.type)return e.value.toString();if(["date","string"].includes(e.type))return JSON.stringify(e.value);if("object"===e.type)return`{${e.value.map((e=>`${JSON.stringify(e[0])}:${Y(e[1])}`)).join(",")}}`;if("array"===e.type)return`[${e.value?.map((e=>Y(e))).join(",")??""}]`;throw Error(`Invalid value type: ${e.toString()}`)}function Q(e){if(!Object.hasOwn(e,"value"))return e.type;switch(e.type){case"string":case"number":case"boolean":case"bigint":return String(e.value);case"regexp":return`/${e.value.pattern}/${e.value.flags??""}`;case"date":return new Date(e.value).toString();case"object":return`Object(${e.value?.length??""})`;case"array":return`Array(${e.value?.length??""})`;case"map":return`Map(${e.value.length})`;case"set":return`Set(${e.value.length})`;case"node":return"node";default:return e.type}}function X(e,t){const n=e[0];return n?"string"===n.type&&H(n.value.toString())&&t?G(e):e.map((e=>Q(e))).join(" "):""}K.logMessageFormatter=G,K.getRemoteValuesText=X,Object.defineProperty(W,"__esModule",{value:!0}),W.LogManager=void 0;const ee=w,te=K;function ne(e){const t=e?.callFrames.map((e=>({columnNumber:e.columnNumber,functionName:e.functionName,lineNumber:e.lineNumber,url:e.url})));return t?{callFrames:t}:void 0}class se{#l;#y;#M;constructor(e,t,n){this.#M=e,this.#y=t,this.#l=n}static create(e,t,n){const s=new se(e,t,n);return s.#B(),s}#B(){this.#V()}#V(){this.#M.cdpClient.on("Runtime.consoleAPICalled",(e=>{const t=this.#y.findRealm({cdpSessionId:this.#M.cdpSessionId,executionContextId:e.executionContextId}),n=void 0===t?Promise.resolve(e.args):Promise.all(e.args.map((e=>t.serializeCdpObject(e,"none"))));this.#l.registerPromiseEvent(n.then((n=>{return{method:ee.Log.EventNames.LogEntryAddedEvent,params:{level:(s=e.type,["assert","error"].includes(s)?"error":["debug","trace"].includes(s)?"debug":["warn","warning"].includes(s)?"warn":"info"),source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:(0,te.getRemoteValuesText)(n,!0),timestamp:Math.round(e.timestamp),stackTrace:ne(e.stackTrace),type:"console",method:"warning"===e.type?"warn":e.type,args:n}};var s})),t?.browsingContextId??"UNKNOWN",ee.Log.EventNames.LogEntryAddedEvent)})),this.#M.cdpClient.on("Runtime.exceptionThrown",(e=>{const t=this.#y.findRealm({cdpSessionId:this.#M.cdpSessionId,executionContextId:e.exceptionDetails.executionContextId}),n=(async()=>e.exceptionDetails.exception?void 0===t?JSON.stringify(e.exceptionDetails.exception):t.stringifyObject(e.exceptionDetails.exception):e.exceptionDetails.text)();this.#l.registerPromiseEvent(n.then((n=>({method:ee.Log.EventNames.LogEntryAddedEvent,params:{level:"error",source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:n,timestamp:Math.round(e.timestamp),stackTrace:ne(e.exceptionDetails.stackTrace),type:"javascript"}}))),t?.browsingContextId??"UNKNOWN",ee.Log.EventNames.LogEntryAddedEvent)}))}}W.LogManager=se;var re={},ae={};Object.defineProperty(ae,"__esModule",{value:!0}),ae.DefaultMap=void 0;class ie extends Map{#U;constructor(e,t){super(t),this.#U=e}get(e){return this.has(e)||this.set(e,this.#U(e)),super.get(e)}}ae.DefaultMap=ie;var oe={};Object.defineProperty(oe,"__esModule",{value:!0}),oe.NetworkRequest=void 0;const de=D,ce=w;class ue{static#$="UNKNOWN";requestId;#l;#F;#q;#W;#K;#J;#H;constructor(e,t){this.requestId=e,this.#l=t,this.#J=new de.Deferred,this.#H=new de.Deferred}onRequestWillBeSentEvent(e){void 0===this.#F&&(this.#F=e,void 0!==this.#q&&this.#J.resolve(),this.#G())}onRequestWillBeSentExtraInfoEvent(e){void 0===this.#q&&(this.#q=e,void 0!==this.#F&&this.#J.resolve())}onResponseReceivedEvent(e){void 0===this.#W&&(this.#W=e,!0===e.hasExtraInfo||this.#J.isFinished||this.#J.resolve(),!0===e.hasExtraInfo&&void 0===this.#K||this.#H.resolve(),this.#Y())}onResponseReceivedEventExtraInfo(e){void 0===this.#K&&(this.#K=e,void 0!==this.#W&&this.#H.resolve())}onLoadingFailedEvent(e){this.#J.resolve(),this.#H.reject(e);const t={...this.#Q(),errorText:e.errorText};this.#l.registerEvent({method:ce.Network.EventNames.FetchErrorEvent,params:t},this.#F?.frameId??null)}#G(){this.#X()||this.#l.registerPromiseEvent(this.#J.then((()=>this.#ee())),this.#F?.frameId??null,ce.Network.EventNames.BeforeRequestSentEvent)}#ee(){if(void 0===this.#F)throw new Error("RequestWillBeSentEvent is not set");const e={...this.#Q(),initiator:{type:this.#te()}};return{method:ce.Network.EventNames.BeforeRequestSentEvent,params:e}}#Q(){return{context:this.#F?.frameId??null,navigation:this.#F?.loaderId??null,redirectCount:0,request:this.#ne(),timestamp:Math.round(1e3*(this.#F?.wallTime??0))}}#ne(){const e=void 0===this.#q?[]:ue.#se(this.#q.associatedCookies);return{request:this.#F?.requestId??ue.#$,url:this.#F?.request.url??ue.#$,method:this.#F?.request.method??ue.#$,headers:Object.keys(this.#F?.request.headers??[]).map((e=>({name:e,value:this.#F?.request.headers[e]}))),cookies:e,headersSize:-1,bodySize:0,timings:{timeOrigin:0,requestTime:0,redirectStart:0,redirectEnd:0,fetchStart:0,dnsStart:0,dnsEnd:0,connectStart:0,connectEnd:0,tlsStart:0,tlsEnd:0,requestStart:0,responseStart:0,responseEnd:0}}}#te(){switch(this.#F?.initiator.type){case"parser":case"script":case"preflight":return this.#F.initiator.type;default:return"other"}}static#re(e){switch(e){case"Strict":return"strict";case"Lax":return"lax";default:return"none"}}static#se(e){return e.map((e=>({name:e.cookie.name,value:e.cookie.value,domain:e.cookie.domain,path:e.cookie.path,expires:e.cookie.expires,size:e.cookie.size,httpOnly:e.cookie.httpOnly,secure:e.cookie.secure,sameSite:ue.#re(e.cookie.sameSite)})))}#Y(){this.#X()||this.#l.registerPromiseEvent(this.#H.then((()=>this.#ae())),this.#W?.frameId??null,ce.Network.EventNames.ResponseCompletedEvent)}#ae(){if(void 0===this.#W)throw new Error("ResponseReceivedEvent is not set");if(void 0===this.#F)throw new Error("RequestWillBeSentEvent is not set");return{method:ce.Network.EventNames.ResponseCompletedEvent,params:{...this.#Q(),response:{url:this.#W.response.url,protocol:this.#W.response.protocol,status:this.#W.response.status,statusText:this.#W.response.statusText,fromCache:this.#W.response.fromDiskCache||this.#W.response.fromPrefetchCache,headers:this.#ie(this.#W.response.headers),mimeType:this.#W.response.mimeType,bytesReceived:this.#W.response.encodedDataLength,headersSize:this.#K?.headersText?.length??-1,bodySize:-1,content:{size:-1}}}}}#ie(e){return Object.keys(e).map((t=>({name:t,value:e[t]})))}#X(){return this.#F?.request.url.endsWith("/favicon.ico")??!1}}oe.NetworkRequest=ue,Object.defineProperty(re,"__esModule",{value:!0}),re.NetworkProcessor=void 0;const le=ae,pe=oe;class he{#l;#oe;constructor(e){this.#l=e,this.#oe=new le.DefaultMap((e=>new pe.NetworkRequest(e,this.#l)))}static async create(e,t){const n=new he(t);return e.on("Network.requestWillBeSent",(e=>{n.#de(e.requestId).onRequestWillBeSentEvent(e)})),e.on("Network.requestWillBeSentExtraInfo",(e=>{n.#de(e.requestId).onRequestWillBeSentExtraInfoEvent(e)})),e.on("Network.responseReceived",(e=>{n.#de(e.requestId).onResponseReceivedEvent(e)})),e.on("Network.responseReceivedExtraInfo",(e=>{n.#de(e.requestId).onResponseReceivedEventExtraInfo(e)})),e.on("Network.loadingFailed",(e=>{n.#de(e.requestId).onLoadingFailedEvent(e)})),await e.sendCommand("Network.enable"),n}#de(e){return this.#oe.get(e)}}re.NetworkProcessor=he,Object.defineProperty(q,"__esModule",{value:!0}),q.CdpTarget=void 0;const me=W,ge=w,fe=D,ve=re;class ye{#ce;#S;#ue;#l;#le;#pe;static create(e,t,n,s,r){const a=new ye(e,t,n,r);return me.LogManager.create(a,s,r),a.#he(),a.#me(),a}constructor(e,t,n,s){this.#ce=e,this.#S=t,this.#ue=n,this.#l=s,this.#pe=!1,this.#le=new fe.Deferred}get targetUnblocked(){return this.#le}get targetId(){return this.#ce}get cdpClient(){return this.#S}get cdpSessionId(){return this.#ue}async#me(){this.#l.isNetworkDomainEnabled&&await this.enableNetworkDomain(),await this.#S.sendCommand("Runtime.enable"),await this.#S.sendCommand("Page.enable"),await this.#S.sendCommand("Page.setLifecycleEventsEnabled",{enabled:!0}),await this.#S.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),await this.#S.sendCommand("Runtime.runIfWaitingForDebugger"),this.#le.resolve()}async enableNetworkDomain(){this.#pe||(this.#pe=!0,await ve.NetworkProcessor.create(this.cdpClient,this.#l))}#he(){this.#S.on("*",((e,t)=>{this.#l.registerEvent({method:ge.CDP.EventNames.EventReceivedEvent,params:{cdpMethod:e,cdpParams:t??{},cdpSession:this.#ue}},null)}))}async addPreloadScript(e,t){return(await this.cdpClient.sendCommand("Page.addScriptToEvaluateOnNewDocument",{source:e,worldName:t})).identifier}async removePreloadScript(e){await this.cdpClient.sendCommand("Page.removeScriptToEvaluateOnNewDocument",{identifier:e})}}q.CdpTarget=ye;var be,xe={},Ce=new Uint8Array(16);function we(){if(!be&&!(be="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return be(Ce)}var _e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function Ie(e){return"string"==typeof e&&_e.test(e)}for(var Se,Te,Ee=[],Pe=0;Pe<256;++Pe)Ee.push((Pe+256).toString(16).substr(1));function ke(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(Ee[e[t+0]]+Ee[e[t+1]]+Ee[e[t+2]]+Ee[e[t+3]]+"-"+Ee[e[t+4]]+Ee[e[t+5]]+"-"+Ee[e[t+6]]+Ee[e[t+7]]+"-"+Ee[e[t+8]]+Ee[e[t+9]]+"-"+Ee[e[t+10]]+Ee[e[t+11]]+Ee[e[t+12]]+Ee[e[t+13]]+Ee[e[t+14]]+Ee[e[t+15]]).toLowerCase();if(!Ie(n))throw TypeError("Stringified UUID is invalid");return n}var Ne=0,Ze=0;function Oe(e){if(!Ie(e))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(e.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(e.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(e.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(e.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n}function Me(e,t,n){function s(e,s,r,a){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],n=0;n<e.length;++n)t.push(e.charCodeAt(n));return t}(e)),"string"==typeof s&&(s=Oe(s)),16!==s.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+e.length);if(i.set(s),i.set(e,s.length),(i=n(i))[6]=15&i[6]|t,i[8]=63&i[8]|128,r){a=a||0;for(var o=0;o<16;++o)r[a+o]=i[o];return r}return ke(i)}try{s.name=e}catch(e){}return s.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",s.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",s}function De(e){return 14+(e+64>>>9<<4)+1}function Re(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function je(e,t,n,s,r,a){return Re((i=Re(Re(t,e),Re(s,a)))<<(o=r)|i>>>32-o,n);var i,o}function Ae(e,t,n,s,r,a,i){return je(t&n|~t&s,e,t,r,a,i)}function ze(e,t,n,s,r,a,i){return je(t&s|n&~s,e,t,r,a,i)}function Le(e,t,n,s,r,a,i){return je(t^n^s,e,t,r,a,i)}function Be(e,t,n,s,r,a,i){return je(n^(t|~s),e,t,r,a,i)}var Ve=Me("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var n=0;n<t.length;++n)e[n]=t.charCodeAt(n)}return function(e){for(var t=[],n=32*e.length,s="0123456789abcdef",r=0;r<n;r+=8){var a=e[r>>5]>>>r%32&255,i=parseInt(s.charAt(a>>>4&15)+s.charAt(15&a),16);t.push(i)}return t}(function(e,t){e[t>>5]|=128<<t%32,e[De(t)-1]=t;for(var n=1732584193,s=-271733879,r=-1732584194,a=271733878,i=0;i<e.length;i+=16){var o=n,d=s,c=r,u=a;n=Ae(n,s,r,a,e[i],7,-680876936),a=Ae(a,n,s,r,e[i+1],12,-389564586),r=Ae(r,a,n,s,e[i+2],17,606105819),s=Ae(s,r,a,n,e[i+3],22,-1044525330),n=Ae(n,s,r,a,e[i+4],7,-176418897),a=Ae(a,n,s,r,e[i+5],12,1200080426),r=Ae(r,a,n,s,e[i+6],17,-1473231341),s=Ae(s,r,a,n,e[i+7],22,-45705983),n=Ae(n,s,r,a,e[i+8],7,1770035416),a=Ae(a,n,s,r,e[i+9],12,-1958414417),r=Ae(r,a,n,s,e[i+10],17,-42063),s=Ae(s,r,a,n,e[i+11],22,-1990404162),n=Ae(n,s,r,a,e[i+12],7,1804603682),a=Ae(a,n,s,r,e[i+13],12,-40341101),r=Ae(r,a,n,s,e[i+14],17,-1502002290),n=ze(n,s=Ae(s,r,a,n,e[i+15],22,1236535329),r,a,e[i+1],5,-165796510),a=ze(a,n,s,r,e[i+6],9,-1069501632),r=ze(r,a,n,s,e[i+11],14,643717713),s=ze(s,r,a,n,e[i],20,-373897302),n=ze(n,s,r,a,e[i+5],5,-701558691),a=ze(a,n,s,r,e[i+10],9,38016083),r=ze(r,a,n,s,e[i+15],14,-660478335),s=ze(s,r,a,n,e[i+4],20,-405537848),n=ze(n,s,r,a,e[i+9],5,568446438),a=ze(a,n,s,r,e[i+14],9,-1019803690),r=ze(r,a,n,s,e[i+3],14,-187363961),s=ze(s,r,a,n,e[i+8],20,1163531501),n=ze(n,s,r,a,e[i+13],5,-1444681467),a=ze(a,n,s,r,e[i+2],9,-51403784),r=ze(r,a,n,s,e[i+7],14,1735328473),n=Le(n,s=ze(s,r,a,n,e[i+12],20,-1926607734),r,a,e[i+5],4,-378558),a=Le(a,n,s,r,e[i+8],11,-2022574463),r=Le(r,a,n,s,e[i+11],16,1839030562),s=Le(s,r,a,n,e[i+14],23,-35309556),n=Le(n,s,r,a,e[i+1],4,-1530992060),a=Le(a,n,s,r,e[i+4],11,1272893353),r=Le(r,a,n,s,e[i+7],16,-155497632),s=Le(s,r,a,n,e[i+10],23,-1094730640),n=Le(n,s,r,a,e[i+13],4,681279174),a=Le(a,n,s,r,e[i],11,-358537222),r=Le(r,a,n,s,e[i+3],16,-722521979),s=Le(s,r,a,n,e[i+6],23,76029189),n=Le(n,s,r,a,e[i+9],4,-640364487),a=Le(a,n,s,r,e[i+12],11,-421815835),r=Le(r,a,n,s,e[i+15],16,530742520),n=Be(n,s=Le(s,r,a,n,e[i+2],23,-995338651),r,a,e[i],6,-198630844),a=Be(a,n,s,r,e[i+7],10,1126891415),r=Be(r,a,n,s,e[i+14],15,-1416354905),s=Be(s,r,a,n,e[i+5],21,-57434055),n=Be(n,s,r,a,e[i+12],6,1700485571),a=Be(a,n,s,r,e[i+3],10,-1894986606),r=Be(r,a,n,s,e[i+10],15,-1051523),s=Be(s,r,a,n,e[i+1],21,-2054922799),n=Be(n,s,r,a,e[i+8],6,1873313359),a=Be(a,n,s,r,e[i+15],10,-30611744),r=Be(r,a,n,s,e[i+6],15,-1560198380),s=Be(s,r,a,n,e[i+13],21,1309151649),n=Be(n,s,r,a,e[i+4],6,-145523070),a=Be(a,n,s,r,e[i+11],10,-1120210379),r=Be(r,a,n,s,e[i+2],15,718787259),s=Be(s,r,a,n,e[i+9],21,-343485551),n=Re(n,o),s=Re(s,d),r=Re(r,c),a=Re(a,u)}return[n,s,r,a]}(function(e){if(0===e.length)return[];for(var t=8*e.length,n=new Uint32Array(De(t)),s=0;s<t;s+=8)n[s>>5]|=(255&e[s/8])<<s%32;return n}(e),8*e.length))})),Ue=Ve;function $e(e,t,n,s){switch(e){case 0:return t&n^~t&s;case 1:case 3:return t^n^s;case 2:return t&n^t&s^n&s}}function Fe(e,t){return e<<t|e>>>32-t}var qe=Me("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var s=unescape(encodeURIComponent(e));e=[];for(var r=0;r<s.length;++r)e.push(s.charCodeAt(r))}else Array.isArray(e)||(e=Array.prototype.slice.call(e));e.push(128);for(var a=e.length/4+2,i=Math.ceil(a/16),o=new Array(i),d=0;d<i;++d){for(var c=new Uint32Array(16),u=0;u<16;++u)c[u]=e[64*d+4*u]<<24|e[64*d+4*u+1]<<16|e[64*d+4*u+2]<<8|e[64*d+4*u+3];o[d]=c}o[i-1][14]=8*(e.length-1)/Math.pow(2,32),o[i-1][14]=Math.floor(o[i-1][14]),o[i-1][15]=8*(e.length-1)&4294967295;for(var l=0;l<i;++l){for(var p=new Uint32Array(80),h=0;h<16;++h)p[h]=o[l][h];for(var m=16;m<80;++m)p[m]=Fe(p[m-3]^p[m-8]^p[m-14]^p[m-16],1);for(var g=n[0],f=n[1],v=n[2],y=n[3],b=n[4],x=0;x<80;++x){var C=Math.floor(x/20),w=Fe(g,5)+$e(C,f,v,y)+b+t[C]+p[x]>>>0;b=y,y=v,v=Fe(f,30)>>>0,f=g,g=w}n[0]=n[0]+g>>>0,n[1]=n[1]+f>>>0,n[2]=n[2]+v>>>0,n[3]=n[3]+y>>>0,n[4]=n[4]+b>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),We=qe;var Ke=Object.freeze({__proto__:null,NIL:"00000000-0000-0000-0000-000000000000",parse:Oe,stringify:ke,v1:function(e,t,n){var s=t&&n||0,r=t||new Array(16),a=(e=e||{}).node||Se,i=void 0!==e.clockseq?e.clockseq:Te;if(null==a||null==i){var o=e.random||(e.rng||we)();null==a&&(a=Se=[1|o[0],o[1],o[2],o[3],o[4],o[5]]),null==i&&(i=Te=16383&(o[6]<<8|o[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),c=void 0!==e.nsecs?e.nsecs:Ze+1,u=d-Ne+(c-Ze)/1e4;if(u<0&&void 0===e.clockseq&&(i=i+1&16383),(u<0||d>Ne)&&void 0===e.nsecs&&(c=0),c>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");Ne=d,Ze=c,Te=i;var l=(1e4*(268435455&(d+=122192928e5))+c)%4294967296;r[s++]=l>>>24&255,r[s++]=l>>>16&255,r[s++]=l>>>8&255,r[s++]=255&l;var p=d/4294967296*1e4&268435455;r[s++]=p>>>8&255,r[s++]=255&p,r[s++]=p>>>24&15|16,r[s++]=p>>>16&255,r[s++]=i>>>8|128,r[s++]=255&i;for(var h=0;h<6;++h)r[s+h]=a[h];return t||ke(r)},v3:Ue,v4:function(e,t,n){var s=(e=e||{}).random||(e.rng||we)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var r=0;r<16;++r)t[n+r]=s[r];return t}return ke(s)},v5:We,validate:Ie,version:function(e){if(!Ie(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}}),Je=t(Ke);Object.defineProperty(xe,"__esModule",{value:!0}),xe.PreloadScriptStorage=void 0;const He=Je;xe.PreloadScriptStorage=class{#ge=new Set;findPreloadScripts(e){return e?[...this.#ge].filter((t=>(void 0===e?.id||e?.id===t.id)&&(void 0===e?.contextId||e?.contextId===t.contextId))):[...this.#ge]}addPreloadScripts(e,t,n,s){const r={id:(0,He.v4)(),contextId:e,cdpPreloadScripts:t,functionDeclaration:n,sandbox:s};return this.#ge.add(r),r}appendPreloadScript(e,t){e.cdpPreloadScripts.push(t)}removePreloadScripts(e){for(const t of this.findPreloadScripts(e))this.#ge.delete(t)}},Object.defineProperty(Z,"__esModule",{value:!0}),Z.BrowsingContextProcessor=void 0;const Ge=w,Ye=P,Qe=O,Xe=q,et=xe;Z.BrowsingContextProcessor=class{#b;#fe;#l;#n;#y;#ve;#ye;constructor(e,t,n,s,r,a){this.#b=r,this.#fe=t,this.#l=s,this.#n=a,this.#y=e,this.#ve=n,this.#ye=new et.PreloadScriptStorage,this.#he(this.#fe.browserClient())}#he(e){e.on("Target.attachedToTarget",(t=>{this.#be(t,e)})),e.on("Target.detachedFromTarget",(e=>{this.#xe(e)})),e.on("Page.frameAttached",(e=>{this.#Ce(e)})),e.on("Page.frameDetached",(e=>{this.#we(e)}))}#Ce(e){const t=this.#b.findContext(e.parentFrameId);void 0!==t&&Qe.BrowsingContextImpl.create(t.cdpTarget,this.#y,e.frameId,e.parentFrameId,this.#l,this.#b,this.#n)}#we(e){"swap"!==e.reason&&this.#b.findContext(e.frameId)?.delete()}#be(e,t){const{sessionId:n,targetInfo:s}=e,r=this.#fe.getCdpClient(n);if(!this.#_e(s))return void r.sendCommand("Runtime.runIfWaitingForDebugger").then((()=>t.sendCommand("Target.detachFromTarget",e)));this.#n?.(Ye.LogType.browsingContexts,"AttachedToTarget event received:",JSON.stringify(e,null,2)),this.#he(r);const a=Xe.CdpTarget.create(s.targetId,r,n,this.#y,this.#l);this.#b.hasContext(s.targetId)?this.#b.getContext(s.targetId).updateCdpTarget(a):Qe.BrowsingContextImpl.create(a,this.#y,s.targetId,null,this.#l,this.#b,this.#n)}#xe(e){const t=e.targetId;this.#b.findContext(t)?.delete()}async#Ie(e){if("realm"in e)return this.#y.getRealm({realmId:e.realm});return this.#b.getContext(e.context).getOrCreateSandbox(e.sandbox)}process_browsingContext_getTree(e){return{result:{contexts:(void 0===e.root?this.#b.getTopLevelContexts():[this.#b.getContext(e.root)]).map((t=>t.serializeToBidiValue(e.maxDepth??Number.MAX_VALUE)))}}}async process_browsingContext_create(e){const t=this.#fe.browserClient();let n;if(void 0!==e.referenceContext&&(n=this.#b.getContext(e.referenceContext),!n.isTopLevelContext()))throw new Ge.Message.InvalidArgumentException("referenceContext should be a top-level context");const s=(await t.sendCommand("Target.createTarget",{url:"about:blank",newWindow:"window"===e.type})).targetId,r=this.#b.getContext(s);return await r.awaitLoaded(),{result:r.serializeToBidiValue(1)}}process_browsingContext_navigate(e){return this.#b.getContext(e.context).navigate(e.url,void 0===e.wait?"none":e.wait)}async process_browsingContext_captureScreenshot(e){return this.#b.getContext(e.context).captureScreenshot()}async process_browsingContext_print(e){return this.#b.getContext(e.context).print(e)}async process_script_addPreloadScript(e){if(void 0!==e.arguments&&e.arguments.length>0)throw new Ge.Message.UnsupportedOperationException("add preload script arguments are not supported");const t=new Set(void 0===e.context||null===e.context?this.#b.getTopLevelContexts().map((e=>e.cdpTarget)):[this.#b.getContext(e.context).cdpTarget]),n=[];for(const s of t){const t=await s.addPreloadScript(`(${e.functionDeclaration})();`,e.sandbox);n.push({target:s,preloadScriptId:t})}return{result:{script:this.#ye.addPreloadScripts(e.context??null,n,e.functionDeclaration,e.sandbox).id}}}async process_script_removePreloadScript(e){const t=e.script,n=this.#ye.findPreloadScripts({id:t});if(0===n.length)throw new Ge.Message.NoSuchScriptException(`No preload script with BiDi ID '${t}'`);for(const e of n)for(const t of e.cdpPreloadScripts){const e=t.target,n=t.preloadScriptId;await e.removePreloadScript(n)}return this.#ye.removePreloadScripts({id:t}),{result:{}}}async process_script_evaluate(e){return(await this.#Ie(e.target)).scriptEvaluate(e.expression,e.awaitPromise,e.resultOwnership??"none")}process_script_getRealms(e){void 0!==e.context&&this.#b.getContext(e.context);const t=this.#y.findRealms({browsingContextId:e.context,type:e.type}).map((e=>e.toBiDi()));return{result:{realms:t}}}async process_script_callFunction(e){return(await this.#Ie(e.target)).callFunction(e.functionDeclaration,e.this||{type:"undefined"},e.arguments||[],e.awaitPromise,e.resultOwnership??"none")}async process_script_disown(e){const t=await this.#Ie(e.target);return await Promise.all(e.handles.map((async e=>t.disown(e)))),{result:{}}}async process_browsingContext_close(e){const t=this.#fe.browserClient();if(!this.#b.getContext(e.context).isTopLevelContext())throw new Ge.Message.InvalidArgumentException("A top-level browsing context cannot be closed.");const n=new Promise((n=>{const s=r=>{r.targetId===e.context&&(t.off("Target.detachedFromTarget",s),n())};t.on("Target.detachedFromTarget",s)}));return await t.sendCommand("Target.closeTarget",{targetId:e.context}),await n,{result:{}}}#_e(e){return e.targetId!==this.#ve&&["page","iframe"].includes(e.type)}async process_cdp_sendCommand(e){const t=e.cdpSession?this.#fe.getCdpClient(e.cdpSession):this.#fe.browserClient();return{result:await t.sendCommand(e.cdpMethod,e.cdpParams),cdpSession:e.cdpSession}}process_cdp_getSession(e){const t=e.context,n=this.#b.getContext(t).cdpTarget.cdpSessionId;return void 0===n?{result:{cdpSession:null}}:{result:{cdpSession:n}}}};var tt={};Object.defineProperty(tt,"__esModule",{value:!0}),tt.OutgoingBidiMessage=void 0;class nt{#Se;#Te;constructor(e,t){this.#Se=e,this.#Te=t}static async createFromPromise(e,t){return e.then((e=>new nt(e,t)))}static createResolved(e,t){return Promise.resolve(new nt(e,t))}get message(){return this.#Se}get channel(){return this.#Te}}tt.OutgoingBidiMessage=nt,Object.defineProperty(N,"__esModule",{value:!0}),N.CommandProcessor=void 0;const st=w,rt=P,at=I,it=Z,ot=tt;class dt{parseAddPreloadScriptParams(e){return e}parseRemovePreloadScriptParams(e){return e}parseGetRealmsParams(e){return e}parseCallFunctionParams(e){return e}parseEvaluateParams(e){return e}parseDisownParams(e){return e}parseSendCommandParams(e){return e}parseGetSessionParams(e){return e}parseSubscribeParams(e){return e}parseNavigateParams(e){return e}parseGetTreeParams(e){return e}parseCreateParams(e){return e}parseCloseParams(e){return e}parseCaptureScreenshotParams(e){return e}parsePrintParams(e){return e}}class ct extends at.EventEmitter{#Ee;#l;#Pe;#n;constructor(e,t,n,s,r=new dt,a,i){super(),this.#l=n,this.#n=i,this.#Ee=new it.BrowsingContextProcessor(e,t,s,n,a,i),this.#Pe=r}static#ke(){return{result:{ready:!1,message:"already connected"}}}async#Ne(e,t){return await this.#l.subscribe(e.events,e.contexts??[null],t),{result:{}}}async#Ze(e,t){return await this.#l.unsubscribe(e.events,e.contexts??[null],t),{result:{}}}async#Oe(e){switch(e.method){case"session.status":return ct.#ke();case"session.subscribe":return this.#Ne(this.#Pe.parseSubscribeParams(e.params),e.channel??null);case"session.unsubscribe":return this.#Ze(this.#Pe.parseSubscribeParams(e.params),e.channel??null);case"browsingContext.create":return this.#Ee.process_browsingContext_create(this.#Pe.parseCreateParams(e.params));case"browsingContext.close":return this.#Ee.process_browsingContext_close(this.#Pe.parseCloseParams(e.params));case"browsingContext.getTree":return this.#Ee.process_browsingContext_getTree(this.#Pe.parseGetTreeParams(e.params));case"browsingContext.navigate":return this.#Ee.process_browsingContext_navigate(this.#Pe.parseNavigateParams(e.params));case"browsingContext.captureScreenshot":return this.#Ee.process_browsingContext_captureScreenshot(this.#Pe.parseCaptureScreenshotParams(e.params));case"browsingContext.print":return this.#Ee.process_browsingContext_print(this.#Pe.parsePrintParams(e.params));case"script.addPreloadScript":return this.#Ee.process_script_addPreloadScript(this.#Pe.parseAddPreloadScriptParams(e.params));case"script.removePreloadScript":return this.#Ee.process_script_removePreloadScript(this.#Pe.parseRemovePreloadScriptParams(e.params));case"script.getRealms":return this.#Ee.process_script_getRealms(this.#Pe.parseGetRealmsParams(e.params));case"script.callFunction":return this.#Ee.process_script_callFunction(this.#Pe.parseCallFunctionParams(e.params));case"script.evaluate":return this.#Ee.process_script_evaluate(this.#Pe.parseEvaluateParams(e.params));case"script.disown":return this.#Ee.process_script_disown(this.#Pe.parseDisownParams(e.params));case"cdp.sendCommand":return this.#Ee.process_cdp_sendCommand(this.#Pe.parseSendCommandParams(e.params));case"cdp.getSession":return this.#Ee.process_cdp_getSession(this.#Pe.parseGetSessionParams(e.params));default:throw new st.Message.UnknownCommandException(`Unknown command '${e.method}'.`)}}async processCommand(e){try{const t=await this.#Oe(e),n={id:e.id,...t};this.emit("response",ot.OutgoingBidiMessage.createResolved(n,e.channel??null))}catch(t){if(t instanceof st.Message.ErrorResponse){const n=t;this.emit("response",ot.OutgoingBidiMessage.createResolved(n.toErrorResponse(e.id),e.channel??null))}else{const n=t;this.#n?.(rt.LogType.bidi,n),this.emit("response",ot.OutgoingBidiMessage.createResolved(new st.Message.ErrorResponse(st.Message.ErrorCode.UnknownError,n.message).toErrorResponse(e.id),e.channel??null))}}}}N.CommandProcessor=ct;var ut={};Object.defineProperty(ut,"__esModule",{value:!0}),ut.BrowsingContextStorage=void 0;const lt=w;ut.BrowsingContextStorage=class{#Me=new Map;getTopLevelContexts(){return this.getAllContexts().filter((e=>e.isTopLevelContext()))}getAllContexts(){return Array.from(this.#Me.values())}deleteContextById(e){this.#Me.delete(e)}deleteContext(e){this.#Me.delete(e.id)}addContext(e){this.#Me.set(e.id,e)}hasContext(e){return this.#Me.has(e)}findContext(e){return this.#Me.get(e)}findTopLevelContextId(e){if(null===e)return null;const t=this.findContext(e),n=t?.parentId??null;return null===n?e:this.findTopLevelContextId(n)}findTopLevelContext(e){const t=this.findTopLevelContextId(e);return null===t?null:this.findContext(t)}getContext(e){const t=this.findContext(e);if(void 0===t)throw new lt.Message.NoSuchFrameException(`Context ${e} not found`);return t}};var pt={},ht={};Object.defineProperty(ht,"__esModule",{value:!0}),ht.Buffer=void 0;ht.Buffer=class{#De;#Re=[];#je;constructor(e,t=(()=>{})){this.#De=e,this.#je=t}get(){return this.#Re}add(e){for(this.#Re.push(e);this.#Re.length>this.#De;){const e=this.#Re.shift();void 0!==e&&this.#je(e)}}};var mt={};Object.defineProperty(mt,"__esModule",{value:!0}),mt.IdWrapper=void 0;class gt{static#Ae=0;#E;constructor(){this.#E=++gt.#Ae}get id(){return this.#E}}mt.IdWrapper=gt;var ft={};Object.defineProperty(ft,"__esModule",{value:!0}),ft.SubscriptionManager=ft.unrollEvents=ft.cartesianProduct=void 0;const vt=w;function yt(...e){return e.reduce(((e,t)=>e.flatMap((e=>t.map((t=>[e,t].flat()))))))}function bt(e){const t=[];for(const n of e)switch(n){case vt.BrowsingContext.AllEvents:t.push(...Object.values(vt.BrowsingContext.EventNames));break;case vt.CDP.AllEvents:t.push(...Object.values(vt.CDP.EventNames));break;case vt.Log.AllEvents:t.push(...Object.values(vt.Log.EventNames));break;case vt.Network.AllEvents:t.push(...Object.values(vt.Network.EventNames));break;case vt.Script.AllEvents:t.push(...Object.values(vt.Script.EventNames));break;default:t.push(n)}return t}ft.cartesianProduct=yt,ft.unrollEvents=bt;ft.SubscriptionManager=class{#ze=0;#Le=new Map;#b;constructor(e){this.#b=e}getChannelsSubscribedToEvent(e,t){return Array.from(this.#Le.keys()).map((n=>({priority:this.#Be(e,t,n),channel:n}))).filter((({priority:e})=>null!==e)).sort(((e,t)=>e.priority-t.priority)).map((({channel:e})=>e))}#Be(e,t,n){const s=this.#Le.get(n);if(void 0===s)return null;const r=this.#b.findTopLevelContextId(t),a=[...new Set([null,r])].map((t=>s.get(t)?.get(e))).filter((e=>void 0!==e));return 0===a.length?null:Math.min(...a)}subscribe(e,t,n){if(t=this.#b.findTopLevelContextId(t),e===vt.BrowsingContext.AllEvents)return void Object.values(vt.BrowsingContext.EventNames).map((e=>this.subscribe(e,t,n)));if(e===vt.CDP.AllEvents)return void Object.values(vt.CDP.EventNames).map((e=>this.subscribe(e,t,n)));if(e===vt.Log.AllEvents)return void Object.values(vt.Log.EventNames).map((e=>this.subscribe(e,t,n)));if(e===vt.Network.AllEvents)return void Object.values(vt.Network.EventNames).map((e=>this.subscribe(e,t,n)));if(e===vt.Script.AllEvents)return void Object.values(vt.Script.EventNames).map((e=>this.subscribe(e,t,n)));this.#Le.has(n)||this.#Le.set(n,new Map);const s=this.#Le.get(n);s.has(t)||s.set(t,new Map);const r=s.get(t);r.has(e)||r.set(e,this.#ze++)}unsubscribeAll(e,t,n){for(const e of t)null!==e&&this.#b.getContext(e);yt(bt(e),t).map((([e,t])=>this.#Ve(e,t,n))).forEach((e=>e()))}unsubscribe(e,t,n){this.unsubscribeAll([e],[t],n)}#Ve(e,t,n){if(t=this.#b.findTopLevelContextId(t),!this.#Le.has(n))throw new vt.Message.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const s=this.#Le.get(n);if(!s.has(t))throw new vt.Message.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const r=s.get(t);if(!r.has(e))throw new vt.Message.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);return()=>{r.delete(e),0===r.size&&s.delete(e),0===s.size&&this.#Le.delete(n)}}},Object.defineProperty(pt,"__esModule",{value:!0}),pt.EventManager=void 0;const xt=w,Ct=ht,wt=mt,_t=tt,It=ae,St=ft;class Tt{#Ue;#$e;#Fe;constructor(e,t){this.#Ue=new wt.IdWrapper,this.#$e=t,this.#Fe=e}get id(){return this.#Ue.id}get contextId(){return this.#$e}get event(){return this.#Fe}}const Et=new Map([[xt.Log.EventNames.LogEntryAddedEvent,100]]);class Pt{static#qe="network";#We=new It.DefaultMap((()=>new Set));#Ke=new Map;#Je=new Map;#He;#Ge;#Ye;constructor(e){this.#Ge=e,this.#He=new St.SubscriptionManager(e.getBrowsingContextStorage()),this.#Ye=!1}get isNetworkDomainEnabled(){return this.#Ye}static#Qe(e,t,n){return JSON.stringify({eventName:e,browsingContext:t,channel:n})}registerEvent(e,t){this.registerPromiseEvent(Promise.resolve(e),t,e.method)}registerPromiseEvent(e,t,n){const s=new Tt(e,t),r=this.#He.getChannelsSubscribedToEvent(n,t);this.#Xe(s,n);for(const t of r)this.#Ge.emitOutgoingMessage(_t.OutgoingBidiMessage.createFromPromise(e,t)),this.#et(s,t,n)}async subscribe(e,t,n){for(const e of t)null!==e&&this.#Ge.getBrowsingContextStorage().getContext(e);for(const s of e)for(const e of t){await this.#tt(s,e),this.#He.subscribe(s,e,n);for(const t of this.#nt(s,e,n))this.#Ge.emitOutgoingMessage(_t.OutgoingBidiMessage.createFromPromise(t.event,n)),this.#et(t,n,s)}}async#tt(e,t){e.startsWith(Pt.#qe)&&(null===t?(this.#Ye=!0,await Promise.all(this.#Ge.getBrowsingContextStorage().getAllContexts().map((e=>e.cdpTarget.enableNetworkDomain())))):await this.#Ge.getBrowsingContextStorage().getContext(t).cdpTarget.enableNetworkDomain())}unsubscribe(e,t,n){this.#He.unsubscribeAll(e,t,n)}#Xe(e,t){if(!Et.has(t))return;const n=Pt.#Qe(t,e.contextId);this.#Ke.has(n)||this.#Ke.set(n,new Ct.Buffer(Et.get(t))),this.#Ke.get(n).add(e),this.#We.get(t).add(e.contextId)}#et(e,t,n){if(!Et.has(n))return;const s=Pt.#Qe(n,e.contextId,t);this.#Je.set(s,Math.max(this.#Je.get(s)??0,e.id))}#nt(e,t,n){const s=Pt.#Qe(e,t),r=Pt.#Qe(e,t,n),a=this.#Je.get(r)??-1/0,i=this.#Ke.get(s)?.get().filter((e=>e.id>a))??[];return null===t&&Array.from(this.#We.get(e).keys()).filter((e=>null!==e&&this.#Ge.getBrowsingContextStorage().hasContext(e))).map((t=>this.#nt(e,t,n))).forEach((e=>i.push(...e))),i.sort(((e,t)=>e.id-t.id))}}pt.EventManager=Pt;var kt={};Object.defineProperty(kt,"__esModule",{value:!0}),kt.RealmStorage=void 0;const Nt=w;kt.RealmStorage=class{#st=new Map;#rt=new Map;get knownHandlesToRealm(){return this.#st}get realmMap(){return this.#rt}findRealms(e){return Array.from(this.#rt.values()).filter((t=>(void 0===e.realmId||e.realmId===t.realmId)&&((void 0===e.browsingContextId||e.browsingContextId===t.browsingContextId)&&((void 0===e.navigableId||e.navigableId===t.navigableId)&&((void 0===e.executionContextId||e.executionContextId===t.executionContextId)&&((void 0===e.origin||e.origin===t.origin)&&((void 0===e.type||e.type===t.type)&&((void 0===e.sandbox||e.sandbox===t.sandbox)&&(void 0===e.cdpSessionId||e.cdpSessionId===t.cdpSessionId)))))))))}findRealm(e){const t=this.findRealms(e);if(1===t.length)return t[0]}getRealm(e){const t=this.findRealm(e);if(void 0===t)throw new Nt.Message.NoSuchFrameException(`Realm ${JSON.stringify(e)} not found`);return t}deleteRealms(e){this.findRealms(e).map((e=>{this.#rt.delete(e.realmId),Array.from(this.#st.entries()).filter((([,t])=>t===e.realmId)).map((([e])=>this.#st.delete(e)))}))}},Object.defineProperty(_,"__esModule",{value:!0}),_.BidiServer=void 0;const Zt=I,Ot=E,Mt=N,Dt=ut,Rt=pt,jt=kt;class At extends Zt.EventEmitter{#at;#it;#ot;#b;#y;#n;#dt=e=>{this.#ot.processCommand(e)};#ct=async e=>{const t=e.message;null!==e.channel&&(t.channel=e.channel),await this.#it.sendMessage(t)};constructor(e,t,n,s,r){super(),this.#n=r,this.#b=new Dt.BrowsingContextStorage,this.#y=new jt.RealmStorage,this.#at=new Ot.ProcessingQueue(this.#ct,(()=>Promise.resolve()),this.#n),this.#it=e,this.#it.setOnMessage(this.#dt),this.#ot=new Mt.CommandProcessor(this.#y,t,new Rt.EventManager(this),n,s,this.#b,this.#n),this.#ot.on("response",(e=>{this.emitOutgoingMessage(e)}))}static async createAndStart(e,t,n,s,r){const a=new At(e,t,n,s,r),i=t.browserClient();return await i.sendCommand("Target.setDiscoverTargets",{discover:!0}),await i.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),await a.topLevelContextsLoaded(),a}async topLevelContextsLoaded(){await Promise.all(this.#b.getTopLevelContexts().map((e=>e.awaitLoaded())))}emitOutgoingMessage(e){this.#at.add(e)}close(){this.#it.close()}getBrowsingContextStorage(){return this.#b}}_.BidiServer=At;var zt={},Lt={};Object.defineProperty(Lt,"__esModule",{value:!0}),Lt.CdpClient=void 0;const Bt=I;class Vt extends Bt.EventEmitter{#fe;#ut;constructor(e,t){super(),this.#fe=e,this.#ut=t}static create(e,t){return new Vt(e,t)}sendCommand(e,...t){const n=t[0];return this.#fe.sendCommand(e,n,this.#ut)}}Lt.CdpClient=Vt;var Ut={};Object.defineProperty(Ut,"__esModule",{value:!0}),Ut.CdpConnection=void 0;const $t=Lt;Ut.CdpConnection=class{#it;#lt;#pt=new Map;#ht=new Map;#mt;#gt=0;constructor(e,t=(()=>{})){this.#it=e,this.#mt=t,this.#it.setOnMessage(this.#ft),this.#lt=$t.CdpClient.create(this,null)}close(){this.#it.close();for(const[,{reject:e,error:t}]of this.#ht)e(t);this.#ht.clear(),this.#pt.clear()}browserClient(){return this.#lt}getCdpClient(e){const t=this.#pt.get(e);if(!t)throw new Error("Unknown CDP session ID");return t}sendCommand(e,t,n){return new Promise(((s,r)=>{const a=this.#gt++;this.#ht.set(a,{resolve:s,reject:r,error:new Error(`${e} ${JSON.stringify(t)} ${n} call rejected because the connection has been closed.`)});const i={id:a,method:e,params:t};n&&(i.sessionId=n);const o=JSON.stringify(i),d=JSON.stringify(i,null,2);this.#it.sendMessage(o),this.#mt("sent ▸",d)}))}#ft=e=>{const t=JSON.parse(e),n=JSON.stringify(t,null,2);if(this.#mt("received ◂",n),"Target.attachedToTarget"===t.method){const{sessionId:e}=t.params;this.#pt.set(e,$t.CdpClient.create(this,e))}else if("Target.detachedFromTarget"===t.method){const{sessionId:e}=t.params;this.#pt.get(e)&&this.#pt.delete(e)}if(void 0!==t.id){const e=this.#ht.get(t.id);this.#ht.delete(t.id),e&&(t.result?e.resolve(t.result):t.error&&e.reject(t.error))}else if(t.method){const e=t.sessionId?this.#pt.get(t.sessionId):this.#lt;e&&e.emit(t.method,t.params||{})}}};var Ft={};Object.defineProperty(Ft,"__esModule",{value:!0}),Ft.WebSocketTransport=void 0;Ft.WebSocketTransport=class{#ft=null;#vt;constructor(e){this.#vt=e,this.#vt.on("message",(e=>{this.#ft?.(e)}))}setOnMessage(e){this.#ft=e}sendMessage(e){this.#vt.send(e)}close(){this.#ft=null,this.#vt.close()}},function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.WebSocketTransport=e.CdpConnection=e.CdpClient=void 0;var t=Lt;Object.defineProperty(e,"CdpClient",{enumerable:!0,get:function(){return t.CdpClient}});var n=Ut;Object.defineProperty(e,"CdpConnection",{enumerable:!0,get:function(){return n.CdpConnection}});var s=Ft;Object.defineProperty(e,"WebSocketTransport",{enumerable:!0,get:function(){return s.WebSocketTransport}})}(zt);var qt={};Object.defineProperty(qt,"__esModule",{value:!0}),qt.log=qt.generatePage=void 0;const Wt=P;function Kt(e){const t=`${e}_log`,n=document.getElementById(t);if(n)return n;const s=document.getElementById("details"),r=document.createElement("div");r.className="divider",s.appendChild(r);const a=document.createElement("div");return a.className="item",a.innerHTML=`<h3>${e}</h3><div id="${t}" class="log"></div>`,s.appendChild(a),document.getElementById(t)}qt.generatePage=function(){globalThis.document.documentElement&&(globalThis.document.documentElement.innerHTML='<!DOCTYPE html><title>BiDi-CDP Mapper</title><style>body{font-family: Roboto, serif; font-size: 13px; color: #202124;}.log{padding: 12px; font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace; font-size: 11px; line-height: 180%; background: #f1f3f4; border-radius: 4px;}.pre{overflow-wrap: break-word; padding: 10px;}.card{margin: 60px auto; padding: 2px 0; max-width: 900px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15), 0 1px 6px rgba(0, 0, 0, 0.2); border-radius: 8px;}.divider{height: 1px; background: #f0f0f0;}.item{padding: 16px 20px;}</style><div class="card"><div class="item"><h1>BiDi-CDP Mapper is controlling this tab</h1><p>Closing or reloading it will stop the BiDi process. <a target="_blank" title="BiDi-CDP Mapper GitHub Repository" href="https://github.com/GoogleChromeLabs/chromium-bidi">Details.</a></p></div><div class="divider"></div><details id="details"><summary class="item">Debug information</summary></details></div>',Kt(Wt.LogType.system),Kt(Wt.LogType.bidi),Kt(Wt.LogType.browsingContexts),Kt(Wt.LogType.cdp))},qt.log=function(t,...n){if(!globalThis.document.documentElement)return;e.window?.sendDebugMessage?.(JSON.stringify({logType:t,messages:n}));const s=Kt(t),r=document.createElement("div");r.className="pre",r.textContent=n.join(" "),s.appendChild(r)};
 /**
 	 * Copyright 2021 Google LLC.
 	 * Copyright (c) Microsoft Corporation.
@@ -17,5 +17,5 @@
 	 *
 	 * @license
 	 */
-var ut=e&&e.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var r=Object.getOwnPropertyDescriptor(t,s);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,r)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),lt=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),pt=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var s in e)"default"!==s&&Object.prototype.hasOwnProperty.call(e,s)&&ut(t,e,s);return lt(t,e),t};Object.defineProperty(t,"__esModule",{value:!0});const ht=pt(s),mt=C,gt=w,ft=et,vt=T,yt=xe,xt=ot,bt=async function(){return new Promise((e=>{window.setSelfTargetId=t=>{(0,xt.log)(vt.LogType.system,"Current target ID:",t),e(t)}}))}();(async()=>{(0,xt.generatePage)();const e=await bt,t=await async function(e){class t{#mt=null;constructor(){window.onBidiMessage=e=>{let s;(0,xt.log)(vt.LogType.bidi,"received ◂",e);try{s=t.#ft(e)}catch(t){return void this.#vt(e,mt.Message.ErrorCode.InvalidArgument,t.message,null)}this.#mt?.call(null,s)}}setOnMessage(e){this.#mt=e}sendMessage(e){const t=JSON.stringify(e);window.sendBidiResponse(t),(0,xt.log)(vt.LogType.bidi,"sent ▸",t)}close(){this.#mt=null,window.onBidiMessage=null}#vt(e,s,n,r){const a=t.#yt(e,s,n);r?this.sendMessage({...a,channel:r}):this.sendMessage(a)}static#xt(e){return null===e?"null":Array.isArray(e)?"array":typeof e}static#yt(e,s,n){let r;try{const s=JSON.parse(e);"object"===t.#xt(s)&&"id"in s&&(r=s.id)}catch{}return{id:r,error:s,message:n}}static#ft(e){let s;try{s=JSON.parse(e)}catch{throw new Error("Cannot parse data as JSON")}const n=t.#xt(s);if("object"!==n)throw new Error(`Expected JSON object but got ${n}`);const{id:r,method:a,params:i}=s,o=t.#xt(r);if("number"!==o||!Number.isInteger(r)||r<0)throw new Error(`Expected unsigned integer but got ${o}`);const d=t.#xt(a);if("string"!==d)throw new Error(`Expected string method but got ${d}`);const c=t.#xt(i);if("object"!==c)throw new Error(`Expected object params but got ${c}`);let u=s.channel;if(void 0!==u){const e=t.#xt(u);if("string"!==e)throw new Error(`Expected string channel but got ${e}`);""===u&&(u=void 0)}return{id:r,method:a,params:i,channel:u}}}return gt.BidiServer.createAndStart(new t,function(){class e{#mt=null;constructor(){window.cdp.onmessage=e=>{this.#mt?.call(null,e)}}setOnMessage(e){this.#mt=e}sendMessage(e){window.cdp.send(e)}close(){this.#mt=null,window.cdp.onmessage=null}}return new ft.CdpConnection(new e,((...e)=>{(0,xt.log)(vt.LogType.cdp,...e)}))}(),e,new Ct,xt.log)}(e);(0,xt.log)(vt.LogType.system,"Launched"),t.emitOutgoingMessage(yt.OutgoingBidiMessage.createResolved({launched:!0},null))})();class Ct{parseAddPreloadScriptParams(e){return ht.Script.parseAddPreloadScriptParams(e)}parseRemovePreloadScriptParams(e){return ht.Script.parseRemovePreloadScriptParams(e)}parseGetRealmsParams(e){return ht.Script.parseGetRealmsParams(e)}parseCallFunctionParams(e){return ht.Script.parseCallFunctionParams(e)}parseEvaluateParams(e){return ht.Script.parseEvaluateParams(e)}parseDisownParams(e){return ht.Script.parseDisownParams(e)}parseSendCommandParams(e){return ht.CDP.parseSendCommandParams(e)}parseGetSessionParams(e){return ht.CDP.parseGetSessionParams(e)}parseSubscribeParams(e){return ht.Session.parseSubscribeParams(e)}parseNavigateParams(e){return ht.BrowsingContext.parseNavigateParams(e)}parseGetTreeParams(e){return ht.BrowsingContext.parseGetTreeParams(e)}parseCreateParams(e){return ht.BrowsingContext.parseCreateParams(e)}parseCloseParams(e){return ht.BrowsingContext.parseCloseParams(e)}parseCaptureScreenshotParams(e){return ht.BrowsingContext.parseCaptureScreenshotParams(e)}parsePrintParams(e){return ht.BrowsingContext.parsePrintParams(e)}}return t}();
+var Jt=e&&e.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,r)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),Ht=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Gt=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Jt(t,e,n);return Ht(t,e),t};Object.defineProperty(n,"__esModule",{value:!0});const Yt=Gt(s),Qt=w,Xt=_,en=zt,tn=P,nn=tt,sn=qt,rn=async function(){return new Promise((e=>{window.setSelfTargetId=t=>{(0,sn.log)(tn.LogType.system,"Current target ID:",t),e(t)}}))}();(async()=>{(0,sn.generatePage)();const e=await rn,t=await function(e){class t{#ft=null;constructor(){window.onBidiMessage=e=>{let n;(0,sn.log)(tn.LogType.bidi,"received ◂",e);try{n=t.#yt(e)}catch(t){return void this.#bt(e,Qt.Message.ErrorCode.InvalidArgument,t.message,null)}this.#ft?.call(null,n)}}setOnMessage(e){this.#ft=e}sendMessage(e){const t=JSON.stringify(e);window.sendBidiResponse(t),(0,sn.log)(tn.LogType.bidi,"sent ▸",t)}close(){this.#ft=null,window.onBidiMessage=null}#bt(e,n,s,r){const a=t.#xt(e,n,s);r?this.sendMessage({...a,channel:r}):this.sendMessage(a)}static#Ct(e){return null===e?"null":Array.isArray(e)?"array":typeof e}static#xt(e,n,s){let r;try{const n=JSON.parse(e);"object"===t.#Ct(n)&&"id"in n&&(r=n.id)}catch{}return{id:r,error:n,message:s}}static#yt(e){let n;try{n=JSON.parse(e)}catch{throw new Error("Cannot parse data as JSON")}const s=t.#Ct(n);if("object"!==s)throw new Error(`Expected JSON object but got ${s}`);const{id:r,method:a,params:i}=n,o=t.#Ct(r);if("number"!==o||!Number.isInteger(r)||r<0)throw new Error(`Expected unsigned integer but got ${o}`);const d=t.#Ct(a);if("string"!==d)throw new Error(`Expected string method but got ${d}`);const c=t.#Ct(i);if("object"!==c)throw new Error(`Expected object params but got ${c}`);let u=n.channel;if(void 0!==u){const e=t.#Ct(u);if("string"!==e)throw new Error(`Expected string channel but got ${e}`);""===u&&(u=void 0)}return{id:r,method:a,params:i,channel:u}}}return Xt.BidiServer.createAndStart(new t,function(){class e{#ft=null;constructor(){window.cdp.onmessage=e=>{this.#ft?.call(null,e)}}setOnMessage(e){this.#ft=e}sendMessage(e){window.cdp.send(e)}close(){this.#ft=null,window.cdp.onmessage=null}}return new en.CdpConnection(new e,((...e)=>{(0,sn.log)(tn.LogType.cdp,...e)}))}(),e,new an,sn.log)}(e);(0,sn.log)(tn.LogType.system,"Launched"),t.emitOutgoingMessage(nn.OutgoingBidiMessage.createResolved({launched:!0},null))})();class an{parseAddPreloadScriptParams(e){return Yt.Script.parseAddPreloadScriptParams(e)}parseRemovePreloadScriptParams(e){return Yt.Script.parseRemovePreloadScriptParams(e)}parseGetRealmsParams(e){return Yt.Script.parseGetRealmsParams(e)}parseCallFunctionParams(e){return Yt.Script.parseCallFunctionParams(e)}parseEvaluateParams(e){return Yt.Script.parseEvaluateParams(e)}parseDisownParams(e){return Yt.Script.parseDisownParams(e)}parseSendCommandParams(e){return Yt.CDP.parseSendCommandParams(e)}parseGetSessionParams(e){return Yt.CDP.parseGetSessionParams(e)}parseSubscribeParams(e){return Yt.Session.parseSubscribeParams(e)}parseNavigateParams(e){return Yt.BrowsingContext.parseNavigateParams(e)}parseGetTreeParams(e){return Yt.BrowsingContext.parseGetTreeParams(e)}parseCreateParams(e){return Yt.BrowsingContext.parseCreateParams(e)}parseCloseParams(e){return Yt.BrowsingContext.parseCloseParams(e)}parseCaptureScreenshotParams(e){return Yt.BrowsingContext.parseCaptureScreenshotParams(e)}parsePrintParams(e){return Yt.BrowsingContext.parsePrintParams(e)}}return n}();
 //# sourceMappingURL=mapperTab.js.map
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 3d0e06e..7f53586 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -91,7 +91,6 @@
   android_library("blink_headers_java") {
     deps = [
       "//services/network/public/mojom:mojom_java",
-      "//third_party/android_deps:com_android_support_support_annotations_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
     srcjar_deps = [ ":blink_headers_java_enums_srcjar" ]
diff --git a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
index 381bbed1..bf0a23e6 100644
--- a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
+++ b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
@@ -19,6 +19,12 @@
 
 namespace blink {
 
+// Note: these must match the values in renderer_preferences.mojom.
+constexpr uint32_t kDefaultActiveSelectionBgColor = 0xFF1967D2;
+constexpr uint32_t kDefaultActiveSelectionFgColor = 0xFFFFFFFF;
+constexpr uint32_t kDefaultInactiveSelectionBgColor = 0xFFC8C8C8;
+constexpr uint32_t kDefaultInactiveSelectionFgColor = 0xFF323232;
+
 // User preferences passed between the browser and renderer processes.
 // See //third_party/blink/public/mojom/renderer_preferences.mojom for a
 // description of what each field is about.
@@ -32,10 +38,10 @@
       gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE};
   bool use_subpixel_positioning{false};
   uint32_t focus_ring_color{0xFFE59700};
-  uint32_t active_selection_bg_color{0xFF1E90FF};
-  uint32_t active_selection_fg_color{0xFFFFFFFF};
-  uint32_t inactive_selection_bg_color{0xFFC8C8C8};
-  uint32_t inactive_selection_fg_color{0xFF323232};
+  uint32_t active_selection_bg_color{kDefaultActiveSelectionBgColor};
+  uint32_t active_selection_fg_color{kDefaultActiveSelectionFgColor};
+  uint32_t inactive_selection_bg_color{kDefaultInactiveSelectionBgColor};
+  uint32_t inactive_selection_fg_color{kDefaultInactiveSelectionFgColor};
   bool browser_handles_all_top_level_requests{false};
   absl::optional<base::TimeDelta> caret_blink_interval;
   bool use_custom_colors{true};
diff --git a/third_party/blink/public/mojom/renderer_preferences.mojom b/third_party/blink/public/mojom/renderer_preferences.mojom
index a542242..da8a633 100644
--- a/third_party/blink/public/mojom/renderer_preferences.mojom
+++ b/third_party/blink/public/mojom/renderer_preferences.mojom
@@ -45,7 +45,8 @@
   uint32 focus_ring_color = 0xFFE59700;
 
   // The colors used in selection text. Currently only used on Linux and Ash.
-  uint32 active_selection_bg_color = 0xFF1E90FF;
+  // Note: these must match the values in renderer_preferences.h.
+  uint32 active_selection_bg_color = 0xFF1967D2;
   uint32 active_selection_fg_color = 0xFFFFFFFF;
   uint32 inactive_selection_bg_color = 0xFFC8C8C8;
   uint32 inactive_selection_fg_color = 0xFF323232;
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 7c821c4..87bb21d 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -2311,6 +2311,9 @@
     content_->InvalidateNormalizedTiming();
     content_->Invalidate();
   }
+
+  // TODO(kevers): Do not update start if "sticky" (explicitly set via startTime
+  // or currentTime).
   if (start_time_) {
     UpdateStartTimeForViewTimeline();
   }
diff --git a/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc b/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc
index e72418b..9de50494 100644
--- a/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc
+++ b/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc
@@ -33,8 +33,8 @@
   }
 
   const HeapHashSet<WeakMember<ScrollSnapshotClient>>&
-  GetUnvalidatedTimelines() {
-    return GetFrame().GetUnvalidatedScrollSnapshotClientsForTesting();
+  GetScrollSnapshotClientsForTesting() {
+    return GetFrame().GetScrollSnapshotClientsForTesting();
   }
 };
 
@@ -196,7 +196,7 @@
     <div id=main></div>
   )HTML");
 
-  ASSERT_TRUE(GetUnvalidatedTimelines().empty());
+  ASSERT_TRUE(GetScrollSnapshotClientsForTesting().empty());
 
   Element* element = MakeGarbageCollected<HTMLDivElement>(GetDocument());
   element->setAttribute(blink::html_names::kIdAttr, "element");
@@ -216,7 +216,7 @@
   observer->observe(element);
 
   UpdateAllLifecyclePhasesForTest();
-  EXPECT_EQ(1u, GetUnvalidatedTimelines().size());
+  EXPECT_EQ(1u, GetScrollSnapshotClientsForTesting().size());
 }
 
 namespace {
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc
index 5559a5c..f4316bf 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -305,7 +305,7 @@
     animation->FlushPendingUpdates();
     if (ViewTimeline* view_timeline =
             DynamicTo<ViewTimeline>(animation->timeline())) {
-      view_timeline->ResolveTimelineOffsets(/* invalidate_effect */ false);
+      view_timeline->ResolveTimelineOffsets();
     }
   }
 
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_model.cc b/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
index 3b40782..b7017e0 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
@@ -417,7 +417,7 @@
   }
   view_timeline_ = timeline;
   if (timeline) {
-    timeline->ResolveTimelineOffsets(false);
+    timeline->ResolveTimelineOffsets();
   }
 }
 
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc
index 0446665..210e863 100644
--- a/third_party/blink/renderer/core/animation/scroll_timeline.cc
+++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc
@@ -195,6 +195,13 @@
   DCHECK(scrollable_area->MaximumScrollOffset().x() == 0 ||
          scrollable_area->MinimumScrollOffset().x() == 0);
 
+  // Record the scroll range for a quick validation check at the end
+  // of the layout process. If the cached values change, a fresh
+  // style + layout cycle is required. The check is performed only once
+  // per frame to avoid an infinite loop in the update cycle.
+  minimum_scroll_offset_ = scrollable_area->MinimumScrollOffset();
+  maximum_scroll_offset_ = scrollable_area->MaximumScrollOffset();
+
   ScrollOffset scroll_offset = scrollable_area->GetScrollOffset();
   auto physical_orientation =
       ToPhysicalScrollOrientation(GetAxis(), *layout_box);
@@ -292,6 +299,36 @@
   return current_phase_and_time != last_current_phase_and_time_;
 }
 
+bool ScrollTimeline::CheckIfNeedsValidation() {
+  bool resolved = ComputeIsResolved();
+  if (resolved != is_resolved_) {
+    return true;
+  }
+
+  Node* source =
+      CurrentAttachment()
+          ? ResolveSource(CurrentAttachment()->ComputeSourceNoLayout())
+          : nullptr;
+  if (source != resolved_source_) {
+    return true;
+  }
+  DCHECK(!resolved || source);
+
+  if (resolved) {
+    LayoutBox* layout_box = source->GetLayoutBox();
+    PaintLayerScrollableArea* scrollable_area = layout_box->GetScrollableArea();
+    ScrollOffset min_scroll_offset = scrollable_area->MinimumScrollOffset();
+    ScrollOffset max_scroll_offset = scrollable_area->MaximumScrollOffset();
+    // Scroll range is cached during the snapshot update. If the values do not
+    // align, the timeline state is no longer valid.
+    if (min_scroll_offset != minimum_scroll_offset_ ||
+        max_scroll_offset != maximum_scroll_offset_) {
+      return true;
+    }
+  }
+  return false;
+}
+
 void ScrollTimeline::ScheduleNextService() {
   // See DocumentAnimations::UpdateAnimations() for why we shouldn't reach here.
   NOTREACHED();
@@ -376,7 +413,7 @@
   return ScrollAxis::kBlock;
 }
 
-void ScrollTimeline::InvalidateEffectTargetStyle() {
+void ScrollTimeline::InvalidateEffectTargetStyle() const {
   for (Animation* animation : GetAnimations()) {
     animation->InvalidateEffectTargetStyle();
   }
@@ -384,12 +421,34 @@
 
 bool ScrollTimeline::ValidateSnapshot() {
   auto state = ComputeTimelineState();
-
-  if (timeline_state_snapshotted_ == state)
+  if (ValidateTimelineOffsets() && timeline_state_snapshotted_ == state) {
     return true;
+  }
 
   timeline_state_snapshotted_ = state;
-  InvalidateEffectTargetStyle();
+
+  // Mark an attached animation's target as dirty if the play state is running
+  // or finished. Idle animations are not in effect and the effect of a paused
+  // animation is not impacted by timeline staleness.
+  for (Animation* animation : GetAnimations()) {
+    Animation::AnimationPlayState play_state =
+        animation->CalculateAnimationPlayState();
+    if (play_state != Animation::kRunning &&
+        play_state != Animation::kFinished) {
+      continue;
+    }
+
+    // The animation's effect target requires a style update to ensure that we
+    // pickup the new effect value.
+    animation->InvalidateEffectTargetStyle();
+    // Normalized timing needs to be reevaluated since the intrinsic iteration
+    // duration may be affected.
+    animation->InvalidateNormalizedTiming();
+    // The animation range may be affected, which in turn can affect animation
+    // start time as well as intrinsic iteration duration.
+    animation->OnRangeUpdate();
+  }
+
   return false;
 }
 
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.h b/third_party/blink/renderer/core/animation/scroll_timeline.h
index 741d8f67..478fcfb 100644
--- a/third_party/blink/renderer/core/animation/scroll_timeline.h
+++ b/third_party/blink/renderer/core/animation/scroll_timeline.h
@@ -123,7 +123,7 @@
 
   // Mark every effect target of every Animation attached to this timeline
   // for style recalc.
-  void InvalidateEffectTargetStyle();
+  void InvalidateEffectTargetStyle() const;
 
   cc::AnimationTimeline* EnsureCompositorTimeline() override;
   void UpdateCompositorTimeline() override;
@@ -185,6 +185,9 @@
   void UpdateSnapshot() override;
   bool ValidateSnapshot() override;
   bool ShouldScheduleNextService() override;
+  bool CheckIfNeedsValidation() override;
+
+  virtual bool ValidateTimelineOffsets() { return true; }
 
   bool ComputeIsResolved() const;
 
@@ -212,6 +215,8 @@
   TimelineAttachment attachment_type_;
   Member<Node> resolved_source_;
   bool is_resolved_ = false;
+  absl::optional<ScrollOffset> minimum_scroll_offset_;
+  absl::optional<ScrollOffset> maximum_scroll_offset_;
 
   // Snapshotted value produced by the last SnapshotState call.
   TimelineState timeline_state_snapshotted_;
diff --git a/third_party/blink/renderer/core/animation/view_timeline.cc b/third_party/blink/renderer/core/animation/view_timeline.cc
index 1bdf6b22..e9f1194 100644
--- a/third_party/blink/renderer/core/animation/view_timeline.cc
+++ b/third_party/blink/renderer/core/animation/view_timeline.cc
@@ -32,27 +32,6 @@
 
 namespace {
 
-double ComputeOffset(LayoutBox* subject_layout,
-                     LayoutBox* source_layout,
-                     ScrollOrientation physical_orientation) {
-  DCHECK(source_layout);
-  MapCoordinatesFlags flags = kIgnoreScrollOffset | kIgnoreTransforms;
-  gfx::PointF point = gfx::PointF(subject_layout->LocalToAncestorPoint(
-      PhysicalOffset(), source_layout, flags));
-
-  // We call LayoutObject::ClientLeft/Top directly and avoid
-  // Element::clientLeft/Top because:
-  //
-  // - We may reach this function during style resolution,
-  //   and clientLeft/Top also attempt to update style/layout.
-  // - Those functions return the unzoomed values, and we require the zoomed
-  //   values.
-  if (physical_orientation == kHorizontalScroll)
-    return point.x() - source_layout->ClientLeft().Round();
-  else
-    return point.y() - source_layout->ClientTop().Round();
-}
-
 bool IsBlockDirection(ViewTimeline::ScrollAxis axis, WritingMode writing_mode) {
   switch (axis) {
     case ViewTimeline::ScrollAxis::kBlock:
@@ -310,31 +289,28 @@
   // Any new call sites will require a similar safeguard.
   DCHECK(IsResolved());
   DCHECK(subject());
-  LayoutBox* layout_box = subject()->GetLayoutBox();
-  DCHECK(layout_box);
-  DCHECK(CurrentAttachment());
-  Element* source = CurrentAttachment()->ComputeSourceNoLayout();
-  Node* resolved_source = ResolvedSource();
-  DCHECK(source);
-  DCHECK(resolved_source);
-  LayoutBox* source_layout = resolved_source->GetLayoutBox();
-  DCHECK(source_layout);
 
+  subject_position_ = SubjectPosition();
+  subject_size_ = SubjectSize();
+
+  DCHECK(subject_position_);
+  target_offset_ = physical_orientation == kHorizontalScroll
+                       ? subject_position_->x()
+                       : subject_position_->y();
+
+  DCHECK(subject_size_);
   LayoutUnit viewport_size;
-
-  target_offset_ =
-      ComputeOffset(layout_box, source_layout, physical_orientation);
-
   if (physical_orientation == kHorizontalScroll) {
-    target_size_ = layout_box->Size().Width().ToDouble();
+    target_size_ = subject_size_->Width().ToDouble();
     viewport_size = scrollable_area->LayoutContentRect().Width();
   } else {
-    target_size_ = layout_box->Size().Height().ToDouble();
+    target_size_ = subject_size_->Height().ToDouble();
     viewport_size = scrollable_area->LayoutContentRect().Height();
   }
-
   viewport_size_ = viewport_size.ToDouble();
 
+  Element* source = CurrentAttachment()->ComputeSourceNoLayout();
+  DCHECK(source);
   TimelineInset inset = ResolveAuto(GetInset(), *source, GetAxis());
 
   // Update inset lengths if style dependent.
@@ -364,16 +340,44 @@
   double start_offset = target_offset_ - viewport_size_ + end_side_inset_;
   double end_offset = target_offset_ + target_size_ - start_side_inset_;
 
-  if (start_offset != start_offset_ || end_offset != end_offset_) {
-    start_offset_ = start_offset;
-    end_offset_ = end_offset;
+  return absl::make_optional<ScrollOffsets>(start_offset, end_offset);
+}
 
-    for (auto animation : GetAnimations()) {
-      animation->InvalidateNormalizedTiming();
-    }
+absl::optional<LayoutSize> ViewTimeline::SubjectSize() const {
+  if (!subject()) {
+    return absl::nullopt;
+  }
+  LayoutBox* subject_layout_box = subject()->GetLayoutBox();
+  if (!subject_layout_box) {
+    return absl::nullopt;
   }
 
-  return absl::make_optional<ScrollOffsets>(start_offset, end_offset);
+  return subject_layout_box->Size();
+}
+
+absl::optional<gfx::PointF> ViewTimeline::SubjectPosition() const {
+  if (!subject() || !ResolvedSource()) {
+    return absl::nullopt;
+  }
+  LayoutBox* subject_layout_box = subject()->GetLayoutBox();
+  LayoutBox* source_layout_box = ResolvedSource()->GetLayoutBox();
+  if (!subject_layout_box || !source_layout_box) {
+    return absl::nullopt;
+  }
+  MapCoordinatesFlags flags = kIgnoreScrollOffset | kIgnoreTransforms;
+  gfx::PointF subject_pos =
+      gfx::PointF(subject_layout_box->LocalToAncestorPoint(
+          PhysicalOffset(), source_layout_box, flags));
+
+  // We call LayoutObject::ClientLeft/Top directly and avoid
+  // Element::clientLeft/Top because:
+  //
+  // - We may reach this function during style resolution,
+  //   and clientLeft/Top also attempt to update style/layout.
+  // - Those functions return the unzoomed values, and we require the zoomed
+  //   values.
+  return gfx::PointF(subject_pos.x() - source_layout_box->ClientLeft().Round(),
+                     subject_pos.y() - source_layout_box->ClientTop().Round());
 }
 
 // https://www.w3.org/TR/scroll-animations-1/#named-range-getTime
@@ -579,16 +583,31 @@
 
 void ViewTimeline::UpdateSnapshot() {
   ScrollTimeline::UpdateSnapshot();
-  ResolveTimelineOffsets(false);
+  ResolveTimelineOffsets();
 }
 
-bool ViewTimeline::ValidateSnapshot() {
-  bool valid_snapshot = ScrollTimeline::ValidateSnapshot();
-  bool has_keyframe_update = ResolveTimelineOffsets(true);
-  return valid_snapshot && !has_keyframe_update;
+bool ViewTimeline::ValidateTimelineOffsets() {
+  bool has_keyframe_update = ResolveTimelineOffsets();
+  return !has_keyframe_update;
 }
 
-bool ViewTimeline::ResolveTimelineOffsets(bool invalidate_effect) const {
+bool ViewTimeline::CheckIfNeedsValidation() {
+  if (ScrollTimeline::CheckIfNeedsValidation()) {
+    return true;
+  }
+
+  if (subject_size_ != SubjectSize()) {
+    return true;
+  }
+
+  if (subject_position_ != SubjectPosition()) {
+    return true;
+  }
+
+  return false;
+}
+
+bool ViewTimeline::ResolveTimelineOffsets() const {
   bool has_keyframe_update = false;
   for (Animation* animation : GetAnimations()) {
     if (auto* effect = DynamicTo<KeyframeEffect>(animation->effect())) {
@@ -602,9 +621,6 @@
               : 1;
       if (effect->Model()->ResolveTimelineOffsets(range_start, range_end)) {
         has_keyframe_update = true;
-        if (invalidate_effect) {
-          animation->InvalidateEffectTargetStyle();
-        }
       }
     }
   }
@@ -621,7 +637,7 @@
 
 void ViewTimeline::FlushStyleUpdate() {
   ScrollTimeline::FlushStyleUpdate();
-  ResolveTimelineOffsets(/* invalidate_effect */ false);
+  ResolveTimelineOffsets();
 }
 
 void ViewTimeline::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/animation/view_timeline.h b/third_party/blink/renderer/core/animation/view_timeline.h
index afd3fec..7d0951e 100644
--- a/third_party/blink/renderer/core/animation/view_timeline.h
+++ b/third_party/blink/renderer/core/animation/view_timeline.h
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/animation/scroll_timeline.h"
 #include "third_party/blink/renderer/core/animation/timeline_inset.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/layout/layout_box.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 
 namespace blink {
@@ -66,7 +67,7 @@
   CSSNumericValue* startOffset() const;
   CSSNumericValue* endOffset() const;
 
-  bool ResolveTimelineOffsets(bool invalidate_effect) const;
+  bool ResolveTimelineOffsets() const;
 
   Animation* Play(AnimationEffect*,
                   ExceptionState& = ASSERT_NO_EXCEPTION) override;
@@ -80,7 +81,12 @@
 
   // ScrollSnapshotClient:
   void UpdateSnapshot() override;
-  bool ValidateSnapshot() override;
+  bool CheckIfNeedsValidation() override;
+
+  bool ValidateTimelineOffsets() override;
+
+  absl::optional<LayoutSize> SubjectSize() const;
+  absl::optional<gfx::PointF> SubjectPosition() const;
 
   void FlushStyleUpdate() override;
 
@@ -91,8 +97,11 @@
   mutable double viewport_size_;
   mutable double start_side_inset_;
   mutable double end_side_inset_;
-  mutable double start_offset_ = 0;
-  mutable double end_offset_ = 0;
+  // Cache values for post-layout validation check.  If the subject position or
+  // size changes, then the range boundaries are stale.
+  mutable absl::optional<LayoutSize> subject_size_;
+  mutable absl::optional<gfx::PointF> subject_position_;
+
   // If either of the following elements are non-null, we need to update
   // |inset_| on a style change.
   Member<const CSSValue> style_dependant_start_inset_;
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index aeaf16e..875329b4 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -4948,6 +4948,7 @@
       computable: false,
       valid_for_formatted_text: true,
       valid_for_formatted_text_run: true,
+      valid_for_highlight: true,
     },
     {
       name: "text-underline-position",
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index 08d82e2..b4498858 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -4120,10 +4120,7 @@
     return ConsumeIdent(range);
   }
 
-  CSSValue* baseline = RuntimeEnabledFeatures::CSSLastBaselineEnabled()
-                           ? ConsumeBaseline(range)
-                           : ConsumeFirstBaseline(range);
-  if (baseline) {
+  if (CSSValue* baseline = ConsumeBaseline(range)) {
     return baseline;
   }
 
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index fa7edb6..a360a0cc 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -127,6 +127,54 @@
   return MakeGarbageCollected<CSSFontSelector>(document);
 }
 
+enum RuleSetFlags {
+  kFontFaceRules = 1 << 0,
+  kKeyframesRules = 1 << 1,
+  kFullRecalcRules = 1 << 2,
+  kPropertyRules = 1 << 3,
+  kCounterStyleRules = 1 << 4,
+  kLayerRules = 1 << 5,
+  kFontPaletteValuesRules = 1 << 6,
+  kPositionFallbackRules = 1 << 7,
+  kFontFeatureValuesRules = 1 << 8
+};
+
+const unsigned kRuleSetFlagsAll = ~0u;
+
+unsigned GetRuleSetFlags(const HeapHashSet<Member<RuleSet>> rule_sets) {
+  unsigned flags = 0;
+  for (auto& rule_set : rule_sets) {
+    if (!rule_set->KeyframesRules().empty()) {
+      flags |= kKeyframesRules;
+    }
+    if (!rule_set->FontFaceRules().empty()) {
+      flags |= kFontFaceRules;
+    }
+    if (!rule_set->FontPaletteValuesRules().empty()) {
+      flags |= kFontPaletteValuesRules;
+    }
+    if (!rule_set->FontFeatureValuesRules().empty()) {
+      flags |= kFontFeatureValuesRules;
+    }
+    if (rule_set->NeedsFullRecalcForRuleSetInvalidation()) {
+      flags |= kFullRecalcRules;
+    }
+    if (!rule_set->PropertyRules().empty()) {
+      flags |= kPropertyRules;
+    }
+    if (!rule_set->CounterStyleRules().empty()) {
+      flags |= kCounterStyleRules;
+    }
+    if (rule_set->HasCascadeLayers()) {
+      flags |= kLayerRules;
+    }
+    if (!rule_set->PositionFallbackRules().empty()) {
+      flags |= kPositionFallbackRules;
+    }
+  }
+  return flags;
+}
+
 }  // namespace
 
 StyleEngine::StyleEngine(Document& document)
@@ -440,7 +488,6 @@
       global_rule_set_->DocumentRulesSelectorsRuleSet();
   DCHECK_NE(old_rule_set, new_rule_set);
 
-  const unsigned changed_rule_flags = 0;
   HeapHashSet<Member<RuleSet>> changed_rule_sets;
   if (old_rule_set) {
     changed_rule_sets.insert(old_rule_set);
@@ -449,6 +496,7 @@
     changed_rule_sets.insert(new_rule_set);
   }
 
+  const unsigned changed_rule_flags = GetRuleSetFlags(changed_rule_sets);
   InvalidateForRuleSetChanges(GetDocument(), changed_rule_sets,
                               changed_rule_flags, kInvalidateAllScopes);
 
@@ -2244,58 +2292,6 @@
   }
 }
 
-namespace {
-
-enum RuleSetFlags {
-  kFontFaceRules = 1 << 0,
-  kKeyframesRules = 1 << 1,
-  kFullRecalcRules = 1 << 2,
-  kPropertyRules = 1 << 3,
-  kCounterStyleRules = 1 << 4,
-  kLayerRules = 1 << 5,
-  kFontPaletteValuesRules = 1 << 6,
-  kPositionFallbackRules = 1 << 7,
-  kFontFeatureValuesRules = 1 << 8
-};
-
-const unsigned kRuleSetFlagsAll = ~0u;
-
-unsigned GetRuleSetFlags(const HeapHashSet<Member<RuleSet>> rule_sets) {
-  unsigned flags = 0;
-  for (auto& rule_set : rule_sets) {
-    if (!rule_set->KeyframesRules().empty()) {
-      flags |= kKeyframesRules;
-    }
-    if (!rule_set->FontFaceRules().empty()) {
-      flags |= kFontFaceRules;
-    }
-    if (!rule_set->FontPaletteValuesRules().empty()) {
-      flags |= kFontPaletteValuesRules;
-    }
-    if (!rule_set->FontFeatureValuesRules().empty()) {
-      flags |= kFontFeatureValuesRules;
-    }
-    if (rule_set->NeedsFullRecalcForRuleSetInvalidation()) {
-      flags |= kFullRecalcRules;
-    }
-    if (!rule_set->PropertyRules().empty()) {
-      flags |= kPropertyRules;
-    }
-    if (!rule_set->CounterStyleRules().empty()) {
-      flags |= kCounterStyleRules;
-    }
-    if (rule_set->HasCascadeLayers()) {
-      flags |= kLayerRules;
-    }
-    if (!rule_set->PositionFallbackRules().empty()) {
-      flags |= kPositionFallbackRules;
-    }
-  }
-  return flags;
-}
-
-}  // namespace
-
 void StyleEngine::InvalidateForRuleSetChanges(
     TreeScope& tree_scope,
     const HeapHashSet<Member<RuleSet>>& changed_rule_sets,
diff --git a/third_party/blink/renderer/core/dom/range.cc b/third_party/blink/renderer/core/dom/range.cc
index f874e0d..7df78ca 100644
--- a/third_party/blink/renderer/core/dom/range.cc
+++ b/third_party/blink/renderer/core/dom/range.cc
@@ -718,14 +718,25 @@
       break;
     ancestors.push_back(runner);
   }
+  // Both https://dom.spec.whatwg.org/#concept-range-clone and
+  // https://dom.spec.whatwg.org/#concept-range-extract specify (in various
+  // ways) that nodes are to be processed in tree order. But the algorithm below
+  // processes in depth first order instead. So clone the nodes first here,
+  // in reverse order, so upgrades happen in the proper order.
+  HeapVector<Member<Node>> cloned_ancestors(ancestors.size(), nullptr);
+  auto clone_ptr = cloned_ancestors.rbegin();
+  for (auto it = ancestors.rbegin(); it != ancestors.rend(); ++it) {
+    *(clone_ptr++) = (*it)->cloneNode(false);
+  }
 
   Node* first_child_in_ancestor_to_process =
       direction == kProcessContentsForward ? container->nextSibling()
                                            : container->previousSibling();
-  for (const auto& ancestor : ancestors) {
+  for (wtf_size_t i = 0; i < ancestors.size(); ++i) {
+    const auto& ancestor = ancestors[i];
     if (action == kExtractContents || action == kCloneContents) {
       // Might have been removed already during mutation event.
-      if (Node* cloned_ancestor = ancestor->cloneNode(false)) {
+      if (auto cloned_ancestor = cloned_ancestors[i]) {
         cloned_ancestor->appendChild(cloned_container, exception_state);
         cloned_container = cloned_ancestor;
       }
diff --git a/third_party/blink/renderer/core/frame/frame_test.cc b/third_party/blink/renderer/core/frame/frame_test.cc
index 1d2dfb6..50167e8 100644
--- a/third_party/blink/renderer/core/frame/frame_test.cc
+++ b/third_party/blink/renderer/core/frame/frame_test.cc
@@ -270,17 +270,13 @@
       &GetDocument(), GetDocument().ScrollingElementNoLayout(),
       ScrollTimeline::ScrollAxis::kBlock, TimelineAttachment::kLocal);
 
-  EXPECT_EQ(GetDocument()
-                .GetFrame()
-                ->GetUnvalidatedScrollSnapshotClientsForTesting()
-                .size(),
-            1U);
+  EXPECT_EQ(
+      GetDocument().GetFrame()->GetScrollSnapshotClientsForTesting().size(),
+      1U);
   NavigateSameDomain("page1");
-  EXPECT_EQ(GetDocument()
-                .GetFrame()
-                ->GetUnvalidatedScrollSnapshotClientsForTesting()
-                .size(),
-            0U);
+  EXPECT_EQ(
+      GetDocument().GetFrame()->GetScrollSnapshotClientsForTesting().size(),
+      0U);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 6e42161..833fd0b 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -429,7 +429,6 @@
   visitor->Trace(mojo_handler_);
   visitor->Trace(text_fragment_handler_);
   visitor->Trace(scroll_snapshot_clients_);
-  visitor->Trace(unvalidated_scroll_snapshot_clients_);
   visitor->Trace(saved_scroll_offsets_);
   visitor->Trace(background_color_paint_image_generator_);
   visitor->Trace(box_shadow_paint_image_generator_);
@@ -3475,7 +3474,6 @@
 
 void LocalFrame::AddScrollSnapshotClient(ScrollSnapshotClient& client) {
   scroll_snapshot_clients_.insert(&client);
-  unvalidated_scroll_snapshot_clients_.insert(&client);
 }
 
 void LocalFrame::UpdateScrollSnapshots() {
@@ -3487,15 +3485,14 @@
 
 bool LocalFrame::ValidateScrollSnapshotClients() {
   bool valid = true;
-  for (auto& client : unvalidated_scroll_snapshot_clients_)
-    valid &= client->ValidateSnapshot();
-  unvalidated_scroll_snapshot_clients_.clear();
+  for (auto& client : scroll_snapshot_clients_) {
+    valid &= client->ValidateSnapshotIfNeeded();
+  }
   return valid;
 }
 
 void LocalFrame::ClearScrollSnapshotClients() {
   scroll_snapshot_clients_.clear();
-  unvalidated_scroll_snapshot_clients_.clear();
 }
 
 void LocalFrame::ScheduleNextServiceForScrollSnapshotClients() {
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index 9bd4cec..3d2e44d5 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -839,7 +839,10 @@
   // All newly created ScrollSnapshotClients are considered "unvalidated". This
   // means that the internal state of the client is considered tentative, and
   // computing the actual state may require an additional style/layout pass.
-  //
+  // ScrollSnapshotClients may be marked as unvalidated if a style or layout
+  // change suggests that the snapshot is stale. This additional check is
+  // expected to be lightweight since run once per frame.
+
   // The lifecycle update will call this function after style and layout has
   // completed. The function will then go though all unvalidated clients,
   // and compare the current state snapshot to a fresh state snapshot. If they
@@ -856,8 +859,8 @@
   void ClearScrollSnapshotClients();
 
   const HeapHashSet<WeakMember<ScrollSnapshotClient>>&
-  GetUnvalidatedScrollSnapshotClientsForTesting() {
-    return unvalidated_scroll_snapshot_clients_;
+  GetScrollSnapshotClientsForTesting() {
+    return scroll_snapshot_clients_;
   }
 
   void ScheduleNextServiceForScrollSnapshotClients();
@@ -1092,9 +1095,6 @@
   // be registered at the actual elements as the references here are weak.
   HeapHashSet<WeakMember<ScrollSnapshotClient>> scroll_snapshot_clients_;
 
-  HeapHashSet<WeakMember<ScrollSnapshotClient>>
-      unvalidated_scroll_snapshot_clients_;
-
   // Set lazily, when the browser asks to host a resource cache in this frame.
   Member<ResourceCacheImpl> resource_cache_;
 
diff --git a/third_party/blink/renderer/core/layout/layout_theme_default.cc b/third_party/blink/renderer/core/layout/layout_theme_default.cc
index e9a3d0b5f..ae79d13 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_default.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_default.cc
@@ -24,6 +24,7 @@
 
 #include "third_party/blink/renderer/core/layout/layout_theme_default.h"
 
+#include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h"
 #include "third_party/blink/public/platform/web_theme_engine.h"
 #include "third_party/blink/public/resources/grit/blink_resources.h"
 #include "third_party/blink/renderer/core/css_value_keywords.h"
@@ -46,13 +47,13 @@
 static const float kMaxCancelButtonSize = 21;
 
 Color LayoutThemeDefault::active_selection_background_color_ =
-    Color::FromRGBA32(0xFF1967D2);
+    Color::FromRGBA32(kDefaultActiveSelectionBgColor);
 Color LayoutThemeDefault::active_selection_foreground_color_ =
-    Color::FromRGBA32(0xFF000000);
+    Color::FromRGBA32(kDefaultActiveSelectionFgColor);
 Color LayoutThemeDefault::inactive_selection_background_color_ =
-    Color::FromRGBA32(0xFFC8C8C8);
+    Color::FromRGBA32(kDefaultInactiveSelectionBgColor);
 Color LayoutThemeDefault::inactive_selection_foreground_color_ =
-    Color::FromRGBA32(0xFF323232);
+    Color::FromRGBA32(kDefaultInactiveSelectionFgColor);
 Color
     LayoutThemeDefault::active_list_box_selection_background_color_dark_mode_ =
         Color::FromRGBA32(0xFF99C8FF);
diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
index 15a5352..d28a74b 100644
--- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
@@ -22,6 +22,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_box_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_disable_side_effects_scope.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
@@ -835,6 +836,10 @@
       if (!layout_result) {
         NGConstraintSpace child_space = BuildSpaceForIntrinsicBlockSize(
             child, max_content_contribution, phase);
+        absl::optional<NGDisableSideEffectsScope> disable_side_effects;
+        if (phase != Phase::kLayout && !Node().GetLayoutBox()->NeedsLayout()) {
+          disable_side_effects.emplace();
+        }
         layout_result = child.Layout(child_space, /* break_token */ nullptr);
         DCHECK(layout_result);
       }
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
index 8b1ca01..ea8cf277 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -1498,8 +1498,7 @@
 void NGGridLayoutAlgorithm::CalculateAlignmentBaselines(
     const NGGridSizingSubtree& sizing_subtree,
     GridTrackSizingDirection track_direction,
-    SizingConstraint sizing_constraint,
-    bool* needs_additional_pass) const {
+    SizingConstraint sizing_constraint) const {
   auto& sizing_data = sizing_subtree.SubtreeRootData();
 
   auto& track_collection =
@@ -1520,16 +1519,11 @@
     const auto space = CreateConstraintSpaceForLayout(
         grid_item, sizing_data.layout_data, &unused_grid_area);
 
-    // We cannot apply some of the baseline alignment rules for synthesized
-    // baselines until layout has been performed. However, layout cannot
-    // be performed in certain scenarios. So force an additional pass in
-    // these cases and skip layout for now.
+    // Skip this item if we aren't able to resolve our inline size.
     const auto& item_style = grid_item.node.Style();
     if (InlineLengthUnresolvable(space, item_style.LogicalWidth()) ||
         InlineLengthUnresolvable(space, item_style.LogicalMinWidth()) ||
         InlineLengthUnresolvable(space, item_style.LogicalMaxWidth())) {
-      if (needs_additional_pass)
-        *needs_additional_pass = true;
       continue;
     }
 
@@ -1770,7 +1764,7 @@
 
   // Cache baselines, as these contributions can influence track sizing
   CalculateAlignmentBaselines(sizing_subtree, track_direction,
-                              sizing_constraint, opt_needs_additional_pass);
+                              sizing_constraint);
 
   // 2. Resolve intrinsic track sizing functions to absolute lengths.
   if (track_collection.HasIntrinsicTrack()) {
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
index 931d00c4..bd3a954 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
@@ -114,11 +114,9 @@
 
   // Determines the major/minor alignment baselines for each row/column based on
   // each item in |grid_items|, and stores the results in |track_collection|.
-  void CalculateAlignmentBaselines(
-      const NGGridSizingSubtree& sizing_subtree,
-      GridTrackSizingDirection track_direction,
-      SizingConstraint sizing_constraint,
-      bool* opt_needs_additional_pass = nullptr) const;
+  void CalculateAlignmentBaselines(const NGGridSizingSubtree& sizing_subtree,
+                                   GridTrackSizingDirection track_direction,
+                                   SizingConstraint sizing_constraint) const;
 
   std::unique_ptr<NGGridLayoutTrackCollection> CreateSubgridTrackCollection(
       const NGSubgriddedItemData& subgrid_data,
diff --git a/third_party/blink/renderer/core/scroll/scroll_snapshot_client.cc b/third_party/blink/renderer/core/scroll/scroll_snapshot_client.cc
index 9a85a0d..867b566 100644
--- a/third_party/blink/renderer/core/scroll/scroll_snapshot_client.cc
+++ b/third_party/blink/renderer/core/scroll/scroll_snapshot_client.cc
@@ -13,4 +13,13 @@
     frame->AddScrollSnapshotClient(*this);
 }
 
+bool ScrollSnapshotClient::ValidateSnapshotIfNeeded() {
+  bool valid = true;
+  if (force_validation_ || CheckIfNeedsValidation()) {
+    valid = ValidateSnapshot();
+  }
+  force_validation_ = false;
+  return valid;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scroll_snapshot_client.h b/third_party/blink/renderer/core/scroll/scroll_snapshot_client.h
index d1f5b62..c563a7b 100644
--- a/third_party/blink/renderer/core/scroll/scroll_snapshot_client.h
+++ b/third_party/blink/renderer/core/scroll/scroll_snapshot_client.h
@@ -19,16 +19,30 @@
   // update.
   virtual void UpdateSnapshot() = 0;
 
-  // Called for newly created clients only at layout clean and at most once per
-  // frame to handle clients created during style and layout recalc.
-  // Returns true if the client state is correct, or false otherwise.
+  // Called for clients marked as needed validation at layout clean and at most
+  // once per frame to handle changes during style and layout recalc.
+  // All new clients are marked as needing validation since the initial snapshot
+  // is tentative. Returns true if the client state is correct, or false
+  // otherwise.
   virtual bool ValidateSnapshot() = 0;
 
   // Compares the last snapshot with the current state, and returns true if a
-  // new animation frame should be schedules due to snapshot difference.
+  // new animation frame should be scheduled due to snapshot difference.
   virtual bool ShouldScheduleNextService() = 0;
 
   virtual bool IsAnchorScrollData() const { return false; }
+
+  // Performs a lightweight check at layout clean to determine if the client
+  // state requires snapshot validation. Called once per animation frame.
+  // https://github.com/w3c/csswg-drafts/issues/8694
+  virtual bool CheckIfNeedsValidation() { return false; }
+
+  // Conditionally performs snapshot validation. Returns true if the client
+  // state is correct, or false otherwise.
+  bool ValidateSnapshotIfNeeded();
+
+ private:
+  bool force_validation_ = true;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
index 8677087..90e2607c 100644
--- a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
+++ b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
@@ -3741,6 +3741,19 @@
       });
 }
 
+// Regression test, since the universal select sets rule set flags indicating
+// that the rule set potentially invalidates all elements.
+TEST_F(DocumentRulesTest, UniversalSelector) {
+  ScopedSpeculationRulesDocumentRulesSelectorMatchesForTest
+      enable_selector_matches{true};
+  DummyPageHolder page_holder;
+  page_holder.GetFrame().GetSettings()->SetScriptEnabled(true);
+  StubSpeculationHost speculation_host;
+  InsertSpeculationRules(
+      page_holder.GetDocument(),
+      R"({"prefetch": [{"source":"document", "where":{"selector_matches":"*"}}]})");
+}
+
 TEST_F(SpeculationRuleSetTest, EagernessRuntimeEnabledFlag) {
   ScopedSpeculationRulesEagernessForTest enable_eagerness{false};
 
diff --git a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc
index 7ef1839..2b6640c 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc
+++ b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc
@@ -33,10 +33,15 @@
   if (!controller_)
     return;
 
-  ScriptState::Scope scope(script_state_);
-
   if (ReadableStreamDefaultController::CanCloseOrEnqueue(controller_)) {
-    ReadableStreamDefaultController::Close(script_state_, controller_);
+    if (script_state_->ContextIsValid()) {
+      ScriptState::Scope scope(script_state_);
+      ReadableStreamDefaultController::Close(script_state_, controller_);
+    } else {
+      // If the context is not valid then Close() will not try to resolve the
+      // promises, and that is not a problem.
+      ReadableStreamDefaultController::Close(script_state_, controller_);
+    }
   }
   controller_ = nullptr;
 }
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
index 828d90cd..337933d 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
@@ -126,10 +126,13 @@
   ScriptState* script_state = resolver->GetScriptState();
 
   if (!success) {
-    ScriptState::Scope scope(script_state);
-    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-        script_state->GetIsolate(), DOMExceptionCode::kOperationError,
-        error_message));
+    if (IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(),
+                                      script_state)) {
+      ScriptState::Scope scope(script_state);
+      resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+          script_state->GetIsolate(), DOMExceptionCode::kOperationError,
+          error_message));
+    }
     if (caller == blink::SharedStorageVoidOperation::kRun) {
       LogSharedStorageWorkletError(
           SharedStorageWorkletErrorType::kRunWebVisible);
@@ -420,10 +423,13 @@
                 ScriptState* script_state = resolver->GetScriptState();
 
                 if (status == mojom::blink::SharedStorageGetStatus::kError) {
-                  ScriptState::Scope scope(script_state);
-                  resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-                      script_state->GetIsolate(),
-                      DOMExceptionCode::kOperationError, error_message));
+                  if (IsInParallelAlgorithmRunnable(
+                          resolver->GetExecutionContext(), script_state)) {
+                    ScriptState::Scope scope(script_state);
+                    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+                        script_state->GetIsolate(),
+                        DOMExceptionCode::kOperationError, error_message));
+                  }
                   return;
                 }
 
@@ -471,10 +477,13 @@
             ScriptState* script_state = resolver->GetScriptState();
 
             if (!success) {
-              ScriptState::Scope scope(script_state);
-              resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-                  script_state->GetIsolate(), DOMExceptionCode::kOperationError,
-                  error_message));
+              if (IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(),
+                                                script_state)) {
+                ScriptState::Scope scope(script_state);
+                resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+                    script_state->GetIsolate(),
+                    DOMExceptionCode::kOperationError, error_message));
+              }
               return;
             }
 
@@ -543,10 +552,13 @@
             ScriptState* script_state = resolver->GetScriptState();
 
             if (!success) {
-              ScriptState::Scope scope(script_state);
-              resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-                  script_state->GetIsolate(), DOMExceptionCode::kOperationError,
-                  error_message));
+              if (IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(),
+                                                script_state)) {
+                ScriptState::Scope scope(script_state);
+                resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+                    script_state->GetIsolate(),
+                    DOMExceptionCode::kOperationError, error_message));
+              }
               return;
             }
 
@@ -808,10 +820,13 @@
                 ScriptState* script_state = resolver->GetScriptState();
 
                 if (!success) {
-                  ScriptState::Scope scope(script_state);
-                  resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-                      script_state->GetIsolate(),
-                      DOMExceptionCode::kOperationError, error_message));
+                  if (IsInParallelAlgorithmRunnable(
+                          resolver->GetExecutionContext(), script_state)) {
+                    ScriptState::Scope scope(script_state);
+                    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+                        script_state->GetIsolate(),
+                        DOMExceptionCode::kOperationError, error_message));
+                  }
                   LogSharedStorageWorkletError(
                       SharedStorageWorkletErrorType::kSelectURLWebVisible);
                   return;
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc
index d27efc56..8df3023 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc
@@ -87,10 +87,14 @@
                 ScriptState* script_state = resolver->GetScriptState();
 
                 if (!success) {
-                  ScriptState::Scope scope(script_state);
-                  resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-                      script_state->GetIsolate(),
-                      DOMExceptionCode::kOperationError, error_message));
+                  if (IsInParallelAlgorithmRunnable(
+                          resolver->GetExecutionContext(), script_state)) {
+                    ScriptState::Scope scope(script_state);
+                    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+                        script_state->GetIsolate(),
+                        DOMExceptionCode::kOperationError, error_message));
+                  }
+
                   LogSharedStorageWorkletError(
                       SharedStorageWorkletErrorType::kAddModuleWebVisible);
                   return;
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc b/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
index 3aa70ce..fce373a7c 100644
--- a/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
@@ -6,8 +6,29 @@
 
 #include "base/notreached.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_smart_card_disposition.h"
+#include "third_party/blink/renderer/modules/smart_card/smart_card_error.h"
 
 namespace blink {
+namespace {
+constexpr char kOperationInProgress[] = "An operation is in progress.";
+constexpr char kDisconnected[] = "Is disconnected.";
+
+using device::mojom::blink::SmartCardDisposition;
+
+SmartCardDisposition ToMojomDisposition(
+    const V8SmartCardDisposition& disposition) {
+  switch (disposition.AsEnum()) {
+    case V8SmartCardDisposition::Enum::kLeave:
+      return SmartCardDisposition::kLeave;
+    case V8SmartCardDisposition::Enum::kReset:
+      return SmartCardDisposition::kReset;
+    case V8SmartCardDisposition::Enum::kUnpower:
+      return SmartCardDisposition::kUnpower;
+    case V8SmartCardDisposition::Enum::kEject:
+      return SmartCardDisposition::kEject;
+  }
+}
+}  // anonymous namespace
 
 SmartCardConnection::SmartCardConnection(
     mojo::PendingRemote<device::mojom::blink::SmartCardConnection>
@@ -19,9 +40,33 @@
       execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI));
 }
 
-ScriptPromise SmartCardConnection::disconnect(const V8SmartCardDisposition&) {
-  NOTIMPLEMENTED();
-  return ScriptPromise();
+ScriptPromise SmartCardConnection::disconnect(ScriptState* script_state,
+                                              ExceptionState& exception_state) {
+  return disconnect(
+      script_state,
+      V8SmartCardDisposition(V8SmartCardDisposition::Enum::kLeave),
+      exception_state);
+}
+
+ScriptPromise SmartCardConnection::disconnect(
+    ScriptState* script_state,
+    const V8SmartCardDisposition& disposition,
+    ExceptionState& exception_state) {
+  if (!EnsureNoOperationInProgress(exception_state) ||
+      !EnsureConnection(exception_state)) {
+    return ScriptPromise();
+  }
+
+  ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(
+      script_state, exception_state.GetContext());
+
+  operation_in_progress_ = true;
+  connection_->Disconnect(
+      ToMojomDisposition(disposition),
+      WTF::BindOnce(&SmartCardConnection::OnDisconnectDone,
+                    WrapPersistent(this), WrapPersistent(resolver)));
+
+  return resolver->Promise();
 }
 
 ScriptPromise SmartCardConnection::status() {
@@ -34,4 +79,42 @@
   ScriptWrappable::Trace(visitor);
 }
 
+bool SmartCardConnection::EnsureNoOperationInProgress(
+    ExceptionState& exception_state) const {
+  if (operation_in_progress_) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      kOperationInProgress);
+    return false;
+  }
+  return true;
+}
+
+bool SmartCardConnection::EnsureConnection(
+    ExceptionState& exception_state) const {
+  if (!connection_.is_bound()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      kDisconnected);
+    return false;
+  }
+  return true;
+}
+
+void SmartCardConnection::OnDisconnectDone(
+    ScriptPromiseResolver* resolver,
+    device::mojom::blink::SmartCardResultPtr result) {
+  CHECK(operation_in_progress_);
+  operation_in_progress_ = false;
+
+  if (result->is_error()) {
+    auto* error = SmartCardError::Create(result->get_error());
+    resolver->Reject(error);
+    return;
+  }
+
+  CHECK(connection_.is_bound());
+  connection_.reset();
+
+  resolver->Resolve();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_connection.h b/third_party/blink/renderer/modules/smart_card/smart_card_connection.h
index 9798bd63..29dcee97 100644
--- a/third_party/blink/renderer/modules/smart_card/smart_card_connection.h
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_connection.h
@@ -7,6 +7,7 @@
 
 #include "services/device/public/mojom/smart_card.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
@@ -25,13 +26,23 @@
       ExecutionContext*);
 
   // SmartCardConnection idl
-  ScriptPromise disconnect(const V8SmartCardDisposition& disposition);
+  ScriptPromise disconnect(ScriptState* script_state,
+                           ExceptionState& exception_state);
+  ScriptPromise disconnect(ScriptState* script_state,
+                           const V8SmartCardDisposition& disposition,
+                           ExceptionState& exception_state);
   ScriptPromise status();
 
   // ScriptWrappable overrides
   void Trace(Visitor*) const override;
 
  private:
+  bool EnsureNoOperationInProgress(ExceptionState& exception_state) const;
+  bool EnsureConnection(ExceptionState& exception_state) const;
+  void OnDisconnectDone(ScriptPromiseResolver* resolver,
+                        device::mojom::blink::SmartCardResultPtr result);
+
+  bool operation_in_progress_ = false;
   HeapMojoRemote<device::mojom::blink::SmartCardConnection> connection_;
 };
 
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_connection.idl b/third_party/blink/renderer/modules/smart_card/smart_card_connection.idl
index fff6ac9..c767a644 100644
--- a/third_party/blink/renderer/modules/smart_card/smart_card_connection.idl
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_connection.idl
@@ -17,6 +17,7 @@
   SecureContext,
   IsolatedContext
 ] interface SmartCardConnection {
+  [CallWith=ScriptState, RaisesException]
   Promise<void> disconnect(optional SmartCardDisposition disposition = "leave");
 
   Promise<SmartCardConnectionStatus> status();
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 91d0e74..238c4fd6 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -909,11 +909,6 @@
       base_feature: "none",
     },
     {
-      name: "CSSLastBaseline",
-      status: "stable",
-      base_feature: "none",
-    },
-    {
       name: "CSSLayoutAPI",
       status: "experimental",
       base_feature: "none",
@@ -3814,6 +3809,12 @@
       base_feature: "none",
     },
     {
+      name: "WebEnvironmentIntegrity",
+      status: "experimental",
+      base_feature: "none",
+      origin_trial_feature_name: "WebEnvironmentIntegrity",
+    },
+    {
       name: "WebFontResizeLCP",
       status: "experimental",
     },
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
index a4f8e14..864c44d 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
@@ -293,6 +293,13 @@
         }
         self.has_regressions: bool = False
 
+    def recreate_artifacts_dir(self):
+        if self.fs.exists(self.artifacts_dir):
+            self.fs.rmtree(self.artifacts_dir)
+        self.fs.maybe_make_directory(self.artifacts_dir)
+        self._copy_results_viewer()
+        _log.info('Recreated artifacts directory (%s)', self.artifacts_dir)
+
     def _copy_results_viewer(self):
         files_to_copy = ['results.html', 'results.html.version']
         for file in files_to_copy:
@@ -384,7 +391,7 @@
                 before this manager exited; a well-behaved caller should avoid
                 this.
         """
-        self._copy_results_viewer()
+        self.recreate_artifacts_dir()
         events = queue.SimpleQueue()
         worker = threading.Thread(target=self._consume_events,
                                   args=(events, ),
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
index 16c1eef..cdb39cb 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
@@ -384,6 +384,48 @@
         return any(
             self._is_http_test(test_name) for test_name in test_names)
 
+    def _rename_results_folder(self):
+        try:
+            timestamp = time.strftime(
+                "%Y-%m-%d-%H-%M-%S",
+                time.localtime(
+                    self._filesystem.mtime(
+                        self._filesystem.join(self._artifacts_directory,
+                                              'results.html'))))
+        except (IOError, OSError) as error:
+            # It might be possible that results.html was not generated in previous run, because the test
+            # run was interrupted even before testing started. In those cases, don't archive the folder.
+            # Simply override the current folder contents with new results.
+            import errno
+            if error.errno in (errno.EEXIST, errno.ENOENT):
+                self._printer.write_update(
+                    'No results.html file found in previous run, skipping it.')
+            return None
+        archived_name = ''.join((self._filesystem.basename(
+            self._artifacts_directory), '_', timestamp))
+        archived_path = self._filesystem.join(
+            self._filesystem.dirname(self._artifacts_directory), archived_name)
+        self._filesystem.move(self._artifacts_directory, archived_path)
+
+    def _delete_dirs(self, dir_list):
+        for dir_path in dir_list:
+            self._filesystem.rmtree(dir_path)
+
+    def _limit_archived_results_count(self):
+        results_directory_path = self._filesystem.dirname(
+            self._artifacts_directory)
+        file_list = self._filesystem.listdir(results_directory_path)
+        results_directories = []
+        for name in file_list:
+            file_path = self._filesystem.join(results_directory_path, name)
+            if (self._filesystem.isdir(file_path)
+                    and self._artifacts_directory in file_path):
+                results_directories.append(file_path)
+        results_directories.sort(key=self._filesystem.mtime)
+        self._printer.write_update('Clobbering excess archived results in %s' %
+                                   results_directory_path)
+        self._delete_dirs(results_directories[:-self.ARCHIVED_RESULTS_LIMIT])
+
     def _set_up_run(self, test_names):
         self._printer.write_update('Checking build ...')
         if self._options.build:
@@ -394,11 +436,11 @@
                 return exit_code
 
         if self._options.clobber_old_results:
-            self._port.clobber_old_results()
+            self._clobber_old_results()
         elif self._filesystem.exists(self._artifacts_directory):
-            self._port.limit_archived_results_count()
+            self._limit_archived_results_count()
             # Rename the existing results folder for archiving.
-            self._port.rename_results_folder()
+            self._rename_results_folder()
 
         # Create the output directory if it doesn't already exist.
         self._port.host.filesystem.maybe_make_directory(
@@ -541,6 +583,25 @@
             test_to_crash_failure[test].create_artifacts(
                 test_result.artifacts, force_overwrite=True)
 
+    def _clobber_old_results(self):
+        dir_above_results_path = self._filesystem.dirname(
+            self._artifacts_directory)
+        self._printer.write_update(
+            'Clobbering old results in %s.' % dir_above_results_path)
+        if not self._filesystem.exists(dir_above_results_path):
+            return
+        file_list = self._filesystem.listdir(dir_above_results_path)
+        results_directories = []
+        for name in file_list:
+            file_path = self._filesystem.join(dir_above_results_path, name)
+            if (self._filesystem.isdir(file_path)
+                    and self._artifacts_directory in file_path):
+                results_directories.append(file_path)
+        self._delete_dirs(results_directories)
+
+        # Port specific clean-up.
+        self._port.clobber_old_port_specific_results()
+
     def _tests_to_retry(self, run_results):
         # TODO(ojan): This should also check that result.type != test_expectations.MISSING
         # since retrying missing expectations is silly. But that's a bit tricky since we
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/manager_unittest.py b/third_party/blink/tools/blinkpy/web_tests/controllers/manager_unittest.py
index 5f1de6de..02a9a77 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/manager_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/manager_unittest.py
@@ -140,6 +140,85 @@
         manager = get_manager()
         manager._look_for_new_crash_logs(run_results, time.time())
 
+    def _make_fake_test_result(self, host, results_directory):
+        host.filesystem.maybe_make_directory(results_directory)
+        host.filesystem.write_binary_file(results_directory + '/results.html',
+                                          'This is a test results file')
+
+    def test_rename_results_folder(self):
+        host = MockHost()
+        port = host.port_factory.get('test-mac-mac10.10')
+
+        def get_manager():
+            manager = Manager(
+                port,
+                options=optparse.Values({
+                    'max_locked_shards': 1
+                }),
+                printer=FakePrinter())
+            return manager
+
+        self._make_fake_test_result(port.host, '/tmp/layout-test-results')
+        self.assertTrue(
+            port.host.filesystem.exists('/tmp/layout-test-results'))
+        timestamp = time.strftime(
+            '%Y-%m-%d-%H-%M-%S',
+            time.localtime(
+                port.host.filesystem.mtime(
+                    '/tmp/layout-test-results/results.html')))
+        archived_file_name = '/tmp/layout-test-results' + '_' + timestamp
+        manager = get_manager()
+        manager._rename_results_folder()
+        self.assertFalse(
+            port.host.filesystem.exists('/tmp/layout-test-results'))
+        self.assertTrue(port.host.filesystem.exists(archived_file_name))
+
+    def test_clobber_old_results(self):
+        host = MockHost()
+        port = host.port_factory.get('test-mac-mac10.10')
+
+        def get_manager():
+            manager = Manager(
+                port,
+                options=optparse.Values({
+                    'max_locked_shards': 1
+                }),
+                printer=FakePrinter())
+            return manager
+
+        self._make_fake_test_result(port.host, '/tmp/layout-test-results')
+        self.assertTrue(
+            port.host.filesystem.exists('/tmp/layout-test-results'))
+        manager = get_manager()
+        manager._clobber_old_results()
+        self.assertFalse(
+            port.host.filesystem.exists('/tmp/layout-test-results'))
+
+    def test_limit_archived_results_count(self):
+        host = MockHost()
+        port = host.port_factory.get('test-mac-mac10.10')
+
+        def get_manager():
+            manager = Manager(
+                port,
+                options=optparse.Values({
+                    'max_locked_shards': 1
+                }),
+                printer=FakePrinter())
+            return manager
+
+        for x in range(1, 31):
+            dir_name = '/tmp/layout-test-results' + '_' + str(x)
+            self._make_fake_test_result(port.host, dir_name)
+        manager = get_manager()
+        manager._limit_archived_results_count()
+        deleted_dir_count = 0
+        for x in range(1, 31):
+            dir_name = '/tmp/layout-test-results' + '_' + str(x)
+            if not port.host.filesystem.exists(dir_name):
+                deleted_dir_count = deleted_dir_count + 1
+        self.assertEqual(deleted_dir_count, 5)
+
     def test_restore_order(self):
         host = MockHost()
         port = host.port_factory.get('test-mac-mac10.10')
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py
index c74663e2..97e6ff4 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/base.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -127,8 +127,6 @@
 # contain all the disc artifacts created by web tests
 ARTIFACTS_SUB_DIR = 'layout-test-results'
 
-ARCHIVED_RESULTS_LIMIT = 25
-
 ENABLE_THREADED_COMPOSITING_FLAG = '--enable-threaded-compositing'
 
 
@@ -2123,68 +2121,6 @@
     def default_configuration(self):
         return 'Release'
 
-    def _delete_dirs(self, dir_list):
-        for dir_path in dir_list:
-            self._filesystem.rmtree(dir_path)
-
-    def rename_results_folder(self):
-        try:
-            timestamp = time.strftime(
-                "%Y-%m-%d-%H-%M-%S",
-                time.localtime(
-                    self._filesystem.mtime(
-                        self._filesystem.join(self.artifacts_directory(),
-                                              'results.html'))))
-        except OSError as error:
-            # It might be possible that results.html was not generated in previous run, because the test
-            # run was interrupted even before testing started. In those cases, don't archive the folder.
-            # Simply override the current folder contents with new results.
-            import errno
-            if error.errno in (errno.EEXIST, errno.ENOENT):
-                _log.info(
-                    'No results.html file found in previous run, skipping it.')
-            return None
-        archived_name = ''.join(
-            (self._filesystem.basename(self.artifacts_directory()), '_',
-             timestamp))
-        archived_path = self._filesystem.join(
-            self._filesystem.dirname(self.artifacts_directory()),
-            archived_name)
-        self._filesystem.move(self.artifacts_directory(), archived_path)
-
-    def _get_artifact_directories(self, artifacts_directory_path):
-        results_directory_path = self._filesystem.dirname(
-            artifacts_directory_path)
-        file_list = self._filesystem.listdir(results_directory_path)
-        results_directories = []
-        for name in file_list:
-            file_path = self._filesystem.join(results_directory_path, name)
-            if (artifacts_directory_path in file_path
-                    and self._filesystem.isdir(file_path)):
-                results_directories.append(file_path)
-        results_directories.sort(key=self._filesystem.mtime)
-        return results_directories
-
-    def limit_archived_results_count(self):
-        _log.info('Clobbering excess archived results in %s' %
-                  self._filesystem.dirname(self.artifacts_directory()))
-        results_directories = self._get_artifact_directories(
-            self.artifacts_directory())
-        self._delete_dirs(results_directories[:-ARCHIVED_RESULTS_LIMIT])
-
-    def clobber_old_results(self):
-        dir_above_results_path = self._filesystem.dirname(
-            self.artifacts_directory())
-        _log.info('Clobbering old results in %s.' % dir_above_results_path)
-        if not self._filesystem.exists(dir_above_results_path):
-            return
-        results_directories = self._get_artifact_directories(
-            self.artifacts_directory())
-        self._delete_dirs(results_directories)
-
-        # Port specific clean-up.
-        self.clobber_old_port_specific_results()
-
     def clobber_old_port_specific_results(self):
         pass
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
index b0ac196b..591d820 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
@@ -29,7 +29,6 @@
 import mock
 import operator
 import optparse
-import time
 import unittest
 
 from blinkpy.common.host_mock import MockHost
@@ -1711,56 +1710,6 @@
         self.assertEqual(port.host.filesystem.cwd, '/')
         self.assertEqual(port.results_directory(), '/some-directory/results')
 
-    def _make_fake_test_result(self, host, results_directory):
-        host.filesystem.maybe_make_directory(results_directory)
-        host.filesystem.write_binary_file(results_directory + '/results.html',
-                                          'This is a test results file')
-
-    def test_rename_results_folder(self):
-        host = MockHost()
-        port = host.port_factory.get('test-mac-mac10.10')
-
-        self._make_fake_test_result(port.host, '/tmp/layout-test-results')
-        self.assertTrue(
-            port.host.filesystem.exists('/tmp/layout-test-results'))
-        timestamp = time.strftime(
-            '%Y-%m-%d-%H-%M-%S',
-            time.localtime(
-                port.host.filesystem.mtime(
-                    '/tmp/layout-test-results/results.html')))
-        archived_file_name = '/tmp/layout-test-results' + '_' + timestamp
-        port.rename_results_folder()
-        self.assertFalse(
-            port.host.filesystem.exists('/tmp/layout-test-results'))
-        self.assertTrue(port.host.filesystem.exists(archived_file_name))
-
-    def test_clobber_old_results(self):
-        host = MockHost()
-        port = host.port_factory.get('test-mac-mac10.10')
-
-        self._make_fake_test_result(port.host, '/tmp/layout-test-results')
-        self.assertTrue(
-            port.host.filesystem.exists('/tmp/layout-test-results'))
-        port.clobber_old_results()
-        self.assertFalse(
-            port.host.filesystem.exists('/tmp/layout-test-results'))
-
-    def test_limit_archived_results_count(self):
-        host = MockHost()
-        port = host.port_factory.get('test-mac-mac10.10')
-
-        for x in range(1, 31):
-            dir_name = '/tmp/layout-test-results' + '_' + str(x)
-            self._make_fake_test_result(port.host, dir_name)
-        port.limit_archived_results_count()
-        deleted_dir_count = 0
-        for x in range(1, 6):
-            dir_name = '/tmp/layout-test-results' + '_' + str(x)
-            self.assertFalse(port.host.filesystem.exists(dir_name))
-        for x in range(6, 31):
-            dir_name = '/tmp/layout-test-results' + '_' + str(x)
-            self.assertTrue(port.host.filesystem.exists(dir_name))
-
     def _assert_config_file_for_platform(self, port, platform, config_file):
         port.host.platform = MockPlatformInfo(os_name=platform)
         self.assertEqual(
diff --git a/third_party/blink/tools/run_wpt_tests.py b/third_party/blink/tools/run_wpt_tests.py
index c111fb0f..126bbb12 100755
--- a/third_party/blink/tools/run_wpt_tests.py
+++ b/third_party/blink/tools/run_wpt_tests.py
@@ -29,7 +29,7 @@
     ANDROID_WEBVIEW,
     CHROME_ANDROID,
 )
-from blinkpy.web_tests.port.base import Port
+from blinkpy.web_tests.port.base import ARTIFACTS_SUB_DIR, Port
 
 path_finder.add_testing_dir_to_sys_path()
 path_finder.add_build_android_to_sys_path()
@@ -308,11 +308,6 @@
         if not self.fs.isdir(output_dir):
             raise ValueError("'--target' must be a directory under //out")
         self.port.set_option_default('target', options.target)
-        if options.results_directory:
-            self.port.set_option_default('results_directory',
-                                         options.results_directory)
-        else:
-            options.results_directory = self.port.results_directory()
         if options.log_chromium == '' or options.show_results:
             options.log_chromium = self.fs.join(output_dir, 'results.json')
         if options.log_wptreport == '':
@@ -471,18 +466,6 @@
             logger.debug('Using WPT tools from %s', tools_root)
             self._create_extra_run_info(options)
 
-            if options.clobber_old_results:
-                self.port.clobber_old_results()
-            elif self.port._filesystem.exists(self.port.artifacts_directory()):
-                self.port.limit_archived_results_count()
-
-                # Rename the existing results folder for archiving.
-                self.port.rename_results_folder()
-
-            # Create the output directory if it doesn't already exist.
-            self.port.host.filesystem.maybe_make_directory(
-                self.port.artifacts_directory())
-
             self.port.setup_test_run()  # Start Xvfb, if necessary.
             stack.callback(self.port.clean_up_test_run)
             self.fs.chdir(self.path_finder.web_tests_dir())
@@ -529,8 +512,18 @@
             json.dump(run_info, file_handle)
 
     @contextlib.contextmanager
-    def process_and_upload_results(self, options):
-        artifacts_dir = self.port.artifacts_directory()
+    def process_and_upload_results(
+            self,
+            options,
+            layout_test_results_subdir: str = ARTIFACTS_SUB_DIR,
+    ):
+        if options.log_chromium:
+            artifacts_dir = self.fs.join(
+                self.fs.dirname(options.log_chromium[0].name),
+                layout_test_results_subdir)
+        else:
+            artifacts_dir = self.path_from_output_dir(
+                options.target, layout_test_results_subdir)
         processor = WPTResultsProcessor(self.host.filesystem,
                                         self.port,
                                         artifacts_dir=artifacts_dir)
@@ -703,9 +696,6 @@
             help=('Log a wptreport as newline-delimited JSON objects '
                   '(default: //out/<target>/'
                   'wpt_reports_<product>_<shard-index>.json)'))
-        group.add_argument('--clobber-old-results',
-                           action='store_true',
-                           help='Clobbers test results from previous runs.'),
         group.add_argument('-v',
                            '--verbose',
                            action='count',
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 47a76bf..b14f23e9 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -232,6 +232,13 @@
 
 crbug.com/1343590 virtual/prefetch/external/wpt/speculation-rules/prefetch/redirect-url.https.html [ Failure ]
 
+crbug.com/1432886 virtual/prefetch/external/wpt/speculation-rules/prefetch/initiators-iframe-location-href.sub.https.html?cross-site [ Failure ]
+crbug.com/1432886 virtual/prefetch/external/wpt/speculation-rules/prefetch/initiators-iframe-location-href.sub.https.html?same-site [ Failure ]
+crbug.com/1432886 virtual/prefetch/external/wpt/speculation-rules/prefetch/initiators-a-element.sub.https.html?cross-site [ Failure ]
+crbug.com/1432886 virtual/prefetch/external/wpt/speculation-rules/prefetch/initiators-a-element.sub.https.html?same-site [ Failure ]
+crbug.com/1432886 virtual/prefetch/external/wpt/speculation-rules/prefetch/initiators-window-open.sub.https.html?cross-site [ Failure ]
+crbug.com/1432886 virtual/prefetch/external/wpt/speculation-rules/prefetch/initiators-window-open.sub.https.html?same-site [ Failure ]
+
 # Test might be flaky on Mac12-arm64 as the test server causes network errors probably becauuse of lack of resources on the bot.
 crbug.com/1382361 [ Mac ] external/wpt/speculation-rules/prerender/csp-script-src-self.html [ Failure Pass ]
 crbug.com/1400927 [ Linux Release ] external/wpt/speculation-rules/prerender/csp-script-src-self.html [ Failure Pass ]
@@ -1605,6 +1612,7 @@
 crbug.com/995106 external/wpt/css/css-lists/inline-list-marker.html [ Failure ]
 
 # css-pseudo
+crbug.com/1443095 external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001.html [ Failure ]
 crbug.com/1163437 external/wpt/css/css-pseudo/grammar-spelling-errors-001.html [ Failure ]
 crbug.com/1163437 external/wpt/css/css-pseudo/grammar-spelling-errors-002.html [ Failure ]
 crbug.com/1147859 external/wpt/css/css-pseudo/highlight-painting-001.html [ Failure ]
@@ -3041,8 +3049,6 @@
 crbug.com/626703 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/svg-text-selection-002.html [ Failure ]
 crbug.com/626703 virtual/css-highlight-overlay-painting/external/wpt/css/css-pseudo/svg-text-selection-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/counter-style-at-rule/descriptor-prefix.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/counter-style-at-rule/system-additive.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/counter-style-at-rule/system-alphabetic.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/counter-style-at-rule/system-extends.html [ Failure ]
@@ -6788,6 +6794,8 @@
 # Sheriff 2023-05-02
 crbug.com/1441166 [ Mac ] http/tests/devtools/indexeddb/resources-panel.js [ Failure Pass ]
 crbug.com/1441166 [ Linux ] http/tests/devtools/indexeddb/resources-panel.js [ Failure Pass ]
+# Sheriff 2023-05-08
+crbug.com/1441166 [ Win ] http/tests/devtools/indexeddb/resources-panel.js [ Failure Pass ]
 
 # Sheriff 2023-05-04
 crbug.com/1434164 http/tests/streams/chromium/transferable-streams-optimization.html [ Crash Failure Pass ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 40ca617..e726727b 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -18679,12 +18679,12 @@
        ]
       ],
       "scroll-timeline-default-print.tentative.html": [
-       "975a59812e9b4d45877fd0c9acdfd10079029d49",
+       "3f25cc93dba6a6f8c360e416b328f897cab29e99",
        [
         null,
         [
          [
-          "/scroll-animations/css/scroll-timeline-default-ref.html",
+          "/scroll-animations/css/printing/scroll-timeline-default-print-ref.html",
           "=="
          ]
         ],
@@ -97263,6 +97263,32 @@
        {}
       ]
      ],
+     "lab-l-over-100-1.html": [
+      "fdb3955e96ee4fc00e33db85134fc78adb84002b",
+      [
+       null,
+       [
+        [
+         "/css/css-color/lab-l-over-100-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "lab-l-over-100-2.html": [
+      "f62f9e0559b0c23106a29848bcf3e5515e16ff04",
+      [
+       null,
+       [
+        [
+         "/css/css-color/lab-l-over-100-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "lch-001.html": [
       "904e2e5bd7c75dade264e22aa3a145ad56625d67",
       [
@@ -97393,6 +97419,32 @@
        {}
       ]
      ],
+     "lch-l-over-100-1.html": [
+      "9711956242df6e903d8ebcd3eebe2820c7b8b1e6",
+      [
+       null,
+       [
+        [
+         "/css/css-color/lch-l-over-100-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "lch-l-over-100-2.html": [
+      "a909a49f0c2344e3b8934a9b4d9b80a77ddac8fc",
+      [
+       null,
+       [
+        [
+         "/css/css-color/lch-l-over-100-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "named-001.html": [
       "61a98dcb7bb02fab3db18ed337eee5ddb07724fc",
       [
@@ -107653,19 +107705,6 @@
         {}
        ]
       ],
-      "fallback-cycle.html": [
-       "2e63a3f4d4445f1b57b216446f8d4474ff5808b1",
-       [
-        null,
-        [
-         [
-          "/css/css-counter-styles/counter-style-at-rule/fallback-cycle-ref.html",
-          "=="
-         ]
-        ],
-        {}
-       ]
-      ],
       "fallbacks-in-shadow-dom.html": [
        "d51f70bc31c011fe9853755715a710837090a700",
        [
@@ -107744,19 +107783,6 @@
         {}
        ]
       ],
-      "suffix-fallback.html": [
-       "7684c9a10a9c09bc768cbb44a7379c1599f09eed",
-       [
-        null,
-        [
-         [
-          "/css/css-counter-styles/counter-style-at-rule/suffix-fallback-ref.html",
-          "=="
-         ]
-        ],
-        {}
-       ]
-      ],
       "symbols-function-invalid.html": [
        "35aa83258726c89efc2c0e31a1e3927362c7f4e2",
        [
@@ -264332,6 +264358,19 @@
        ],
        {}
       ]
+     ],
+     "view-timeline-subject-bounds-update.html": [
+      "7001eceeaf8f4997d7fb3f8b297eaa3827c537e6",
+      [
+       null,
+       [
+        [
+         "/scroll-animations/css/animation-update-ref.html?translate=100px&scroll=800",
+         "=="
+        ]
+       ],
+       {}
+      ]
      ]
     },
     "scroll-timelines": {
@@ -271569,6 +271608,16 @@
    }
   },
   "support": {
+   ".cache": {
+    "gitignore2.json": [
+     "ae71786e96f4f32e9c08bc2eee776cc4820a2be9",
+     []
+    ],
+    "mtime.json": [
+     "b7f7703c77b481009e1fcdf93ad11846059cfe1f",
+     []
+    ]
+   },
    ".gitignore": [
     "d93e645d547894b50149d3726de2654957b6e06f",
     []
@@ -291213,6 +291262,10 @@
       "9d0bc0c6c765b45b54b76bfeeb2e8e9720f9540d",
       []
      ],
+     "lab-l-over-100-ref.html": [
+      "57328cfa7c5569850f1d69fbcb6cab7c81b68478",
+      []
+     ],
      "lch-004-ref.html": [
       "2bc1e8285720e69646f1f17fd2c1fd7a0c4d76fd",
       []
@@ -291237,6 +291290,10 @@
       "24ff4166bdb9d8d8069a6beee0443879bce6796c",
       []
      ],
+     "lch-l-over-100-ref.html": [
+      "67766274e59aced21539d94499d3a324d11b8478",
+      []
+     ],
      "mossgreensquare-ref.html": [
       "06f866c02dd04724a35cf5032b1d40e6783c3389",
       []
@@ -291303,7 +291360,7 @@
        []
       ],
       "color-computed-lab-expected.txt": [
-       "cdcc18f7ae0ab64e37435d3fb000c1e987f61907",
+       "4445e6305a1ae3afaf16a3a6db52db5a042c959e",
        []
       ],
       "color-computed-lab.html.ini": [
@@ -291335,7 +291392,7 @@
        []
       ],
       "color-valid-lab-expected.txt": [
-       "a2907edba929a071ec7e5dbf29b3464b98e69936",
+       "0dc2ec7db1046b6a9bb7f924bc5fbe77603efd1e",
        []
       ],
       "color-valid-lab.html.ini": [
@@ -293374,14 +293431,6 @@
        "7d0dbc3314d8379deb597d08e97804cfc51aa4ab",
        []
       ],
-      "fallback-cycle-ref.html": [
-       "22bcf8d9b4ef3963020b3e834c893756426df412",
-       []
-      ],
-      "fallback-cycle.html.ini": [
-       "912e1a676a91725be6c414790968cf6c77fd2460",
-       []
-      ],
       "fallbacks-in-shadow-dom-ref.html": [
        "53e467bb391884ec9751edfcffe85f03c8502e08",
        []
@@ -293410,14 +293459,6 @@
        "7f1af7532075c983e7fc0bcec7cd14830e0c13eb",
        []
       ],
-      "suffix-fallback-ref.html": [
-       "15cd54cb24f18b64f1bbbc900287bd9734a5f093",
-       []
-      ],
-      "suffix-fallback.html.ini": [
-       "fdd848b176ff0e3edaa2decf6a7c2ecebb3e11c0",
-       []
-      ],
       "support": {
        "counter-style-testcommon.js": [
         "a3615e92ff0678d5e7b2aad0a20076cd1ac07d6e",
@@ -310425,7 +310466,7 @@
        []
       ],
       "clip-path-scaled-video.html.ini": [
-       "ed150633d8352b4299aaa545509a384ac9e04921",
+       "56fb68b83e26b8aae7eddb915e98fe87eeba17ef",
        []
       ],
       "clip-path-scroll.html.ini": [
@@ -328966,6 +329007,10 @@
        "2415b1279f48e51bb930d36e36c0f330f510a2d5",
        []
       ],
+      "kind-of-widget-fallback-input-submit-border-left-style-001.html.ini": [
+       "463fe4db2b7785ebcaca6933f5f0af26874c69e4",
+       []
+      ],
       "kind-of-widget-fallback-input-submit-border-left-width-001.html.ini": [
        "7e86e3dde9c51af132c681e6c1b829bcefefbc34",
        []
@@ -335044,7 +335089,7 @@
       []
      ],
      "cssom-getPropertyValue-common-checks-expected.txt": [
-      "419cc4d0dbe77e3f65b3ac9f823bfb13b41b4761",
+      "4d33936040222e0219b0e96ac632ef9895720a60",
       []
      ],
      "cssom-getPropertyValue-common-checks.html.ini": [
@@ -336103,6 +336148,10 @@
       "4d1f43792c071fd439314de1f798f4d740419c01",
       []
      ],
+     "css-backdrop-filters-animation-drop-shadow.html.ini": [
+      "1af6526b97976963a946313eb00b44a7b03711b1",
+      []
+     ],
      "css-backdrop-filters-animation-grayscale-ref.html": [
       "072652009a7b6a060ebec30eeac8597c6fd735a8",
       []
@@ -382012,6 +382061,10 @@
        "5545ee0b73410fa6696885cc638e75ed9b4b3c0d",
        []
       ],
+      "scroll-timeline-default-print-ref.html": [
+       "6610f7a5a7e503c2deab83a7cde3979222898abc",
+       []
+      ],
       "scroll-timeline-specified-scroller-ref.html": [
        "d2f2d8f73d71f84c0c1111e6f923929acdb22a3a",
        []
@@ -386601,8 +386654,8 @@
       "15f2a68eeddb7e095a7488af3efae8b91ad4004a",
       []
      ],
-     "accept-clint-hint-cache.https.html.ini": [
-      "a89648017d86b1f126d04587ac2302fafa40ade1",
+     "accept-client-hint-cache.https.html.ini": [
+      "8965a0e6e70f04af1f85a69be988d9a6f96fc31f",
       []
      ],
      "activation-start.html.ini": [
@@ -394414,18 +394467,10 @@
      "9ac7d83c98203bdb24def82f07380bce7d89a049",
      []
     ],
-    "elementwise_unary.https.any-expected.txt": [
-     "c9c5f21c4afbf74e5a1fd72813523bf19f8f7c5a",
-     []
-    ],
     "elementwise_unary.https.any.js.ini": [
      "6a4e236829aa66e9712a5bb2b88c1b9e1079d6c2",
      []
     ],
-    "elementwise_unary.https.any.worker-expected.txt": [
-     "dfafaf3a7510b4c7b2a5d98d56f0596bf4bc1375",
-     []
-    ],
     "elu.https.any.js.ini": [
      "3d8375a4d8202a75e91146661baa24201fda6cc0",
      []
@@ -396536,6 +396581,22 @@
      "3291dcef88d077daf5e6b8a226e8081b9e43b627",
      []
     ],
+    "close.https.any-expected.txt": [
+     "7032e6693d58d31622fd30e056ee83cdcd4b3c37",
+     []
+    ],
+    "close.https.any.serviceworker-expected.txt": [
+     "7032e6693d58d31622fd30e056ee83cdcd4b3c37",
+     []
+    ],
+    "close.https.any.sharedworker-expected.txt": [
+     "7032e6693d58d31622fd30e056ee83cdcd4b3c37",
+     []
+    ],
+    "close.https.any.worker-expected.txt": [
+     "7032e6693d58d31622fd30e056ee83cdcd4b3c37",
+     []
+    ],
     "datagrams.https.any-expected.txt": [
      "cdb67a1ed4ec1d30102afc1cdfb007fb0e8c82ed",
      []
@@ -441279,7 +441340,7 @@
        ]
       ],
       "color-interpolation.html": [
-       "7bda888a0b4d4355e916197e3646b69d1ca1ef64",
+       "d22f53409c9ab67f3882150bd2430907fe2164b5",
        [
         null,
         {}
@@ -501540,6 +501601,13 @@
        ]
       ],
       "multi-globals": {
+       "construct-in-detached-frame.window.js": [
+        "b0d6ba5b80db821ee75b3892626369caa6e3aece",
+        [
+         "fetch/api/request/multi-globals/construct-in-detached-frame.window.html",
+         {}
+        ]
+       ],
        "url-parsing.html": [
         "df60e72507ffdf22ce3d6e8342a8a35aa03fb201",
         [
@@ -503813,7 +503881,7 @@
        ]
       ],
       "response-static-json.any.js": [
-       "3c8a2b637f70871a21a66319d6eb3f9db7c41f77",
+       "5ec79e69aa3f9c1009050b083e0cf8c0cc76e1dc",
        [
         "fetch/api/response/response-static-json.any.html",
         {
@@ -554815,7 +554883,7 @@
        ]
       ],
       "popover-attribute-all-elements.html": [
-       "9ee659962b8997cca1813a26a068736c7d94699a",
+       "5a536f026ee96744c744eb98244cb3e06017d277",
        [
         null,
         {
@@ -554825,7 +554893,7 @@
        ]
       ],
       "popover-attribute-basic.html": [
-       "335f817e75d8f90580ff86d0c4d99bdda20f673b",
+       "eab61407c8b38772059fb9dae2dfe33308138a1e",
        [
         null,
         {
@@ -554850,6 +554918,13 @@
         }
        ]
       ],
+      "popover-css-properties.tentative.html": [
+       "93d388b02b533f8e8719ef8a9b54293f45a5cffd",
+       [
+        null,
+        {}
+       ]
+      ],
       "popover-dialog-initial-focus.html": [
        "47b2252bf5f26bc5bd122b9e57035992da65855a",
        [
@@ -554897,8 +554972,18 @@
         }
        ]
       ],
+      "popover-hover-hide.tentative.html": [
+       "ed647a7d7d8f9c2598cf2c69c21f84ec455f5994",
+       [
+        null,
+        {
+         "testdriver": true,
+         "timeout": "long"
+        }
+       ]
+      ],
       "popover-invoker-reset.html": [
-       "4b1ac6b588f70398e01de389bd0ab7c2bd305469",
+       "bfc79fd629171606b5d5d9a4224522e4bb4137ef",
        [
         null,
         {
@@ -554924,7 +555009,7 @@
        ]
       ],
       "popover-light-dismiss.html": [
-       "3c776fd6f65fbdf7d2d7abd3567c24e5cd9e81fa",
+       "4411d0b7e381b95960d25a5fbbda7682af1db263",
        [
         null,
         {
@@ -554984,6 +555069,16 @@
         {}
        ]
       ],
+      "popover-target-action-hover.tentative.html": [
+       "b03ec78ebf12e49775bf0636c78a803d97a1c19d",
+       [
+        null,
+        {
+         "testdriver": true,
+         "timeout": "long"
+        }
+       ]
+      ],
       "popover-target-element-disabled.html": [
        "d5c951768c083aa0fea3c6d473c9a370f386f31b",
        [
@@ -555010,14 +555105,14 @@
        ]
       ],
       "popover-types-with-hints.tentative.html": [
-       "06282a2aa1f5595e2a2be281dce57f52d26f405d",
+       "7a73efb50fc8e54926ffb4eb78c79f75413b1273",
        [
         null,
         {}
        ]
       ],
       "popover-types.html": [
-       "e6d7d967bbc9c1b01b402e7f8a81d92efe269513",
+       "d4ad81e52bf1fcfae93237bfc7d8d180715b038e",
        [
         null,
         {}
@@ -600395,7 +600490,7 @@
       ]
      ],
      "timeline-range-name-offset-in-keyframes.tentative.html": [
-      "7bae49c2e97dcc8c22b3f071256fdfd9cca699c2",
+      "54467bc83b18146c4a0adcd2dffde44bfd352df9",
       [
        null,
        {}
@@ -600678,7 +600773,7 @@
       ]
      ],
      "scroll-timeline-invalidation.html": [
-      "f35d878c69acd0a3c29567513e23940a9b3802c9",
+      "0b9e10c9846d17ae19be1d5c6f1b47e0826dc386",
       [
        null,
        {}
@@ -608988,7 +609083,7 @@
        }
       ]
      ],
-     "accept-clint-hint-cache.https.html": [
+     "accept-client-hint-cache.https.html": [
       "66e2c90c04a04dd69119569e24658697e258e4c6",
       [
        null,
@@ -652637,7 +652732,7 @@
    },
    "webtransport": {
     "close.https.any.js": [
-     "642d716a10342ad46ba2c852713e3360cfc5ca03",
+     "de675036f3d7ea4a7e2aaf5bf88bdfb35a173f3a",
      [
       "webtransport/close.https.any.html",
       {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle-ref.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle-ref.html
deleted file mode 100644
index 22bcf8d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle-ref.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>CSS Reference: fallback cycle</title>
-<style>
-.decimal {
-    list-style-type: decimal;
-}
-.paren::marker {
-    content: "(" counter(list-item) ")\A0";
-}
-.bracket::marker {
-    content: "[" counter(list-item, lower-roman) "]\A0";
-}
-.brace::marker {
-    content: "{" counter(list-item, lower-alpha) "}\A0";
-}
-</style>
-
-<ol>
-    <li class=decimal>paren > bracket > brace > decimal
-    <li class=paren>paren
-    <li class=paren>paren
-    <li class=paren>paren
-    <li class=bracket>paren > bracket
-    <li class=bracket>paren > bracket
-    <li class=bracket>paren > bracket
-    <li class=brace>paren > bracket > brace
-    <li class=brace>paren > bracket > brace
-    <li class=decimal>paren > bracket > brace > decimal
-</ol>
-
-<ol>
-    <li class=decimal>bracket > brace > paren > decimal
-    <li class=paren>bracket > brace > paren
-    <li class=paren>bracket > brace > paren
-    <li class=bracket>bracket
-    <li class=bracket>bracket
-    <li class=bracket>bracket
-    <li class=bracket>bracket
-    <li class=brace>bracket > brace
-    <li class=brace>bracket > brace
-    <li class=decimal>bracket > brace > paren > decimal
-</ol>
-
-<ol>
-    <li class=decimal>brace > paren > bracket > decimal
-    <li class=paren>brace > paren
-    <li class=paren>brace > paren
-    <li class=paren>brace > paren
-    <li class=bracket>brace > paren > bracket
-    <li class=bracket>brace > paren > bracket
-    <li class=brace>brace
-    <li class=brace>brace
-    <li class=brace>brace
-    <li class=decimal>brace > paren > bracket > decimal
-</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html
deleted file mode 100644
index 2e63a3f4..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>CSS Test: fallback cycle</title>
-<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
-<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-range">
-<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-fallback">
-<meta name="assert" content="While following fallbacks to find a counter style that can render the given counter value,
-                             if a loop in the specified fallbacks is detected, the decimal style must be used instead">
-<link rel="match" href="fallback-cycle-ref.html">
-<style>
-/*
-    Three styles with different but overlapping ranges,
-    with fallback to each other in a cycle.
-
-    Depending where in the cycle we start, we expect different results
-    for the overlapping ranges; in all cases we fall back to the default
-    (decimal) style when fallback would loop around.
-*/
-@counter-style paren {
-    system: extends decimal;
-    prefix: "(";
-    suffix: ")\A0";
-    range: 2 4;
-    fallback: bracket;
-}
-
-@counter-style bracket {
-    system: extends lower-roman;
-    prefix: "[";
-    suffix: "]\A0";
-    range: 4 7;
-    fallback: brace;
-}
-
-@counter-style brace {
-    system: extends lower-alpha;
-    prefix: "{";
-    suffix: "}\A0";
-    range: 7 9;
-    fallback: paren;
-}
-
-ol {
-    list-style-type: disc;  /* overridden by the counter-style rules */
-}
-</style>
-
-<ol style="list-style: paren">
-    <li>paren > bracket > brace > decimal
-    <li>paren
-    <li>paren
-    <li>paren
-    <li>paren > bracket
-    <li>paren > bracket
-    <li>paren > bracket
-    <li>paren > bracket > brace
-    <li>paren > bracket > brace
-    <li>paren > bracket > brace > decimal
-</ol>
-
-<ol style="list-style: bracket">
-    <li>bracket > brace > paren > decimal
-    <li>bracket > brace > paren
-    <li>bracket > brace > paren
-    <li>bracket
-    <li>bracket
-    <li>bracket
-    <li>bracket
-    <li>bracket > brace
-    <li>bracket > brace
-    <li>bracket > brace > paren > decimal
-</ol>
-
-<ol style="list-style: brace">
-    <li>brace > paren > bracket > decimal
-    <li>brace > paren
-    <li>brace > paren
-    <li>brace > paren
-    <li>brace > paren > bracket
-    <li>brace > paren > bracket
-    <li>brace
-    <li>brace
-    <li>brace
-    <li>brace > paren > bracket > decimal
-</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html.ini b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html.ini
deleted file mode 100644
index 912e1a6..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/fallback-cycle.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[fallback-cycle.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback-ref.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback-ref.html
deleted file mode 100644
index 15cd54c..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback-ref.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>CSS Reference: suffix fallback</title>
-<style>
-div div {
-  width: 4em;
-  text-align: right;
-}
-</style>
-
-<div>
-    <div>1st</div>
-    <div>2nd</div>
-    <div>3rd</div>
-    <div>4th</div>
-    <div>5th</div>
-    <div>6th</div>
-    <div>7th</div>
-    <div>8th</div>
-    <div>9th</div>
-    <div>10th</div>
-    <div>11th</div>
-    <div>12th</div>
-    <div>13th</div>
-    <div>14th</div>
-    <div>15th</div>
-    <div>16th</div>
-    <div>17th</div>
-    <div>18th</div>
-    <div>19th</div>
-    <div>20th</div>
-    <div>21st</div>
-    <div>22nd</div>
-    <div>23rd</div>
-    <div>24th</div>
-    <div>25th</div>
-    <div>26th</div>
-    <div>27th</div>
-    <div>28th</div>
-    <div>29th</div>
-    <div>30th</div>
-    <div>31st</div>
-    <div>32nd</div>
-    <div>33rd</div>
-    <div>34th</div>
-    <div>35th</div>
-</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html
deleted file mode 100644
index 7684c9a1..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>CSS Test: suffix fallback</title>
-<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
-<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-range">
-<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-fallback">
-<link rel="match" href="suffix-fallback-ref.html">
-<style>
-/* A set of rules that rely on range limits and fallback to vary the suffix. */
-@counter-style ordinal-default {
-    system: numeric;
-    symbols: "0" "1" "2" "3" "4" "5" "6" "7" "8" "9";
-    suffix: "th";
-    range: 1 infinite;
-}
-
-@counter-style ordinal {
-    system: extends ordinal-default;
-    suffix: "st";
-    fallback: ordinal-twos;
-    range: 1 1, 21 21, 31 31, 41 41, 51 51, 61 61, 71 71, 81 81, 91 91;
-}
-
-@counter-style ordinal-twos {
-    system: extends ordinal-default;
-    suffix: "nd";
-    fallback: ordinal-threes;
-    range: 2 2, 22 22, 32 32, 42 42, 52 52, 62 62, 72 72, 82 82, 92 92;
-}
-
-@counter-style ordinal-threes {
-    system: extends ordinal-default;
-    suffix: "rd";
-    fallback: ordinal-default;
-    range: 3 3, 23 23, 33 33, 43 43, 53 53, 63 63, 73 73, 83 83, 93 93;
-}
-
-ol.ordinal {
-    margin: 0;
-    padding: 0;
-    list-style: ordinal;
-}
-li {
-    margin-left: 4em;
-}
-</style>
-
-<ol class="ordinal">
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-    <li></li>
-</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html.ini b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html.ini
deleted file mode 100644
index fdd848b1..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/suffix-fallback.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[suffix-fallback.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-padding-003.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-padding-003.html
new file mode 100644
index 0000000..ee84f15
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-padding-003.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://crbug.com/1440908">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert"
+  content="vertical-rl block's auto height should encompass its children, and the percentage padding should resolve based on that." />
+
+<style>
+  #reference-overlapped-red {
+    position: absolute;
+    background-color: red;
+    width: 100px;
+    height: 100px;
+    z-index: -1;
+  }
+
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+
+<div id=reference-overlapped-red></div>
+
+<div id="container" style="writing-mode:vertical-rl; width:101px;">
+  <div style="display:flex; padding-right:5%;">
+    <div style="writing-mode:horizontal-tb; padding-right:10%;">
+      <div
+        style="width:100px; height:100px; background:green; position:relative; left:15px;">
+      </div>
+    </div>
+  </div>
+</div>
+<script>
+  document.body.offsetTop;
+  container.style.width = "100px";
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001-ref.html
new file mode 100644
index 0000000..3d01bccf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Highlight API Test: ::highlight with text-underline-offset, reference</title>
+<style>
+  #target {
+    text-decoration: wavy underline green 5px;
+    text-underline-offset: 20px;
+  }
+</style>
+<p id="target">The underline should be offset.</p>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001.html b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001.html
new file mode 100644
index 0000000..14b238ce
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-highlight-api/painting/css-highlight-painting-underline-offset-001.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Highlight API Test: ::highlight with text-underline-offset</title>
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel="match" href="css-highlight-painting-underline-offset-001-ref.html">
+<meta name="assert" content="Verify that text-underline-offset works in a ::highlight pseudo-element.">
+<style>
+  ::highlight(example) {
+    text-decoration: wavy underline green 5px;
+    text-underline-offset: 20px;
+  }
+</style>
+<p id="target">The underline should be offset.</p>
+<script>
+  let range = new Range();
+  range.setStart(target, 0);
+  range.setEnd(target, 1);
+  CSS.highlights.set(`example`, new Highlight(range));
+</script>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-scaled-video.html.ini b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-scaled-video.html.ini
index ed150633..56fb68b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-scaled-video.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-scaled-video.html.ini
@@ -1,5 +1,6 @@
 [clip-path-scaled-video.html]
   expected:
     if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+    if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL
     if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
     if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-left-style-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-left-style-001.html.ini
new file mode 100644
index 0000000..463fe4db2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-left-style-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-input-submit-border-left-style-001.html]
+  expected:
+    if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-drop-shadow.html.ini b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-drop-shadow.html.ini
new file mode 100644
index 0000000..1af6526
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-drop-shadow.html.ini
@@ -0,0 +1,3 @@
+[css-backdrop-filters-animation-drop-shadow.html]
+  expected:
+    if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors-expected.txt
deleted file mode 100644
index 46ca349d..0000000
--- a/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Range.cloneContents should invoke constructor in tree order assert_array_equals: expected property 0 to be "root-0" but got "root-0-0" (expected array ["root-0", "root-0-0", "root-1"] got ["root-0-0", "root-0", "root-1"])
-FAIL Range.extractContents should invoke constructor in tree order assert_array_equals: expected property 0 to be "root-0" but got "root-0-0" (expected array ["root-0", "root-0-0"] got ["root-0-0", "root-0"])
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors.html b/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors.html
index d17c3b7..cc51424 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/range-and-constructors.html
@@ -5,22 +5,22 @@
 <meta name="author" title="Edgar Chen" href="mailto:echen@mozilla.com">
 <link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#concept-upgrade-an-element">
 <link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
-<line rel="help" href="https://dom.spec.whatwg.org/#concept-range-extract">
-<line rel="help" href="https://dom.spec.whatwg.org/#concept-range-clone">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-range-extract">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-range-clone">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 </head>
 <body>
 <div id="log"></div>
 
-<c-e data-index="root">
-  <c-e data-index="root-0">
-    <c-e data-index="root-0-0">
-      <c-e data-index="root-0-0-0"></c-e>
+<c-e id="root">
+  <c-e id="root-0">
+    <c-e id="root-0-0">
+      <c-e id="root-0-0-0"></c-e>
       <span id="start"></span>
     </c-e>
   </c-e>
-  <c-e data-index="root-1"></c-e>
+  <c-e id="root-1"></c-e>
   <span id="end"></span>
 </c-e>
 
@@ -30,7 +30,7 @@
 class CE extends HTMLElement {
   constructor() {
     super();
-    logs.push(this.dataset.index);
+    logs.push(this.id);
   }
 }
 customElements.define('c-e', CE);
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/request/multi-globals/construct-in-detached-frame.window.js b/third_party/blink/web_tests/external/wpt/fetch/api/request/multi-globals/construct-in-detached-frame.window.js
new file mode 100644
index 0000000..b0d6ba5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/api/request/multi-globals/construct-in-detached-frame.window.js
@@ -0,0 +1,11 @@
+// This is a regression test for Chromium issue https://crbug.com/1427266.
+test(() => {
+  const iframe = document.createElement('iframe');
+  document.body.append(iframe);
+  const otherRequest = iframe.contentWindow.Request;
+  iframe.remove();
+  const r1 = new otherRequest('resource', { method: 'POST', body: 'string' });
+  const r2 = new otherRequest(r1);
+  assert_true(r1.bodyUsed);
+  assert_false(r2.bodyUsed);
+}, 'creating a request from another request in a detached realm should work');
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/response/response-static-json.any.js b/third_party/blink/web_tests/external/wpt/fetch/api/response/response-static-json.any.js
index 3c8a2b6..5ec79e6 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/api/response/response-static-json.any.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/api/response/response-static-json.any.js
@@ -79,3 +79,18 @@
     }
   )
 }, "Check static json() propagates JSON serializer errors");
+
+const encodingChecks = [
+  ["𝌆", [34, 240, 157, 140, 134, 34]],
+  ["\uDF06\uD834", [34, 92, 117, 100, 102, 48, 54, 92, 117, 100, 56, 51, 52, 34]],
+  ["\uDEAD", [34, 92, 117, 100, 101, 97, 100, 34]],
+];
+
+for (const [input, expected] of encodingChecks) {
+  promise_test(async function () {
+    const response = Response.json(input);
+    const buffer = await response.arrayBuffer();
+    const data = new Uint8Array(buffer);
+    assert_array_equals(data, expected);
+  }, `Check response returned by static json() with input ${input}`);
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-dialog-initial-focus.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-dialog-initial-focus.html
deleted file mode 100644
index 47b2252b..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-dialog-initial-focus.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<link rel=author href="mailto:jarhar@chromium.org">
-<link rel=help href="http://crbug.com/1430405">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<dialog id=dialog popover=auto>
-  <button id=button>button</button>
-</dialog>
-
-<dialog id=dialog2 popover=auto autofocus>
-  <button>button</button>
-</dialog>
-
-<script>
-test(() => {
-  dialog.showPopover();
-  assert_equals(document.activeElement, button);
-}, 'Opening dialogs as popovers should use dialog initial focus algorithm.');
-
-test(() => {
-  dialog2.showPopover();
-  assert_equals(document.activeElement, dialog2);
-}, 'Opening dialogs as popovers which have autofocus should focus the dialog.');
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html
index df7c046..98bb065 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html
@@ -49,6 +49,14 @@
   <button autofocus tabindex="0">second autofocus button</button>
 </div>
 
+<dialog popover=auto data-test='Opening dialogs as popovers should use dialog initial focus algorithm.'>
+  <button class=should-be-focused>button</button>
+</dialog>
+
+<dialog popover=auto autofocus class=should-be-focused data-test='Opening dialogs as popovers which have autofocus should focus the dialog.'>
+  <button>button</button>
+</dialog>
+
 <style>
   [popover] {
     border: 2px solid black;
@@ -178,7 +186,7 @@
       assert_true(popover.matches(':popover-open'));
       assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by button.click()`);
       popover.focus();
-      assert_equals(document.activeElement, popover.hasAttribute('tabindex') ? popover : expectedFocusedElement, `${testName} directly focus with popover.focus()`);
+      assert_equals(document.activeElement, popover.hasAttribute('tabindex') || popover.tagName === 'DIALOG' ? popover : expectedFocusedElement, `${testName} directly focus with popover.focus()`);
       button.click(); // Button is set to toggle the popover
       assert_false(popover.matches(':popover-open'));
       assert_equals(document.activeElement, priorFocus, 'prior element should get focus on button-toggled hide');
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-src-change.html b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-src-change.html
index e0701a21..33213a5 100644
--- a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-src-change.html
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-src-change.html
@@ -1,37 +1,75 @@
 <!DOCTYPE HTML>
 <meta charset=utf-8>
 <title>Largest Contentful Paint: src change triggers new entry.</title>
+
 <body>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/largest-contentful-paint-helpers.js"></script>
-<img src='/images/black-rectangle.png' id='image_id'/>
-<script>
-  setup({"hide_test_state": true});
-  async_test(function (t) {
-    assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
-    let beforeLoad = performance.now();
-    let firstCallback = true;
-    const observer = new PerformanceObserver(
-      t.step_func(function(entryList) {
-        assert_equals(entryList.getEntries().length, 1);
-        const entry = entryList.getEntries()[0];
-        const url = window.location.origin + (firstCallback ? '/images/black-rectangle.png' : '/images/blue.png');
-        // black-rectangle.png is 100 x 50. blue.png is 133 by 106.
-        const size = firstCallback ? 100 * 50 : 133 * 106;
-        checkImage(entry, url, 'image_id', size, beforeLoad);
-        if (firstCallback) {
-          // Set the src to trigger another entry.
-          const img = document.getElementById('image_id');
-          img.src = '/images/blue.png';
-          beforeLoad = performance.now();
-          firstCallback =false;
-        } else {
-          t.done();
-        }
-      })
-    );
-    observer.observe({type: 'largest-contentful-paint', buffered: true});
-  }, 'Largest Contentful Paint: changing src causes a new entry to be dispatched.');
-</script>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="resources/largest-contentful-paint-helpers.js"></script>
+  <img src='' id='image_id' />
+  <script>
+    setup({ "hide_test_state": true });
+
+    let first_image_src = '/images/black-rectangle.png';
+    let second_image_src = '/images/blue.png';
+    let image_id = 'image_id';
+
+    // Add listener for load event that is fired when image is loaded.
+    const image_load_promise = image_element => {
+      return new Promise(resolve => {
+        image_element.addEventListener('load', resolve);
+      });
+    }
+
+    // Create a promise that resolves when an LCP is observed.
+    const lcp_observation_promise = image_src => {
+      return new Promise(resolve => {
+        new PerformanceObserver((entryList) => {
+          let lcpEntry = entryList.getEntries().find(e => e.url.includes(image_src));
+
+          if (lcpEntry) {
+            resolve(lcpEntry);
+          }
+
+        }).observe({ type: 'largest-contentful-paint' });
+      });
+    }
+
+    const loadImageAndGetLCPEntry = async image_src => {
+      let LCPObserverPromise = lcp_observation_promise(image_src);
+
+      let image_element = document.getElementById(image_id);
+
+      let promise = image_load_promise(image_element);
+
+      image_element.src = image_src;
+
+      await promise;
+
+      return await LCPObserverPromise;
+    }
+
+    promise_test(async t => {
+
+      assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
+
+
+      // Load first image.
+      let beforeLoad = performance.now();
+
+      let first_LCP = await loadImageAndGetLCPEntry(first_image_src);
+
+      // Verify first LCP entry correctness. The black-rectangle.png is 100 x 50.
+      checkImage(first_LCP, window.location.origin + first_image_src, image_id, 100 * 50, beforeLoad);
+
+      // Load second image.
+      beforeLoad = performance.now();
+
+      let second_LCP = await loadImageAndGetLCPEntry(second_image_src);
+
+      // Verify second LCP entry correctness. The blue.png is 133 by 106.
+      checkImage(second_LCP, window.location.origin + second_image_src, image_id, 133 * 106, beforeLoad);
+
+    }, 'Largest Contentful Paint: changing src causes a new entry to be dispatched.');
+  </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print-ref.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print-ref.html
new file mode 100644
index 0000000..6610f7a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Reference for default scroll() timeline</title>
+<style>
+  html {
+    min-height: 100%;
+    padding-bottom: 100px;
+  }
+
+  #box {
+    width: 100px;
+    height: 100px;
+    background-color: green;
+  }
+
+  * {
+    margin-top: 0px;
+    margin-bottom: 0px;
+  }
+</style>
+
+<div id="box"></div>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print.tentative.html
index 975a5981..3f25cc9 100644
--- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-default-print.tentative.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/scroll-animations-1/#scroll-notation">
 <link rel="help" href="https://drafts.csswg.org/css-animations-2/#animation-timeline">
 <meta name="assert" content="CSS animation correctly updates values when using the default scroll() timeline">
-<link rel="match" href="../scroll-timeline-default-ref.html">
+<link rel="match" href="scroll-timeline-default-print-ref.html">
 
 <style>
   @keyframes update {
@@ -25,12 +25,6 @@
     animation-timeline: scroll();
   }
 
-  #covered {
-    width: 100px;
-    height: 100px;
-    background-color: red;
-  }
-
   * {
     margin-top: 0px;
     margin-bottom: 0px;
@@ -38,7 +32,6 @@
 </style>
 
 <div id="box"></div>
-<div id="covered"></div>
 <script src="/web-animations/testcommon.js"></script>
 <script>
   document.documentElement.addEventListener('TestRendered', async () => {
@@ -51,6 +44,10 @@
     await waitForCompositorReady();
 
     // Move the scroller to the halfway point.
+    // When printing, a timeline associated with the document's scrolling
+    // element will become inactive. The root scroller is considered to be
+    // fully in view with a scroll range of zero.
+    // https://github.com/w3c/csswg-drafts/issues/8226
     const maxScroll = scroller.scrollHeight - scroller.clientHeight;
     scroller.scrollTop = 0.5 * maxScroll;
 
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
index 7bae49c..54467bc 100644
--- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
@@ -87,9 +87,12 @@
       container.scrollTop = 400;
       await waitForNextFrame();
       assert_equals(getComputedStyle(subject).opacity, '1',
-                    'Effect at entry 100% (post resize)');
+                    'Effect at entry 100%');
 
+      // Reducing the viewport by 100px, shifts the keyframe offsets.
+      // The entry range shifts from [200px, 400px] to [300px, 500px].
       container.style.height = '300px';
+
       await waitForNextFrame();
       assert_equals(getComputedStyle(subject).opacity, '0.5',
                     'Effect at entry 50% (post resize)');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html
new file mode 100644
index 0000000..7001ecee
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>Update subject bounds refTest</title>
+<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/8694">
+<link rel="match"
+      href="./animation-update-ref.html?translate=100px&scroll=800">
+<script src="/web-animations/testcommon.js"></script>
+</head>
+<style type="text/css">
+  @keyframes anim {
+    from { transform: translateX(100px) }
+    to { transform: translateX(0px) }
+  }
+  #scroller {
+    border: 1px solid black;
+    overflow: hidden;
+    width: 300px;
+    height: 200px;
+  }
+  #target {
+    margin-bottom: 800px;
+    margin-top: 700px;
+    margin-left: 10px;
+    margin-right: 10px;
+    width: 100px;
+    height: 200px;
+    z-index: -1;
+    background-color: green;
+    animation: anim auto both linear;
+    animation-timeline: timeline;
+    view-timeline: timeline;
+    animation-range: exit;
+  }
+  #target.bounds-update {
+    height: 100px;
+    /* Keep the scroll range the same. */
+    margin-top:  800px;
+  }
+</style>
+<body>
+  <div id="scroller">
+    <div id="target"></div>
+  </div>
+</body>
+<script type="text/javascript">
+  document.documentElement.addEventListener('TestRendered', async () => {
+    runTest();
+  }, { once: true });
+
+  async function runTest() {
+    await waitForCompositorReady();
+
+    const anim = target.getAnimations()[0];
+
+    // Scroll to exit 50%.
+    scroller.scrollTop = 800;
+    await waitForNextFrame();
+
+    // After the update to the animation range, the positioning is exit 0%
+    target.classList.add('bounds-update');
+    await waitForNextFrame();
+
+    // Make sure change to animation range was properly picked up.
+    document.documentElement.classList.remove("reftest-wait");
+  }
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/scroll-timeline-invalidation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/scroll-timeline-invalidation.html
index f35d878..0b9e10c 100644
--- a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/scroll-timeline-invalidation.html
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/scroll-timeline-invalidation.html
@@ -100,6 +100,8 @@
    'size changes.');
 
 promise_test(async t => {
+  await waitForNextFrame();
+
   const timeline = createScrollTimeline(t);
   const scroller = timeline.source;
   const maxScroll = scroller.scrollHeight - scroller.clientHeight;
@@ -117,12 +119,35 @@
   // Wait for new animation frame  which allows the timeline to compute new
   // current time.
   await waitForNextFrame();
-  assert_times_equal(timeline.currentTime.value, 20,
+
+  // Let s = scroll position
+  //     p = fractional progress
+  //     v = viewport height
+  //     c = scroll height
+  // c[i] = c[i-1] * (1 + p[i-1])
+  // p[i] = s / (c[i-1] - v)
+
+  // c[0] = 1000
+  // p[0] = 0.2 ==> s = 180
+  // c[1] = 1000 * 1.2  = 1200
+  assert_percents_equal(timeline.currentTime, 20,
     'Timeline current time is updated after animation frame.');
+  assert_equals(scroller.scrollHeight, 1200);
   await waitForNextFrame();
-  assert_times_equal(timeline.currentTime.value, 16.3636,
+
+  // Applying the animation effect alters the height of the scroll content and
+  // makes the scroll timeline stale.
+  // https://github.com/w3c/csswg-drafts/issues/8694
+
+  // p[1] = 180 / (1200 - 100) = 0.16363636363
+  // c[2] = 1000 * 1.16363636363 = 1163.6363 => 1164
+  // p[2] = 180 / (1164 - 100) = 0.1692
+  // c[3] = 1169
+
+  assert_percents_equal(timeline.currentTime, 16.92,
     'Timeline current time is updated after two animation frames and ' +
     'reflects single layout run.');
+  assert_approx_equals(scroller.scrollHeight, 1169, 1);
 }, 'If scroll animation resizes its scroll timeline scroller, ' +
-   'layout runs only once to reflect the initial update.');
+   'layout reruns once per frame.');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-a-element.sub.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-a-element.sub.https.html
new file mode 100644
index 0000000..bac5eb7c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-a-element.sub.https.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<meta name="variant" content="?cross-site">
+<meta name="variant" content="?same-site">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script>
+  // In https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigate,
+  // `sourceDocument` (instead of `navigable`'s active document) should be
+  // used as the referring document for prefetch.
+  promise_test(async t => {
+    assert_implements(HTMLScriptElement.supports('speculationrules'), "Speculation Rules not supported");
+
+    const win = await spawnWindow(t, { protocol: 'https' });
+
+    const hostname =
+      location.search === '?cross-site' ? '{{hosts[alt][www]}}' : undefined;
+    const nextUrl = win.getExecutorURL({ protocol: 'https', hostname, page: 2 });
+
+    await win.forceSinglePrefetch(nextUrl);
+
+    // sourceDocument == `win`'s Document == active document of window being
+    // navigated.
+    await win.execute_script((url) => {
+      window.executor.suspend(() => {
+        const a = document.createElement('a');
+        a.setAttribute('href', url);
+        document.body.appendChild(a);
+        a.click();
+      });
+    }, [nextUrl]);
+
+    assert_equals(
+        await win.execute_script(() => location.href),
+        nextUrl.toString(),
+        "expected navigation to reach destination URL");
+
+    assert_prefetched(await win.getRequestHeaders());
+  }, `<a>`);
+
+  promise_test(async t => {
+    assert_implements(HTMLScriptElement.supports('speculationrules'), "Speculation Rules not supported");
+
+    const win = await spawnWindow(t, { protocol: 'https' });
+
+    const hostname =
+      location.search === '?cross-site' ? '{{hosts[alt][www]}}' : undefined;
+    const nextUrl = win.getExecutorURL({ protocol: 'https', hostname, page: 2 });
+
+    await win.forceSinglePrefetch(nextUrl);
+
+    // sourceDocument == `win`'s Document != active document of window being
+    // navigated, since the window being navigated is a new window.
+    await win.execute_script((url) => {
+      window.executor.suspend(() => {
+        const a = document.createElement('a');
+        a.setAttribute('href', url);
+        a.setAttribute('target', '_blank');
+        document.body.appendChild(a);
+        a.click();
+      });
+    }, [nextUrl]);
+
+    // Below, the scripts given to `win.execute_script()` are executed on the
+    // `nextUrl` page in the new window, because `window.executor.suspend()`
+    // above made `win`'s original page stop processing `execute_script()`,
+    // while the new page of `nextUrl` in the new window starts processing
+    // `execute_script()` for the same ID.
+    assert_equals(
+        await win.execute_script(() => location.href),
+        nextUrl.toString(),
+        "expected navigation to reach destination URL");
+
+    assert_prefetched(await win.getRequestHeaders());
+  }, `<a target="blank">`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-iframe-location-href.sub.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-iframe-location-href.sub.https.html
new file mode 100644
index 0000000..9d6702d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-iframe-location-href.sub.https.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<meta name="variant" content="?cross-site">
+<meta name="variant" content="?same-site">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script>
+  // In https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigate,
+  // `sourceDocument` (instead of `navigable`'s active document) should be
+  // used as the referring document for prefetch.
+  promise_test(async t => {
+    assert_implements(HTMLScriptElement.supports('speculationrules'), "Speculation Rules not supported");
+
+    const win = await spawnWindow(t, { protocol: 'https' });
+
+    const hostname =
+      location.search === '?cross-site' ? '{{hosts[alt][www]}}' : undefined;
+    const nextUrl = win.getExecutorURL({ protocol: 'https', hostname, page: 2 });
+
+    await win.forceSinglePrefetch(nextUrl);
+
+    // In https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigate,
+    // `sourceDocument` is the incumbent Document and thus `win`'s Document.
+    // `navigable`'s active document is `iframe`'s Document.
+    await win.execute_script((url) => {
+      window.executor.suspend(() => {
+        const iframe = document.createElement('iframe');
+        document.body.appendChild(iframe);
+        iframe.contentWindow.location.href = url;
+      });
+    }, [nextUrl]);
+
+    // Below, the scripts given to `win.execute_script()` are executed on the
+    // `nextUrl` page in the iframe, because `window.executor.suspend()` above
+    // made `win`'s original page stop processing `execute_script()`,
+    // while the new page of `nextUrl` in the iframe starts processing
+    // `execute_script()` for the same ID.
+    assert_equals(
+        await win.execute_script(() => location.href),
+        nextUrl.toString(),
+        "expected navigation to reach destination URL");
+
+    assert_prefetched(await win.getRequestHeaders());
+  }, `location.href across iframe`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-window-open.sub.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-window-open.sub.https.html
new file mode 100644
index 0000000..f786df0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/initiators-window-open.sub.https.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<meta name="variant" content="?cross-site">
+<meta name="variant" content="?same-site">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script>
+  // In https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigate,
+  // `sourceDocument` (instead of `navigable`'s active document) should be
+  // used as the referring document for prefetch.
+  promise_test(async t => {
+    assert_implements(HTMLScriptElement.supports('speculationrules'), "Speculation Rules not supported");
+
+    const win = await spawnWindow(t, { protocol: 'https' });
+
+    const hostname =
+      location.search === '?cross-site' ? '{{hosts[alt][www]}}' : undefined;
+    const nextUrl = win.getExecutorURL({ protocol: 'https', hostname, page: 2 });
+
+    await win.forceSinglePrefetch(nextUrl);
+
+    await win.execute_script((url) => {
+      window.executor.suspend(() => {
+        window.open(url, "_blank");
+      });
+    }, [nextUrl]);
+
+    // Below, the scripts given to `win.execute_script()` are executed on the
+    // `nextUrl` page in the new window, because `window.executor.suspend()`
+    // above made `win`'s original page stop processing `execute_script()`,
+    // while the new page of `nextUrl` in the new window starts processing
+    // `execute_script()` for the same ID. Same for below.
+    assert_equals(
+        await win.execute_script(() => location.href),
+        nextUrl.toString(),
+        "expected navigation to reach destination URL");
+
+    assert_prefetched(await win.getRequestHeaders());
+  }, `window.open()`);
+
+  promise_test(async t => {
+    assert_implements(HTMLScriptElement.supports('speculationrules'), "Speculation Rules not supported");
+
+    const win = await spawnWindow(t, { protocol: 'https' });
+
+    const hostname =
+      location.search === '?cross-site' ? '{{hosts[alt][www]}}' : undefined;
+    const nextUrl = win.getExecutorURL({ protocol: 'https', hostname, page: 2 });
+
+    await win.forceSinglePrefetch(nextUrl);
+
+    await win.execute_script((url) => {
+      window.executor.suspend(() => {
+        window.open(url, "_blank", "noopener");
+      });
+    }, [nextUrl]);
+
+    assert_equals(
+        await win.execute_script(() => location.href),
+        nextUrl.toString(),
+        "expected navigation to reach destination URL");
+
+    assert_prefetched(await win.getRequestHeaders());
+  }, `window.open(noopener)`);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub.html
index 3f1312e..ec6a7cd9 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub.html
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub.html
@@ -33,6 +33,36 @@
 
   let agent = await spawnWindow(t, { protocol: 'https', pipe: 'header(Cache-Control, no-store)' });
   let previousUrl = await agent.execute_script(() => location.href);
+  await agent.execute_script(async () => {
+    window.preventBfcache = new WebSocket('wss://{{ports[wss][0]}}/echo');
+  });
+
+  let nextUrl = agent.getExecutorURL({ protocol: 'https', page: 2 });
+  await agent.navigate(nextUrl);
+
+  await agent.forceSinglePrefetch(previousUrl);
+  // In https://html.spec.whatwg.org/multipage/nav-history-apis.html#delta-traverse,
+  // `sourceDocument` is `History`'s relevant global object's associated
+  // Document. In this case, it's `iframe.contentDocument`, and thus the
+  // prefetch from `win`'s Document (iframe's parent Document) isn't used.
+  await agent.execute_script(() => {
+    window.executor.suspend(() => {
+      const iframe = document.createElement('iframe');
+      document.body.appendChild(iframe);
+      iframe.contentWindow.history.go(-1);
+    });
+  });
+
+  assert_equals(previousUrl, await agent.execute_script(() => location.href));
+  assert_not_prefetched(await agent.getRequestHeaders(),
+      "prefetch from different Document should not be used");
+}, "History's Document is used for traversal navigations");
+
+promise_test(async t => {
+  assert_implements(HTMLScriptElement.supports('speculationrules'), "Speculation Rules not supported");
+
+  let agent = await spawnWindow(t, { protocol: 'https', pipe: 'header(Cache-Control, no-store)' });
+  let previousUrl = await agent.execute_script(() => location.href);
   await agent.forceSinglePrefetch(previousUrl);
   await agent.execute_script(() => {
     window.executor.suspend(() => location.reload());
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https-expected.txt b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https-expected.txt
new file mode 100644
index 0000000..e0a8051
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Prerender navigation requests should use prefetched results assert_equals: Network request count expected "1" but got "2"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https.html
index 48de5ad..2a1553b 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https.html
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/prefetch.https.html
@@ -15,7 +15,7 @@
       await create_prerendered_page(t, {}, {prefetch: true}, {});
 
   assert_equals(await tryToActivate(), 'activated');
-  assert_equals(await getNetworkRequestCount(), '2', 'Network request count');
-}, "Prerender navigation requests don't use prefetched results (for now)");
+  assert_equals(await getNetworkRequestCount(), '1', 'Network request count');
+}, "Prerender navigation requests should use prefetched results");
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt
new file mode 100644
index 0000000..7032e669
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS close
+PASS close with code and reason
+PASS close with code and long reason
+PASS server initiated closure without code and reason
+PASS server initiated closure with code and reason
+PASS server initiated connection closure
+FAIL opening unidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
+FAIL opening bidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection."
+PASS server initiated closure while opening unidirectional stream before ready
+PASS server initiated closure while opening bidirectional stream before ready
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js
index 642d716a..de67503 100644
--- a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js
@@ -14,7 +14,7 @@
 
   const close_info = await wt.closed;
 
-  assert_equals(close_info.closeCode, 0 , 'code');
+  assert_equals(close_info.closeCode, 0, 'code');
   assert_equals(close_info.reason, '', 'reason');
 
   await wait(10);
@@ -129,3 +129,25 @@
   assert_equals(e.source, 'session', 'source');
   assert_equals(e.streamErrorCode, null, 'streamErrorCode');
 }, 'server initiated connection closure');
+
+promise_test(async t => {
+  const wt = new WebTransport(webtransport_url('echo.py'));
+  const stream = await wt.createUnidirectionalStream();
+  await wt.ready;
+}, 'opening unidirectional stream before ready');
+
+promise_test(async t => {
+  const wt = new WebTransport(webtransport_url('echo.py'));
+  const stream = await wt.createBidirectionalStream();
+  await wt.ready;
+}, 'opening bidirectional stream before ready');
+
+promise_test(async t => {
+  const wt = new WebTransport(webtransport_url('server-close.py'));
+  promise_rejects_dom(t, "InvalidStateError", wt.createUnidirectionalStream());
+}, 'server initiated closure while opening unidirectional stream before ready');
+
+promise_test(async t => {
+  const wt = new WebTransport(webtransport_url('server-close.py'));
+  promise_rejects_dom(t, "InvalidStateError", wt.createBidirectionalStream());
+}, 'server initiated closure while opening bidirectional stream before ready');
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt
new file mode 100644
index 0000000..7032e669
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS close
+PASS close with code and reason
+PASS close with code and long reason
+PASS server initiated closure without code and reason
+PASS server initiated closure with code and reason
+PASS server initiated connection closure
+FAIL opening unidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
+FAIL opening bidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection."
+PASS server initiated closure while opening unidirectional stream before ready
+PASS server initiated closure while opening bidirectional stream before ready
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt
new file mode 100644
index 0000000..7032e669
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS close
+PASS close with code and reason
+PASS close with code and long reason
+PASS server initiated closure without code and reason
+PASS server initiated closure with code and reason
+PASS server initiated connection closure
+FAIL opening unidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
+FAIL opening bidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection."
+PASS server initiated closure while opening unidirectional stream before ready
+PASS server initiated closure while opening bidirectional stream before ready
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt
new file mode 100644
index 0000000..7032e669
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS close
+PASS close with code and reason
+PASS close with code and long reason
+PASS server initiated closure without code and reason
+PASS server initiated closure with code and reason
+PASS server initiated connection closure
+FAIL opening unidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
+FAIL opening bidirectional stream before ready promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection."
+PASS server initiated closure while opening unidirectional stream before ready
+PASS server initiated closure while opening bidirectional stream before ready
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-display-none-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-display-none-expected.png
index 7ef4e11..230a02d 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-display-none-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-display-none-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-expected.png
index 2e1500fd..a66f51f 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-display-none-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-display-none-expected.png
index bbc7734..7e5f423 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-display-none-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-display-none-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-hover-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-hover-expected.png
index 08e6a71..4f2ff677 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-hover-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-thumb-hover-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-display-none-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-display-none-expected.png
index cc2647e..448f3372 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-display-none-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-display-none-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-hover-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-hover-expected.png
index cc024b1..d442a449 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-hover-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-custom-scrollbar-track-hover-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-expected.png
index 8a66b4c..c05329c1 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png
index 4dcdccea..0c1fb17 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-long-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-long-expected.png
index c86c7546..c96c528 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-long-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-long-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-many-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-many-expected.png
index 4808ca87..773df76d 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-many-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-many-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png
index a8144b3..07f9952c 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png
index cb80ecb7..af830ad 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png
index 6a01c42..b8e42b9a 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png
index bb525de..051135c 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-size-changed-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-size-changed-expected.png
index 2dd8a99..ddfc4b8 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-size-changed-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-size-changed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-styled-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-styled-expected.png
index db36248..0660440e 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-styled-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-styled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-tall-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
index ac2acaec..72883eed 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png
index 9c0d6cd..12b8840 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png
index 69933f8..7d9e4b58 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-transform-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-transform-expected.png
index 879028c..6320796 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-transform-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png
index e78027a..68446908a 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png
index cd6c67a..a151580 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png
index 0871af9..8f12887 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-move-after-open-expected.png b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-move-after-open-expected.png
index 54c0c09..838f9e94 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-move-after-open-expected.png
+++ b/third_party/blink/web_tests/fast/forms/select-popup/popup-menu-move-after-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-within-composited-scroller-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-within-composited-scroller-expected.png
index 34f265f..d7ce399 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-within-composited-scroller-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-within-composited-scroller-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/text/selection-no-clip-text-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/paint/text/selection-no-clip-text-expected.png
index 57e611f..1bae4261 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/text/selection-no-clip-text-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/text/selection-no-clip-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/flexbox-selection-nested-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
index f65d2ff..d84d7f2 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/selection-painting-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
index bf46b6b..d9d24d2 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js
index 52ff838c..77c3410 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js
@@ -198,6 +198,12 @@
     return this._browserSession.protocol;
   }
 
+  async attachFullBrowserSession() {
+    const bp = this._browserSession.protocol;
+    const browserSessionId = (await bp.Target.attachToBrowserTarget()).result.sessionId;
+    return new TestRunner.Session(this, browserSessionId);
+  }
+
   async createPage(options) {
     options = options || {};
     const browserProtocol = this._browserSession.protocol;
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-invalid-filter-error-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-invalid-filter-error-expected.txt
new file mode 100644
index 0000000..06782001
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-invalid-filter-error-expected.txt
@@ -0,0 +1,10 @@
+Tests enabling auto-attach on Browser with filter allowing both tab and page results in an error.
+Expected error when auto-attaching with wildcard filter{
+    error : {
+        code : -32602
+        message : Filter should not simultaneously allow "tab" and "page", page targets are attached via tab targets
+    }
+    id : <number>
+    sessionId : <string>
+}
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-invalid-filter-error.js b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-invalid-filter-error.js
new file mode 100644
index 0000000..ef69691
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-invalid-filter-error.js
@@ -0,0 +1,14 @@
+(async function(testRunner) {
+  const pageURL = 'http://127.0.0.1:8000/inspector-protocol/resources/inspector-protocol-page.html';
+  const {session, dp} = await testRunner.startURL(pageURL,
+    'Tests enabling auto-attach on Browser with filter allowing both tab and page results in an error.');
+
+  const bp = (await testRunner.attachFullBrowserSession()).protocol;
+
+  bp.Target.onAttachedToTarget(event => {
+    testRunner.log(event.params, 'FAIL: unexpected attachedToTarget event');
+  });
+  const err = await bp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: true, flatten: true, filter: [{}]});
+  testRunner.log(err, 'Expected error when auto-attaching with wildcard filter');
+  testRunner.completeTest();
+});
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-tab-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-tab-expected.txt
new file mode 100644
index 0000000..d84a6da
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-tab-expected.txt
@@ -0,0 +1,57 @@
+Tests auto-attahcing tab targets from browser targets.
+Attached to target: {
+    sessionId : <string>
+    targetInfo : {
+        attached : true
+        browserContextId : <string>
+        canAccessOpener : false
+        targetId : <string>
+        title : 127.0.0.1:8000/inspector-protocol/resources/inspector-protocol-page.html
+        type : tab
+        url : http://127.0.0.1:8000/inspector-protocol/resources/inspector-protocol-page.html
+    }
+    waitingForDebugger : false
+}
+Response to runIfWaitingForDebugger: {
+    id : <number>
+    result : {
+    }
+    sessionId : <string>
+}
+Creating a new target, expect it paused
+Attached to target: {
+    sessionId : <string>
+    targetInfo : {
+        attached : true
+        browserContextId : <string>
+        canAccessOpener : false
+        targetId : <string>
+        title : 
+        type : tab
+        url : 
+    }
+    waitingForDebugger : true
+}
+Page attached via tab target: {
+    sessionId : <string>
+    targetInfo : {
+        attached : true
+        browserContextId : <string>
+        canAccessOpener : false
+        targetId : <string>
+        title : 
+        type : page
+        url : http://127.0.0.1:8000/inspector-protocol/resources/test-page.html
+    }
+    waitingForDebugger : false
+}
+Resuming target
+Response to runIfWaitingForDebugger: {
+    id : <number>
+    result : {
+    }
+    sessionId : <string>
+}
+Requesting http://127.0.0.1:8000/inspector-protocol/resources/test-page.html
+load event fired
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-tab.js b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-tab.js
new file mode 100644
index 0000000..ee75be57
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/target/browser-auto-attach-tab.js
@@ -0,0 +1,57 @@
+(async function(testRunner) {
+  const pageURL = 'http://127.0.0.1:8000/inspector-protocol/resources/inspector-protocol-page.html';
+  const {session, dp} = await testRunner.startURL(pageURL,
+    'Tests auto-attahcing tab targets from browser targets.');
+
+  const browserSession = await testRunner.attachFullBrowserSession();
+  const bp = browserSession.protocol;
+
+  await bp.Fetch.enable({});
+  bp.Fetch.onRequestPaused(e => {
+    testRunner.log(`Requesting ${e.params.request.url}`);
+    bp.Fetch.continueRequest({requestId: e.params.requestId});
+  });
+  bp.Target.onAttachedToTarget(({params}) => {
+    // Pretend the test page is not there.
+    if (params.targetInfo.url === location.href)
+      return;
+    testRunner.log(params, 'Attached to target: ');
+  });
+  const enableAutoAttachPromise = bp.Target.setAutoAttach({
+      autoAttach: true,
+      waitForDebuggerOnStart: true,
+      flatten: true,
+      filter: [{'type': 'tab'}]
+  });
+
+  {
+    // Assure issuing runIfWaitingForDebugger to a non-paused target is not
+    // an error, for compatibility with other targets.
+    const {params} = await bp.Target.onceAttachedToTarget();
+    const tp = browserSession.createChild(params.sessionId).protocol;
+    const response = await tp.Runtime.runIfWaitingForDebugger();
+    testRunner.log(response, 'Response to runIfWaitingForDebugger: ');
+  }
+
+  await enableAutoAttachPromise;
+  const newUrl = testRunner.url('../resources/test-page.html');
+  testRunner.log('Creating a new target, expect it paused');
+  const createTargetPromise = bp.Target.createTarget({url: newUrl});
+  const tabTarget = (await bp.Target.onceAttachedToTarget()).params;
+  await createTargetPromise;
+
+  const tabSession = browserSession.createChild(tabTarget.sessionId);
+  const tp = tabSession.protocol;
+  tp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: true, flatten: true});
+  const pageTarget = (await tp.Target.onceAttachedToTarget()).params;
+  testRunner.log(pageTarget, 'Page attached via tab target: ');
+  const pageSession = browserSession.createChild(pageTarget.sessionId);
+  pageSession.protocol.Page.enable();
+
+  testRunner.log('Resuming target');
+  const response = await tp.Runtime.runIfWaitingForDebugger();
+  testRunner.log(response, 'Response to runIfWaitingForDebugger: ');
+  await pageSession.protocol.Page.onceLoadEventFired();
+  testRunner.log('load event fired');
+  testRunner.completeTest();
+});
diff --git a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html
index 3e39d5f..9796730 100644
--- a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html
+++ b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html
@@ -16,6 +16,7 @@
     unicode-bidi: bidi-override;
     width: 2em;
 }
+body { background-color: lightgreen; }
 </style>
 <div id="container">
     xx y
diff --git a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html
index 1ce4218..8b62fc3c 100644
--- a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html
+++ b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html
@@ -15,6 +15,7 @@
     height: 2em;
     -webkit-writing-mode: vertical-lr;
 }
+body { background-color: lightgreen; }
 </style>
 <div id="container">
     xx y
diff --git a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html
index 899ee42a..4110e06 100644
--- a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html
+++ b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html
@@ -15,6 +15,7 @@
     height: 2em;
     -webkit-writing-mode: vertical-rl;
 }
+body { background-color: lightgreen; }
 </style>
 <div id="container">
     xx y
diff --git a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline.html b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline.html
index df16a6a..679f65e7 100644
--- a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline.html
+++ b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-includes-newline.html
@@ -14,6 +14,7 @@
     font-family: Ahem;
     width: 2em;
 }
+body { background-color: lightgreen; }
 </style>
 <div id="container">
     xx y
diff --git a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html
index 11593f3..99b8705 100644
--- a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html
+++ b/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html
@@ -15,6 +15,7 @@
 div {
     font-family: Ahem;
 }
+body { background-color: lightgreen; }
 </style>
 <div id="container">
     a<br>b
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end.html
index b5743c6..3d53d20 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end.html
@@ -5,9 +5,8 @@
 <script src="../../resources/run-after-layout-and-paint.js"></script>
 <script src="resources/selection.js"></script>
 <style>
-div {
-    font-family: Ahem;
-}
+div { font-family: Ahem; }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRangeAfterLayoutAndPaint(container, 0, container2, 0);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks.html
index 1d390c5e..7d902a05 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks.html
@@ -5,9 +5,8 @@
 <script src="../../resources/run-after-layout-and-paint.js"></script>
 <script src="resources/selection.js"></script>
 <style>
-div {
-    font-family: Ahem;
-}
+div { font-family: Ahem; }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRangeAfterLayoutAndPaint(container, 0, container2, 1);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-br.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-br.html
index c20ad73..55e5439b 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-br.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-br.html
@@ -2,6 +2,9 @@
 <script src="../../resources/ahem.js"></script>
 <script src="../../resources/run-after-layout-and-paint.js"></script>
 <script src="resources/selection.js"></script>
+<style>
+  body { background-color: lightgreen; }
+</style>
 <!-- Two lines in one block explicitly wrapped with a br which should
      include space representing a newline at end of the first line. -->
 <div id="container" style="font-family: Ahem;">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-rtl.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-rtl.html
index dffb821b..c871fbd 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-rtl.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-rtl.html
@@ -11,6 +11,7 @@
     unicode-bidi: bidi-override;
     width: 2em;
 }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRange(container, 0, container, 1);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-span-across-line.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-span-across-line.html
index 9777226..28cc459 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-span-across-line.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-span-across-line.html
@@ -9,6 +9,7 @@
     font-family: Ahem;
     width: 4em;
 }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRangeAfterLayoutAndPaint(container, 0, container, 3);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-span.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-span.html
index f0b9296..4bb1968 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-span.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-span.html
@@ -9,6 +9,7 @@
     font-family: Ahem;
     width: 5em;
 }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRangeAfterLayoutAndPaint(container, 0, container, 3);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-lr.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-lr.html
index 1325231..97ee8873 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-lr.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-lr.html
@@ -10,6 +10,7 @@
     height: 2em;
     -webkit-writing-mode: vertical-lr;
 }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRange(container, 0, container, 1);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-rl.html b/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-rl.html
index bad3618..2e53d22d 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-rl.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline-vertical-rl.html
@@ -10,6 +10,7 @@
     height: 2em;
     -webkit-writing-mode: vertical-rl;
 }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRange(container, 0, container, 1);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline.html b/third_party/blink/web_tests/paint/selection/text-selection-newline.html
index 200a49e..80b29a1 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-newline.html
@@ -9,6 +9,7 @@
     font-family: Ahem;
     width: 2em;
 }
+body { background-color: lightgreen; }
 </style>
 </head>
 <body onload="selectRange(container, 0, container, 1);">
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-update-style.html b/third_party/blink/web_tests/paint/selection/text-selection-update-style.html
index c5a77393..f5745ae8 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-update-style.html
+++ b/third_party/blink/web_tests/paint/selection/text-selection-update-style.html
@@ -4,6 +4,7 @@
 <!-- Updating display property should let selection show the element. -->
 <style>
   div { font-family: Ahem}
+  body { background-color: lightgreen; }
 </style>
 <div id="r1">foo</div>
 <div id="r2" style="display: none">bar</div>
diff --git a/third_party/blink/web_tests/platform/linux/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png b/third_party/blink/web_tests/platform/linux/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png
index c212017..84b05c92 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/squashing/selection-repaint-with-gaps-expected.png b/third_party/blink/web_tests/platform/linux/compositing/squashing/selection-repaint-with-gaps-expected.png
index 57fd2a19..3c3b30b 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/squashing/selection-repaint-with-gaps-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/squashing/selection-repaint-with-gaps-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.png b/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.png
index 7ed11b7..3d948fe 100644
--- a/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.png
index 6eb90574a..273a0a21 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/5099303-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/5099303-expected.png
index fbaf8c1..4f16486 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/5099303-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/5099303-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.png
index e5a6602d..325d4c4a 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/5232159-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/5232159-expected.png
index 111bfd6..b02c471 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/5232159-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/5232159-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.png
index b8fd400..02222a8 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
index acef5e52..e2b24bd 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
index 6844602..69939d4 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
index 69892b16..4382042 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
index b721fcfe..9c36eaa0 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/inline-closest-leaf-child-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/inline-closest-leaf-child-expected.png
index 0f54bc2c2..641cf96 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/inline-closest-leaf-child-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/inline-closest-leaf-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/japanese-lr-selection-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/japanese-lr-selection-expected.png
index ff353d5..fdcc78d 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/japanese-lr-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/japanese-lr-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/japanese-rl-selection-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/japanese-rl-selection-expected.png
index 0fc52e4c..5e882a71 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/japanese-rl-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/japanese-rl-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.png
index f21dc95..c31cdb4 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.png
index 7d962658..48b2c81 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/range-between-block-and-inline-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/range-between-block-and-inline-expected.png
index c0fc71a..1984938 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/range-between-block-and-inline-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/range-between-block-and-inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.png
index fb3dec7..0fb1f42 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-expected.png
index 4c7273bb..bbc2f5a 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
index ae95706..90abdfb2 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
index 29cb96c5..cce5bf27 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
index 7abaa6c..0d73f631 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
index 1ef35f5..2e22aab 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/selection-button-text-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/selection-button-text-expected.png
index 7e23b37..0b03457 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/selection-button-text-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/selection-button-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/selection-color-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/selection-color-expected.png
index bcb6a976..9831064 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/selection-color-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/selection-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/transformed-selection-rects-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/transformed-selection-rects-expected.png
index bce7195..19d96a54 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/transformed-selection-rects-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/transformed-selection-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/vertical-lr-replaced-selection-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/vertical-lr-replaced-selection-expected.png
index 3cd3f600..ad07104 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/vertical-lr-replaced-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/vertical-lr-replaced-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/vertical-rl-replaced-selection-expected.png b/third_party/blink/web_tests/platform/linux/editing/selection/vertical-rl-replaced-selection-expected.png
index 3a10e0cd..e02b5c8 100644
--- a/third_party/blink/web_tests/platform/linux/editing/selection/vertical-rl-replaced-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/editing/selection/vertical-rl-replaced-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/dom/52776-expected.png b/third_party/blink/web_tests/platform/linux/fast/dom/52776-expected.png
index 03dc3600..ee22306 100644
--- a/third_party/blink/web_tests/platform/linux/fast/dom/52776-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/dom/52776-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/dynamic/selection-highlight-adjust-expected.png b/third_party/blink/web_tests/platform/linux/fast/dynamic/selection-highlight-adjust-expected.png
index dc0692a..ea4ba86 100644
--- a/third_party/blink/web_tests/platform/linux/fast/dynamic/selection-highlight-adjust-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/dynamic/selection-highlight-adjust-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/platform/linux/fast/events/updateLayoutForHitTest-expected.png
index 99ccc0c..148e5d5 100644
--- a/third_party/blink/web_tests/platform/linux/fast/events/updateLayoutForHitTest-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/events/updateLayoutForHitTest-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png
index cf07dbf..0f77283 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png
index 8bfa0fd..22ce7c0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/text-selection-outside-control-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/text-selection-outside-control-expected.png
index 7678cdb..0da7ed3d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/text-selection-outside-control-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/text-selection-outside-control-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png
index f59f4eb..121cd5f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png
index fef800c7..8fafd3b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-fractional-width-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png
index 3803764..fefa8a31 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png
index bf4e7743..94df1135 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png
index 518905bd..9c7137e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-minimum-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png
index cdeab25..d38672b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-default-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png
index 0e73d0b..7632b30 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png
index 6ba6edc2c..6680737 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png
index ed506e88..50e41e7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-tall-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
index 1b41db3..77d37bf6 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png
index 4933ef5..6bb90ee7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-text-align-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png
index f689f5f..6589070e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png
index ced896a..f800d9f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png
index e0b21fde..614f7685 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png
index b29e903b..d691df4 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom110-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png
index 9281a96..1a90af9 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-different-font-indentation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-move-after-open-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-move-after-open-expected.png
index e9f2970..074287e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-move-after-open-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select-popup/popup-menu-move-after-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select/listbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select/listbox-appearance-basic-expected.png
index 7636fff..7e0bab0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select/listbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select/listbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png
index 624e22a..db86fab 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png
index c7d9cc9..c0824b33 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select/select-listbox-multiple-no-focusring-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/select/select-listbox-multiple-no-focusring-expected.png
index d6ef883..e0892375 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/select/select-listbox-multiple-no-focusring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/select/select-listbox-multiple-no-focusring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/tabbing-input-iframe-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/tabbing-input-iframe-expected.png
index 8cb5f664..e1b96ea 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/tabbing-input-iframe-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/tabbing-input-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-appearance-selection-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-appearance-selection-expected.png
index 490e13f9..a9646f7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-appearance-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-appearance-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-double-click-selection-gap-bug-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-double-click-selection-gap-bug-expected.png
index 4f0d6df..1204140 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-double-click-selection-gap-bug-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-double-click-selection-gap-bug-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-readonly-autoscroll-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-readonly-autoscroll-expected.png
index 725ddc8d..5d22123 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-readonly-autoscroll-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-readonly-autoscroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-text-double-click-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-text-double-click-expected.png
index ce06501..802071f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/text/input-text-double-click-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/text/input-text-double-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/lists/markers-in-selection-expected.png b/third_party/blink/web_tests/platform/linux/fast/lists/markers-in-selection-expected.png
index 155c585..4e85b931 100644
--- a/third_party/blink/web_tests/platform/linux/fast/lists/markers-in-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/lists/markers-in-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/overflow/image-selection-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/overflow/image-selection-highlight-expected.png
index 6dc38e2c..99cd3163 100644
--- a/third_party/blink/web_tests/platform/linux/fast/overflow/image-selection-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/overflow/image-selection-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/reflections/inline-crash-expected.png b/third_party/blink/web_tests/platform/linux/fast/reflections/inline-crash-expected.png
index 8fbeba7..5b7a46b6 100644
--- a/third_party/blink/web_tests/platform/linux/fast/reflections/inline-crash-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/reflections/inline-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/spatial-navigation/snav-multiple-select-focusring-expected.png b/third_party/blink/web_tests/platform/linux/fast/spatial-navigation/snav-multiple-select-focusring-expected.png
index 6db79cc..5b2516ce 100644
--- a/third_party/blink/web_tests/platform/linux/fast/spatial-navigation/snav-multiple-select-focusring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/spatial-navigation/snav-multiple-select-focusring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt b/third_party/blink/web_tests/platform/linux/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt
index 67a5b366..70655fe 100644
--- a/third_party/blink/web_tests/platform/linux/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt
@@ -1,6 +1,6 @@
 [crbug/1311561] Tests that auto dark mode emulation from DevTools correctly emulates dark mode for select element
 === Before auto dark mode (autoDarkMode and prefers-color-scheme override) is not enabled ===
-data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAH19JREFUeJzt3X+QlfV96PHP7p6FVRYxZMPPZRcuNsSK4yXV5pbwQxNJII5Gy9oqVkXE8cLcQNW6ZNcQnUiLm8vVEKNINDgMHQxtpGJrNaCVmMnV3glpvTOpPwbvxrtN3ADTZIVEguye+4fJOtwFhGeXj46+Xv9kzvk+z/P57vnLd57zcCrK5XI5AAAAElS+2xsAAAA+OAQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaUrHctCyZctO9D7ed9ra2t7tLQAAwHvOOwbIsmXL/Md0AT43AADoy1ewAACANAIEAABII0AAAIA0/QqQ7373uzFz5syora2NYcOGxfTp0+PRRx895JhTTz01Bg0aFDU1NVFTUxNjxoyJ6667Lrq6uiIi4vOf/3yUSqUolUpRWVkZlZWVva+vvvrqiIg4++yz47777is0+1Of+lSffU+bNi2+853v9L7+3ve+F8OGDYtvfOMb/fk4AACAd1A4QDZt2hRNTU1xzTXXRGdnZ/z85z+PJUuWxPz582Pt2rWHHPvoo4/G/v37Y//+/fHcc8/Fiy++GH/+538eERFbtmyJgwcPxsGDB2PevHmxePHi3tfr16/v9+xXXnkl/v7v//6If8cjjzwSK1asiI997GNFPwoAAOAYFQqQAwcOxNKlS+P222+P+fPnR21tbdTU1MSll14aq1evjptuuin27dt32HMbGhri5ptvjn/8x38stOHjnf3lL385mpub4+DBg4e93o9//OPYsmVLDB069Khz77zzzujs7OzzfmdnZ3zta18r9LcAAMAHTaEA+ed//ufYtWtXXHfddX3W5s2bF6VSKbZt23bE87u7u2PQoEFFRh/37HPPPTfGjx8f999//2Gvd8stt8TJJ5981Jlr1qyJm266KaZPnx6vvfZa7/uvvfZaTJ8+PW644YYjXh8AAHhboQB59dVXY9SoUTFkyJA+a1VVVTFhwoR49dVX+6yVy+V45ZVXoq2tLZqamoqMPu7Z5XI5vvrVr8btt98ee/fuLTTzkksuifHjx8fOnTtjxowZ0dnZGZ2dnTFjxozYuXNnnHbaaXHhhRcWujYAAHyQFAqQ6urq6O7uPuJ6T09PVFa+felLLrkkamtr45RTTonPfvazMWPGjPirv/qrIqOPe3ZExJlnnhmf+9znYuXKlYVmjho1Kr7//e/HxIkTY+fOnTF16tSYOnVq7Ny5MyZOnBjPPPNMjBo1qtC1AQDgg+Qdfwn9cCZMmBC7du2KX/7yl3Hqqacestbd3R0/+clP4rTTTut97+/+7u9i9uzZ/dtpwdm/85WvfCXOOuusWLRoUVRUVBz33Pr6+nj66adj5syZ0d7eHhEREydOjO3bt8fo0aOL/TEAAPABU+gOyNlnnx319fVxzz339Fl76KGHorq6Oj796U/3e3MDOXvMmDGxaNGiuOWWW6K6urrQ7HHjxsUzzzwT9fX1MX78+Ni+fXvU19cXuhYAAHwQFboDUllZGffee29cfvnlMWLEiLj88sujVCrFY489FjfccEPcfffdMXjw4IHea79nNzc3x0c/+tHCD8BHvHUn5JlnnolSqSQ+AADgOBX+HZALL7wwHnvssfibv/mbGDduXIwcOTK+/vWvx4YNG+Lyyy8fyD0O2Oza2tq49dZbex9S7+7u7v2BxKeffjpuuOGGqKmpiS984QtHnT9hwoQYN27cgP5NAADwQVBRLpfLRztg2bJl0dbWlrWf9w2fGwAA9FX4DggAAMDxEiAAAEAaAQIAAKR5x2dAIt56noHj4/kPAADo6x3vgIiPYnxuAADQ1zH9DsiGrj870ft437ly2F+/21sAAID3HM+AAAAAaQQIAACQ5pi+gnUkv+n4Qez7lwfizd3/FlFZFaXhH43as+ZHzfhze4/pfPCTUT74RkTFW61TOXhYDG6YHqf8l5uicvDQ+I8nlsRv/u/33zq43PPW//722JN+73Nx6nl/GXsevixOOv2PY8jv/8lxz66uOz0+fOEDh+x7z5arY8iZfxYn/adZb13rZz+MX3x3SQw95wsxZPKJ/RV3AAD4ICscIG/sfCK6nrktTvlkS3xozj1RUVEV+1/9Xvxy+5di6B8ujSG/f2nvsR+a/fWoGTctIiK6974Wv/inlnj92a/GqefeHsNnf733uF/8U0tUDhoaw6a1Dtjs7tc7Yv+r26Om8dzDXmt/+z/Fr3787SidOqHoRwEAAByjQl/BKne/Ga//z7YYevZ/i5MnfT4qq0+OitLgOGniZ+KUqcti77OroufNXx/23Kqho6P2rPlv3/U4wbNr/+D62PvcXVHuOXjY6735i1di+GdXR0X1yYX2AwAAHLtCAfLmrv8dPW/8R5x0+h/3WTvptM9FVJbiwL8/e+QLlLsjKquLjD7u2YNGnxNVQ8fEr194+LDXG/rx66Ki+qRCewEAAI5PoQDp3vtaVJ5cF5WHuWtQUVkVVUPHRvfe1/qslcvlONjVEfv+dV3v8xcnfnY5hn7ixtj3o29Gz4FfFZoJAAAMjGLPgFSW3rqLcSTlnoiKit6Xv/juDVFRURlRURGVJ304aiZ8OoaevbjQ6OOdHRFR/eHfi8EN02Pfv34rTvnDJcXmAgAA/VYoQKpOGRs9b/xH9Pzm9agcfMoha+We7uje97OoGtbQ+96HPntX70Po/XW8s39n6NmLY893Lv3tv6RV0WcdAAA48Qp9Bav6I2dE5ZCR8asfb+qztn/n4xGVpRg89hP93txAzq4aMiJO/v0/ib3/6+6oqOzXvz4MAAAUVChAKioqY9j0W+JX//JA/PqFh6PnzV9H+eBv4o3/sy1ef/a/x7BPfjEqqgYN9F77PXvIf74mfvPT56L79X8/IXsDAACOrvCtgJrGc+NDc+6JfT/6Zrz+3J0RUY7qD0+KYZ/6ywH7utVAz66sPjlq/+C/xuvfvz0i3vrKVue6394t6TkYB17bEa8/9z/i5I/NjWHTWk7o3wAAAB9EFeVyuXy0A5YtWxYbuv4saz/vG1cO++toa2t7t7cBAADvKYW+ggUAAFCEAAEAANIIEAAAIM0xPYT+b3eMO9H7eN9ZufLd3gEAALz3uAMCAACkESAAAECafgXIU089FRdccEHU19dHY2NjzJkzJx5//PFDjmlsbIwRI0bEqFGjYtSoUXH66afH0qVLo6urKyIi5s2bF3V1dVFXVxfDhw+P4cOH975etGhRREScd955sW7dukKzL7rooj77njNnTmzZsiUiIp599tk4//zzY/z48fHxj388Hnroof58JAAAwFEUDpDNmzfH/Pnz44orrogXX3wxXnrppbj++utj8eLF8eCDDx5y7MaNG6OzszM6Oztj69at8fLLL0dra2vv2p49e2LPnj3R1NQU1157be/rNWvW9Ht2e3t7PPHEE4e9TldXV1x22WWxcOHCaG9vjzVr1sSNN94YL7zwQtGPBQAAOIpCAXLgwIFoaWmJ1tbWmDdvXtTW1kZNTU1cfPHFcccdd8Ty5ctj3759hz133LhxsWTJkti2bVuhDR/v7Obm5rj11lvj4MGDh73W7bffHpdddllUVFTEJz7xiZg8eXLs2LGj0N4AAICjKxQgO3bsiN27d8dVV13VZ62pqSmqqqpi+/btRzy/u7s7Bg0aVGT0cc+eNm1aNDQ0xPr16/sc/5GPfOSQ65TL5ejo6Ij6+vpCewMAAI6uUIB0dHTEyJEjY8iQIX3WqqqqorGxMTo6OvqslcvlaG9vj9WrVx/22YwTMbtcLsdtt90Wq1atir179x712nfffXeMHj06ZsyYUWhvAADA0RUKkFKpFN3d3Udc7+npicrKty995ZVXRn19fTQ0NMTcuXNj6tSpsXz58iKjj3t2RMQZZ5wRs2bNirvuuuuI561bty7Wrl0b69at63M+AAAwMI7phwj/f42NjbF79+7o6uqKYcOGHbLW3d0dHR0dMWHChN73NmzYEOeff37/dlpw9u+0tLTE9OnTY8GCBX3W7rnnnrj//vvjsccei/Hjxw/IPgEAgL4K/V/9U6ZMibFjx8YDDzzQZ+3hhx+OUqkUM2fO7PfmBnL26NGjY8GCBbFixYqorq7ufX/z5s3xzW9+M/7hH/5BfAAAwAlW6A5IZWVlrFq1KhYuXBh1dXUxd+7cKJVKsXXr1mhtbY22trYYPHjwQO+137OXLFkS55xzTm+A7N27N1paWmL9+vUePAcAgASFH3aYPXt2bNq0KR555JGYPHlyTJo0KdauXRv33XdfNDU1DeQeB2x2bW1tNDc39z6k/tRTT8WuXbvi4osv7v2hxFGjRvX+RgkAADCwKsrlcvloByxbtixaWlqy9vO+sXLlymhra3u3twEAAO8p/rknAAAgjQABAADSCBAAACCNAAEAANIIEAAAII0AAQAA0vQrQJ566qm44IILor6+PhobG2POnDnx+OOPH3JMY2NjjBgxovc3Nk4//fRYunRpdHV1RUTEvHnzoq6uLurq6mL48OExfPjw3teLFi2KiIjzzjsv1q1bV2j2RRdd1Gffc+bMiS1btkRExJNPPhkzZsyI8ePHx5QpU+Jb3/pWfz4SAADgKAoHyObNm2P+/PlxxRVXxIsvvhgvvfRSXH/99bF48eJ48MEHDzl248aN0dnZGZ2dnbF169Z4+eWXe3/sb+PGjbFnz57Ys2dPNDU1xbXXXtv7es2aNf2e3d7eHk888cRhr/PTn/40rr766vjSl74UP/nJT2LdunWxfPny+NGPflT0YwEAAI6iUIAcOHAgWlpaorW1NebNmxe1tbVRU1MTF198cdxxxx2xfPny2Ldv32HPHTduXCxZsiS2bdtWaMPHO7u5uTluvfXWOHjwYJ9rVVRUxDe+8Y34zGc+ExERU6ZMiYkTJ8bOnTsL7Q0AADi6QgGyY8eO2L17d1x11VV91pqamqKqqiq2b99+xPO7u7tj0KBBRUYf9+xp06ZFQ0NDrF+/vs/xY8aMiUsuuSQiIvbv3x9btmyJXbt2xfTp0wvtDQAAOLpCAdLR0REjR46MIUOG9FmrqqqKxsbG6Ojo6LNWLpejvb09Vq9efdhnM07E7HK5HLfddlusWrUq9u7de9hr/u3f/m2MGTMm/uIv/iLWrFkTo0ePLrQ3AADg6AoFSKlUiu7u7iOu9/T0RGXl25e+8soro76+PhoaGmLu3LkxderUWL58eZHRxz07IuKMM86IWbNmxV133XXYcy699NLo7OyMe++9NxYuXBg//OEPC+0NAAA4ulKRkxobG2P37t3R1dUVw4YNO2Stu7s7Ojo6YsKECb3vbdiwIc4///z+7bTg7N9paWmJ6dOnx4IFCw573UGDBsWsWbPiwgsvjIceeijOPvvsAdkvAADwtkJ3QKZMmRJjx46NBx54oM/aww8/HKVSKWbOnNnvzQ3k7NGjR8eCBQtixYoVUV1dHRERzz//fGzcuPGQ43p6eqJUKtRlAADAOyj0X9qVlZWxatWqWLhwYdTV1cXcuXOjVCrF1q1bo7W1Ndra2mLw4MEDvdd+z16yZEmcc845vQESEXHzzTfH2LFjY8aMGfH888/Ho48+6rdAAADgBCn8OyCzZ8+OTZs2xSOPPBKTJ0+OSZMmxdq1a+O+++6LpqamgdzjgM2ura2N5ubm3ofUzzrrrFi9enV88YtfjIaGhrjmmmti+fLlA/Z1MQAA4FAV5XK5fLQDli1bFi0tLVn7ed9YuXJltLW1vdvbAACA95TCd0AAAACOlwABAADSCBAAACCNAAEAANIIEAAAII0AAQAA0vQrQJ566qm44IILor6+PhobG2POnDnx+OOPH3JMY2NjjBgxIkaNGhWjRo2K008/PZYuXRpdXV0RETFv3ryoq6uLurq6GD58eAwfPrz39aJFiyIi4rzzzot169YVmn3RRRf12fecOXNiy5Yth7z3xhtvxFlnnRU33nhjfz4SAADgKAoHyObNm2P+/PlxxRVXxIsvvhgvvfRSXH/99bF48eJ48MEHDzl248aN0dnZGZ2dnbF169Z4+eWXo7W1tXdtz549sWfPnmhqaoprr7229/WaNWv6Pbu9vT2eeOKJd/x7vva1r0VPT0/BTwMAADgWhQLkwIED0dLSEq2trTFv3ryora2NmpqauPjii+OOO+6I5cuXx759+w577rhx42LJkiWxbdu2Qhs+3tnNzc1x6623xsGDB494zVdffTU2b94cf/qnf1poTwAAwLEpFCA7duyI3bt3x1VXXdVnrampKaqqqmL79u1HPL+7uzsGDRpUZPRxz542bVo0NDTE+vXrj3jNlpaWaG5ujpqamkJ7AgAAjk2hAOno6IiRI0fGkCFD+qxVVVVFY2NjdHR09Fkrl8vR3t4eq1evPuyzGSdidrlcjttuuy1WrVoVe/fu7XPOk08+GT//+c+jqamp0H4AAIBjVyhASqVSdHd3H3G9p6cnKivfvvSVV14Z9fX10dDQEHPnzo2pU6fG8uXLi4w+7tkREWeccUbMmjUr7rrrrkPe/93XuVasWBEVFRWF9gMAABy7UpGTGhsbY/fu3dHV1RXDhg07ZK27uzs6OjpiwoQJve9t2LAhzj///P7ttODs32lpaYnp06fHggULet+7995748wzz4w/+qM/GpC9AQAAR1foDsiUKVNi7Nix8cADD/RZe/jhh6NUKsXMmTP7vbmBnD169OhYsGBBrFixIqqrqyMi4oUXXogf/OAHMWnSpJg0aVKsXr06vv3tb8ecOXNOyN4BAOCDrtAdkMrKyli1alUsXLgw6urqYu7cuVEqlWLr1q3R2toabW1tMXjw4IHea79nL1myJM4555zeAFm7du0h66tWrYqf/exnceedd56QvQMAwAdd4d8BmT17dmzatCkeeeSRmDx5ckyaNCnWrl0b99133wl/oLvo7Nra2mhubj7sA/IAAMCJV1Eul8tHO2DZsmXR0tKStZ/3jZUrV0ZbW9u7vQ0AAHhPKXwHBAAA4HgJEAAAII0AAQAA0hzTv4K1cuXKE70PAADgA+AdH0IHAAAYKL6CBQAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACk+X+KoU8tBe36DwAAAABJRU5ErkJggg==
+data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAH11JREFUeJzt3X90lfWd4PFPwgXSEsVlUwgQEji4ZVxxPHT1zJbDjzqFFurR6hC3Fasi0uPibKG2Y2iwqW7lFNNhVOoPYHRwWTpYOpWCrdUBOaV2up2ZM3aPM9spenCjzVQj0GlTmJHSJHf/6BqXDSB5Ej569PX6797v8zyfb+5fvr334akol8vlAAAASFD5Zm8AAAB45xAgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApCmdykErVqw43ft422ltbX2ztwAAAG85bxggK1as8B/TBfjcAACgLz/BAgAA0ggQAAAgjQABAADSDChA/vIv/zJmz54d1dXVMXLkyJg5c2Y8+uijxxxz1llnxbBhw6Kqqiqqqqpi3Lhx8clPfjI6OzsjIuKjH/1olEqlKJVKUVlZGZWVlb2vr7322oiIuOCCC2L9+vWFZv/+7/9+n33PmDEjvvGNb/S+/t73vhcjR46Me++9dyAfBwAA8AYKB8jWrVujsbExrrvuuujo6IhXXnklli1bFosWLYoNGzYcc+yjjz4aR44ciSNHjsRf//Vfx969e+PTn/50RETs2LEjurq6oqurKxYuXBg33nhj7+tNmzYNePbzzz8f3/rWt074d2zfvj1WrVoVv/M7v1P0owAAAE5RoQA5evRoLF++PG6//fZYtGhRVFdXR1VVVVxxxRWxdu3a+OxnPxuHDx8+7rn19fVx8803x3e+851CG+7v7C984QvR1NQUXV1dx73ej3/849ixY0ecccYZJ5175513RkdHR5/3Ozo64u677y70twAAwDtNoQD5m7/5m9i/f3988pOf7LO2cOHCKJVKsWvXrhOe393dHcOGDSsyut+zP/CBD8TEiRPjgQceOO71brnllnj3u9990pnr1q2Lz372szFz5sx4+eWXe99/+eWXY+bMmXHTTTed8PoAAMDrCgXIiy++GLW1tTFixIg+a0OGDIlJkybFiy++2GetXC7H888/H62trdHY2FhkdL9nl8vl+PKXvxy33357HDp0qNDMyy+/PCZOnBj79u2LWbNmRUdHR3R0dMSsWbNi3759cfbZZ8cll1xS6NoAAPBOUihAhg4dGt3d3Sdc7+npicrK1y99+eWXR3V1dZx55pnx4Q9/OGbNmhVf+tKXiozu9+yIiPPOOy8+8pGPxOrVqwvNrK2tje9///sxefLk2LdvX0yfPj2mT58e+/bti8mTJ8dTTz0VtbW1ha4NAADvJG/4JPTjmTRpUuzfvz9++ctfxllnnXXMWnd3d7zwwgtx9tln9773zW9+M+bNmzewnRac/ZovfvGLcf7558fSpUujoqKi33Pr6uriu9/9bsyePTva2toiImLy5MmxZ8+eGDt2bLE/BgAA3mEKfQNywQUXRF1dXdx333191h5++OEYOnRofPCDHxzw5gZz9rhx42Lp0qVxyy23xNChQwvNnjBhQjz11FNRV1cXEydOjD179kRdXV2hawEAwDtRoW9AKisr4/77748rr7wyRo8eHVdeeWWUSqV47LHH4qabbop77rknhg8fPth7HfDspqameO9731v4BviI334T8tRTT0WpVBIfAADQT4WfA3LJJZfEY489Fl//+tdjwoQJMWbMmPjKV74SmzdvjiuvvHIw9zhos6urq+PWW2/tvUm9u7u79wGJ3/3ud+Omm26Kqqqq+NSnPnXS+ZMmTYoJEyYM6t8EAADvBBXlcrl8sgNWrFgRra2tWft52/C5AQBAX4W/AQEAAOgvAQIAAKQRIAAAQJo3vAck4rf3M9A/7v8AAIC+3vAbEPFRjM8NAAD6OqXngGzu/MTp3sfbztUjv/pmbwEAAN5y3AMCAACkESAAAECaU/oJ1ol84N9Xx7L5o+N3698V3eWIf/ynI7Fu54HY+fe/6j1m713nxruGVUTP/73V/Zf/0h1P/sOv4ovfeDkOHemJh5Y2xJzzzoyIiMqK3x7z2rHb/vYXsfy//VM80Xx2/PkP/jk2P/XP/Z79Dz99Na64638fs+/tN0+OB3YfjMd+1BkREf/x342ITX84Me7Y3hEP7fn5QD4SAADgJAoHyKX/YWT8yTV1ccvXXopP3PtCdHeXY+7vnhl3L6qLL32zI776/ddj4dr7X4g9Pz4cERHj/83QuPf6+vjix8bFTZv+Ka5b92LvcfcsnhC/+tfuuOVrLw3a7InvGRZzf/eM2PX3h457rXnnnxmLPvBvY1/Hr4t+FAAAwCkq9BOsoUMq4vaPjYsv73glvv7DX8S//ronft1Vjm//qDNatr4UtzWOjXcPP/6lf/aL38S6nQfig1PPKLTh/s6+87FXouUPxsaQE/yl7x1XFdfd/0IcPtJdaD8AAMCpKxQg75v0rqg5oxRf/au+P1f65t/+Mrp6ImafU33C84dURhztesPHjwzK7P/x7L9E+8+PxlUzRh33el95fH+8+ptiewEAAPqnUIDUjRoW+3/VFa8e7fsf7j3liJ8ePBp1o4Yd99yGmmHxhx9+T+/9F6d7dkVFxO2PdMRNF4+JESf4VgYAAMhR6B6Q33SXT/iTpojf3kze8/88YH3jf54YPT3lKEfEgV91xXf+Z2es+dYrRUb3e3ZExN6XjsTu/3UoPjV/dNyxvaPQXAAAYOAKBchPf340as4oxZnvqoxfvdpzzFplRcSEmmHRduBo73uL179+E/pA9Xf2a/740Y7Y3fLe+O/f+3mU/eIKAADeFIV+k/TMi6/GS7/4TSz6QE2ftcsvPCt+012Ov9o7OMExWLNf6eyKTd/7eXzuo7XR1a1AAADgzVAoQMrliOaHfxbL5r0nrpoxKt49vDKGlyriI9POjP/6n8bF57/2s8I3mZ/O2fftPBAzz6mOhprj358CAACcXoWfA7Lr7w/FJ+59IT79kdHx+T+ojcrKivhx+6vxXx766aD93GqwZ//rr3viT779Snz5qvER8dufbD1/z9SI+O0/7/v+91bHFxrHxp9//5/j81tP/iwSAACg/yrK5ZPfEbFixYrY3PmJrP28bVw98qvR2tr6Zm8DAADeUvy7tAAAQBoBAgAApBEgAABAmlO6Cf0f75hwuvfxtrN69Zu9AwAAeOvxDQgAAJBGgAAAAGkGFCC7d++Oiy++OOrq6qKhoSHmz58fjz/++DHHNDQ0xOjRo6O2tjZqa2vjnHPOieXLl0dnZ2dERCxcuDBqamqipqYmRo0aFaNGjep9vXTp0oiIuOiii2Ljxo2FZl966aV99j1//vzYsWNHRET88Ic/jDlz5sTEiRPjfe97Xzz88MMD+UgAAICTKBwg27Zti0WLFsVVV10Ve/fujWeffTZuuOGGuPHGG+Ohhx465tgtW7ZER0dHdHR0xM6dO+O5556LlStX9q4dPHgwDh48GI2NjXH99df3vl63bt2AZ7e1tcUTTzxx3Ot0dnbGxz/+8ViyZEm0tbXFunXr4jOf+Uz85Cc/KfqxAAAAJ1EoQI4ePRrNzc2xcuXKWLhwYVRXV0dVVVVcdtllcccdd0RLS0scPnz8J5JPmDAhli1bFrt27Sq04f7ObmpqiltvvTW6urqOe63bb789Pv7xj0dFRUX83u/9XkydOjWefvrpQnsDAABOrlCAPP3003HgwIG45ppr+qw1NjbGkCFDYs+ePSc8v7u7O4YNG1ZkdL9nz5gxI+rr62PTpk19jn/Pe95zzHXK5XK0t7dHXV1dob0BAAAnVyhA2tvbY8yYMTFixIg+a0OGDImGhoZob2/vs1Yul6OtrS3Wrl173HszTsfscrkct912W6xZsyYOHTp00mvfc889MXbs2Jg1a1ahvQEAACdXKEBKpVJ0d3efcL2npycqK1+/9NVXXx11dXVRX18fCxYsiOnTp0dLS0uR0f2eHRFx7rnnxty5c+Ouu+464XkbN26MDRs2xMaNG/ucDwAADI5TehDh/6+hoSEOHDgQnZ2dMXLkyGPWuru7o729PSZNmtT73ubNm2POnDkD22nB2a9pbm6OmTNnxuLFi/us3XffffHAAw/EY489FhMnThyUfQIAAH0V+l/906ZNi/Hjx8eDDz7YZ+2RRx6JUqkUs2fPHvDmBnP22LFjY/HixbFq1aoYOnRo7/vbtm2LP/3TP41vf/vb4gMAAE6zQt+AVFZWxpo1a2LJkiVRU1MTCxYsiFKpFDt37oyVK1dGa2trDB8+fLD3OuDZy5YtiwsvvLA3QA4dOhTNzc2xadMmN54DAECCwjc7zJs3L7Zu3Rrbt2+PqVOnxpQpU2LDhg2xfv36aGxsHMw9Dtrs6urqaGpq6r1Jfffu3bF///647LLLeh+UWFtb2/uMEgAAYHBVlMvl8skOWLFiRTQ3N2ft521j9erV0dra+mZvAwAA3lL8c08AAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkGVCA7N69Oy6++OKoq6uLhoaGmD9/fjz++OPHHNPQ0BCjR4/ufcbGOeecE8uXL4/Ozs6IiFi4cGHU1NRETU1NjBo1KkaNGtX7eunSpRERcdFFF8XGjRsLzb700kv77Hv+/PmxY8eOiIh48sknY9asWTFx4sSYNm1a/Nmf/dlAPhIAAOAkCgfItm3bYtGiRXHVVVfF3r1749lnn40bbrghbrzxxnjooYeOOXbLli3R0dERHR0dsXPnznjuued6H/a3ZcuWOHjwYBw8eDAaGxvj+uuv7329bt26Ac9ua2uLJ5544rjX+dnPfhbXXnttfP7zn48XXnghNm7cGC0tLfGjH/2o6McCAACcRKEAOXr0aDQ3N8fKlStj4cKFUV1dHVVVVXHZZZfFHXfcES0tLXH48OHjnjthwoRYtmxZ7Nq1q9CG+zu7qakpbr311ujq6upzrYqKirj33nvjQx/6UERETJs2LSZPnhz79u0rtDcAAODkCgXI008/HQcOHIhrrrmmz1pjY2MMGTIk9uzZc8Lzu7u7Y9iwYUVG93v2jBkzor6+PjZt2tTn+HHjxsXll18eERFHjhyJHTt2xP79+2PmzJmF9gYAAJxcoQBpb2+PMWPGxIgRI/qsDRkyJBoaGqK9vb3PWrlcjra2tli7du1x7804HbPL5XLcdtttsWbNmjh06NBxr/kXf/EXMW7cuPijP/qjWLduXYwdO7bQ3gAAgJMrFCClUim6u7tPuN7T0xOVla9f+uqrr466urqor6+PBQsWxPTp06OlpaXI6H7Pjog499xzY+7cuXHXXXcd95wrrrgiOjo64v77748lS5bE3/3d3xXaGwAAcHKlIic1NDTEgQMHorOzM0aOHHnMWnd3d7S3t8ekSZN639u8eXPMmTNnYDstOPs1zc3NMXPmzFi8ePFxrzts2LCYO3duXHLJJfHwww/HBRdcMCj7BQAAXlfoG5Bp06bF+PHj48EHH+yz9sgjj0SpVIrZs2cPeHODOXvs2LGxePHiWLVqVQwdOjQiIp555pnYsmXLMcf19PREqVSoywAAgDdQ6L+0KysrY82aNbFkyZKoqamJBQsWRKlUip07d8bKlSujtbU1hg8fPth7HfDsZcuWxYUXXtgbIBERN998c4wfPz5mzZoVzzzzTDz66KOeBQIAAKdJ4eeAzJs3L7Zu3Rrbt2+PqVOnxpQpU2LDhg2xfv36aGxsHMw9Dtrs6urqaGpq6r1J/fzzz4+1a9fG5z73uaivr4/rrrsuWlpaBu3nYgAAwLEqyuVy+WQHrFixIpqbm7P287axevXqaG1tfbO3AQAAbymFvwEBAADoLwECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBlQgOzevTsuvvjiqKuri4aGhpg/f348/vjjxxzT0NAQo0ePjtra2qitrY1zzjknli9fHp2dnRERsXDhwqipqYmampoYNWpUjBo1qvf10qVLIyLioosuio0bNxaafemll/bZ9/z582PHjh3HvPfqq6/G+eefH5/5zGcG8pEAAAAnUThAtm3bFosWLYqrrroq9u7dG88++2zccMMNceONN8ZDDz10zLFbtmyJjo6O6OjoiJ07d8Zzzz0XK1eu7F07ePBgHDx4MBobG+P666/vfb1u3boBz25ra4snnnjiDf+eu+++O3p6egp+GgAAwKkoFCBHjx6N5ubmWLlyZSxcuDCqq6ujqqoqLrvssrjjjjuipaUlDh8+fNxzJ0yYEMuWLYtdu3YV2nB/Zzc1NcWtt94aXV1dJ7zmiy++GNu2bYuPfexjhfYEAACcmkIB8vTTT8eBAwfimmuu6bPW2NgYQ4YMiT179pzw/O7u7hg2bFiR0f2ePWPGjKivr49Nmzad8JrNzc3R1NQUVVVVhfYEAACcmkIB0t7eHmPGjIkRI0b0WRsyZEg0NDREe3t7n7VyuRxtbW2xdu3a496bcTpml8vluO2222LNmjVx6NChPuc8+eST8corr0RjY2Oh/QAAAKeuUICUSqXo7u4+4XpPT09UVr5+6auvvjrq6uqivr4+FixYENOnT4+WlpYio/s9OyLi3HPPjblz58Zdd911zPuv/Zxr1apVUVFRUWg/AADAqSsVOamhoSEOHDgQnZ2dMXLkyGPWuru7o729PSZNmtT73ubNm2POnDkD22nB2a9pbm6OmTNnxuLFi3vfu//+++O8886L97///YOyNwAA4OQKfQMybdq0GD9+fDz44IN91h555JEolUoxe/bsAW9uMGePHTs2Fi9eHKtWrYqhQ4dGRMRPfvKT+MEPfhBTpkyJKVOmxNq1a+NrX/tazJ8//7TsHQAA3ukKfQNSWVkZa9asiSVLlkRNTU0sWLAgSqVS7Ny5M1auXBmtra0xfPjwwd7rgGcvW7YsLrzwwt4A2bBhwzHra9asiZdeeinuvPPO07J3AAB4pyv8HJB58+bF1q1bY/v27TF16tSYMmVKbNiwIdavX3/ab+guOru6ujqampqOe4M8AABw+lWUy+XyyQ5YsWJFNDc3Z+3nbWP16tXR2tr6Zm8DAADeUgp/AwIAANBfAgQAAEgjQAAAgDSn9K9grV69+nTvAwAAeAd4w5vQAQAABoufYAEAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQRoAAAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaf4PAkqVsOC2qOIAAAAASUVORK5CYII=
 
 === After auto dark mode (autoDarkMode and prefers-color-scheme override) is enabled ===
 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAH45JREFUeJzt3W+Qlnd97/HPLkiB0nbYmJMFolbrEUsdG2tCSrEnEWN75AwasTVTM4S0nhPbBYEe3AkxnkSlEBzd2RjJTuLsFJoOeCYdDYkIDCQCNhTSNhxHraVgYq2kWwiEDARB2D/nQZrtUP4YbuCbTPJ6PYL7uu7r+9v70b7nvn57NbW0tAwEAACgQPNLvQAAAODVQ4AAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQZuiLOWn+/PkXeh2vOB0dHS/1EgAA4GWn6Wc9iHD+/PlZs2ZN1XpeMaZOnSpCAADgP3ELFgAAUEaAAAAAZQQIAABQ5kVtQj+diRMn5oYbbsj48ePT39+fJ554IitXrsyjjz46eM66desyfPjw9Pf3J0kOHjyYrVu3ZunSpTl8+HCWLFmSSZMmJUmam5/voRfOXb9+fRYtWpTu7u6sXr06q1atOuvZO3fuzJw5c05Yd1dXV+6///5s2rQpSXLZZZflc5/7XL785S/nq1/96rl8JAAAwBk0HCBTpkzJggUL0tnZmfb29vT19WXy5Mm59dZbc8899+TBBx8cPPfmm2/OY489liS55JJLcvvtt2fu3LlZvHhxFixYMHjebbfdlkOHDqWzs/O8zR43blwmT56cLVu2nPJav/3bv53p06fnRz/6UaMfBQAA8CI1dAvW0KFDM2/evHR3d2ft2rU5cuRIjh07lo0bN+bOO+/M7NmzM2LEiFO+d8+ePVm5cuXgtx4XevayZcvS1taWIUOGnPJ6b3zjG7NgwYL85Cc/OePc6667Li0tLSe93tLSkg9/+MMN/SwAAPBq01CATJgwIaNHj85DDz100rENGzakr68vV1xxxemHNjfn+PHjjYw+69nbt29PT09Ppk2bdsrr3XffffnpT396xpnXXnttPv7xj6erqysXXXTR4OsXXXRRurq6MmfOnNNeHwAA+A8NBUhra2v279+fo0ePnnSsv78/PT09aW1tPeV7x44dm+uvv35w/8WFnt3U1JSurq7ceOONGTlyZEMzv/Wtb6WnpyeXXnpp7r777rS0tKSlpSV33313Lr300uzevfu0t3gBAAD/oaE9IL29vae9pSl5/pf+FzaSJ8kdd9yRvr6+DAwM5MCBA9m8eXO6u7sbGX3Ws5PkySefzLZt2zJjxozce++9Zz3zmWeeSVtbW5YuXZpLL70099xzT5LnY+qpp57KrFmz8swzz5z1dQEA4NWmoQDp6enJ6NGjM2rUqDz33HMnHGtubs6YMWOye/fuwdduueWWwU3o5+psZ7+gu7s7y5cvzwMPPNDQ3Keffjof//jHs3Tp0owdOzZJ8tRTT2X27NnZv39/Q9cEAIBXm4ZuwdqxY0f27t2b6dOnn3TsmmuuSW9vbx5//PFzXtz5nL1v376sWrUqN910U3p7exuavXfv3syaNSt79+5NT09PZs+enaeffrqhawEAwKtRQ9+ADAwMpKOjI5/+9Kdz4MCBPPzww+nr68ukSZMyZ86cdHZ2NrzJ/ELOXrFiRb7yla80HCDJ89+EzJo1K319feIDAADOUsPPAdmyZUva29szc+bMtLW1pbm5Obt27crChQvP2+1W53v2kSNHsmzZsrS3tyd5/pathx9+OMnzf973He94R2bNmpWvf/3rZ3wWSU9Pz/n9gQAA4FWiqaWlZeBMJ8yfPz9r1qypWs8rxtSpU9PR0fFSLwMAAF5WGtoDAgAA0AgBAgAAlBEgAABAmZ+5ByR5fh8IZ8f+DwAAONnP/AZEfDTG5wYAACd7UX+G97Xv+eSFXscrzr5HFr/USwAAgJcde0AAAIAyAgQAACjT8JPQk+SpHY/lu4/cl2d2/1PS1JyWsW/Or737I3ndr71r8Jyv3Pq76T12NE3Nz7fOz438xYx766Rc/v7ZGTZiVDb++YLs/se/SZIM9PcnyeC5b/yN38m7/uBT+UbnR/PmK6dl/G9de9azL7p0fH7nT+46Yd1rv/Qn+dX/9uH88q+/O0nybz/4f/nmn9+c35j6sbz1XR86l48EAAA4g4YD5J+//Uj+5v4lmfjBP83rP/r5DBkyND/+h0ez5f8uyjve97ETYuHdf/S5XPqrv5kkOXxgT/56xWfyt6u+mHf9wa159x8tGTzvr1d8NsNGjMqV0//3eZt9aP9T+ZfvPZrXv+1dp7zWv3z3W/mnLV/LL/2XNzT6UQAAAC9SQ7dg9fUez98+cGfe8d//V958xdQMGz4yQ14zLL982ZRc8YG5efzrS3Ps6E9O+d6fH31Jfu3dH8lT/7i1oQWf7ey3v/cPs/0bXenv6zvl9Z79tx/m3X+0JK8ZPrKh9QAAAC9eQwGy71++n6PPHcibr5x20rE3vuO9aWoekp6df3fa9/f39WXI0Nc0MvqsZ7f+yjsyqmVMdm176JTXe/t7Z2bosOENrQUAADg7DQXI4QP/lhG/eFFe83MjTr7gkCEZ1TImP3l2z0nHBgYGcmjfU/mHjSvyhn/ff3GhZw8MDOSd/6Mt33l4eY6f5lsZAACgRkN7QJqHDD3tLU1JkoGBpKlp8L+b/+KTaWpqTpqaMnzU6Lzh7Vfn13/no42MPuvZSTJ67K9k3K9Oyne/+Zf5jakfa2guAABw7hoKkJ8fPSY/PfxsfvqTQ/m5kb9wwrH+vr4ceqYnv/DaSwdfu2rm4sFN6OfqbGe/4LLf/Z/5esfMvGXStWn6T4ECAADUaOgWrIte99aM/KWL809bvnbSsX/+9sNpHjI0rW9+5zkv7nzOHvlLr8343/pgvr32y2keck5/fRgAAGhQQwHS3NycidPn53vf/Mvs3PZQjh39SfqOH8uPvrMpf/fgXZn4wT/N0NcMO99rPefZE67+SHp2/X0O7X/qgqwNAAA4s4a/Cnj9296VKR/9fL778F9k++qu9Pf3p2Xcf83kP/g/5+12q/M9e9jwkXn7e/8wj331C0mev2Vr5Sev+fd/92bPE9/O3399ad7ym+/PxA/+6QX9GQAA4NWoqaWlZeBMJ8yfPz+vfc8nq9bzirHvkcXp6Oh4qZcBAAAvKw3dggUAANAIAQIAAJQRIAAAQJkXtQn9vvnvutDreMWZOnXqS70EAAB42fENCAAAUEaAAAAAZc7pkeATJ07MDTfckPHjx6e/vz9PPPFEVq5cmUcffXTwnHXr1mX48OHp7+9Pkhw8eDBbt27N0qVLc/jw4SxZsiSTJk1K8vxDBpMMnrt+/fosWrQo3d3dWb16dVatWnXWs3fu3Jk5c+acsO6urq7cf//92bRpU97+9rdn9uzZed3rXpeDBw9m+fLlWbt27bl8LAAAwGk0HCBTpkzJggUL0tnZmfb29vT19WXy5Mm59dZbc8899+TBBx8cPPfmm2/OY489liS55JJLcvvtt2fu3LlZvHhxFixYMHjebbfdlkOHDqWzs/O8zR43blwmT56cLVu2nHSdUaNG5fOf/3w6Ozuzbt26vO1tb8tdd92VHTt25Ic//GGjHw0AAHAaDd2CNXTo0MybNy/d3d1Zu3Ztjhw5kmPHjmXjxo258847M3v27IwYMeKU792zZ09Wrlw5+K3HhZ69bNmytLW1ZciQIae81pe+9KWsW7cuSfK9730vu3btyoQJExpaGwAAcGYNBciECRMyevToPPTQQycd27BhQ/r6+nLFFVecfmhzc44fP97I6LOevX379vT09GTatGknnf/ss89m9erVJ7zW2tqaPXv2NLQ2AADgzBoKkNbW1uzfvz9Hjx496Vh/f396enrS2tp6yveOHTs2119/fTZt2tTI6LOe3dTUlK6urtx4440ZOXLkGa/9kY98JE8//XQef/zxhtYGAACcWUN7QHp7e095S9MLmpqaBjeSJ8kdd9yRvr6+DAwM5MCBA9m8eXO6u7sbGX3Ws5PkySefzLZt2zJjxozce++9p3zftddem9///d/PrFmzMjAw0NDaAACAM2soQHp6ejJ69OiMGjUqzz333AnHmpubM2bMmOzevXvwtVtuuWVwE/q5OtvZL+ju7s7y5cvzwAMPnHTsuuuuy4c+9KHMmjUr//qv/3pe1gkAAJysoVuwduzYkb1792b69OknHbvmmmvS29t7wW5janT2vn37smrVqtx0003p7e0dfH3KlCn5vd/7vcyePVt8AADABdZQgAwMDKSjoyMzZszItGnTMmLEiAwbNixXXXVV5syZk87OzoY3mV/I2StWrMjll1+esWPHJklGjhyZefPm5bOf/Wz27t17QdYLAAD8h4afA7Jly5a0t7dn5syZaWtrS3Nzc3bt2pWFCxeet9utzvfsI0eOZNmyZWlvb0+SXHnllWlpackXv/jFE85btWpV7rrrrgv6MwAAwKtRU0tLyxl3XM+fPz9r1qypWs8rxtSpU9PR0fFSLwMAAF5WGroFCwAAoBECBAAAKCNAAACAMgIEAAAoI0AAAIAyAgQAACjT8HNAkmTixIm54YYbMn78+PT39+eJJ57IypUr8+ijjw6es27dugwfPjz9/f1JkoMHD2br1q1ZunRpDh8+nCVLlmTSpElJkubm53vohXPXr1+fRYsWpbu7O6tXr86qVavOevbOnTszZ86cE9bd1dWV+++/P5s2bcqVV16ZP/7jP05ra2sOHTqUlStXnjAHAAA4fxoOkClTpmTBggXp7OxMe3t7+vr6Mnny5Nx6662555578uCDDw6ee/PNNw8+IPCSSy7J7bffnrlz52bx4sVZsGDB4Hm33XZbDh06lM7OzvM2e9y4cZk8eXK2bNly0nUuvvjiLFq0KJ/61Keybdu2vPWtb83dd9+dHTt2ZMeOHY1+NAAAwGk0dAvW0KFDM2/evHR3d2ft2rU5cuRIjh07lo0bN+bOO+/M7NmzM2LEiFO+d8+ePVm5cuXgtx4XevayZcvS1taWIUOGnHStgYGBLF68ONu2bUuS7NixIz/+8Y/z+te/vqG1AQAAZ9ZQgEyYMCGjR4/OQw89dNKxDRs2pK+vL1dcccXphzY35/jx442MPuvZ27dvT09PT6ZNm3bS+fv27cs3v/nNJMmwYcNy9dVXp6WlJdu3b29obQAAwJk1FCCtra3Zv39/jh49etKx/v7+9PT0pLW19ZTvHTt2bK6//vps2rSpkdFnPbupqSldXV258cYbM3LkyFNe873vfW8eeeSRfOITn8jChQuzb9++htYGAACcWUN7QHp7e095S9MLmpqaBjeSJ8kdd9yRvr6+DAwM5MCBA9m8eXO6u7sbGX3Ws5PkySefzLZt2zJjxozce++9J71nw4YN2bhxYy6//PJ85jOfySc+8Yl8//vfb2h9AADA6TUUID09PRk9enRGjRqV55577oRjzc3NGTNmTHbv3j342i233DK4Cf1cne3sF3R3d2f58uV54IEHTnnd3t7ebNu2LZs3b8773vc+AQIAABdAQ7dg7dixI3v37s306dNPOnbNNdekt7c3jz/++Dkv7nzO3rdvX1atWpWbbropvb29SZK3vOUted/73nfCeU1NTenr67sgawcAgFe7hgJkYGAgHR0dmTFjRqZNm5YRI0Zk2LBhueqqqzJnzpx0dnY2vMn8Qs5esWJFLr/88owdO3bwtfnz5+ed73xnkmT8+PG5+uqrs3Xr1guydgAAeLVr+DkgW7ZsSXt7e2bOnJm2trY0Nzdn165dWbhw4Xm73ep8zz5y5EiWLVuW9vb2JMnOnTuzZMmSzJs3L5dcckmeffbZfPnLX77g6wcAgFerppaWloEznTB//vysWbOmaj2vGFOnTk1HR8dLvQwAAHhZaegWLAAAgEYIEAAAoIwAAQAAyggQAACgjAABAADKCBAAAKBMw88BSZKJEyfmhhtuyPjx49Pf358nnngiK1euzKOPPjp4zrp16zJ8+PD09/cnSQ4ePJitW7dm6dKlOXz4cJYsWZJJkyYlSZqbn++hF85dv359Fi1alO7u7qxevTqrVq0669k7d+7MnDlzTlh3V1dX7r///mzatGnwtWHDhmXFihV57LHH8oUvfOFcPhYAAOA0Gv4GZMqUKfmzP/uzfOMb38j73//+TJs2LX/1V3+VW2+9NR/4wAdOOPfmm2/OlClTMmXKlHzsYx/LG97whsydOzdJsmDBglx11VW56qqrsmHDhnzta18b/P+iRYvOefa4ceMyefLkn/nzzJgxYzCAAACAC6Oh37iHDh2aefPmpbu7O2vXrs2RI0dy7NixbNy4MXfeeWdmz56dESNGnPK9e/bsycqVKwe/9bjQs5ctW5a2trYMGTLktNccM2ZM3vOe92TdunUNrQkAAHhxGgqQCRMmZPTo0XnooYdOOrZhw4b09fXliiuuOP3Q5uYcP368kdFnPXv79u3p6enJtGnTTnvNuXPnZvny5Tl27FhDawIAAF6chgKktbU1+/fvz9GjR0861t/fn56enrS2tp7yvWPHjs31119/wv6LCzm7qakpXV1dufHGGzNy5MiT3nPllVfmoosuyvr16xtaDwAA8OI1tAm9t7f3jLc0NTU1DW4kT5I77rgjfX19GRgYyIEDB7J58+Z0d3c3MvqsZyfJk08+mW3btmXGjBm59957B18fOnRo5s6dmyVLljS0FgAA4Ow0FCA9PT0ZPXp0Ro0aleeee+6EY83NzRkzZkx27949+Nott9ySxx577NxW2uDsF3R3d2f58uV54IEHBl+77rrr8oMf/CDf+c53zsvaAACAM2soQHbs2JG9e/dm+vTpue+++044ds0116S3tzePP/74eVng+Zq9b9++rFq1KjfddFN6e3uTJG9605ty2WWXDe4nGT58eIYMGZI3velNaWtruyDrBwCAV7OGAmRgYCAdHR359Kc/nQMHDuThhx9OX19fJk2alDlz5qSzs7PhTeYXcvaKFSvyla98ZTBAFi5ceMLxmTNn5uKLL/YcEAAAuEAafhDhli1b0t7enpkzZ6atrS3Nzc3ZtWtXFi5ceN5utzrfs48cOZJly5alvb39gq4PAAA4taaWlpaBM50wf/78rFmzpmo9rxhTp05NR0fHS70MAAB4WfHobwAAoIwAAQAAyggQAACgzIvahD516tQLvQ4AAOBV4GduQgcAADhf3IIFAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQBkBAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJT5/5ZGpzazvfnHAAAAAElFTkSuQmCC
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/4774354-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/4774354-expected.png
index 3993a91d..0921b06b 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/4774354-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/4774354-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
index 1aa38674..c87a952 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png
index 990c21bc..11909f0 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-after-remove-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-after-remove-expected.png
index d37a715..f6a510d 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-after-remove-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-after-remove-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png
index 7ea5dfc..b45771e 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png
index 9149c47..17f64ff 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
index fa1ed7ef..bbd3895 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-rl-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-rl-expected.png
index ac86815..cff7f7dc 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-rl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-within-composited-scroller-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-within-composited-scroller-expected.png
index 2a32a4a..8bfbb4ff 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-within-composited-scroller-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-within-composited-scroller-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
index c74296e..99fdff52 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-expected.png
index 92ce902..e52bead5 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-64px-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-64px-expected.png
index c340cee5..e0c42b4 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-64px-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-64px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-8px-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-8px-expected.png
index 9c9943a..d154daf 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-8px-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-font-8px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-125-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-125-expected.png
index 960e99c..9c40f7b 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-125-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-150-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-150-expected.png
index 14d435c..5f44220 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-150-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-175-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-175-expected.png
index 5ee0cdc3..5406391d 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-175-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-175-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-200-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-200-expected.png
index b2078291..d8ae8965 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-200-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-2000-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-2000-expected.png
index c5ced07..f7d60162 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-2000-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-2000-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-250-expected.png b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-250-expected.png
index 493a76b7..e563a9b 100644
--- a/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-250-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/markers/document-markers-zoom-250-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-expected.png b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-expected.png
index 66b67d0..67e1249 100644
--- a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-rtl-expected.png b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-rtl-expected.png
index 83c81fde..a1f361a 100644
--- a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-inline-block-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-clipped-by-overflow-expected.png b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
index 08df255..e8bd306 100644
--- a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
index 786e00ef..1200609 100644
--- a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
index 762a402..943b263 100644
--- a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-with-composition-expected.png b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-with-composition-expected.png
index 1b5e4e6..b4d34a8 100644
--- a/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-with-composition-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/selection/text-selection-with-composition-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/text/selection-no-clip-text-expected.png b/third_party/blink/web_tests/platform/linux/paint/text/selection-no-clip-text-expected.png
index 7ce48bf3..5b305b1a 100644
--- a/third_party/blink/web_tests/platform/linux/paint/text/selection-no-clip-text-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/text/selection-no-clip-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/text/vertical-upright-oblique-expected.png b/third_party/blink/web_tests/platform/linux/paint/text/vertical-upright-oblique-expected.png
index b4c898f..b372a7d6 100644
--- a/third_party/blink/web_tests/platform/linux/paint/text/vertical-upright-oblique-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/text/vertical-upright-oblique-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/text/foreignObject-text-clipping-bug-expected.png b/third_party/blink/web_tests/platform/linux/svg/text/foreignObject-text-clipping-bug-expected.png
index f5a56e67..e6c8e8d 100644
--- a/third_party/blink/web_tests/platform/linux/svg/text/foreignObject-text-clipping-bug-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/text/foreignObject-text-clipping-bug-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png
index 7707e99a..fc42807 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/text/input-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/text/input-focus-ring-expected.png
index 40efcc9..bd96eb4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/text/input-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/text/input-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png
index b25fc15..e9b826ca 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png
index 958985b8..bd887f47 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png
index d4e4483..0729702 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/emphasis-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/emphasis-expected.png
index a3979a4..1a36d72 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/emphasis-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/emphasis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-expected.png
index 0cafdf5..cb94802 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-nested-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
index 13c15147..822be8b 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/khmer-selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/khmer-selection-expected.png
index 8ed9ece..11c1dae 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/khmer-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/khmer-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/mixed-directionality-selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/mixed-directionality-selection-expected.png
index 07c91bf0..44fc493e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/mixed-directionality-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/mixed-directionality-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png
index 73354fd..e5e0afd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-painting-hidpi-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
index b9c41047d..b526fae1 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-with-inline-padding-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-with-inline-padding-expected.png
index 98a80e0..a561a0cf 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-with-inline-padding-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/selection-with-inline-padding-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/shaping-selection-rect-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/shaping-selection-rect-expected.png
index 9573976b..ca64883 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/shaping-selection-rect-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/shaping-selection-rect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/should-use-atsui-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/should-use-atsui-expected.png
index 67093cc..70db71eb 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/should-use-atsui-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/selection/should-use-atsui-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
index b48ac90..6da112b9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
index d291c255..b9b71a9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
index 40eacd7..4672c00 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
index 2aa093bd..7ad94d3b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
index 65720485..3eb7d5f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-across-blocks-expected.png
index 65720485..3eb7d5f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-across-blocks-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-across-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-br-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-br-expected.png
index 65720485..3eb7d5f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-br-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-expected.png
index b48ac90..6da112b9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-rtl-expected.png
index d291c255..b9b71a9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-across-line-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-across-line-expected.png
index e8550d1..70b9a8de 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-across-line-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-across-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-expected.png
index 3ecf63d..b9dbfc00 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-lr-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-lr-expected.png
index 40eacd7..4672c00 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-rl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-rl-expected.png
index 2aa093bd..7ad94d3b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-newline-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-update-style-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-update-style-expected.png
index 8ca30adf..02739bc9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-update-style-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/selection/text-selection-update-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
index 5b61b7f..eec2ba06 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
index ea904b4..d78e6de 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [8, 8, 48, 33]
       ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
index 5c0aa1f9..ee5e590 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
index d4571bbd..4d6cd21 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [0, 8, 40, 33]
       ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
index 50268f9..3079d37 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
index 9e651e11..6acd005 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [8, 8, 33, 48]
       ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
index be50750..cb59dc7 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
index bc2952499..f992fa81 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [7, 8, 33, 48]
       ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
index a5094a4e..29cbad13 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
index 461b8e8..1a09b2aa 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [8, 24, 16, 17],
         [8, 8, 16, 17],
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png
index a5094a4e..29cbad13 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/ruby/select-ruby-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
similarity index 85%
rename from third_party/blink/web_tests/platform/linux/fast/ruby/select-ruby-expected.png
rename to third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
index 0abde32..165b23c 100644
--- a/third_party/blink/web_tests/platform/linux/fast/ruby/select-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-br-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-br-expected.png
index a5094a4e..29cbad13 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-br-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-expected.png
index 5b61b7f..eec2ba06 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png
index 5c0aa1f9..ee5e590 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-across-line-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-across-line-expected.png
index bfda3cb..96379c6e 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-across-line-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-across-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-expected.png
index 984ec3e..e062290 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-lr-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-lr-expected.png
index 50268f9..3079d37 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-rl-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-rl-expected.png
index be50750..cb59dc7 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-update-style-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-update-style-expected.png
index 911be117..861571a 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-update-style-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-update-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png b/third_party/blink/web_tests/platform/win/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png
index a914f2de..c34b1a9 100644
--- a/third_party/blink/web_tests/platform/win/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/squashing/selection-repaint-with-gaps-expected.png b/third_party/blink/web_tests/platform/win/compositing/squashing/selection-repaint-with-gaps-expected.png
index 0d427402..eb53af96 100644
--- a/third_party/blink/web_tests/platform/win/compositing/squashing/selection-repaint-with-gaps-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/squashing/selection-repaint-with-gaps-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.png b/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.png
index 40ee1e2..b9d9f5c 100644
--- a/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.png
index fb79410..4fd0e33f 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/5099303-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/5099303-expected.png
index ddf35d35..56638ae9 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/5099303-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/5099303-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.png
index 937e894..e03983ae8 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/5232159-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/5232159-expected.png
index 51c5b562..719a016 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/5232159-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/5232159-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.png
index 41a3ccc..58422dd 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
index 7840c00..6866d65 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
index 5040edb..cb896e8 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
index bd4bbbf..6e9196f 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
index 82b370d..0e522696 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/inline-closest-leaf-child-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/inline-closest-leaf-child-expected.png
index 6eec4e9..558fdcc 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/inline-closest-leaf-child-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/inline-closest-leaf-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/japanese-lr-selection-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/japanese-lr-selection-expected.png
index abad259..762b5fa3 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/japanese-lr-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/japanese-lr-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/japanese-rl-selection-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/japanese-rl-selection-expected.png
index d1d97b17..68c3365 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/japanese-rl-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/japanese-rl-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.png
index 31e0067..b0d8ee4 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.png
index 86ec848..9805def 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/range-between-block-and-inline-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/range-between-block-and-inline-expected.png
index 116c6624..b15380b1 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/range-between-block-and-inline-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/range-between-block-and-inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.png
index 0066ecc..f00499ba 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png
index 53461e4e9..04e9570b 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
index 9dbb4f3..1c7423c 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
index d807fc9..4b5f516 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
index 245af0ee..8d69edb8 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
index c976426..1b2a569 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/selection-button-text-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/selection-button-text-expected.png
index ca04852..e3a26916 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/selection-button-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/selection-button-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/selection-color-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/selection-color-expected.png
index 071237f4..57d5c7d 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/selection-color-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/selection-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/transformed-selection-rects-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/transformed-selection-rects-expected.png
index af809e0..069dcb17 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/transformed-selection-rects-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/transformed-selection-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/vertical-lr-replaced-selection-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/vertical-lr-replaced-selection-expected.png
index 1ecfcd07..277f2a9c0 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/vertical-lr-replaced-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/vertical-lr-replaced-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/vertical-rl-replaced-selection-expected.png b/third_party/blink/web_tests/platform/win/editing/selection/vertical-rl-replaced-selection-expected.png
index 926f96e8..af28389 100644
--- a/third_party/blink/web_tests/platform/win/editing/selection/vertical-rl-replaced-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/editing/selection/vertical-rl-replaced-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/dom/52776-expected.png b/third_party/blink/web_tests/platform/win/fast/dom/52776-expected.png
index 464c590..488509c 100644
--- a/third_party/blink/web_tests/platform/win/fast/dom/52776-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/dom/52776-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/dynamic/selection-highlight-adjust-expected.png b/third_party/blink/web_tests/platform/win/fast/dynamic/selection-highlight-adjust-expected.png
index f47c171..81c7ee0 100644
--- a/third_party/blink/web_tests/platform/win/fast/dynamic/selection-highlight-adjust-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/dynamic/selection-highlight-adjust-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png
index 0063b0c..f868427e 100644
--- a/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png
index 182ea58..08c2795 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png
index 6c329a89..61bf2343 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-multiple-hover-focused-unselected-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/text-selection-outside-control-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/text-selection-outside-control-expected.png
index eea48ae..8c6a697 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/text-selection-outside-control-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/text-selection-outside-control-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/select/listbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/select/listbox-appearance-basic-expected.png
index 4c1bafc..b71d1a1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/select/listbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/select/listbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png
index a5ed3f2..caf6612 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-popup-type-ahead-style-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png
index ac445ab1..8714a31 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/select/multiselect-in-listbox-keyboard-focusring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/select/select-listbox-multiple-no-focusring-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/select/select-listbox-multiple-no-focusring-expected.png
index c01835f..18a41209 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/select/select-listbox-multiple-no-focusring-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/select/select-listbox-multiple-no-focusring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/tabbing-input-iframe-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/tabbing-input-iframe-expected.png
index 0e0c97f..8e31c6e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/tabbing-input-iframe-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/tabbing-input-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/text/input-appearance-selection-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/text/input-appearance-selection-expected.png
index f2681e58..01b1b87 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/text/input-appearance-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/text/input-appearance-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/text/input-double-click-selection-gap-bug-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/text/input-double-click-selection-gap-bug-expected.png
index c3bf3fc..c43bddad 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/text/input-double-click-selection-gap-bug-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/text/input-double-click-selection-gap-bug-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/text/input-readonly-autoscroll-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/text/input-readonly-autoscroll-expected.png
index 7b5fbd2f..4e0d2bb5 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/text/input-readonly-autoscroll-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/text/input-readonly-autoscroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/text/input-text-double-click-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/text/input-text-double-click-expected.png
index ef3b777..aab682d 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/text/input-text-double-click-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/text/input-text-double-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/lists/markers-in-selection-expected.png b/third_party/blink/web_tests/platform/win/fast/lists/markers-in-selection-expected.png
index 2c520d3..acd6120 100644
--- a/third_party/blink/web_tests/platform/win/fast/lists/markers-in-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/lists/markers-in-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/overflow/image-selection-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/overflow/image-selection-highlight-expected.png
index 9658a89..3698f59 100644
--- a/third_party/blink/web_tests/platform/win/fast/overflow/image-selection-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/overflow/image-selection-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/reflections/inline-crash-expected.png b/third_party/blink/web_tests/platform/win/fast/reflections/inline-crash-expected.png
index bdbb0e4..dcf4bdc 100644
--- a/third_party/blink/web_tests/platform/win/fast/reflections/inline-crash-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/reflections/inline-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/ruby/select-ruby-expected.png b/third_party/blink/web_tests/platform/win/fast/ruby/select-ruby-expected.png
index c57e461..8bd1b7c 100644
--- a/third_party/blink/web_tests/platform/win/fast/ruby/select-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/ruby/select-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/spatial-navigation/snav-multiple-select-focusring-expected.png b/third_party/blink/web_tests/platform/win/fast/spatial-navigation/snav-multiple-select-focusring-expected.png
index eb36dfcb..2bd3c36 100644
--- a/third_party/blink/web_tests/platform/win/fast/spatial-navigation/snav-multiple-select-focusring-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/spatial-navigation/snav-multiple-select-focusring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt b/third_party/blink/web_tests/platform/win/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt
index 5dd66cd..c4e4cfc6 100644
--- a/third_party/blink/web_tests/platform/win/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt
+++ b/third_party/blink/web_tests/platform/win/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt
@@ -1,6 +1,6 @@
 [crbug/1311561] Tests that auto dark mode emulation from DevTools correctly emulates dark mode for select element
 === Before auto dark mode (autoDarkMode and prefers-color-scheme override) is not enabled ===
-data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAEN9JREFUeJzt3T2OHGUCgOHqlXNSWxpLRiZdDoBkwwUIyCHeGBH0GSZBZCwihHvYGm6w8UjOdiblBL1Rr8ZNV/9Ud7899DxPAlNVXV/JUb366quaLRaLxQAAABD4x7kvAAAAeDoECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABA5tkuB83n81Nfx8W5vr4+9yUAAMCjszVA5vO5m+kJ/LsBAMBfeQQLAADICBAAACAjQAAAgMxOi9A3mc1mH/29WCw27l89bmz/8pjZbLb1nOv2r24b2z52LAAAcHwHBciuN/SbYuDhvl1iYNcxdz0XAADQmfwI1tgN/nLW4hT2GXPbdewz8/Hjjz8O9/f3f9l+f38//PTTTzudAwAAeMJrQHaNj59//nn44Ycfhjdv3gx3d3f/3353dze8efNm+P7774dff/31VJcJAAAX5aID5BizMd98883w6tWr4fb2dnj79u1wf38/3N/fD2/fvh1ub2+Hzz77bPj666+PdMUAAHDZDl6Evot1EfB3Wfj9/Pnz4Y8//hi++uqr4fb2dvjiiy+GYRiGDx8+DK9fvx5ubm6G58+fn/kqAQDg7yEJkHPGxtibtPZxdXU1vHv3bvjyyy+HDx8+DMMwDK9fvx7ev38/vHjx4liXCgAAF++iH8E6ppcvXw43NzfD1dXV8OrVq+H9+/fD1dXVuS8LAAD+VibPgGz6RsepZjymjnmsN3NdXV0NNzc3w7Nnz8QHAABMcNAjWGOvvz2lqWMeK0I+/fTTg88BAABP1cFrQLbd/O8TJGPf+DjWmFPOBQAAHI81IAAAQEaAAAAAGQECAABkZosdFkHM5/PiWi7K9fX1uS8BAAAena0zIOJjGv9uAADwVzu9Beu3P7899XVcnO8++f3clwAAAI+ONSAAAEBGgAAAAJmDP0R498vnH/394l//2bh/9bix/ctj7n75fOs51+1f3Ta2fexYAADg+A4KkF1v6DfFwMN9u8TArmPuei4AAKAz+RGssRv85azFKewz5rbrMPMBAAC9J7sGRHwAAEDvogPklLMxAADA/g5ehL6LdRFgBgIAAJ6eJEDOGRtjb9ICAAB6F/0IFgAA8LhMDpCx9RWnnG2YOqa1IAAA8Dgc9AjW2OtvT2nqmCIEAADOb7ZYLBabDpjP58Nvf35bXc/F+O6T34fr6+tzXwYAADwq1oAAAAAZAQIAAGQECAAAkNlpEfp///3PU1/HxZnPz30FAADw+JgBAQAAMgIEAADIHPQdkGEYhtls9tHfq2/1Xd2/etzY/uUxs9ls6znX7V/3duGH27edAwAAOL6DAmQsDla3bYqBh/vGwmHKmJvOte/xAADAcUx+BGvshn05a3EK+4y56TqEBgAAnIc1IAAAQOaiA+SUszEAAMD+Dl6Evot1EfCYHoOy/gMAABpJgJzz5n7sTVpL4gMAADoX/QjWNuIDAABakwNkbH3FKW/qp4657nfiAwAAegc9gjX2+ttTmjrmw9+t/nef8wAAANMdvAZk2037Pjf1Y9/4ONaYy+1CAwAAzuNJrwEBAABaAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgc/Brebd/SWPfhwIfHje1fHrPug4G7jLnuVbsPt/sGCAAA9A4KkLE4WN22KQYe7tvl6+S7jrnpXPseDwAAHMfkR7DGbtjXfan8WPYZc9N1CA0AADgPa0AAAIDMwWtAHrOxNSRLD2dIzIoAAMDpJQGy7lGox3DDv+/6EwAA4DBJgJzzxn7bLAgAANCxBgQAAMhMDpCxt0ydcrZh6pirvzvVW7oAAIDNDnoEa+z1t6c0dcyHvzvHdQMAAEdYA7Ltxn2fG/uxb3wca8yH2wUHAAD0rAEBAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgc/Brebd/TGPvo3/K4TR8FXH6vY9s51+1f95rdfbcDAADHdVCAjMXB6rZNN/0P9+0SAruOuWtU+Co6AAB0Jj+CNXaDv+4r48eyz5invA4AAGCaJ70GxKNXAADQuugAMQsCAACPy8GL0HexLgLOPfNg9gMAAHpJgJzzRn/sTVoAAEDvoh/BGrOckZnNZh/9PwAAcFqTA2RsfcUpZxumjrn6u+Xrfx++BtgMCQAAnN5Bj2CNvf72lKaOaUE6AACc38FrQLbd/O8TJGPf+DjWmPtuBwAAjutJrgEBAADOQ4AAAAAZAQIAAGR2WgMyn89PfR0AAMATMFtYgQ0AAEQ8ggUAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGQECAAAkBEgAABARoAAAAAZAQIAAGT+B8tBTe0RtkDVAAAAAElFTkSuQmCC
+data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAENlJREFUeJzt3T2OI2UCgOHyanLSYdVIg4aUCyDNwAUIyCHfFBH4DJ0gskEihHswao6waUuTMZ1yAm/klce4/FO2Xzfu50mgq8r1lSaqV199VbPFYrEYAAAAAv+69AUAAABPhwABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMg82+eg+Xx+7uu4Ore3t5e+BAAAeHR2Bsh8PnczPYF/NwAA+DuPYAEAABkBAgAAZAQIAACQ2WsR+jaz2eyDvxeLxdb968eN7V8eM5vNdp5z0/71bWPbx44FAABO76gA2feGflsMrO7bJwb2HXPfcwEAAJ3Jj2CN3eAvZy3O4ZAxd13HITMfP/744/Dw8PC37Q8PD8NPP/201zkAAIAnvAZk3/h48+bN8MMPPwyvXr0a3r9////t79+/H169ejV8//33wy+//HKuywQAgKty1QFyitmYb775Znjx4sVwf38/vH79enh4eBgeHh6G169fD/f398Nnn302fP311ye6YgAAuG5HL0Lfx6YI+Kcs/H7+/Pnwxx9/DF999dVwf38/fPHFF8MwDMO7d++Gly9fDnd3d8Pz588vfJUAAPDPkATIJWNj7E1ah7i5uRl+//334csvvxzevXs3DMMwvHz5cnj79u3w8ccfn+pSAQDg6l31I1in9Mknnwx3d3fDzc3N8OLFi+Ht27fDzc3NpS8LAAD+USbPgGz7Rse5ZjymjnmqN3Pd3NwMd3d3w7Nnz8QHAABMcNQjWGOvvz2nqWOeKkI+/fTTo88BAABP1dFrQHbd/B8SJGPf+DjVmFPOBQAAnI41IAAAQEaAAAAAGQECAABkZos9FkHM5/PiWq7K7e3tpS8BAAAenZ0zIOJjGv9uAADwd3u9BevXv74993Vcne8++u3SlwAAAI+ONSAAAEBGgAAAAJmjP0T458+ff/D3v//z3637148b27885s+fP995zk3717eNbR87FgAAOL2jAmTfG/ptMbC6b58Y2HfMfc8FAAB0Jj+CNXaDv5y1OIdDxtx1HWY+AACg92TXgIgPAADoXXWAnHM2BgAAONzRi9D3sSkCzEAAAMDTkwTIJWNj7E1aAABA76ofwQIAAB6XyQEytr7inLMNU8e0FgQAAB6Hox7BGnv97TlNHVOEAADA5c0Wi8Vi2wHz+Xz49a9vq+u5Gt999Ntwe3t76csAAIBHxRoQAAAgI0AAAICMAAEAADJ7LUK3ePtw8/mlrwAAAB4fMyAAAEBGgAAAAJmjvgMyDMMwm80++Hv9rb7r+9ePG9u/PGY2m+0856b9m94uvLp91zkAAIDTOypAxuJgfdu2GFjdNxYOU8bcdq5DjwcAAE5j8iNYYzfsy1mLczhkzG3XITQAAOAyrAEBAAAyVx0g55yNAQAADnf0IvR9bIqAx/QYlPUfAADQSALkkjf3Y2/SWhIfAADQuepHsHYRHwAA0JocIGPrK855Uz91zE2/Ex8AANA76hGssdffntPUMVd/t/7fQ84DAABMd/QakF037Yfc1I994+NUYy63Cw0AALiMJ70GBAAAaAkQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgc/RreHd9S2PThwNXjxvbvzxm0wcD9xlz06t2V7f7BggAAPSOCpCxOFjfti0GVvft83Xyfcfcdq5DjwcAAE5j8iNYYzfsm75UfiqHjLntOoQGAABchjUgAABA5ug1II/Z2BqSpdUZErMiAABwfkmAbHoU6jHc8B+6/gQAADhOEiCXvLHfNQsCAAB0rAEBAAAykwNk7C1T55xtmDrm+u/O9ZYuAABgu6MewRp7/e05TR1z9XeXuG4AAOAEa0B23bgfcmM/9o2PU425ul1wAABAzxoQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAIDM0a/h3fU9jbGP/i2P2/ZRwOX3Onadc9P+Ta/ZPXQ7AABwWkcFyFgcrG/bdtO/um+fENh3zH2jwlfRAQCgM/kRrLEb/E1fGT+VQ8Y853UAAADTPOk1IB69AgCA1lUHiFkQAAB4XI5ehL6PTRFw6ZkHsx8AANBLAuSSN/pjb9ICAAB6V/0I1pjljMxsNvvg/wEAgPOaHCBj6yvOOdswdcz13y1f/7v6GmAzJAAAcH5HPYI19vrbc5o6pgXpAABweUevAdl1839IkIx94+NUYx66HQAAOK0nuQYEAAC4DAECAABkBAgAAJDZaw3IfD4/93UAAABPwGxhBTYAABDxCBYAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJD5H0F0Tf/N+jljAAAAAElFTkSuQmCC
 
 === After auto dark mode (autoDarkMode and prefers-color-scheme override) is enabled ===
 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAEQNJREFUeJzt3T9uG1cCwOHnxZ6ATmXoKO7SEQiQKun2AJGdhl0OkI6dbaTOIdSlCZSbxBBgJb6Ct1hoIcscin/EHxXq+5okMyPOQ6r54c2b92w2m30aAAAAgX8dewAAAMDTIUAAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADL/3uSixWJx6HGcnOVyeewhAADAo/Psvo0IF4vFuLi4qMZzMubzuQgBAIA7vIIFAABkBAgAAJARIAAAQGajRejrXF5efvbfL1++XHv+7nVT52+uuby8vPc3V52/e2zq+NS1AADAw9srQDZ9oF8XA7fPbRIDm95z098CAAA6O7+CNfWAfzNrcQjb3PO+cWwz8/H999+P2Wz2xfHZbDa+++67jX4DAAB4wmtANo2Pb7/9drx+/Xq8e/duPH/+/P/Hnz9/Pt69ezd+/PHH8c033xxqmAAAcFJOOkAeYjbm999/H1dXV+Ps7Gy8fft2zGazMZvNxtu3b8fZ2dn4888/xx9//PFAIwYAgNO29yL0TayKgH/Kwu+PHz+OH374Ybx582acnZ2NX375ZYwxxosXL8b79+/H+fn5+Pjx45FHCQAA/wxJgBwzNqa+pLWN6+vr8fr16/HmzZvx4sWLMcYY79+/H69evRp///33Qw0VAABO3km/gvWQPnz4MM7Pz8eHDx/G1dXVePXq1bi+vj72sAAA4B9l5wCZWl9xyH01dr3nQ32Z6/r6epyfn4/z83PxAQAAO9jrFaypz98e0q73fKgIubq62vs3AADgqXo2m80+rbtgsViMi4uLajwnYz6fj+VyeexhAADAo2INCAAAkBEgAABARoAAAACZe9eAjPG/dSBsx/oPAAD40r0zIOJjN/6/AQDAlzb6DO9XX/906HGcnL9++/nYQwAAgEfHGhAAACAjQAAAgMxeO6GPMcavi893If/P8nLt+bvXTZ2/uebXxct7f3PV+bvHpo5PXQsAADy8vQJk0wf6dTFw+9wmMbDpPTf9LQAAoLPzK1hTD/g3sxaHsM097xuHmQ8AAOg92TUg4gMAAHonHSCHnI0BAAC2t/ci9E2sigAzEAAA8PQkAXLM2Jj6khYAANA76VewAACAx2XnAJlaX3HI2YZd72ktCAAAPA57vYI19fnbQ9r1niIEAACO79lsNvu07oLFYjG++vqnajwn46/ffh7L5fLYwwAAgEfFGhAAACAjQAAAgIwAAQAAMhstQrd4e3vz+fzYQwAAgEfHDAgAAJARIAAAQGavfUDGGOPy8vM9OF6+fLn2/N3rps7fXHN5eXnvb646f/fY3eP3/QYAAPDw9gqQqTi4e2xdDNw+NxUOu9xz3W9tez0AAPAwdn4Fa+qB/WbW4hC2uee6cQgNAAA4DmtAAACAzEkHyCFnYwAAgO3tvQh9E6si4DG9BmX9BwAANJIAOebD/dSXtG6IDwAA6Jz0K1j3ER8AANDaOUCm1lcc8qF+13uu+jvxAQAAvb1ewZr6/O0h7XrP239395/b/A4AALC7Z7PZ7NO6CxaLxbi4uKjGczLm8/lYLpfHHgYAADwqT3oNCAAA0BIgAABARoAAAAAZAQIAAGQECAAAkBEgAABAZq99QMa4fy+NVRsH3r5u6vzNNas2DNzknqv29Lh93B4gAADQ2ytApuLg7rF1MXD73Ca7k296z3W/te31AADAw9j5FaypB/ZVO5U/lG3uuW4cQgMAAI7DGhAAACCz9xqQx2xqDcmN2zMkZkUAAODwkgBZ9SrUY3jg33b9CQAAsJ8kQI75YH/fLAgAANCxBgQAAMjsHCBTX5k65GzDrve8+3eH+koXAACw3l6vYE19/vaQdr3n7b87xrgBAIAxns1ms0/rLlgsFuPi4qIaz8mYz+djuVweexgAAPCoWAMCAABkBAgAAJARIAAAQEaAAAAAGQECAABkBAgAAJDZax+QMb7c1O/ufhpTm/7dXLduU8Cb/Tru+81V51ft67HtcQAA4GHtFSBTcXD32LqH/tvnNgmBTe+5aVTYFR0AADo7v4I19YC/apfxh7LNPQ85DgAAYDdPeg2IV68AAKB10gFiFgQAAB6XvRehb2JVBBx75sHsBwAA9JIAOeaD/tSXtAAAgN5Jv4I15WZG5vLy8rN/BwAADmvnAJlaX3HI2YZd73n3724+/3v7M8BmSAAA4PD2egVr6vO3h7TrPS1IBwCA43s2m80+rbtgsViMi4uLajwnYz6fj+VyeexhAADAo/Ik14AAAADHIUAAAICMAAEAADIbLUKfz+eHHgcAAPAE3LsIHQAA4KF4BQsAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMgIEAAAICNAAACAjAABAAAyAgQAAMj8FxtjyPFFdO+SAAAAAElFTkSuQmCC
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/4774354-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/4774354-expected.png
index 40212eb..da189fa 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/4774354-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/4774354-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
index 7992e83..28ee138 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
index 785a361..6dd2c53 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
index 88aa5ff..f41b627 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [8, 8, 48, 32]
       ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
index 94c8f58..b20f2d6 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
index 503481b..67c4ab79 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [0, 8, 40, 32]
       ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
index 2849a72..7e3403a 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
index 003cb1e..82e3e6f 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [8, 8, 32, 48]
       ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
index 9887934a..82f477a 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
index 003cb1e..82e3e6f 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [8, 8, 32, 48]
       ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
index f04b9c95..ce4c510 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
similarity index 66%
rename from third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
rename to third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
index bed46977..b2a859e 100644
--- a/third_party/blink/web_tests/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
@@ -1,10 +1,10 @@
 {
   "layers": [
     {
-      "name": "Scrolling background of LayoutView #document",
+      "name": "Scrolling background of LayoutNGView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
+      "backgroundColor": "#90EE90",
       "invalidations": [
         [24, 8, 16, 16],
         [8, 24, 16, 16],
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png
index 8028bd6d3..8556d8b 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-after-remove-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-after-remove-expected.png
index 56e82b7..d92a73e 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-after-remove-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-after-remove-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png
index eae6d71..4b9f844 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png
index 76d8e6f..c9ab563 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
index bd1fec4..afbffdc 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-rl-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-rl-expected.png
index 3e24792..7314432 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-rl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-within-composited-scroller-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-within-composited-scroller-expected.png
index fb477fe..d7ecad4 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-within-composited-scroller-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-within-composited-scroller-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
index c0a5ea2..c1a30395 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-expected.png
index 085aa93..fc7e9ce7 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-64px-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-64px-expected.png
index a964c94..354938f 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-64px-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-64px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-8px-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-8px-expected.png
index 41eda78b..b4ee83d 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-8px-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-font-8px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-125-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-125-expected.png
index 6115b59..5097ee5 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-125-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-150-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-150-expected.png
index 5284b1e..ad982a7 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-150-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-175-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-175-expected.png
index 7aa1354..486ebf5 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-175-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-175-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-200-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-200-expected.png
index 5634b5d9..fa93640 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-200-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-2000-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-2000-expected.png
index 6c5d580..eee3d64 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-2000-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-2000-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-250-expected.png b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-250-expected.png
index 54cd144..2025346 100644
--- a/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-250-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/markers/document-markers-zoom-250-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/image-writing-modes-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/image-writing-modes-expected.png
index a0ae21a2..305a6061 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/image-writing-modes-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/image-writing-modes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-expected.png
index 10c7a76..dcf2b0e 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-rtl-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-rtl-expected.png
index b8e8fe4..4d0e271 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-inline-block-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-expected.png
index f04b9c95..ce4c510 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
similarity index 84%
rename from third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
rename to third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
index c7db599b..743d927 100644
--- a/third_party/blink/web_tests/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-br-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-br-expected.png
index f04b9c95..ce4c510 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-br-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-clipped-by-overflow-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
index 4b0ee85..50b7925 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-expected.png
index 785a361..6dd2c53 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
index 67f69fe..757e77c 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
index 9ac2f20..41de509 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-expected.png
index 94c8f58..b20f2d6 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-across-line-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-across-line-expected.png
index 8b759cf..d8517953 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-across-line-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-across-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-expected.png
index 24233494..c540c5a 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-lr-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-lr-expected.png
index 2849a72..7e3403a 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-rl-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-rl-expected.png
index 9887934a..82f477a 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-newline-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-update-style-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-update-style-expected.png
index 419dc0d..ada2dc06 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-update-style-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-update-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-with-composition-expected.png b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-with-composition-expected.png
index 30c16832..e530778 100644
--- a/third_party/blink/web_tests/platform/win/paint/selection/text-selection-with-composition-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/selection/text-selection-with-composition-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/text/selection-no-clip-text-expected.png b/third_party/blink/web_tests/platform/win/paint/text/selection-no-clip-text-expected.png
index 70761e0..44f583e 100644
--- a/third_party/blink/web_tests/platform/win/paint/text/selection-no-clip-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/text/selection-no-clip-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/text/vertical-upright-oblique-expected.png b/third_party/blink/web_tests/platform/win/paint/text/vertical-upright-oblique-expected.png
index 62bce779..adf92250 100644
--- a/third_party/blink/web_tests/platform/win/paint/text/vertical-upright-oblique-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/text/vertical-upright-oblique-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/text/foreignObject-text-clipping-bug-expected.png b/third_party/blink/web_tests/platform/win/svg/text/foreignObject-text-clipping-bug-expected.png
index 7158ccf8..7b25b1c 100644
--- a/third_party/blink/web_tests/platform/win/svg/text/foreignObject-text-clipping-bug-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/text/foreignObject-text-clipping-bug-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png
index c32116b..c17069e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/text-selection-outside-control-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/text/input-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/text/input-focus-ring-expected.png
index 9cd4cf4..d3f1f1bc 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/text/input-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/text/input-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png
index 16c62c7..a0989fff 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-kerning-and-ligatures-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png
index 42dffea..3da680b6 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/atsui-rtl-override-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png
index 4a56d12..432ea37 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/complex-text-rtl-selection-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/emphasis-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/emphasis-expected.png
index 4476590c..1a6a0fda 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/emphasis-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/emphasis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-expected.png
index 18d84d6..cad21d9 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-nested-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
index 26fbcea..c91b1877e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/flexbox-selection-nested-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/khmer-selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/khmer-selection-expected.png
index 15130b96..c430820 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/khmer-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/khmer-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/mixed-directionality-selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/mixed-directionality-selection-expected.png
index a424062..983d3550 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/mixed-directionality-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/mixed-directionality-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png
index 878dbe8..824d6fe6 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/pre-wrap-overflow-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-painting-hidpi-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
index 64257ec..9d909d2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-painting-hidpi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-with-inline-padding-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-with-inline-padding-expected.png
index cce9941a..d0b02407 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-with-inline-padding-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/selection-with-inline-padding-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/shaping-selection-rect-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/shaping-selection-rect-expected.png
index f2ae473..9ba79001 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/shaping-selection-rect-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/shaping-selection-rect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/should-use-atsui-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/should-use-atsui-expected.png
index ad352f6..8fd19e4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/should-use-atsui-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/selection/should-use-atsui-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/forms/select-popup/popup-menu-appearance-tall-expected.png b/third_party/blink/web_tests/platform/win10/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
index 17f238b2..9470ddb 100644
--- a/third_party/blink/web_tests/platform/win10/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
+++ b/third_party/blink/web_tests/platform/win10/fast/forms/select-popup/popup-menu-appearance-tall-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/prefetch/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub-expected.txt b/third_party/blink/web_tests/virtual/prefetch/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub-expected.txt
new file mode 100644
index 0000000..ea1d86b4
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/prefetch/external/wpt/speculation-rules/prefetch/prefetch-traverse-reload.sub-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+PASS prefetches can be used for traversal navigations
+FAIL History's Document is used for traversal navigations assert_equals: prefetch from different Document should not be used expected "" but got "prefetch"
+PASS prefetches can be used for reload navigations
+Harness: the test ran to completion.
+
diff --git a/third_party/cpuinfo/cpuinfo.gni b/third_party/cpuinfo/cpuinfo.gni
index be4e155..e0e8c02 100644
--- a/third_party/cpuinfo/cpuinfo.gni
+++ b/third_party/cpuinfo/cpuinfo.gni
@@ -8,6 +8,8 @@
     current_cpu != "s390" && current_cpu != "s390x" &&
     # cpuinfo is not supported on fuchsia.
     !is_fuchsia &&
+    # cpuinfo is crashy on the Windows Arm64 chips.
+    !(is_win && current_cpu == "arm64") &&
     # There's a few arm architectures that are not supported by cpuinfo,
     # especially amongst ChromeOS devices.
     # See //third_party/cpuinfo/src/src/arm/linux/cp.h.
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 3395a082..363491c3 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-0-90-g9127c68f5
-Revision: 9127c68f593d9509bc289518bf907c311425e694
+Version: VER-2-13-0-97-g8fe50c2ad
+Revision: 8fe50c2adca74a4eca1501c831251283b4cc6d9b
 CPEPrefix: cpe:/a:freetype:freetype:2.12.1
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/libei/OWNERS b/third_party/libei/OWNERS
index b6b89e7f..5dcd134 100644
--- a/third_party/libei/OWNERS
+++ b/third_party/libei/OWNERS
@@ -1,3 +1,3 @@
 lambroslambrou@chromium.org
 maxbooth@chromium.org
-salmanmalik@chromium.org
+rasputin@google.com
diff --git a/third_party/rust/Cargo.lock b/third_party/rust/Cargo.lock
index a8470fbb..8e23e5c 100644
--- a/third_party/rust/Cargo.lock
+++ b/third_party/rust/Cargo.lock
@@ -379,7 +379,7 @@
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.3"
+version = "1.0.8"
 
 [[package]]
 name = "unicode-linebreak"
diff --git a/third_party/rust/unicode_ident/v1/BUILD.gn b/third_party/rust/unicode_ident/v1/BUILD.gn
index 25f41d6..4b12bbd 100644
--- a/third_party/rust/unicode_ident/v1/BUILD.gn
+++ b/third_party/rust/unicode_ident/v1/BUILD.gn
@@ -18,7 +18,7 @@
   build_native_rust_unit_tests = false
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
-  cargo_pkg_version = "1.0.3"
+  cargo_pkg_version = "1.0.8"
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "unicode-ident"
   cargo_pkg_description = "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31"
diff --git a/third_party/rust/unicode_ident/v1/README.chromium b/third_party/rust/unicode_ident/v1/README.chromium
index f0fd9d2..6b1116d 100644
--- a/third_party/rust/unicode_ident/v1/README.chromium
+++ b/third_party/rust/unicode_ident/v1/README.chromium
@@ -1,6 +1,7 @@
 Name: unicode-ident
 URL: https://crates.io/crates/unicode-ident
 Description: Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31
-Version: 1.0.3
+Version: 1.0.8
 Security Critical: no
-License: Apache 2.0, Unicode DFS 2016
+License: Apache 2.0, Unicode License Agreement - Data Files and Software (2016)
+Revision: c4f455414fdb61f354bbed176d27528b8d726391
diff --git a/third_party/rust/unicode_ident/v1/crate/.cargo_vcs_info.json b/third_party/rust/unicode_ident/v1/crate/.cargo_vcs_info.json
index e6a5bfe..295e0b8 100644
--- a/third_party/rust/unicode_ident/v1/crate/.cargo_vcs_info.json
+++ b/third_party/rust/unicode_ident/v1/crate/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "e970dad20b00d4e992c2e2fb1af32220d3e9398e"
+    "sha1": "c4f455414fdb61f354bbed176d27528b8d726391"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff --git a/third_party/rust/unicode_ident/v1/crate/.gitattributes b/third_party/rust/unicode_ident/v1/crate/.gitattributes
index 696f4e6..735b3ee 100644
--- a/third_party/rust/unicode_ident/v1/crate/.gitattributes
+++ b/third_party/rust/unicode_ident/v1/crate/.gitattributes
@@ -1,5 +1,5 @@
-generate/src/ucd.rs linguist-generated
 src/tables.rs linguist-generated
 tests/fst/xid_continue.fst linguist-generated
 tests/fst/xid_start.fst linguist-generated
+tests/tables/tables.rs linguist-generated
 tests/trie/trie.rs linguist-generated
diff --git a/third_party/rust/unicode_ident/v1/crate/.github/FUNDING.yml b/third_party/rust/unicode_ident/v1/crate/.github/FUNDING.yml
new file mode 100644
index 0000000..7507077
--- /dev/null
+++ b/third_party/rust/unicode_ident/v1/crate/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: dtolnay
diff --git a/third_party/rust/unicode_ident/v1/crate/.github/workflows/ci.yml b/third_party/rust/unicode_ident/v1/crate/.github/workflows/ci.yml
index a9684ad..b74694e 100644
--- a/third_party/rust/unicode_ident/v1/crate/.github/workflows/ci.yml
+++ b/third_party/rust/unicode_ident/v1/crate/.github/workflows/ci.yml
@@ -3,49 +3,66 @@
 on:
   push:
   pull_request:
+  workflow_dispatch:
   schedule: [cron: "40 1 * * *"]
 
+permissions:
+  contents: read
+
 env:
   RUSTFLAGS: -Dwarnings
 
 jobs:
+  pre_ci:
+    uses: dtolnay/.github/.github/workflows/pre_ci.yml@master
+
   unicode:
     name: latest Unicode
     runs-on: ubuntu-latest
     if: github.event_name != 'pull_request'
+    timeout-minutes: 45
     steps:
       - uses: actions/checkout@v3
       - uses: dtolnay/rust-toolchain@stable
       - id: ucd-generate
-        run: echo "::set-output name=version::$(grep 'ucd-generate [0-9]\+\.[0-9]\+\.[0-9]\+' generate/src/ucd.rs --only-matching)"
+        run: echo "version=$(grep 'ucd-generate [0-9]\+\.[0-9]\+\.[0-9]\+' tests/tables/tables.rs --only-matching)" >> $GITHUB_OUTPUT
       - run: cargo install ucd-generate
       - run: curl -LO https://www.unicode.org/Public/zipped/latest/UCD.zip
       - run: unzip UCD.zip -d UCD
-      - run: ucd-generate property-bool UCD --include XID_Start,XID_Continue > generate/src/ucd.rs
+      - run: ucd-generate property-bool UCD --include XID_Start,XID_Continue > tests/tables/tables.rs
       - run: ucd-generate property-bool UCD --include XID_Start,XID_Continue --fst-dir tests/fst
       - run: ucd-generate property-bool UCD --include XID_Start,XID_Continue --trie-set > tests/trie/trie.rs
       - run: cargo run --manifest-path generate/Cargo.toml
-      - run: sed --in-place 's/ucd-generate [0-9]\+\.[0-9]\+\.[0-9]\+/${{steps.ucd-generate.outputs.version}}/' generate/src/ucd.rs tests/trie/trie.rs
+      - run: sed --in-place 's/ucd-generate [0-9]\+\.[0-9]\+\.[0-9]\+/${{steps.ucd-generate.outputs.version}}/' tests/tables/tables.rs tests/trie/trie.rs
       - run: git diff --exit-code
 
   test:
     name: Rust ${{matrix.rust}}
+    needs: pre_ci
+    if: needs.pre_ci.outputs.continue
     runs-on: ubuntu-latest
     strategy:
       fail-fast: false
       matrix:
         rust: [nightly, beta, stable]
+    timeout-minutes: 45
     steps:
       - uses: actions/checkout@v3
       - uses: dtolnay/rust-toolchain@master
         with:
           toolchain: ${{matrix.rust}}
+      - name: Enable type layout randomization
+        run: echo RUSTFLAGS=${RUSTFLAGS}\ -Zrandomize-layout >> $GITHUB_ENV
+        if: matrix.rust == 'nightly'
       - run: cargo test
       - run: cargo check --benches
 
   msrv:
     name: Rust 1.31.0
+    needs: pre_ci
+    if: needs.pre_ci.outputs.continue
     runs-on: ubuntu-latest
+    timeout-minutes: 45
     steps:
       - uses: actions/checkout@v3
       - uses: dtolnay/rust-toolchain@1.31.0
@@ -55,15 +72,17 @@
     name: Clippy
     runs-on: ubuntu-latest
     if: github.event_name != 'pull_request'
+    timeout-minutes: 45
     steps:
       - uses: actions/checkout@v3
       - uses: dtolnay/rust-toolchain@clippy
-      - run: cargo clippy --tests --benches -- -Dclippy::all -Dclippy::pedantic
+      - run: cargo clippy --tests --benches --workspace -- -Dclippy::all -Dclippy::pedantic
 
   outdated:
     name: Outdated
     runs-on: ubuntu-latest
     if: github.event_name != 'pull_request'
+    timeout-minutes: 45
     steps:
       - uses: actions/checkout@v3
       - uses: dtolnay/install@cargo-outdated
diff --git a/third_party/rust/unicode_ident/v1/crate/Cargo.toml b/third_party/rust/unicode_ident/v1/crate/Cargo.toml
index d946cc8..05687ca9 100644
--- a/third_party/rust/unicode_ident/v1/crate/Cargo.toml
+++ b/third_party/rust/unicode_ident/v1/crate/Cargo.toml
@@ -13,12 +13,15 @@
 edition = "2018"
 rust-version = "1.31"
 name = "unicode-ident"
-version = "1.0.3"
+version = "1.0.8"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 description = "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31"
 documentation = "https://docs.rs/unicode-ident"
 readme = "README.md"
-keywords = ["unicode"]
+keywords = [
+    "unicode",
+    "xid",
+]
 categories = [
     "development-tools::procedural-macro-helpers",
     "no-std",
@@ -29,12 +32,15 @@
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]
 
+[lib]
+doc-scrape-examples = false
+
 [[bench]]
 name = "xid"
 harness = false
 
 [dev-dependencies.criterion]
-version = "0.3"
+version = "0.4"
 default-features = false
 
 [dev-dependencies.fst]
@@ -45,11 +51,11 @@
 features = ["small_rng"]
 
 [dev-dependencies.roaring]
-version = "0.9"
+version = "0.10"
 
 [dev-dependencies.ucd-trie]
 version = "0.1"
 default-features = false
 
 [dev-dependencies.unicode-xid]
-version = "0.2"
+version = "0.2.4"
diff --git a/third_party/rust/unicode_ident/v1/crate/Cargo.toml.orig b/third_party/rust/unicode_ident/v1/crate/Cargo.toml.orig
index 5a56d8b..7f70f04c 100644
--- a/third_party/rust/unicode_ident/v1/crate/Cargo.toml.orig
+++ b/third_party/rust/unicode_ident/v1/crate/Cargo.toml.orig
@@ -1,24 +1,23 @@
 [package]
 name = "unicode-ident"
-version = "1.0.3"
+version = "1.0.8"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::procedural-macro-helpers", "no-std"]
 description = "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31"
 documentation = "https://docs.rs/unicode-ident"
 edition = "2018"
-keywords = ["unicode"]
+keywords = ["unicode", "xid"]
 license = "(MIT OR Apache-2.0) AND Unicode-DFS-2016"
-readme = "README.md"
 repository = "https://github.com/dtolnay/unicode-ident"
 rust-version = "1.31"
 
 [dev-dependencies]
-criterion = { version = "0.3", default-features = false }
+criterion = { version = "0.4", default-features = false }
 fst = "0.4"
 rand = { version = "0.8", features = ["small_rng"] }
-roaring = "0.9"
+roaring = "0.10"
 ucd-trie = { version = "0.1", default-features = false }
-unicode-xid = "0.2"
+unicode-xid = "0.2.4"
 
 [[bench]]
 name = "xid"
@@ -27,5 +26,8 @@
 [workspace]
 members = ["diagram", "generate"]
 
+[lib]
+doc-scrape-examples = false
+
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]
diff --git a/third_party/rust/unicode_ident/v1/crate/LICENSE-APACHE b/third_party/rust/unicode_ident/v1/crate/LICENSE-APACHE
index 16fe87b..1b5ec8b 100644
--- a/third_party/rust/unicode_ident/v1/crate/LICENSE-APACHE
+++ b/third_party/rust/unicode_ident/v1/crate/LICENSE-APACHE
@@ -174,28 +174,3 @@
    of your accepting any such warranty or additional liability.
 
 END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/third_party/rust/unicode_ident/v1/crate/README.md b/third_party/rust/unicode_ident/v1/crate/README.md
index 5a63c613..dfb943b 100644
--- a/third_party/rust/unicode_ident/v1/crate/README.md
+++ b/third_party/rust/unicode_ident/v1/crate/README.md
@@ -4,7 +4,7 @@
 [<img alt="github" src="https://img.shields.io/badge/github-dtolnay/unicode--ident-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/dtolnay/unicode-ident)
 [<img alt="crates.io" src="https://img.shields.io/crates/v/unicode-ident.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/unicode-ident)
 [<img alt="docs.rs" src="https://img.shields.io/badge/docs.rs-unicode--ident-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs" height="20">](https://docs.rs/unicode-ident)
-[<img alt="build status" src="https://img.shields.io/github/workflow/status/dtolnay/unicode-ident/CI/master?style=for-the-badge" height="20">](https://github.com/dtolnay/unicode-ident/actions?query=branch%3Amaster)
+[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/dtolnay/unicode-ident/ci.yml?branch=master&style=for-the-badge" height="20">](https://github.com/dtolnay/unicode-ident/actions?query=branch%3Amaster)
 
 Implementation of [Unicode Standard Annex #31][tr31] for determining which
 `char` values are valid in programming language identifiers.
@@ -41,10 +41,10 @@
 
 | | static storage | 0% nonascii | 1% | 10% | 100% nonascii |
 |---|---|---|---|---|---|
-| **`unicode-ident`** | 9.75 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |
-| **`unicode-xid`** | 11.34 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns |
-| **`ucd-trie`** | 9.95 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns |
-| **`fst`** | 133 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |
+| **`unicode-ident`** | 10.0 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |
+| **`unicode-xid`** | 11.5 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns |
+| **`ucd-trie`** | 10.2 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns |
+| **`fst`** | 138 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |
 | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns |
 
 Source code for the benchmark is provided in the *bench* directory of this repo
diff --git a/third_party/rust/unicode_ident/v1/crate/src/lib.rs b/third_party/rust/unicode_ident/v1/crate/src/lib.rs
index 42126dd..b20ecc4 100644
--- a/third_party/rust/unicode_ident/v1/crate/src/lib.rs
+++ b/third_party/rust/unicode_ident/v1/crate/src/lib.rs
@@ -242,6 +242,7 @@
 //! this data structure is straight-line code with no need for branching.
 
 #![no_std]
+#![doc(html_root_url = "https://docs.rs/unicode-ident/1.0.8")]
 #![allow(clippy::doc_markdown, clippy::must_use_candidate)]
 
 #[rustfmt::skip]
diff --git a/third_party/rust/unicode_ident/v1/crate/src/tables.rs b/third_party/rust/unicode_ident/v1/crate/src/tables.rs
index a697636b..b355f30 100644
--- a/third_party/rust/unicode_ident/v1/crate/src/tables.rs
+++ b/third_party/rust/unicode_ident/v1/crate/src/tables.rs
@@ -1,6 +1,6 @@
 // @generated by ../generate. To regenerate, run the following in the repo root:
 //
-// $ curl -LO https://www.unicode.org/Public/zipped/14.0.0/UCD.zip
+// $ curl -LO https://www.unicode.org/Public/zipped/15.0.0/UCD.zip
 // $ unzip UCD.zip -d UCD
 // $ cargo run --manifest-path generate/Cargo.toml
 
@@ -28,7 +28,7 @@
 
 pub(crate) const CHUNK: usize = 64;
 
-pub(crate) static TRIE_START: Align8<[u8; 394]> = Align8([
+pub(crate) static TRIE_START: Align8<[u8; 402]> = Align8([
     0x04, 0x0B, 0x0F, 0x13, 0x17, 0x1B, 0x1F, 0x23, 0x27, 0x2D, 0x31, 0x34, 0x38, 0x3C, 0x40, 0x02,
     0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
@@ -39,21 +39,22 @@
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x60, 0x64, 0x66,
     0x6A, 0x6E, 0x72, 0x28, 0x76, 0x78, 0x7C, 0x80, 0x84, 0x88, 0x8C, 0x90, 0x94, 0x98, 0x9E, 0xA2,
     0x05, 0x2B, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x99, 0x05, 0x05, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x05, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x05, 0xAE, 0x00, 0xB2, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x32, 0x05, 0x05, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x43, 0xB8, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xC6, 0x00, 0x00, 0x00, 0xB9,
-    0xBC, 0xCF, 0x00, 0xBF, 0xD3, 0x00, 0x00, 0xD7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x05, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x05, 0xB1, 0x00, 0xB5, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+    0x05, 0x05, 0x05, 0x32, 0x05, 0x05, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x43, 0xBB, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC8, 0x00, 0x00, 0x00, 0xAF,
+    0xCE, 0xD2, 0xD6, 0xBC, 0xDA, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0xD9, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x52, 0xDC, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xDF, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE1, 0x00, 0x00,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xDD,
+    0x05, 0x05, 0x05, 0xE0, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x52, 0xE3, 0x05, 0x05, 0x05,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE6, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x00, 0x00,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE4, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+    0x05, 0xE7,
 ]);
 
 pub(crate) static TRIE_CONTINUE: Align8<[u8; 1793]> = Align8([
@@ -66,23 +67,23 @@
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62, 0x64, 0x68,
     0x6C, 0x70, 0x74, 0x28, 0x76, 0x7A, 0x7E, 0x82, 0x86, 0x8A, 0x8E, 0x92, 0x96, 0x9B, 0xA0, 0xA4,
-    0x05, 0x2B, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x99, 0x05, 0x05, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x05, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x05, 0xB0, 0x00, 0xB4, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x32, 0x05, 0x05, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x43, 0xB8, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xAC, 0xC1, 0xC4, 0xC8, 0x00, 0xCA, 0x00, 0xB9,
-    0xCD, 0xD1, 0x00, 0xBF, 0xD5, 0x00, 0x00, 0xD7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x00, 0x00,
+    0x05, 0x2B, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x99, 0x05, 0x05, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x05, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x05, 0xB3, 0x00, 0xB7, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+    0x05, 0x05, 0x05, 0x32, 0x05, 0x05, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x43, 0xBB, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xAC, 0xC4, 0xC6, 0xCA, 0x00, 0xCC, 0x00, 0xAF,
+    0xD0, 0xD4, 0xD8, 0xBC, 0xDC, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0xD9, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x52, 0xDC, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xDF, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE1, 0x00, 0x00,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x05, 0x05, 0x05, 0xE0, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x52, 0xE3, 0x05, 0x05, 0x05,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE6, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x00, 0x00,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE4, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+    0x05, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -169,10 +170,10 @@
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xCB,
+    0xC2,
 ]);
 
-pub(crate) static LEAF: Align64<[u8; 7264]> = Align64([
+pub(crate) static LEAF: Align64<[u8; 7520]> = Align64([
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -240,7 +241,7 @@
     0xF0, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0x00, 0x40, 0x70, 0x80, 0x03, 0x00, 0x00, 0xFC,
     0xE0, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0xFB, 0x2F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, 0xF3, 0xDF, 0x3D, 0x60, 0x27, 0xCF, 0xFF, 0x00, 0x00,
-    0xEF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xEF, 0xF3, 0xDF, 0x3D, 0x60, 0x60, 0xCF, 0xFF, 0x06, 0x00,
+    0xEF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFD, 0xEF, 0xF3, 0xDF, 0x3D, 0x60, 0x60, 0xCF, 0xFF, 0x0E, 0x00,
     0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7D, 0xF0, 0x80, 0xCF, 0xFF, 0x00, 0xFC,
     0xEE, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0xFB, 0x2F, 0x7F, 0x84, 0x5F, 0xFF, 0xC0, 0xFF, 0x0C, 0x00,
     0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -248,7 +249,7 @@
     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00,
     0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x7F, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
-    0xD6, 0xF7, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0x3F, 0x5F, 0x3F, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00,
+    0xD6, 0xF7, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0x3F, 0x5F, 0x7F, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00,
     0x01, 0x00, 0x00, 0x03, 0xFF, 0x03, 0xA0, 0xC2, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0xFE, 0xFF,
     0xDF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0x00, 0x00, 0x3F, 0x3C, 0x62, 0xC0, 0xE1, 0xFF,
@@ -309,7 +310,7 @@
     0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF0, 0x00, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x27, 0x00, 0xF0, 0x00, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80,
     0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -339,7 +340,7 @@
     0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0x1F, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x80,
     0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
@@ -434,7 +435,7 @@
     0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
     0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
     0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF,
     0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00,
     0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00,
@@ -445,11 +446,11 @@
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x04, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x03,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xDE, 0xFF, 0x17, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x7F, 0xBD, 0xFF, 0xBF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
     0xE0, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xED, 0x23, 0x00, 0x00, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x7F, 0xBD, 0xFF, 0xBF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x03,
     0xEF, 0x9F, 0xF9, 0xFF, 0xFF, 0xFD, 0xED, 0xFB, 0x9F, 0x39, 0x81, 0xE0, 0xCF, 0x1F, 0x1F, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -499,28 +500,34 @@
     0xFF, 0x7F, 0xFB, 0x01, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xF4, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x07, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE3, 0x07, 0xF8,
     0xE7, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0x7F, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xE0,
@@ -545,26 +552,24 @@
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x6F, 0xFF, 0x7F,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x1F,
     0xFF, 0x01, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x3F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x1F,
     0xFF, 0x01, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x6F, 0xFF, 0x7F,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xDF, 0x64, 0xDE, 0xFF, 0xEB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xBF, 0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0x7B, 0x5F, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -581,10 +586,12 @@
     0x10, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
-    0x7F, 0xFF, 0xFF, 0xF9, 0xDB, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0x3F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x7F, 0xFF, 0xFF, 0xF9, 0xDB, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00,
+    0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -595,6 +602,14 @@
     0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -617,12 +632,14 @@
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff --git a/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_continue.fst b/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_continue.fst
index 5359051c..05e7b1aa 100644
--- a/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_continue.fst
+++ b/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_continue.fst
Binary files differ
diff --git a/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_start.fst b/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_start.fst
index 5c2e43f..a5975b6 100644
--- a/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_start.fst
+++ b/third_party/rust/unicode_ident/v1/crate/tests/fst/xid_start.fst
Binary files differ
diff --git a/third_party/rust/unicode_ident/v1/crate/tests/static_size.rs b/third_party/rust/unicode_ident/v1/crate/tests/static_size.rs
index f0e04d4..610adf31 100644
--- a/third_party/rust/unicode_ident/v1/crate/tests/static_size.rs
+++ b/third_party/rust/unicode_ident/v1/crate/tests/static_size.rs
@@ -1,4 +1,4 @@
-#![allow(clippy::unreadable_literal)]
+#![allow(clippy::let_underscore_untyped, clippy::unreadable_literal)]
 
 use std::mem::size_of_val;
 
@@ -13,20 +13,19 @@
         + size_of_val(&tables::TRIE_START)
         + size_of_val(&tables::TRIE_CONTINUE)
         + size_of_val(&tables::LEAF);
-    assert_eq!(9752, size);
+    assert_eq!(10016, size);
 }
 
 #[test]
 fn test_xid_size() {
     #[deny(dead_code)]
-    #[allow(clippy::redundant_static_lifetimes)]
-    #[path = "../generate/src/ucd.rs"]
-    mod ucd;
+    #[path = "tables/mod.rs"]
+    mod tables;
 
-    let size = size_of_val(ucd::XID_START) + size_of_val(ucd::XID_CONTINUE);
-    assert_eq!(11344, size);
+    let size = size_of_val(tables::XID_START) + size_of_val(tables::XID_CONTINUE);
+    assert_eq!(11528, size);
 
-    let _ = ucd::BY_NAME;
+    let _ = tables::BY_NAME;
 }
 
 #[cfg(target_pointer_width = "64")]
@@ -71,7 +70,7 @@
         + size_of_val(tree3_level2)
         + size_of_val(tree3_level3);
 
-    assert_eq!(9952, start_size + continue_size);
+    assert_eq!(10208, start_size + continue_size);
 
     let _ = trie::BY_NAME;
 }
@@ -81,7 +80,7 @@
     let xid_start_fst = include_bytes!("fst/xid_start.fst");
     let xid_continue_fst = include_bytes!("fst/xid_continue.fst");
     let size = xid_start_fst.len() + xid_continue_fst.len();
-    assert_eq!(132897, size);
+    assert_eq!(137749, size);
 }
 
 #[test]
diff --git a/third_party/rust/unicode_ident/v1/crate/tests/tables/mod.rs b/third_party/rust/unicode_ident/v1/crate/tests/tables/mod.rs
new file mode 100644
index 0000000..72bfd8bd
--- /dev/null
+++ b/third_party/rust/unicode_ident/v1/crate/tests/tables/mod.rs
@@ -0,0 +1,7 @@
+#![allow(clippy::module_inception)]
+
+#[allow(clippy::redundant_static_lifetimes)]
+#[rustfmt::skip]
+mod tables;
+
+pub(crate) use self::tables::*;
diff --git a/third_party/rust/unicode_ident/v1/crate/tests/tables/tables.rs b/third_party/rust/unicode_ident/v1/crate/tests/tables/tables.rs
new file mode 100644
index 0000000..30aeee9
--- /dev/null
+++ b/third_party/rust/unicode_ident/v1/crate/tests/tables/tables.rs
@@ -0,0 +1,347 @@
+// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY:
+//
+//   ucd-generate property-bool UCD --include XID_Start,XID_Continue
+//
+// Unicode version: 15.0.0.
+//
+// ucd-generate 0.2.13 is available on crates.io.
+
+pub const BY_NAME: &'static [(&'static str, &'static [(u32, u32)])] = &[
+  ("XID_Continue", XID_CONTINUE), ("XID_Start", XID_START),
+];
+
+pub const XID_CONTINUE: &'static [(u32, u32)] = &[
+  (48, 57), (65, 90), (95, 95), (97, 122), (170, 170), (181, 181), (183, 183),
+  (186, 186), (192, 214), (216, 246), (248, 705), (710, 721), (736, 740),
+  (748, 748), (750, 750), (768, 884), (886, 887), (891, 893), (895, 895),
+  (902, 906), (908, 908), (910, 929), (931, 1013), (1015, 1153), (1155, 1159),
+  (1162, 1327), (1329, 1366), (1369, 1369), (1376, 1416), (1425, 1469),
+  (1471, 1471), (1473, 1474), (1476, 1477), (1479, 1479), (1488, 1514),
+  (1519, 1522), (1552, 1562), (1568, 1641), (1646, 1747), (1749, 1756),
+  (1759, 1768), (1770, 1788), (1791, 1791), (1808, 1866), (1869, 1969),
+  (1984, 2037), (2042, 2042), (2045, 2045), (2048, 2093), (2112, 2139),
+  (2144, 2154), (2160, 2183), (2185, 2190), (2200, 2273), (2275, 2403),
+  (2406, 2415), (2417, 2435), (2437, 2444), (2447, 2448), (2451, 2472),
+  (2474, 2480), (2482, 2482), (2486, 2489), (2492, 2500), (2503, 2504),
+  (2507, 2510), (2519, 2519), (2524, 2525), (2527, 2531), (2534, 2545),
+  (2556, 2556), (2558, 2558), (2561, 2563), (2565, 2570), (2575, 2576),
+  (2579, 2600), (2602, 2608), (2610, 2611), (2613, 2614), (2616, 2617),
+  (2620, 2620), (2622, 2626), (2631, 2632), (2635, 2637), (2641, 2641),
+  (2649, 2652), (2654, 2654), (2662, 2677), (2689, 2691), (2693, 2701),
+  (2703, 2705), (2707, 2728), (2730, 2736), (2738, 2739), (2741, 2745),
+  (2748, 2757), (2759, 2761), (2763, 2765), (2768, 2768), (2784, 2787),
+  (2790, 2799), (2809, 2815), (2817, 2819), (2821, 2828), (2831, 2832),
+  (2835, 2856), (2858, 2864), (2866, 2867), (2869, 2873), (2876, 2884),
+  (2887, 2888), (2891, 2893), (2901, 2903), (2908, 2909), (2911, 2915),
+  (2918, 2927), (2929, 2929), (2946, 2947), (2949, 2954), (2958, 2960),
+  (2962, 2965), (2969, 2970), (2972, 2972), (2974, 2975), (2979, 2980),
+  (2984, 2986), (2990, 3001), (3006, 3010), (3014, 3016), (3018, 3021),
+  (3024, 3024), (3031, 3031), (3046, 3055), (3072, 3084), (3086, 3088),
+  (3090, 3112), (3114, 3129), (3132, 3140), (3142, 3144), (3146, 3149),
+  (3157, 3158), (3160, 3162), (3165, 3165), (3168, 3171), (3174, 3183),
+  (3200, 3203), (3205, 3212), (3214, 3216), (3218, 3240), (3242, 3251),
+  (3253, 3257), (3260, 3268), (3270, 3272), (3274, 3277), (3285, 3286),
+  (3293, 3294), (3296, 3299), (3302, 3311), (3313, 3315), (3328, 3340),
+  (3342, 3344), (3346, 3396), (3398, 3400), (3402, 3406), (3412, 3415),
+  (3423, 3427), (3430, 3439), (3450, 3455), (3457, 3459), (3461, 3478),
+  (3482, 3505), (3507, 3515), (3517, 3517), (3520, 3526), (3530, 3530),
+  (3535, 3540), (3542, 3542), (3544, 3551), (3558, 3567), (3570, 3571),
+  (3585, 3642), (3648, 3662), (3664, 3673), (3713, 3714), (3716, 3716),
+  (3718, 3722), (3724, 3747), (3749, 3749), (3751, 3773), (3776, 3780),
+  (3782, 3782), (3784, 3790), (3792, 3801), (3804, 3807), (3840, 3840),
+  (3864, 3865), (3872, 3881), (3893, 3893), (3895, 3895), (3897, 3897),
+  (3902, 3911), (3913, 3948), (3953, 3972), (3974, 3991), (3993, 4028),
+  (4038, 4038), (4096, 4169), (4176, 4253), (4256, 4293), (4295, 4295),
+  (4301, 4301), (4304, 4346), (4348, 4680), (4682, 4685), (4688, 4694),
+  (4696, 4696), (4698, 4701), (4704, 4744), (4746, 4749), (4752, 4784),
+  (4786, 4789), (4792, 4798), (4800, 4800), (4802, 4805), (4808, 4822),
+  (4824, 4880), (4882, 4885), (4888, 4954), (4957, 4959), (4969, 4977),
+  (4992, 5007), (5024, 5109), (5112, 5117), (5121, 5740), (5743, 5759),
+  (5761, 5786), (5792, 5866), (5870, 5880), (5888, 5909), (5919, 5940),
+  (5952, 5971), (5984, 5996), (5998, 6000), (6002, 6003), (6016, 6099),
+  (6103, 6103), (6108, 6109), (6112, 6121), (6155, 6157), (6159, 6169),
+  (6176, 6264), (6272, 6314), (6320, 6389), (6400, 6430), (6432, 6443),
+  (6448, 6459), (6470, 6509), (6512, 6516), (6528, 6571), (6576, 6601),
+  (6608, 6618), (6656, 6683), (6688, 6750), (6752, 6780), (6783, 6793),
+  (6800, 6809), (6823, 6823), (6832, 6845), (6847, 6862), (6912, 6988),
+  (6992, 7001), (7019, 7027), (7040, 7155), (7168, 7223), (7232, 7241),
+  (7245, 7293), (7296, 7304), (7312, 7354), (7357, 7359), (7376, 7378),
+  (7380, 7418), (7424, 7957), (7960, 7965), (7968, 8005), (8008, 8013),
+  (8016, 8023), (8025, 8025), (8027, 8027), (8029, 8029), (8031, 8061),
+  (8064, 8116), (8118, 8124), (8126, 8126), (8130, 8132), (8134, 8140),
+  (8144, 8147), (8150, 8155), (8160, 8172), (8178, 8180), (8182, 8188),
+  (8255, 8256), (8276, 8276), (8305, 8305), (8319, 8319), (8336, 8348),
+  (8400, 8412), (8417, 8417), (8421, 8432), (8450, 8450), (8455, 8455),
+  (8458, 8467), (8469, 8469), (8472, 8477), (8484, 8484), (8486, 8486),
+  (8488, 8488), (8490, 8505), (8508, 8511), (8517, 8521), (8526, 8526),
+  (8544, 8584), (11264, 11492), (11499, 11507), (11520, 11557),
+  (11559, 11559), (11565, 11565), (11568, 11623), (11631, 11631),
+  (11647, 11670), (11680, 11686), (11688, 11694), (11696, 11702),
+  (11704, 11710), (11712, 11718), (11720, 11726), (11728, 11734),
+  (11736, 11742), (11744, 11775), (12293, 12295), (12321, 12335),
+  (12337, 12341), (12344, 12348), (12353, 12438), (12441, 12442),
+  (12445, 12447), (12449, 12538), (12540, 12543), (12549, 12591),
+  (12593, 12686), (12704, 12735), (12784, 12799), (13312, 19903),
+  (19968, 42124), (42192, 42237), (42240, 42508), (42512, 42539),
+  (42560, 42607), (42612, 42621), (42623, 42737), (42775, 42783),
+  (42786, 42888), (42891, 42954), (42960, 42961), (42963, 42963),
+  (42965, 42969), (42994, 43047), (43052, 43052), (43072, 43123),
+  (43136, 43205), (43216, 43225), (43232, 43255), (43259, 43259),
+  (43261, 43309), (43312, 43347), (43360, 43388), (43392, 43456),
+  (43471, 43481), (43488, 43518), (43520, 43574), (43584, 43597),
+  (43600, 43609), (43616, 43638), (43642, 43714), (43739, 43741),
+  (43744, 43759), (43762, 43766), (43777, 43782), (43785, 43790),
+  (43793, 43798), (43808, 43814), (43816, 43822), (43824, 43866),
+  (43868, 43881), (43888, 44010), (44012, 44013), (44016, 44025),
+  (44032, 55203), (55216, 55238), (55243, 55291), (63744, 64109),
+  (64112, 64217), (64256, 64262), (64275, 64279), (64285, 64296),
+  (64298, 64310), (64312, 64316), (64318, 64318), (64320, 64321),
+  (64323, 64324), (64326, 64433), (64467, 64605), (64612, 64829),
+  (64848, 64911), (64914, 64967), (65008, 65017), (65024, 65039),
+  (65056, 65071), (65075, 65076), (65101, 65103), (65137, 65137),
+  (65139, 65139), (65143, 65143), (65145, 65145), (65147, 65147),
+  (65149, 65149), (65151, 65276), (65296, 65305), (65313, 65338),
+  (65343, 65343), (65345, 65370), (65382, 65470), (65474, 65479),
+  (65482, 65487), (65490, 65495), (65498, 65500), (65536, 65547),
+  (65549, 65574), (65576, 65594), (65596, 65597), (65599, 65613),
+  (65616, 65629), (65664, 65786), (65856, 65908), (66045, 66045),
+  (66176, 66204), (66208, 66256), (66272, 66272), (66304, 66335),
+  (66349, 66378), (66384, 66426), (66432, 66461), (66464, 66499),
+  (66504, 66511), (66513, 66517), (66560, 66717), (66720, 66729),
+  (66736, 66771), (66776, 66811), (66816, 66855), (66864, 66915),
+  (66928, 66938), (66940, 66954), (66956, 66962), (66964, 66965),
+  (66967, 66977), (66979, 66993), (66995, 67001), (67003, 67004),
+  (67072, 67382), (67392, 67413), (67424, 67431), (67456, 67461),
+  (67463, 67504), (67506, 67514), (67584, 67589), (67592, 67592),
+  (67594, 67637), (67639, 67640), (67644, 67644), (67647, 67669),
+  (67680, 67702), (67712, 67742), (67808, 67826), (67828, 67829),
+  (67840, 67861), (67872, 67897), (67968, 68023), (68030, 68031),
+  (68096, 68099), (68101, 68102), (68108, 68115), (68117, 68119),
+  (68121, 68149), (68152, 68154), (68159, 68159), (68192, 68220),
+  (68224, 68252), (68288, 68295), (68297, 68326), (68352, 68405),
+  (68416, 68437), (68448, 68466), (68480, 68497), (68608, 68680),
+  (68736, 68786), (68800, 68850), (68864, 68903), (68912, 68921),
+  (69248, 69289), (69291, 69292), (69296, 69297), (69373, 69404),
+  (69415, 69415), (69424, 69456), (69488, 69509), (69552, 69572),
+  (69600, 69622), (69632, 69702), (69734, 69749), (69759, 69818),
+  (69826, 69826), (69840, 69864), (69872, 69881), (69888, 69940),
+  (69942, 69951), (69956, 69959), (69968, 70003), (70006, 70006),
+  (70016, 70084), (70089, 70092), (70094, 70106), (70108, 70108),
+  (70144, 70161), (70163, 70199), (70206, 70209), (70272, 70278),
+  (70280, 70280), (70282, 70285), (70287, 70301), (70303, 70312),
+  (70320, 70378), (70384, 70393), (70400, 70403), (70405, 70412),
+  (70415, 70416), (70419, 70440), (70442, 70448), (70450, 70451),
+  (70453, 70457), (70459, 70468), (70471, 70472), (70475, 70477),
+  (70480, 70480), (70487, 70487), (70493, 70499), (70502, 70508),
+  (70512, 70516), (70656, 70730), (70736, 70745), (70750, 70753),
+  (70784, 70853), (70855, 70855), (70864, 70873), (71040, 71093),
+  (71096, 71104), (71128, 71133), (71168, 71232), (71236, 71236),
+  (71248, 71257), (71296, 71352), (71360, 71369), (71424, 71450),
+  (71453, 71467), (71472, 71481), (71488, 71494), (71680, 71738),
+  (71840, 71913), (71935, 71942), (71945, 71945), (71948, 71955),
+  (71957, 71958), (71960, 71989), (71991, 71992), (71995, 72003),
+  (72016, 72025), (72096, 72103), (72106, 72151), (72154, 72161),
+  (72163, 72164), (72192, 72254), (72263, 72263), (72272, 72345),
+  (72349, 72349), (72368, 72440), (72704, 72712), (72714, 72758),
+  (72760, 72768), (72784, 72793), (72818, 72847), (72850, 72871),
+  (72873, 72886), (72960, 72966), (72968, 72969), (72971, 73014),
+  (73018, 73018), (73020, 73021), (73023, 73031), (73040, 73049),
+  (73056, 73061), (73063, 73064), (73066, 73102), (73104, 73105),
+  (73107, 73112), (73120, 73129), (73440, 73462), (73472, 73488),
+  (73490, 73530), (73534, 73538), (73552, 73561), (73648, 73648),
+  (73728, 74649), (74752, 74862), (74880, 75075), (77712, 77808),
+  (77824, 78895), (78912, 78933), (82944, 83526), (92160, 92728),
+  (92736, 92766), (92768, 92777), (92784, 92862), (92864, 92873),
+  (92880, 92909), (92912, 92916), (92928, 92982), (92992, 92995),
+  (93008, 93017), (93027, 93047), (93053, 93071), (93760, 93823),
+  (93952, 94026), (94031, 94087), (94095, 94111), (94176, 94177),
+  (94179, 94180), (94192, 94193), (94208, 100343), (100352, 101589),
+  (101632, 101640), (110576, 110579), (110581, 110587), (110589, 110590),
+  (110592, 110882), (110898, 110898), (110928, 110930), (110933, 110933),
+  (110948, 110951), (110960, 111355), (113664, 113770), (113776, 113788),
+  (113792, 113800), (113808, 113817), (113821, 113822), (118528, 118573),
+  (118576, 118598), (119141, 119145), (119149, 119154), (119163, 119170),
+  (119173, 119179), (119210, 119213), (119362, 119364), (119808, 119892),
+  (119894, 119964), (119966, 119967), (119970, 119970), (119973, 119974),
+  (119977, 119980), (119982, 119993), (119995, 119995), (119997, 120003),
+  (120005, 120069), (120071, 120074), (120077, 120084), (120086, 120092),
+  (120094, 120121), (120123, 120126), (120128, 120132), (120134, 120134),
+  (120138, 120144), (120146, 120485), (120488, 120512), (120514, 120538),
+  (120540, 120570), (120572, 120596), (120598, 120628), (120630, 120654),
+  (120656, 120686), (120688, 120712), (120714, 120744), (120746, 120770),
+  (120772, 120779), (120782, 120831), (121344, 121398), (121403, 121452),
+  (121461, 121461), (121476, 121476), (121499, 121503), (121505, 121519),
+  (122624, 122654), (122661, 122666), (122880, 122886), (122888, 122904),
+  (122907, 122913), (122915, 122916), (122918, 122922), (122928, 122989),
+  (123023, 123023), (123136, 123180), (123184, 123197), (123200, 123209),
+  (123214, 123214), (123536, 123566), (123584, 123641), (124112, 124153),
+  (124896, 124902), (124904, 124907), (124909, 124910), (124912, 124926),
+  (124928, 125124), (125136, 125142), (125184, 125259), (125264, 125273),
+  (126464, 126467), (126469, 126495), (126497, 126498), (126500, 126500),
+  (126503, 126503), (126505, 126514), (126516, 126519), (126521, 126521),
+  (126523, 126523), (126530, 126530), (126535, 126535), (126537, 126537),
+  (126539, 126539), (126541, 126543), (126545, 126546), (126548, 126548),
+  (126551, 126551), (126553, 126553), (126555, 126555), (126557, 126557),
+  (126559, 126559), (126561, 126562), (126564, 126564), (126567, 126570),
+  (126572, 126578), (126580, 126583), (126585, 126588), (126590, 126590),
+  (126592, 126601), (126603, 126619), (126625, 126627), (126629, 126633),
+  (126635, 126651), (130032, 130041), (131072, 173791), (173824, 177977),
+  (177984, 178205), (178208, 183969), (183984, 191456), (194560, 195101),
+  (196608, 201546), (201552, 205743), (917760, 917999),
+];
+
+pub const XID_START: &'static [(u32, u32)] = &[
+  (65, 90), (97, 122), (170, 170), (181, 181), (186, 186), (192, 214),
+  (216, 246), (248, 705), (710, 721), (736, 740), (748, 748), (750, 750),
+  (880, 884), (886, 887), (891, 893), (895, 895), (902, 902), (904, 906),
+  (908, 908), (910, 929), (931, 1013), (1015, 1153), (1162, 1327),
+  (1329, 1366), (1369, 1369), (1376, 1416), (1488, 1514), (1519, 1522),
+  (1568, 1610), (1646, 1647), (1649, 1747), (1749, 1749), (1765, 1766),
+  (1774, 1775), (1786, 1788), (1791, 1791), (1808, 1808), (1810, 1839),
+  (1869, 1957), (1969, 1969), (1994, 2026), (2036, 2037), (2042, 2042),
+  (2048, 2069), (2074, 2074), (2084, 2084), (2088, 2088), (2112, 2136),
+  (2144, 2154), (2160, 2183), (2185, 2190), (2208, 2249), (2308, 2361),
+  (2365, 2365), (2384, 2384), (2392, 2401), (2417, 2432), (2437, 2444),
+  (2447, 2448), (2451, 2472), (2474, 2480), (2482, 2482), (2486, 2489),
+  (2493, 2493), (2510, 2510), (2524, 2525), (2527, 2529), (2544, 2545),
+  (2556, 2556), (2565, 2570), (2575, 2576), (2579, 2600), (2602, 2608),
+  (2610, 2611), (2613, 2614), (2616, 2617), (2649, 2652), (2654, 2654),
+  (2674, 2676), (2693, 2701), (2703, 2705), (2707, 2728), (2730, 2736),
+  (2738, 2739), (2741, 2745), (2749, 2749), (2768, 2768), (2784, 2785),
+  (2809, 2809), (2821, 2828), (2831, 2832), (2835, 2856), (2858, 2864),
+  (2866, 2867), (2869, 2873), (2877, 2877), (2908, 2909), (2911, 2913),
+  (2929, 2929), (2947, 2947), (2949, 2954), (2958, 2960), (2962, 2965),
+  (2969, 2970), (2972, 2972), (2974, 2975), (2979, 2980), (2984, 2986),
+  (2990, 3001), (3024, 3024), (3077, 3084), (3086, 3088), (3090, 3112),
+  (3114, 3129), (3133, 3133), (3160, 3162), (3165, 3165), (3168, 3169),
+  (3200, 3200), (3205, 3212), (3214, 3216), (3218, 3240), (3242, 3251),
+  (3253, 3257), (3261, 3261), (3293, 3294), (3296, 3297), (3313, 3314),
+  (3332, 3340), (3342, 3344), (3346, 3386), (3389, 3389), (3406, 3406),
+  (3412, 3414), (3423, 3425), (3450, 3455), (3461, 3478), (3482, 3505),
+  (3507, 3515), (3517, 3517), (3520, 3526), (3585, 3632), (3634, 3634),
+  (3648, 3654), (3713, 3714), (3716, 3716), (3718, 3722), (3724, 3747),
+  (3749, 3749), (3751, 3760), (3762, 3762), (3773, 3773), (3776, 3780),
+  (3782, 3782), (3804, 3807), (3840, 3840), (3904, 3911), (3913, 3948),
+  (3976, 3980), (4096, 4138), (4159, 4159), (4176, 4181), (4186, 4189),
+  (4193, 4193), (4197, 4198), (4206, 4208), (4213, 4225), (4238, 4238),
+  (4256, 4293), (4295, 4295), (4301, 4301), (4304, 4346), (4348, 4680),
+  (4682, 4685), (4688, 4694), (4696, 4696), (4698, 4701), (4704, 4744),
+  (4746, 4749), (4752, 4784), (4786, 4789), (4792, 4798), (4800, 4800),
+  (4802, 4805), (4808, 4822), (4824, 4880), (4882, 4885), (4888, 4954),
+  (4992, 5007), (5024, 5109), (5112, 5117), (5121, 5740), (5743, 5759),
+  (5761, 5786), (5792, 5866), (5870, 5880), (5888, 5905), (5919, 5937),
+  (5952, 5969), (5984, 5996), (5998, 6000), (6016, 6067), (6103, 6103),
+  (6108, 6108), (6176, 6264), (6272, 6312), (6314, 6314), (6320, 6389),
+  (6400, 6430), (6480, 6509), (6512, 6516), (6528, 6571), (6576, 6601),
+  (6656, 6678), (6688, 6740), (6823, 6823), (6917, 6963), (6981, 6988),
+  (7043, 7072), (7086, 7087), (7098, 7141), (7168, 7203), (7245, 7247),
+  (7258, 7293), (7296, 7304), (7312, 7354), (7357, 7359), (7401, 7404),
+  (7406, 7411), (7413, 7414), (7418, 7418), (7424, 7615), (7680, 7957),
+  (7960, 7965), (7968, 8005), (8008, 8013), (8016, 8023), (8025, 8025),
+  (8027, 8027), (8029, 8029), (8031, 8061), (8064, 8116), (8118, 8124),
+  (8126, 8126), (8130, 8132), (8134, 8140), (8144, 8147), (8150, 8155),
+  (8160, 8172), (8178, 8180), (8182, 8188), (8305, 8305), (8319, 8319),
+  (8336, 8348), (8450, 8450), (8455, 8455), (8458, 8467), (8469, 8469),
+  (8472, 8477), (8484, 8484), (8486, 8486), (8488, 8488), (8490, 8505),
+  (8508, 8511), (8517, 8521), (8526, 8526), (8544, 8584), (11264, 11492),
+  (11499, 11502), (11506, 11507), (11520, 11557), (11559, 11559),
+  (11565, 11565), (11568, 11623), (11631, 11631), (11648, 11670),
+  (11680, 11686), (11688, 11694), (11696, 11702), (11704, 11710),
+  (11712, 11718), (11720, 11726), (11728, 11734), (11736, 11742),
+  (12293, 12295), (12321, 12329), (12337, 12341), (12344, 12348),
+  (12353, 12438), (12445, 12447), (12449, 12538), (12540, 12543),
+  (12549, 12591), (12593, 12686), (12704, 12735), (12784, 12799),
+  (13312, 19903), (19968, 42124), (42192, 42237), (42240, 42508),
+  (42512, 42527), (42538, 42539), (42560, 42606), (42623, 42653),
+  (42656, 42735), (42775, 42783), (42786, 42888), (42891, 42954),
+  (42960, 42961), (42963, 42963), (42965, 42969), (42994, 43009),
+  (43011, 43013), (43015, 43018), (43020, 43042), (43072, 43123),
+  (43138, 43187), (43250, 43255), (43259, 43259), (43261, 43262),
+  (43274, 43301), (43312, 43334), (43360, 43388), (43396, 43442),
+  (43471, 43471), (43488, 43492), (43494, 43503), (43514, 43518),
+  (43520, 43560), (43584, 43586), (43588, 43595), (43616, 43638),
+  (43642, 43642), (43646, 43695), (43697, 43697), (43701, 43702),
+  (43705, 43709), (43712, 43712), (43714, 43714), (43739, 43741),
+  (43744, 43754), (43762, 43764), (43777, 43782), (43785, 43790),
+  (43793, 43798), (43808, 43814), (43816, 43822), (43824, 43866),
+  (43868, 43881), (43888, 44002), (44032, 55203), (55216, 55238),
+  (55243, 55291), (63744, 64109), (64112, 64217), (64256, 64262),
+  (64275, 64279), (64285, 64285), (64287, 64296), (64298, 64310),
+  (64312, 64316), (64318, 64318), (64320, 64321), (64323, 64324),
+  (64326, 64433), (64467, 64605), (64612, 64829), (64848, 64911),
+  (64914, 64967), (65008, 65017), (65137, 65137), (65139, 65139),
+  (65143, 65143), (65145, 65145), (65147, 65147), (65149, 65149),
+  (65151, 65276), (65313, 65338), (65345, 65370), (65382, 65437),
+  (65440, 65470), (65474, 65479), (65482, 65487), (65490, 65495),
+  (65498, 65500), (65536, 65547), (65549, 65574), (65576, 65594),
+  (65596, 65597), (65599, 65613), (65616, 65629), (65664, 65786),
+  (65856, 65908), (66176, 66204), (66208, 66256), (66304, 66335),
+  (66349, 66378), (66384, 66421), (66432, 66461), (66464, 66499),
+  (66504, 66511), (66513, 66517), (66560, 66717), (66736, 66771),
+  (66776, 66811), (66816, 66855), (66864, 66915), (66928, 66938),
+  (66940, 66954), (66956, 66962), (66964, 66965), (66967, 66977),
+  (66979, 66993), (66995, 67001), (67003, 67004), (67072, 67382),
+  (67392, 67413), (67424, 67431), (67456, 67461), (67463, 67504),
+  (67506, 67514), (67584, 67589), (67592, 67592), (67594, 67637),
+  (67639, 67640), (67644, 67644), (67647, 67669), (67680, 67702),
+  (67712, 67742), (67808, 67826), (67828, 67829), (67840, 67861),
+  (67872, 67897), (67968, 68023), (68030, 68031), (68096, 68096),
+  (68112, 68115), (68117, 68119), (68121, 68149), (68192, 68220),
+  (68224, 68252), (68288, 68295), (68297, 68324), (68352, 68405),
+  (68416, 68437), (68448, 68466), (68480, 68497), (68608, 68680),
+  (68736, 68786), (68800, 68850), (68864, 68899), (69248, 69289),
+  (69296, 69297), (69376, 69404), (69415, 69415), (69424, 69445),
+  (69488, 69505), (69552, 69572), (69600, 69622), (69635, 69687),
+  (69745, 69746), (69749, 69749), (69763, 69807), (69840, 69864),
+  (69891, 69926), (69956, 69956), (69959, 69959), (69968, 70002),
+  (70006, 70006), (70019, 70066), (70081, 70084), (70106, 70106),
+  (70108, 70108), (70144, 70161), (70163, 70187), (70207, 70208),
+  (70272, 70278), (70280, 70280), (70282, 70285), (70287, 70301),
+  (70303, 70312), (70320, 70366), (70405, 70412), (70415, 70416),
+  (70419, 70440), (70442, 70448), (70450, 70451), (70453, 70457),
+  (70461, 70461), (70480, 70480), (70493, 70497), (70656, 70708),
+  (70727, 70730), (70751, 70753), (70784, 70831), (70852, 70853),
+  (70855, 70855), (71040, 71086), (71128, 71131), (71168, 71215),
+  (71236, 71236), (71296, 71338), (71352, 71352), (71424, 71450),
+  (71488, 71494), (71680, 71723), (71840, 71903), (71935, 71942),
+  (71945, 71945), (71948, 71955), (71957, 71958), (71960, 71983),
+  (71999, 71999), (72001, 72001), (72096, 72103), (72106, 72144),
+  (72161, 72161), (72163, 72163), (72192, 72192), (72203, 72242),
+  (72250, 72250), (72272, 72272), (72284, 72329), (72349, 72349),
+  (72368, 72440), (72704, 72712), (72714, 72750), (72768, 72768),
+  (72818, 72847), (72960, 72966), (72968, 72969), (72971, 73008),
+  (73030, 73030), (73056, 73061), (73063, 73064), (73066, 73097),
+  (73112, 73112), (73440, 73458), (73474, 73474), (73476, 73488),
+  (73490, 73523), (73648, 73648), (73728, 74649), (74752, 74862),
+  (74880, 75075), (77712, 77808), (77824, 78895), (78913, 78918),
+  (82944, 83526), (92160, 92728), (92736, 92766), (92784, 92862),
+  (92880, 92909), (92928, 92975), (92992, 92995), (93027, 93047),
+  (93053, 93071), (93760, 93823), (93952, 94026), (94032, 94032),
+  (94099, 94111), (94176, 94177), (94179, 94179), (94208, 100343),
+  (100352, 101589), (101632, 101640), (110576, 110579), (110581, 110587),
+  (110589, 110590), (110592, 110882), (110898, 110898), (110928, 110930),
+  (110933, 110933), (110948, 110951), (110960, 111355), (113664, 113770),
+  (113776, 113788), (113792, 113800), (113808, 113817), (119808, 119892),
+  (119894, 119964), (119966, 119967), (119970, 119970), (119973, 119974),
+  (119977, 119980), (119982, 119993), (119995, 119995), (119997, 120003),
+  (120005, 120069), (120071, 120074), (120077, 120084), (120086, 120092),
+  (120094, 120121), (120123, 120126), (120128, 120132), (120134, 120134),
+  (120138, 120144), (120146, 120485), (120488, 120512), (120514, 120538),
+  (120540, 120570), (120572, 120596), (120598, 120628), (120630, 120654),
+  (120656, 120686), (120688, 120712), (120714, 120744), (120746, 120770),
+  (120772, 120779), (122624, 122654), (122661, 122666), (122928, 122989),
+  (123136, 123180), (123191, 123197), (123214, 123214), (123536, 123565),
+  (123584, 123627), (124112, 124139), (124896, 124902), (124904, 124907),
+  (124909, 124910), (124912, 124926), (124928, 125124), (125184, 125251),
+  (125259, 125259), (126464, 126467), (126469, 126495), (126497, 126498),
+  (126500, 126500), (126503, 126503), (126505, 126514), (126516, 126519),
+  (126521, 126521), (126523, 126523), (126530, 126530), (126535, 126535),
+  (126537, 126537), (126539, 126539), (126541, 126543), (126545, 126546),
+  (126548, 126548), (126551, 126551), (126553, 126553), (126555, 126555),
+  (126557, 126557), (126559, 126559), (126561, 126562), (126564, 126564),
+  (126567, 126570), (126572, 126578), (126580, 126583), (126585, 126588),
+  (126590, 126590), (126592, 126601), (126603, 126619), (126625, 126627),
+  (126629, 126633), (126635, 126651), (131072, 173791), (173824, 177977),
+  (177984, 178205), (178208, 183969), (183984, 191456), (194560, 195101),
+  (196608, 201546), (201552, 205743),
+];
diff --git a/third_party/rust/unicode_ident/v1/crate/tests/trie/trie.rs b/third_party/rust/unicode_ident/v1/crate/tests/trie/trie.rs
index 7f7a14f3..821e7cb 100644
--- a/third_party/rust/unicode_ident/v1/crate/tests/trie/trie.rs
+++ b/third_party/rust/unicode_ident/v1/crate/tests/trie/trie.rs
@@ -2,9 +2,9 @@
 //
 //   ucd-generate property-bool UCD --include XID_Start,XID_Continue --trie-set
 //
-// Unicode version: 14.0.0.
+// Unicode version: 15.0.0.
 //
-// ucd-generate 0.2.10 is available on crates.io.
+// ucd-generate 0.2.13 is available on crates.io.
 
 pub const BY_NAME: &'static [(&'static str, &'static ::ucd_trie::TrieSet)] = &[
   ("XID_Continue", XID_CONTINUE), ("XID_Start", XID_START),
@@ -77,10 +77,10 @@
     0xF3C5FDFFFFF99FEF, 0x5003FFCFB080799F, 0xD36DFDFFFFF987EE,
     0x3FFFC05E023987, 0xF3EDFDFFFFFBBFEE, 0xFE00FFCF00013BBF,
     0xF3EDFDFFFFF99FEE, 0x2FFCFB0E0399F, 0xC3FFC718D63DC7EC, 0xFFC000813DC7,
-    0xF3FFFDFFFFFDDFFF, 0xFFCF27603DDF, 0xF3EFFDFFFFFDDFEF, 0x6FFCF60603DDF,
+    0xF3FFFDFFFFFDDFFF, 0xFFCF27603DDF, 0xF3EFFDFFFFFDDFEF, 0xEFFCF60603DDF,
     0xFFFFFFFFFFFDDFFF, 0xFC00FFCF80F07DDF, 0x2FFBFFFFFC7FFFEE,
     0xCFFC0FF5F847F, 0x7FFFFFFFFFFFFFE, 0x3FF7FFF, 0x3FFFFFAFFFFFF7D6,
-    0xF3FF3F5F, 0xC2A003FF03000001, 0xFFFE1FFFFFFFFEFF, 0x1FFFFFFFFEFFFFDF,
+    0xF3FF7F5F, 0xC2A003FF03000001, 0xFFFE1FFFFFFFFEFF, 0x1FFFFFFFFEFFFFDF,
     0x40, 0xFFFFFFFFFFFF03FF, 0xFFFFFFFF3FFFFFFF, 0xF7FFFFFFFFFF20BF,
     0xFFFFFFFF3D7F3DFF, 0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D,
     0xFFFFFFFFFF3DFFFF, 0x3FE00E7FFFFFF, 0xFFFFFFFF0000FFFF,
@@ -112,78 +112,80 @@
   ],
   tree3_level1: &[
     0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 10, 11, 12, 13, 14, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 15, 16, 17, 7, 18, 19, 7, 20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    7, 7, 7, 15, 16, 17, 7, 18, 19, 7, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   ],
   tree3_level2: &[
     0, 1, 2, 3, 4, 5, 4, 6, 4, 4, 7, 8, 9, 10, 11, 12, 2, 2, 13, 14, 15, 16,
     17, 4, 2, 2, 2, 2, 18, 19, 20, 4, 21, 22, 23, 24, 25, 4, 26, 4, 27, 28,
-    29, 30, 31, 32, 33, 4, 2, 34, 35, 35, 36, 4, 4, 4, 4, 4, 37, 4, 38, 39,
-    40, 41, 2, 42, 3, 43, 44, 45, 2, 46, 47, 4, 48, 49, 50, 51, 4, 4, 2, 52,
-    2, 53, 4, 4, 54, 55, 2, 56, 57, 58, 59, 60, 4, 4, 3, 4, 61, 62, 63, 64,
-    65, 66, 67, 68, 69, 57, 4, 4, 4, 4, 70, 71, 72, 4, 73, 74, 75, 4, 4, 4, 4,
-    76, 4, 4, 77, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78, 4, 2, 79,
-    2, 2, 2, 80, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 81, 82, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    29, 30, 31, 32, 33, 4, 2, 34, 35, 35, 36, 4, 4, 4, 4, 4, 37, 38, 39, 40,
+    41, 42, 2, 43, 3, 44, 45, 46, 2, 47, 48, 49, 50, 51, 52, 53, 4, 4, 2, 54,
+    2, 55, 4, 4, 56, 57, 2, 58, 59, 60, 61, 62, 4, 4, 3, 4, 63, 64, 65, 66,
+    67, 68, 69, 70, 71, 59, 4, 4, 4, 4, 72, 73, 74, 4, 75, 76, 77, 4, 4, 4, 4,
+    78, 79, 80, 81, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 82, 4, 2, 83,
+    2, 2, 2, 84, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 85, 86, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 87, 88, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 60, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 62, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2,
-    2, 2, 2, 2, 2, 2, 2, 57, 83, 67, 84, 18, 85, 86, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 2, 4, 4, 2, 87, 88, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 59, 89, 69, 90, 18, 91, 92, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 2, 4, 4, 2, 93, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 91, 34, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    2, 2, 2, 2, 2, 96, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 88, 34, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 92, 2, 2, 2, 2, 93, 94, 2, 2, 2, 2, 2, 95, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 97, 2, 2, 2, 2, 98, 99, 2, 2, 2, 2, 2, 100, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 2, 96, 97, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 2, 101, 102, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 98, 60, 4, 4, 4, 4, 4, 4, 4, 99, 100, 4, 4, 101, 4, 4,
-    4, 4, 4, 4, 2, 102, 103, 104, 105, 106, 2, 2, 2, 2, 107, 108, 109, 110,
-    111, 112, 4, 4, 4, 4, 4, 4, 4, 4, 113, 114, 115, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 23, 4, 4, 4, 116, 4, 4, 4, 117, 118, 4, 4, 4,
-    4, 119, 120, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 121,
-    2, 2, 2, 122, 2, 123, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 124, 125, 126, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 103, 62, 4, 4, 4, 4, 4, 4, 4, 104, 105, 4, 4, 106, 4,
+    4, 4, 4, 4, 4, 2, 107, 108, 109, 110, 111, 2, 2, 2, 2, 112, 113, 114, 115,
+    116, 117, 4, 4, 4, 4, 4, 4, 4, 4, 118, 119, 120, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 121, 4, 4, 4, 122, 123, 124, 4, 125, 126, 4, 4,
+    4, 4, 127, 128, 4, 4, 4, 4, 4, 4, 4, 129, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    130, 2, 2, 2, 131, 2, 132, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 133, 134, 135, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 127, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 128, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 136, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 137, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 2, 2, 2, 11,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 128, 2, 2, 2,
+    11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 138, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 129, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
+    2, 2, 2, 140, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 141, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 130, 4, 4, 4, 4, 4,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 87, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2,
-    2, 131, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 132, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 87, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 133,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
   ],
   tree3_level3: &[
     0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0,
@@ -195,32 +197,34 @@
     0x37FFFF00000000, 0x3FFFFFF003FFFFF, 0xC0FFFFFFFFFFFFFF,
     0x873FFFFFFEEFF06F, 0x1FFFFFFF00000000, 0x1FFFFFFF, 0x7FFFFFFEFF,
     0x3FFFFFFFFFFFFF, 0x7FFFF003FFFFF, 0x3FFFF, 0x1FF, 0x7FFFFFFFFFFFF,
-    0x3FF00FFFFFFFFFF, 0x31BFFFFFFFFFF, 0xFFFF00801FFFFFFF,
-    0xFFFF00000001FFFF, 0xFFFF00000000003F, 0x7FFFFF0000001F,
-    0x803FFFC00000007F, 0x3FF01FFFFFF0004, 0xFFDFFFFFFFFFFFFF,
-    0x4FFFFFFFFF00F0, 0x17FFDE1F, 0x40FFFFFFFFFBFFFF, 0xFFFF01FFBFFFBD7F,
-    0x3FF07FFFFFFFFFF, 0xFBEDFDFFFFF99FEF, 0x1F1FCFE081399F, 0x3C3FF07FF,
-    0x3FF00BF, 0xFF3FFFFFFFFFFFFF, 0x3F000001, 0x3FF0011, 0x1FFFFFFFFFFFFFF,
-    0x3FF, 0x3FF0FFFE7FFFFFF, 0x7F, 0xFFFFFFFF00000000, 0x800003FFFFFFFFFF,
-    0xF9BFFFFFFF6FF27F, 0x3FF000F, 0xFFFFFCFF00000000, 0x1BFCFFFFFF,
-    0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0080, 0xFFFF000023FFFFFF,
-    0xFF7FFFFFFFFFFDFF, 0xFFFC000003FF0001, 0x7FFEFFFFFCFFFF,
-    0xB47FFFFFFFFFFB7F, 0xFFFFFDBF03FF00FF, 0x3FF01FB7FFF, 0x7FFFFF00000000,
-    0x1000000000000, 0x3FFFFFF, 0x7FFFFFFFFFFF, 0xF, 0xFFFFFFFFFFFF0000,
-    0x1FFFFFFFFFFFF, 0xFFFF03FF7FFFFFFF, 0x1F3FFFFFFF03FF, 0xE0FFFFF803FF000F,
-    0xFFFF, 0xFFFFFFFFFFFF87FF, 0xFFFF80FF, 0x3001B00000000, 0xFFFFFFFFFFFFFF,
-    0x3FFFFF, 0x6FEF000000000000, 0x7FFFFFFFF, 0xFFFF00F000070000,
-    0xFFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF, 0x63FF01FF, 0xFFFF3FFFFFFFFFFF,
-    0xF807E3E000000000, 0x3C0000000FE7, 0x1C, 0xFFFFFFFFFFDFFFFF,
-    0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF, 0x7BFFFFFFDFDFE7BF,
-    0xFFFFFFFFFFFDFC5F, 0xFFFFFF3FFFFFFFFF, 0xF7FFFFFFF7FFFFFD,
-    0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF, 0xFFFFFDFFFFFFFDFF,
-    0xFFFFFFFFFFFFCFF7, 0xF87FFFFFFFFFFFFF, 0x201FFFFFFFFFFF, 0xFFFEF8000010,
-    0x7DBF9FFFF7F, 0x3FFF1FFFFFFFFFFF, 0x43FF, 0x7FFFFFFF0000,
-    0x3FFFFFFFFFFFFFF, 0x7FFF6F7F00000000, 0x7F001F, 0x3FF0FFF,
-    0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF,
+    0x3FF00FFFFFFFFFF, 0x31BFFFFFFFFFF, 0xE000000000000000,
+    0xFFFF00801FFFFFFF, 0xFFFF00000001FFFF, 0xFFFF00000000003F,
+    0x7FFFFF0000001F, 0x803FFFC00000007F, 0x3FF01FFFFFF0004,
+    0xFFDFFFFFFFFFFFFF, 0x4FFFFFFFFF00F0, 0x17FFDE1F, 0xC0FFFFFFFFFBFFFF, 0x3,
+    0xFFFF01FFBFFFBD7F, 0x3FF07FFFFFFFFFF, 0xFBEDFDFFFFF99FEF,
+    0x1F1FCFE081399F, 0x3C3FF07FF, 0x3FF00BF, 0xFF3FFFFFFFFFFFFF, 0x3F000001,
+    0x3FF0011, 0x1FFFFFFFFFFFFFF, 0x3FF, 0x3FF0FFFE7FFFFFF, 0x7F,
+    0xFFFFFFFF00000000, 0x800003FFFFFFFFFF, 0xF9BFFFFFFF6FF27F, 0x3FF000F,
+    0xFFFFFCFF00000000, 0x1BFCFFFFFF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0080,
+    0xFFFF000023FFFFFF, 0xFF7FFFFFFFFFFDFF, 0xFFFC000003FF0001,
+    0x7FFEFFFFFCFFFF, 0xB47FFFFFFFFFFB7F, 0xFFFFFDBF03FF00FF, 0x3FF01FB7FFF,
+    0x7FFFFF00000000, 0xC7FFFFFFFFFDFFFF, 0x3FF0007, 0x1000000000000,
+    0x3FFFFFF, 0x7FFFFFFFFFFF, 0xF, 0xFFFFFFFFFFFF0000, 0x1FFFFFFFFFFFF,
+    0xFFFFFFFFFFFF, 0x3FFFFF, 0xFFFF03FF7FFFFFFF, 0x1F3FFFFFFF03FF,
+    0xE0FFFFF803FF000F, 0xFFFF, 0xFFFFFFFFFFFF87FF, 0xFFFF80FF,
+    0x3001B00000000, 0xFFFFFFFFFFFFFF, 0x6FEF000000000000, 0x40007FFFFFFFF,
+    0xFFFF00F000270000, 0xFFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF, 0x63FF01FF,
+    0xFFFF3FFFFFFFFFFF, 0xF807E3E000000000, 0x3C0000000FE7, 0x1C,
+    0xFFFFFFFFFFDFFFFF, 0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF,
+    0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F, 0xFFFFFF3FFFFFFFFF,
+    0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF,
+    0xFFFFFDFFFFFFFDFF, 0xFFFFFFFFFFFFCFF7, 0xF87FFFFFFFFFFFFF,
+    0x201FFFFFFFFFFF, 0xFFFEF8000010, 0x7E07FFFFFFF, 0xFFFF07DBF9FFFF7F,
+    0x3FFFFFFFFFFF, 0x8000, 0x3FFF1FFFFFFFFFFF, 0x43FF, 0x7FFFFFFF0000,
+    0x3FFFFFFFFFFFFFF, 0x3FFFFFFFFFF0000, 0x7FFF6F7F00000000, 0x7F001F,
+    0x3FF0FFF, 0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF,
     0x3FF000000000000, 0xFFFFFFFF, 0xFFFF0003FFFFFFFF, 0x1FFFFFFFF,
-    0x3FFFFFFF, 0x7FF, 0xFFFFFFFFFFFF,
+    0x3FFFFFFF, 0xFFFFFFFFFFFF07FF,
   ],
 };
 
@@ -336,7 +340,7 @@
   ],
   tree3_level1: &[
     0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 10, 5, 11, 12, 5, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 13, 14, 15, 7, 16, 17, 7, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    7, 7, 13, 14, 15, 7, 16, 17, 7, 18, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -345,61 +349,63 @@
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   ],
   tree3_level2: &[
     0, 1, 2, 3, 4, 5, 4, 4, 4, 4, 6, 7, 8, 9, 10, 11, 2, 2, 12, 13, 14, 15,
     16, 4, 2, 2, 2, 2, 17, 18, 19, 4, 20, 21, 22, 23, 24, 4, 25, 4, 26, 27,
     28, 29, 30, 31, 32, 4, 2, 33, 34, 34, 35, 4, 4, 4, 4, 4, 36, 4, 37, 38,
-    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4, 50, 22, 51, 52, 4, 4, 5,
-    53, 54, 55, 4, 4, 56, 57, 54, 58, 59, 4, 60, 61, 4, 4, 62, 4, 63, 64, 65,
-    66, 67, 68, 69, 70, 71, 72, 4, 4, 4, 4, 73, 74, 75, 4, 76, 77, 78, 4, 4,
-    4, 4, 79, 4, 4, 80, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 81, 4, 2,
-    56, 2, 2, 2, 82, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 83, 84, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 56, 4, 4, 4, 4, 4, 4, 4, 4,
+    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 22, 52, 53, 4, 4, 5,
+    54, 55, 56, 4, 4, 57, 58, 55, 59, 60, 4, 61, 62, 4, 4, 63, 4, 64, 65, 66,
+    67, 68, 69, 70, 71, 72, 73, 4, 4, 4, 4, 74, 75, 76, 4, 77, 78, 79, 4, 4,
+    4, 4, 80, 81, 4, 82, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 83, 4,
+    2, 57, 2, 2, 2, 84, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 85, 86,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 55, 87, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 61, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 62, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    2, 2, 2, 2, 2, 2, 2, 2, 72, 85, 86, 87, 54, 88, 75, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 2, 4, 4, 2, 89, 90, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 2, 2, 2, 2, 2, 2, 2, 2, 73, 88, 89, 90, 55, 91, 76, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 2, 4, 4, 2, 92, 93, 94, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 93, 33, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    2, 2, 2, 2, 2, 2, 2, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 96, 33, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 94, 2, 2, 2, 2, 95, 96, 2, 2, 2, 2, 2, 97, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 97, 2, 2, 2, 2, 98, 99, 2, 2, 2, 2, 2, 100, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 2, 98, 99, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 100, 101, 102, 103, 104, 2, 2,
-    2, 2, 105, 106, 107, 108, 109, 110, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 4, 4, 4, 4, 4, 4, 111,
-    112, 4, 4, 4, 4, 87, 62, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 113, 2, 2, 2, 114, 2, 115, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 116, 117, 118, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 119, 2, 2, 2, 2, 2, 2,
+    4, 4, 4, 4, 4, 4, 2, 101, 102, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 103, 104, 105, 106, 107,
+    2, 2, 2, 2, 108, 109, 110, 111, 112, 113, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 114, 4, 4, 4, 115, 116,
+    4, 4, 117, 118, 4, 4, 4, 4, 90, 63, 4, 4, 4, 4, 4, 4, 4, 119, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 120, 2, 2, 2, 121, 2, 122, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 123, 124, 125, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 126, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 72, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 120, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 128, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 121, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 129, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 122, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 123, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 130, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 55,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
   ],
   tree3_level3: &[
     0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0,
@@ -414,23 +420,25 @@
     0x303FFFFFFFFFF, 0xFFFF00801FFFFFFF, 0xFFFF00000000003F,
     0xFFFF000000000003, 0x7FFFFF0000001F, 0xFFFFFFFFFFFFF8, 0x26000000000000,
     0xFFFFFFFFFFF8, 0x1FFFFFF0000, 0x7FFFFFFFF8, 0x47FFFFFFFF0090,
-    0x7FFFFFFFFFFF8, 0x1400001E, 0xFFFFFFBFFFF, 0xFFFF01FFBFFFBD7F,
+    0x7FFFFFFFFFFF8, 0x1400001E, 0x80000FFFFFFBFFFF, 0x1, 0xFFFF01FFBFFFBD7F,
     0x23EDFDFFFFF99FE0, 0x3E0010000, 0x380000780, 0xFFFFFFFFFFFF, 0xB0,
     0x7FFFFFFFFFFF, 0xF000000, 0x10, 0x10007FFFFFFFFFF, 0x7FFFFFF, 0x7F,
     0xFFFFFFFFFFF, 0xFFFFFFFF00000000, 0x80000000FFFFFFFF, 0x8000FFFFFF6FF27F,
     0x2, 0xFFFFFCFF00000000, 0xA0001FFFF, 0x407FFFFFFFFF801,
     0xFFFFFFFFF0010000, 0xFFFF0000200003FF, 0x1FFFFFFFFFFFFFF, 0x7FFFFFFFFDFF,
     0xFFFC000000000001, 0xFFFF, 0x1FFFFFFFFFB7F, 0xFFFFFDBF00000040,
-    0x10003FF, 0x7FFFF00000000, 0x1000000000000, 0x3FFFFFF, 0xF,
-    0xFFFFFFFFFFFF0000, 0x1FFFFFFFFFFFF, 0xFFFF00007FFFFFFF,
+    0x10003FF, 0x7FFFF00000000, 0xFFFFFFFFDFFF4, 0x1000000000000, 0x3FFFFFF,
+    0xF, 0xFFFFFFFFFFFF0000, 0x1FFFFFFFFFFFF, 0x7E, 0xFFFF00007FFFFFFF,
     0x7FFFFFFFFFFFFFFF, 0x3FFFFFFF0000, 0xE0FFFFF80000000F, 0x107FF,
     0xFFF80000, 0xB00000000, 0xFFFFFFFFFFFFFF, 0x3FFFFF, 0x6FEF000000000000,
-    0x7FFFFFFFF, 0xFFFF00F000070000, 0xFFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF,
-    0x3FF01FF, 0xFFFFFFFFFFDFFFFF, 0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF,
-    0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F, 0xFFFFFF3FFFFFFFFF,
-    0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF,
-    0xFFFFFDFFFFFFFDFF, 0xFF7, 0x3F801FFFFFFFFFFF, 0x4000, 0x7FFF6F7F00000000,
-    0x1F, 0x80F, 0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF,
-    0xFFFFFFFF, 0xFFFF0003FFFFFFFF, 0x1FFFFFFFF, 0x3FFFFFFF, 0x7FF,
+    0x40007FFFFFFFF, 0xFFFF00F000270000, 0xFFFFFFFFFFFFFFF,
+    0x1FFF07FFFFFFFFFF, 0x3FF01FF, 0xFFFFFFFFFFDFFFFF, 0xEBFFDE64DFFFFFFF,
+    0xFFFFFFFFFFFFFFEF, 0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F,
+    0xFFFFFF3FFFFFFFFF, 0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF,
+    0xFFFF7FFFFFFF7FFF, 0xFFFFFDFFFFFFFDFF, 0xFF7, 0x7E07FFFFFFF,
+    0xFFFF000000000000, 0x3FFFFFFFFFFF, 0x3F801FFFFFFFFFFF, 0x4000,
+    0xFFFFFFF0000, 0x7FFF6F7F00000000, 0x1F, 0x80F, 0xAF7FE96FFFFFFEF,
+    0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF, 0xFFFFFFFF, 0x3FFFFFFFFFFFFFF,
+    0xFFFF0003FFFFFFFF, 0x1FFFFFFFF, 0x3FFFFFFF, 0xFFFFFFFFFFFF07FF,
   ],
 };
diff --git a/tools/cast3p/runtime.version b/tools/cast3p/runtime.version
index 5c190c22..38507ff 100644
--- a/tools/cast3p/runtime.version
+++ b/tools/cast3p/runtime.version
@@ -1 +1 @@
-359153
+359700
diff --git a/tools/crates/gnrt/download.rs b/tools/crates/gnrt/download.rs
index 6fbe752b5..5c35839 100644
--- a/tools/crates/gnrt/download.rs
+++ b/tools/crates/gnrt/download.rs
@@ -161,5 +161,8 @@
     ("ISC", "ISC"),
     ("MIT OR Zlib OR Apache-2.0", "Apache 2.0"),
     ("0BSD OR MIT OR Apache-2.0", "Apache 2.0"),
-    ("Unicode-DFS-2016", "Unicode License Agreement - Data Files and Software (2016)"),
+    (
+        "(MIT OR Apache-2.0) AND Unicode-DFS-2016",
+        "Apache 2.0 AND Unicode License Agreement - Data Files and Software (2016)",
+    ),
 ];
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index fe34ccb..e8772f6 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -2271,7 +2271,7 @@
     ],
 
     'chromeos_js_coverage_reclient': [
-      'chromeos_with_codecs', 'release_bot_reclient', 'also_build_lacros_chrome', 'use_javascript_coverage', 'enable_webui_inline_sourcemaps_on', 'optimize_webui_off',
+      'chromeos_with_codecs', 'release_bot_reclient', 'use_javascript_coverage', 'enable_webui_inline_sourcemaps_on', 'optimize_webui_off',
     ],
 
     'chromeos_kevin_include_unwind_tables_official_dchecks': [
diff --git a/tools/mb/mb_config_expectations/chromium.coverage.json b/tools/mb/mb_config_expectations/chromium.coverage.json
index e2730a5..ace2046 100644
--- a/tools/mb/mb_config_expectations/chromium.coverage.json
+++ b/tools/mb/mb_config_expectations/chromium.coverage.json
@@ -59,7 +59,6 @@
   },
   "chromeos-js-code-coverage": {
     "gn_args": {
-      "also_build_lacros_chrome": true,
       "dcheck_always_on": false,
       "enable_webui_inline_sourcemaps": true,
       "ffmpeg_branding": "ChromeOS",
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
index f8da936..e4ba3b8 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -12,7 +12,6 @@
   },
   "chromeos-js-code-coverage": {
     "gn_args": {
-      "also_build_lacros_chrome": true,
       "dcheck_always_on": false,
       "enable_webui_inline_sourcemaps": true,
       "ffmpeg_branding": "ChromeOS",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index dd0e8d3..ecaadb8 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -6866,6 +6866,8 @@
   <int value="2033" label="NUMERIC_QUANTITY: accepted"/>
   <int value="2048" label="ONE_TIME_CODE: edited"/>
   <int value="2049" label="ONE_TIME_CODE: accepted"/>
+  <int value="2176" label="ADDRESS_HOME_LANDMARK: edited"/>
+  <int value="2177" label="ADDRESS_HOME_LANDMARK: accepted"/>
 </enum>
 
 <enum name="AutofillErrorDialogType">
@@ -7206,6 +7208,16 @@
   <int value="9479" label="IBAN: False Positive (Empty)"/>
   <int value="9480" label="IBAN: False Negative (Mismatch)"/>
   <int value="9481" label="IBAN: False Negative (Unknown)"/>
+  <int value="9672" label="Landmark: True Positive"/>
+  <int value="9673" label="Landmark: True Negative (Ambiguous)"/>
+  <int value="9674" label="Landmark: True Negative (Unknown)"/>
+  <int value="9675" label="Landmark: True Negative (Empty)"/>
+  <int value="9676" label="Landmark: False Positive (Mismatch)"/>
+  <int value="9677" label="Landmark: False Positive (Ambiguous)"/>
+  <int value="9678" label="Landmark: False Positive (Unknown)"/>
+  <int value="9679" label="Landmark: False Positive (Empty)"/>
+  <int value="9680" label="Landmark: False Negative (Mismatch)"/>
+  <int value="9681" label="Landmark: False Negative (Unknown)"/>
 </enum>
 
 <enum name="AutofillFormControlType">
@@ -9333,6 +9345,22 @@
   <int value="780"
       label="ONE_TIME_CODE - Predictions different - Value agrees with both
              predictions"/>
+  <int value="817"
+      label="ADDRESS_HOME_LANDMARK - Predictions equal - Value agrees"/>
+  <int value="818"
+      label="ADDRESS_HOME_LANDMARK - Predictions equal - Value disagrees"/>
+  <int value="819"
+      label="ADDRESS_HOME_LANDMARK - Predictions different - Value agrees
+             with old prediction"/>
+  <int value="820"
+      label="ADDRESS_HOME_LANDMARK - Predictions different - Value agrees
+             with new prediction"/>
+  <int value="821"
+      label="ADDRESS_HOME_LANDMARK - Predictions different - Value agrees
+             with neither prediction"/>
+  <int value="822"
+      label="ADDRESS_HOME_LANDMARK - Predictions different - Value agrees
+             with both predictions"/>
 </enum>
 
 <enum name="AutofillPredictionSource">
@@ -9619,6 +9647,7 @@
   <int value="127" label="RESERVED"/>
   <int value="128" label="NUMERIC_QUANTITY"/>
   <int value="129" label="ONE_TIME_CODE"/>
+  <int value="136" label="ADDRESS_HOME_LANDMARK"/>
 </enum>
 
 <enum name="AutofillServerPredictionAvailability">
@@ -18914,7 +18943,6 @@
 
 <enum name="ContentType">
   <int value="-1" label="Invalid setting"/>
-  <int value="0" label="Cookies setting"/>
   <int value="1" label="Images setting"/>
   <int value="2" label="JavaScript setting"/>
   <int value="3" label="Plugins setting [removed in M91]"/>
@@ -19007,7 +19035,12 @@
   <int value="94" label="Federated identity auto re-authn"/>
   <int value="95" label="Federated identity IdP Registration API"/>
   <int value="96" label="Anti-abuse"/>
-  <int value="97" label="Third-Party Storage Partitioning"/>
+  <int value="97" label="Third-Party StoragePartitioning"/>
+  <int value="98" label="HTTPS Enforcement"/>
+  <int value="99" label="USB Chooser Data"/>
+  <int value="100" label="Cookies setting"/>
+  <int value="101" label="Get Display Media Set Select All Screens"/>
+  <int value="102" label="MIDI"/>
 </enum>
 
 <enum name="ContentTypeParseableResult">
@@ -25657,6 +25690,7 @@
   <int value="2" label="Close Incognito tabs"/>
   <int value="3" label="Cookies in use dialog"/>
   <int value="4" label="Site settings page"/>
+  <int value="5" label="History Page Entries"/>
   <int value="6" label="Quick delete"/>
   <int value="7" label="Page info permission reset"/>
 </enum>
@@ -32658,14 +32692,15 @@
   <int value="1056" label="KioskTroubleshootingToolsEnabled"/>
   <int value="1057" label="ForceEnablePepperVideoDecoderDevAPI"/>
   <int value="1058" label="DomainReliabilityAllowed"/>
-  <int value="1059" label="ScreensaverEnabled"/>
-  <int value="1060" label="ScreensaverIdleTimeoutSeconds"/>
-  <int value="1061" label="ScreensaverImageDisplayIntervalSeconds"/>
-  <int value="1062" label="ScreensaverImages"/>
-  <int value="1063" label="DeviceScreensaverEnabled"/>
-  <int value="1064" label="DeviceScreensaverIdleTimeoutSeconds"/>
-  <int value="1065" label="DeviceScreensaverImageDisplayIntervalSeconds"/>
-  <int value="1066" label="DeviceScreensaverImages"/>
+  <int value="1059" label="ScreensaverLockScreenEnabled"/>
+  <int value="1060" label="ScreensaverLockScreenIdleTimeoutSeconds"/>
+  <int value="1061" label="ScreensaverLockScreenImageDisplayIntervalSeconds"/>
+  <int value="1062" label="ScreensaverLockScreenImages"/>
+  <int value="1063" label="DeviceScreensaverLoginScreenEnabled"/>
+  <int value="1064" label="DeviceScreensaverLoginScreenIdleTimeoutSeconds"/>
+  <int value="1065"
+      label="DeviceScreensaverLoginScreenImageDisplayIntervalSeconds"/>
+  <int value="1066" label="DeviceScreensaverLoginScreenImages"/>
   <int value="1067" label="DefaultWindowManagementSetting"/>
   <int value="1068" label="WindowManagementAllowedForUrls"/>
   <int value="1069" label="WindowManagementBlockedForUrls"/>
@@ -32703,6 +32738,7 @@
   <int value="1098" label="SafeBrowsingExtensionProtectionAllowed"/>
   <int value="1099" label="ShowDisplaySizeScreenEnabled"/>
   <int value="1100" label="AnonymousSearchEnabled"/>
+  <int value="1101" label="LegacyTechReportAllowlist"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
@@ -79435,6 +79471,22 @@
   <int value="9" label="Change password automatically"/>
 </enum>
 
+<enum name="PasswordCheckInteractionIOS">
+  <int value="0" label="Change password"/>
+  <int value="1" label="Edit password"/>
+  <int value="2" label="Remove password"/>
+  <int value="3" label="Show password"/>
+  <int value="4" label="Mute warning"/>
+  <int value="5" label="Unmute warning"/>
+  <int value="6" label="Show list of warnings"/>
+</enum>
+
+<enum name="PasswordCheckInteractionIOSWithoutContext">
+  <int value="0" label="Check started automatically"/>
+  <int value="1" label="Check started manually"/>
+  <int value="2" label="Open password checkup homepage"/>
+</enum>
+
 <enum name="PasswordCheckReferrer">
   <int value="0" label="Safety Check"/>
   <int value="1" label="Password Settings"/>
@@ -83376,8 +83428,8 @@
 </enum>
 
 <enum name="PrefetchProxyPrefetchStatus">
-  <int value="0" label="Prefetch Used, No Probe">
-    The interceptor used a prefetch.
+  <int value="0" label="DEPRECATED Prefetch Used, No Probe">
+    The interceptor used a prefetch. (Deprecated M115)
   </int>
   <int value="1" label="Prefetch Used, Probe Success">
     The interceptor used a prefetch after successfully probing the origin.
@@ -83390,9 +83442,9 @@
     The url was eligible to be prefetched, but the network request was never
     made.
   </int>
-  <int value="4" label="Prefetch Not,Eligible: Google Domain">
+  <int value="4" label="DEPRECATED Prefetch Not Eligible: Google Domain">
     The url was not eligible to be prefetched because it is a Google-owned
-    domain.
+    domain. (Deprecated M115)
   </int>
   <int value="5" label="Prefetch Not Eligible: User Has Cookies">
     The url was not eligible to be prefetched because the user had cookies for
@@ -83406,7 +83458,7 @@
     The url was not eligible to be prefetched because its scheme was not
     https://.
   </int>
-  <int value="8" label="Prefetch Not Eligible: Host Is IP Address">
+  <int value="8" label="DEPRECATED Prefetch Not Eligible: Host Is IP Address">
     The url was not eligible to be prefetched because its host was an IP
     address. (Deprecated M100)
   </int>
@@ -83430,64 +83482,86 @@
   <int value="14" label="Prefetch Successful">
     The prefetch finished successfully but was never used.
   </int>
-  <int value="15" label="Navigated To Link Not On SRP">
+  <int value="15" label="DEPRECATED Navigated To Link Not On SRP">
     The navigation off of the Google SRP was to a url that was not on the SRP.
+    (Deprecated M115)
   </int>
-  <int value="16" label="Prefetch Used, No Probe, Did NoStatePrefetch">
+  <int value="16"
+      label="DEPRECATED Prefetch Used, No Probe, Did NoStatePrefetch">
     The url was prefetched and No State Prerendered and committed without a
-    probe to the origin.
+    probe to the origin. (Deprecated M115)
   </int>
-  <int value="17" label="Prefetch Used, Probe Success, Did NoStatePrefetch">
+  <int value="17"
+      label="DEPRECATED Prefetch Used, Probe Success, Did NoStatePrefetch">
     The url was prefetched and No State Prerendered and committed with a
-    successful probe to the origin.
+    successful probe to the origin. (Deprecated M115)
   </int>
-  <int value="18" label="Prefetch Not Used, Probe Failed, Did NoStatePrefetch">
+  <int value="18"
+      label="DEPRECATED Prefetch Not Used, Probe Failed, Did NoStatePrefetch">
     The url was prefetched and No State Prerendered but the origin probe failed
-    and the prefetch was not used.
+    and the prefetch was not used. (Deprecated M115)
   </int>
   <int value="19"
-      label="Prefetch Used, No Probe, NoStatePrefetch Attempt Denied">
+      label="DEPRECATED Prefetch Used, No Probe, NoStatePrefetch Attempt
+             Denied">
     The url was prefetched but was not No State Prerendered despite attempting
-    to do so and committed without a probe to the origin.
+    to do so and committed without a probe to the origin. (Deprecated M115)
   </int>
   <int value="20"
-      label="Prefetch Used, Probe Success, NoStatePrefetch Attempt Denied">
+      label="DEPRECATED Prefetch Used, Probe Success, NoStatePrefetch Attempt
+             Denied">
     The url was prefetched but was not No State Prerendered despite attempting
-    to do so and committed with a successful probe to the origin.
+    to do so and committed with a successful probe to the origin. (Deprecated
+    M115)
   </int>
   <int value="21"
-      label="Prefetch Not Used, Probe Failed, NoStatePrefetch Attempt Denied">
+      label="DEPRECATED Prefetch Not Used, Probe Failed, NoStatePrefetch
+             Attempt Denied">
     The url was prefetched but was not No State Prerendered despite attempting
     to do so, and the origin probe failed and the prefetch was not used.
+    (Deprecated M115)
   </int>
-  <int value="22" label="Prefetch Used, No Probe, NoStatePrefetch Not Started">
+  <int value="22"
+      label="DEPRECATED Prefetch Used, No Probe, NoStatePrefetch Not Started">
     The url was prefetched and eligible for NoStatePrerender but wasn't started
-    and committed without a probe to the origin.
+    and committed without a probe to the origin. (Deprecated M115)
   </int>
   <int value="23"
-      label="Prefetch Used, Probe Success, NoStatePrefetch Not Started">
+      label="DEPRECATED Prefetch Used, Probe Success, NoStatePrefetch Not
+             Started">
     The url was prefetched and eligible for NoStatePrerender but wasn't started
-    and committed with a successful probe to the origin.
+    and committed with a successful probe to the origin. (Deprecated M115)
   </int>
   <int value="24"
-      label="Prefetch Not Used, Probe Failed, NoStatePrefetch Not Started">
+      label="DEPRECATED Prefetch Not Used, Probe Failed, NoStatePrefetch Not
+             Started">
     The url was prefetched and eligible for NoStatePrerender but wasn't started
-    and the origin probe failed and the prefetch was not used.
+    and the origin probe failed and the prefetch was not used. (Deprecated M115)
   </int>
-  <int value="25" label="Subresource throttled"/>
-  <int value="26" label="Prediction position not eligible"/>
+  <int value="25" label="DEPRECATED Subresource throttled">
+    (Deprecated M115)
+  </int>
+  <int value="26" label="DEPRECATED Prediction position not eligible">
+    (Deprecated M115)
+  </int>
   <int value="27" label="Prefetch Not Eligible: Retry-After not elasped"/>
   <int value="28" label="Connecting to the prefetch proxy previously failed"/>
   <int value="29" label="Decoy request"/>
   <int value="30" label="Stale prefetch"/>
-  <int value="31" label="Stale prefetch with NSP"/>
-  <int value="32" label="Stale prefetch, NSP attempt denied"/>
-  <int value="33" label="Stale prefetch, NSP not started"/>
+  <int value="31" label="DEPRECATED Stale prefetch with NSP">
+    (Deprecated M115)
+  </int>
+  <int value="32" label="DEPRECATED Stale prefetch, NSP attempt denied">
+    (Deprecated M115)
+  </int>
+  <int value="33" label="DEPRECATED Stale prefetch, NSP not started">
+    (Deprecated M115)
+  </int>
   <int value="34" label="Prefetch Not Used, Cookies Changed">
     The url was prefetched but not used, because cookies were added to the URL
     at some point after the initial eligibility check.
   </int>
-  <int value="35" label="Prefetch failed, redirects disabled">
+  <int value="35" label="DEPRECATED Prefetch failed, redirects disabled">
     The url was prefetched and was redirected; however, redirects were disabled,
     so the prefetch failed. (Deprecated M113)
   </int>
@@ -100339,7 +100413,7 @@
   <int value="18" label="SERVER_RETURN_CLIENT_DATA_OBSOLETE"/>
   <int value="19" label="SERVER_RETURN_ENCRYPTION_OBSOLETE"/>
   <int value="20" label="(deprecated) DATATYPE_TRIGGERED_RETRY"/>
-  <int value="21" label="SERVER_MORE_TO_DOWNLOAD"/>
+  <int value="21" label="(deprecated) SERVER_MORE_TO_DOWNLOAD"/>
   <int value="22" label="SYNCER_OK"/>
 </enum>
 
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index d22487a8..7d3042e 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -1946,7 +1946,7 @@
 </histogram>
 
 <histogram name="Net.HttpJob.CanIncludeCookies" enum="Boolean"
-    expires_after="2023-06-18">
+    expires_after="2024-06-18">
   <owner>cfredric@chromium.org</owner>
   <owner>kaustubhag@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index a689540..26e3d73f 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -3091,58 +3091,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime.FrameTree"
-    units="ms" expires_after="2020-12-01">
-  <owner>sclittle@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Total time the browser process waited for all render processes to save their
-    respective frames while saving a page into MHTML.
-  </summary>
-</histogram>
-
-<histogram
-    name="PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime.SingleFrame"
-    units="ms" expires_after="2020-12-01">
-  <owner>sclittle@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Time the browser process waited on a single frame to be saved by a render
-    processes while saving a page into MHTML.
-  </summary>
-</histogram>
-
-<histogram name="PageSerialization.MhtmlGeneration.FinalSaveStatus"
-    enum="MhtmlGenerationFinalSaveStatus" expires_after="2021-08-08">
-  <owner>sclittle@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>Final status of the MHTML save operation for a page.</summary>
-</histogram>
-
-<histogram
-    name="PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame"
-    units="ms" expires_after="2020-12-01">
-  <owner>sclittle@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Time spent by the renderer main thread while saving one frame of a page to
-    MHTML.
-  </summary>
-</histogram>
-
-<histogram name="PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame"
-    units="ms" expires_after="2020-12-01">
-  <owner>sclittle@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Time spent writing a frame's encoded MHTML data to the file or data pipe
-    handle passed to the Renderer, recorded when the writing is done and the
-    handle is closed. Note that when writing to a data pipe, this metric does
-    not precisely reflect the time taken to write the data to disk.
-  </summary>
-</histogram>
-
 <histogram name="PageSerialization.MhtmlLoading.LoadResult"
     enum="MhtmlLoadResult" expires_after="2023-04-23">
   <owner>sclittle@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index f7ac025..4d66705 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -1141,7 +1141,47 @@
     enum="PasswordCheckInteraction" expires_after="2023-09-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
-  <summary>User actions performed on the Password Check settings page.</summary>
+  <summary>
+    User actions performed on the Password Check settings page. Replaced on IOS
+    by PasswordManager.BulkCheck.UserAction.IOS.* in M114.
+  </summary>
+</histogram>
+
+<histogram name="PasswordManager.BulkCheck.UserAction.IOS.General"
+    enum="PasswordCheckInteractionIOSWithoutContext" expires_after="2023-10-28">
+  <owner>eic@google.com</owner>
+  <owner>noemies@google.com</owner>
+  <summary>
+    User actions performed on the Password Check UI inside the Password Manager.
+    After M114, the Password Check UI on iOS was divided into multiple views to
+    display each type of password check warning: compromised passwords, reused
+    passwords, and weak passwords. User actions taken in the Password Check UI
+    while viewing a specific type of warning are logged in
+    PasswordManager.BulkCheck.UserAction.IOS{Context}. The actions logged are
+    done from Password Check UI not specific to a type of warning.
+  </summary>
+</histogram>
+
+<histogram name="PasswordManager.BulkCheck.UserAction.IOS{Context}"
+    enum="PasswordCheckInteractionIOS" expires_after="2023-10-28">
+  <owner>eic@google.com</owner>
+  <owner>noemies@google.com</owner>
+  <summary>
+    User actions performed on the Password Check UI inside the Password Manager.
+    After M114, the Password Check UI on iOS was divided into multiple views to
+    display each type of password check warning: compromised passwords, reused
+    passwords, and weak passwords. This histogram represents actions taken in
+    the Password Check UI while viewing a specific type of warning. See
+    PasswordManager.BulkCheck.UserAction.IOS.General for actions not specific to
+    a type of warning.
+  </summary>
+  <token key="Context">
+    <variant name="" summary="Aggregated across all breakdowns"/>
+    <variant name=".Compromised"/>
+    <variant name=".MutedCompromised"/>
+    <variant name=".Reused"/>
+    <variant name=".Weak"/>
+  </token>
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.UserActionAndroid"
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index 27665243..36fab16 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -576,6 +576,17 @@
   </token>
 </histogram>
 
+<histogram name="SBClientPhishing.ApplyTfliteTime.Classify" units="ms"
+    expires_after="2024-05-05">
+  <owner>andysjlim@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Records the duration of running the TfLite classification, which is one step
+    in applying the TfLite model for phishing detection. This model is applied
+    roughly once per navigation.
+  </summary>
+</histogram>
+
 <histogram name="SBClientPhishing.BrowserReadyOnClassifierNotReady"
     enum="BooleanReady" expires_after="2023-07-24">
   <owner>andysjlim@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index 9bf4997b..b941bca 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -814,7 +814,7 @@
 </histogram>
 
 <histogram name="SiteIsolation.IsolatableSandboxedIframes" units="processes"
-    expires_after="2023-05-09">
+    expires_after="2023-11-08">
   <owner>wjmaclean@chromium.org</owner>
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
@@ -833,7 +833,7 @@
 </histogram>
 
 <histogram name="SiteIsolation.IsolatableSandboxedIframes.UniqueOrigins"
-    units="processes" expires_after="2023-05-09">
+    units="processes" expires_after="2023-11-08">
   <owner>wjmaclean@chromium.org</owner>
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
@@ -848,7 +848,7 @@
 </histogram>
 
 <histogram name="SiteIsolation.IsolatableSandboxedIframes.UniqueSites"
-    units="processes" expires_after="2023-05-09">
+    units="processes" expires_after="2023-11-08">
   <owner>wjmaclean@chromium.org</owner>
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index b82ced5..823ac3d 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -1483,9 +1483,8 @@
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
-    The time to perform 'match' operations of type {MatchType} on the Cache
-    object in the ServiceWorker Cache API. This histogram was temporarily
-    disabled from M96 through early 12/2021.
+    Histogram for the ServiceWorker Cache API. {MatchType} This histogram was
+    temporarily disabled from M96 through early 12/2021.
   </summary>
   <token key="ServiceWorkerCacheProcessType"
       variants="ServiceWorkerCacheProcessType"/>
@@ -1510,9 +1509,8 @@
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
-    The time to perform the {ProcessOps} operation on the Cache object in the
-    ServiceWorker Cache API. This histogram was temporarily disabled from M96
-    through early 12/2021.
+    Histogram for the ServiceWorker Cache API. {ProcessOps} This histogram was
+    temporarily disabled from M96 through early 12/2021.
   </summary>
   <token key="ServiceWorkerCacheProcessType"
       variants="ServiceWorkerCacheProcessType"/>
@@ -1555,9 +1553,8 @@
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
-    The time to perform the {ProcessOps} operations on the CacheStorage object
-    in the ServiceWorker Cache API. This histogram was temporarily disabled from
-    M96 through early 12/2021.
+    Histogram for the ServiceWorker Cache API. {ProcessOps} This histogram was
+    temporarily disabled from M96 through early 12/2021.
   </summary>
   <token key="ServiceWorkerCacheProcessType"
       variants="ServiceWorkerCacheProcessType"/>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index f2f81665..b401f06 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -526,6 +526,26 @@
   </summary>
 </histogram>
 
+<histogram name="TabGroups.SavedTabGroupCount" units="groups"
+    expires_after="2023-12-27">
+  <owner>dljames@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records once an hour once the SavedTabGroupKeyedService is instantiated.
+    Tracks the total number of groups saved in the profile.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.SavedTabGroupTabCount" units="tabs"
+    expires_after="2023-12-27">
+  <owner>dljames@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records once an hour once the SavedTabGroupKeyedService is instantiated.
+    Tracks the number of tabs in a SavedTabGroup.
+  </summary>
+</histogram>
+
 <histogram name="TabGroups.SessionsPerGroup" units="sessions"
     expires_after="2023-10-22">
   <owner>yusufo@chromium.org</owner>
@@ -558,6 +578,26 @@
   </summary>
 </histogram>
 
+<histogram name="TabGroups.UnsavedTabGroupCount" units="groups"
+    expires_after="2023-12-27">
+  <owner>dljames@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records once an hour once the SavedTabGroupKeyedService is instantiated.
+    Tracks the number of unsaved TabGroups.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.UnsavedTabGroupTabCount" units="tabs"
+    expires_after="2023-12-27">
+  <owner>dljames@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records once an hour once the SavedTabGroupKeyedService is instantiated.
+    Tracks the number of tabs in an unsaved TabGroup.
+  </summary>
+</histogram>
+
 <histogram name="TabGroups.UserCustomizedGroupCountPerLoad" units="groups"
     expires_after="2023-09-03">
   <owner>dpenning@chromium.org</owner>
diff --git a/tools/origin_trials/generate_token.py b/tools/origin_trials/generate_token.py
index 61513a4a..cb488c1 100755
--- a/tools/origin_trials/generate_token.py
+++ b/tools/origin_trials/generate_token.py
@@ -8,8 +8,8 @@
 usage: generate_token.py [-h] [--key-file KEY_FILE]
                          [--expire-days EXPIRE_DAYS |
                           --expire-timestamp EXPIRE_TIMESTAMP]
-                         [--is_subdomain | --no-subdomain]
-                         [--is_third-party | --no-third-party]
+                         [--is-subdomain | --no-subdomain]
+                         [--is-third-party | --no-third-party]
                          [--usage-restriction USAGE_RESTRICTION]
                          --version=VERSION
                          origin trial_name
diff --git a/ui/accessibility/test_ax_tree_update_json_reader.h b/ui/accessibility/test_ax_tree_update_json_reader.h
index e4f00d1..d4298fcbb 100644
--- a/ui/accessibility/test_ax_tree_update_json_reader.h
+++ b/ui/accessibility/test_ax_tree_update_json_reader.h
@@ -18,7 +18,7 @@
 // NOTE: This parser is not complete and only processes the required tags for
 // the existing tests.
 // |role_conversions| is a map of role strings in the JSON file to Chrome roles.
-// TODO(https://crbug.com/1278249): Drop |role_conversions| once Chrome roles
+// TODO(https://crbug.com/1341655): Drop |role_conversions| once Chrome roles
 // are added to the JSON file.
 AXTreeUpdate AXTreeUpdateFromJSON(
     const base::Value& json,
diff --git a/ui/android/java/src/org/chromium/ui/base/UiAndroidFeatureList.java b/ui/android/java/src/org/chromium/ui/base/UiAndroidFeatureList.java
index 15732b1..b53c05df 100644
--- a/ui/android/java/src/org/chromium/ui/base/UiAndroidFeatureList.java
+++ b/ui/android/java/src/org/chromium/ui/base/UiAndroidFeatureList.java
@@ -6,13 +6,11 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Java accessor for ui/android/ui_android_feature_list.cc state
  */
 @JNINamespace("ui")
-@MainDex
 public class UiAndroidFeatureList {
     // Do not instantiate this class
     private UiAndroidFeatureList() {}
diff --git a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
index 73a38ea8..f1773b73 100644
--- a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
+++ b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
@@ -21,13 +21,11 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.compat.ApiHelperForR;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * DisplayAndroidManager is a class that informs its observers Display changes.
  */
 @JNINamespace("ui")
-@MainDex
 public class DisplayAndroidManager {
     /**
      * DisplayListenerBackend is used to handle the actual listening of display changes. It handles
diff --git a/ui/android/java/src/org/chromium/ui/gl/ScopedJavaSurfaceControl.java b/ui/android/java/src/org/chromium/ui/gl/ScopedJavaSurfaceControl.java
index 36e30fa..3355b02 100644
--- a/ui/android/java/src/org/chromium/ui/gl/ScopedJavaSurfaceControl.java
+++ b/ui/android/java/src/org/chromium/ui/gl/ScopedJavaSurfaceControl.java
@@ -11,11 +11,9 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.build.annotations.MainDex;
 
 @RequiresApi(Build.VERSION_CODES.Q)
 @JNINamespace("gl")
-@MainDex
 class ScopedJavaSurfaceControl {
     @CalledByNative
     private static void releaseSurfaceControl(SurfaceControl surfaceControl) {
diff --git a/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java b/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java
index 9f50ca8..84fb3fd 100644
--- a/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java
+++ b/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java
@@ -8,13 +8,11 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Listener to an android SurfaceTexture object for frame availability.
  */
 @JNINamespace("gl")
-@MainDex
 class SurfaceTextureListener implements SurfaceTexture.OnFrameAvailableListener {
     // Used to determine the class instance to dispatch the native call to.
     private final long mNativeSurfaceTextureListener;
diff --git a/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java b/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java
index a8d28445..0e2e6b586 100644
--- a/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java
+++ b/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java
@@ -9,14 +9,12 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * Wrapper class for the underlying platform's SurfaceTexture in order to
  * provide a stable JNI API.
  */
 @JNINamespace("gl")
-@MainDex
 class SurfaceTexturePlatformWrapper {
     private static final String TAG = "SurfaceTexturePlatformWrapper";
 
diff --git a/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java b/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java
index 25574611..8420777 100644
--- a/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java
+++ b/ui/android/java/src/org/chromium/ui/resources/ResourceManager.java
@@ -12,7 +12,6 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.display.DisplayAndroid;
 import org.chromium.ui.resources.ResourceLoader.ResourceLoaderCallback;
@@ -26,7 +25,6 @@
  * This class does not hold any resource state, but passes it directly to native as they are loaded.
  */
 @JNINamespace("ui")
-@MainDex
 public class ResourceManager implements ResourceLoaderCallback {
     private final SparseArray<ResourceLoader> mResourceLoaders = new SparseArray<ResourceLoader>();
     private final SparseArray<SparseArray<LayoutResource>> mLoadedResources =
diff --git a/ui/base/accelerators/accelerator.h b/ui/base/accelerators/accelerator.h
index bcc4452..d5fe7062 100644
--- a/ui/base/accelerators/accelerator.h
+++ b/ui/base/accelerators/accelerator.h
@@ -154,8 +154,8 @@
   // Whether the accelerator is interrupted by a mouse press/release. This is
   // optionally used by AcceleratorController. Even this is set to true, the
   // accelerator may still be handled successfully. (Currently only
-  // TOGGLE_APP_LIST is disabled when mouse press/release occurs between search
-  // key down and up. See crbug.com/665897)
+  // AcceleratorAction::kToggleAppList is disabled when mouse press/release
+  // occurs between search key down and up. See crbug.com/665897)
   bool interrupted_by_mouse_event_;
 
   // The |source_device_id_| of the KeyEvent.
diff --git a/ui/chromeos/styles/cros_typography.json5 b/ui/chromeos/styles/cros_typography.json5
index f5f314f..d0525552 100644
--- a/ui/chromeos/styles/cros_typography.json5
+++ b/ui/chromeos/styles/cros_typography.json5
@@ -58,6 +58,12 @@
         font_size: 13,
         font_weight: 500,
         line_height: 20,
+      },
+      title_1: {
+        font_family: '$font_family_google_sans',
+        font_size: 16,
+        font_weight: 500,
+        line_height: 24,
       }
     }
   },
diff --git a/ui/color/BUILD.gn b/ui/color/BUILD.gn
index 71e3aa2..e36b69c 100644
--- a/ui/color/BUILD.gn
+++ b/ui/color/BUILD.gn
@@ -61,12 +61,13 @@
   ]
 
   if (is_mac) {
-    frameworks = [ "AppKit.framework" ]
     sources += [
       "mac/native_color_transform.mm",
       "mac/system_color_utils.h",
       "mac/system_color_utils.mm",
     ]
+    configs += [ "//build/config/compiler:enable_arc" ]
+    frameworks = [ "AppKit.framework" ]
   }
 }
 
@@ -159,8 +160,9 @@
   if (is_chromeos) {
     sources += [ "chromeos/native_color_mixers_chromeos.cc" ]
   } else if (is_mac) {
-    frameworks = [ "AppKit.framework" ]
     sources += [ "mac/native_color_mixers_mac.mm" ]
+    configs += [ "//build/config/compiler:enable_arc" ]
+    frameworks = [ "AppKit.framework" ]
   } else if (is_win) {
     sources += [ "win/native_color_mixers_win.cc" ]
     deps += [
diff --git a/ui/color/mac/native_color_mixers_mac.mm b/ui/color/mac/native_color_mixers_mac.mm
index 4f9127a..be72694 100644
--- a/ui/color/mac/native_color_mixers_mac.mm
+++ b/ui/color/mac/native_color_mixers_mac.mm
@@ -15,6 +15,10 @@
 #include "ui/color/color_recipe.h"
 #include "ui/gfx/color_palette.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ui {
 
 namespace {
diff --git a/ui/color/mac/native_color_transform.mm b/ui/color/mac/native_color_transform.mm
index b77a298..207c80e 100644
--- a/ui/color/mac/native_color_transform.mm
+++ b/ui/color/mac/native_color_transform.mm
@@ -12,6 +12,10 @@
 #include "ui/color/mac/system_color_utils.h"
 #include "ui/gfx/color_utils.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ui {
 
 ColorTransform ApplySystemControlTintIfNeeded() {
diff --git a/ui/color/mac/system_color_utils.mm b/ui/color/mac/system_color_utils.mm
index 61c794d..d4264a1 100644
--- a/ui/color/mac/system_color_utils.mm
+++ b/ui/color/mac/system_color_utils.mm
@@ -8,6 +8,10 @@
 
 #include "ui/gfx/color_utils.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 bool graphite_tint_test_override = false;
 }
@@ -18,7 +22,7 @@
   if (graphite_tint_test_override)
     return true;
 
-  return [NSColor currentControlTint] == NSGraphiteControlTint;
+  return NSColor.currentControlTint == NSGraphiteControlTint;
 }
 
 SkColor ColorToGrayscale(SkColor color) {
@@ -35,4 +39,4 @@
   graphite_tint_test_override = original_test_override_;
 }
 
-}  // ui
+}  // namespace ui
diff --git a/ui/events/ash/event_rewriter_ash.cc b/ui/events/ash/event_rewriter_ash.cc
index 851301e..863b3ffe9 100644
--- a/ui/events/ash/event_rewriter_ash.cc
+++ b/ui/events/ash/event_rewriter_ash.cc
@@ -704,6 +704,7 @@
 }
 
 bool EventRewriterAsh::RewriteModifierKeys(const KeyEvent& key_event,
+                                           int device_id,
                                            MutableKeyState* state) {
   DCHECK(key_event.type() == ET_KEY_PRESSED ||
          key_event.type() == ET_KEY_RELEASED);
@@ -732,13 +733,13 @@
       if (IsISOLevel5ShiftUsedByCurrentInputMethod()) {
         if (incoming.code == DomCode::CAPS_LOCK) {
           characteristic_flag = EF_ALTGR_DOWN | EF_MOD3_DOWN;
-          remapped_key = GetRemappedKey(
-              last_keyboard_device_id_, mojom::ModifierKey::kCapsLock,
-              prefs::kLanguageRemapCapsLockKeyTo, delegate_);
+          remapped_key =
+              GetRemappedKey(device_id, mojom::ModifierKey::kCapsLock,
+                             prefs::kLanguageRemapCapsLockKeyTo, delegate_);
         } else {
           characteristic_flag = EF_ALTGR_DOWN;
-          remapped_key = GetSearchRemappedKey(
-              delegate_, last_keyboard_device_id_, *keyboard_capability_);
+          remapped_key =
+              GetSearchRemappedKey(delegate_, device_id, *keyboard_capability_);
         }
       }
       if (remapped_key && remapped_key->result.key_code == VKEY_CAPITAL) {
@@ -783,15 +784,15 @@
       }
 
       characteristic_flag = EF_CAPS_LOCK_ON;
-      remapped_key = GetRemappedKey(
-          last_keyboard_device_id_, mojom::ModifierKey::kCapsLock,
-          prefs::kLanguageRemapCapsLockKeyTo, delegate_);
+      remapped_key =
+          GetRemappedKey(device_id, mojom::ModifierKey::kCapsLock,
+                         prefs::kLanguageRemapCapsLockKeyTo, delegate_);
       break;
     case DomCode::META_LEFT:
     case DomCode::META_RIGHT:
       characteristic_flag = EF_COMMAND_DOWN;
-      remapped_key = GetSearchRemappedKey(delegate_, last_keyboard_device_id_,
-                                          *keyboard_capability_);
+      remapped_key =
+          GetSearchRemappedKey(delegate_, device_id, *keyboard_capability_);
       // Default behavior is Super key, hence don't remap the event if the pref
       // is unavailable.
       break;
@@ -799,31 +800,30 @@
     case DomCode::CONTROL_RIGHT:
       characteristic_flag = EF_CONTROL_DOWN;
       remapped_key =
-          GetRemappedKey(last_keyboard_device_id_, mojom::ModifierKey::kControl,
+          GetRemappedKey(device_id, mojom::ModifierKey::kControl,
                          prefs::kLanguageRemapControlKeyTo, delegate_);
       break;
     case DomCode::ALT_LEFT:
     case DomCode::ALT_RIGHT:
       // ALT key
       characteristic_flag = EF_ALT_DOWN;
-      remapped_key =
-          GetRemappedKey(last_keyboard_device_id_, mojom::ModifierKey::kAlt,
-                         prefs::kLanguageRemapAltKeyTo, delegate_);
+      remapped_key = GetRemappedKey(device_id, mojom::ModifierKey::kAlt,
+                                    prefs::kLanguageRemapAltKeyTo, delegate_);
       break;
     case DomCode::ESCAPE:
       remapped_key =
-          GetRemappedKey(last_keyboard_device_id_, mojom::ModifierKey::kEscape,
+          GetRemappedKey(device_id, mojom::ModifierKey::kEscape,
                          prefs::kLanguageRemapEscapeKeyTo, delegate_);
       break;
     case DomCode::BACKSPACE:
-      remapped_key = GetRemappedKey(
-          last_keyboard_device_id_, mojom::ModifierKey::kBackspace,
-          prefs::kLanguageRemapBackspaceKeyTo, delegate_);
+      remapped_key =
+          GetRemappedKey(device_id, mojom::ModifierKey::kBackspace,
+                         prefs::kLanguageRemapBackspaceKeyTo, delegate_);
       break;
     case DomCode::LAUNCH_ASSISTANT:
-      remapped_key = GetRemappedKey(
-          last_keyboard_device_id_, mojom::ModifierKey::kAssistant,
-          prefs::kLanguageRemapAssistantKeyTo, delegate_);
+      remapped_key =
+          GetRemappedKey(device_id, mojom::ModifierKey::kAssistant,
+                         prefs::kLanguageRemapAssistantKeyTo, delegate_);
       break;
     default:
       break;
@@ -856,7 +856,7 @@
   }
 
   // Next, remap modifier bits.
-  state->flags |= GetRemappedModifierMasks(key_event, incoming.flags);
+  state->flags |= GetRemappedModifierMasks(device_id, incoming.flags);
 
   // If the DomKey is not a modifier before remapping but is after, set the
   // modifier latches for the later non-modifier key's modifier states.
@@ -903,18 +903,20 @@
   return exact_event;
 }
 
-void EventRewriterAsh::DeviceKeyPressedOrReleased(int device_id) {
-  KeyboardCapability::DeviceType type =
-      keyboard_capability_->GetDeviceType(device_id);
-
-  // Ignore virtual Xorg keyboard (magic that generates key repeat
-  // events). Pretend that the previous real keyboard is the one that is still
-  // in use.
-  if (type == KeyboardCapability::DeviceType::kDeviceVirtualCoreKeyboard) {
-    return;
+int EventRewriterAsh::GetKeyboardDeviceId(int keyboard_device_id,
+                                          int last_keyboard_device_id) const {
+  if (keyboard_device_id == ED_UNKNOWN_DEVICE) {
+    return ED_UNKNOWN_DEVICE;
   }
 
-  last_keyboard_device_id_ = device_id;
+  // Ignore virtual Xorg keyboard (magic that generates key repeat events).
+  // Pretend that the previous real keyboard is the one that is still in use.
+  if (keyboard_capability_->GetDeviceType(keyboard_device_id) ==
+      KeyboardCapability::DeviceType::kDeviceVirtualCoreKeyboard) {
+    return last_keyboard_device_id;
+  }
+
+  return keyboard_device_id;
 }
 
 bool EventRewriterAsh::IsHotrodRemote(int device_id) const {
@@ -922,7 +924,7 @@
          KeyboardCapability::DeviceType::kDeviceHotrodRemote;
 }
 
-int EventRewriterAsh::GetRemappedModifierMasks(const Event& event,
+int EventRewriterAsh::GetRemappedModifierMasks(int device_id,
                                                int original_flags) const {
   int unmodified_flags = original_flags;
   int rewritten_flags = pressed_modifier_latches_ | latched_modifier_latches_;
@@ -934,8 +936,8 @@
     }
     switch (kModifierRemappings[i].flag) {
       case EF_COMMAND_DOWN:
-        remapped_key = GetSearchRemappedKey(delegate_, last_keyboard_device_id_,
-                                            *keyboard_capability_);
+        remapped_key =
+            GetSearchRemappedKey(delegate_, device_id, *keyboard_capability_);
         break;
       case EF_MOD3_DOWN:
         // If EF_MOD3_DOWN is used by the current input method, leave it alone;
@@ -959,9 +961,9 @@
         break;
     }
     if (!remapped_key && kModifierRemappings[i].pref_name) {
-      remapped_key = GetRemappedKey(
-          last_keyboard_device_id_, kModifierRemappings[i].remap_to,
-          kModifierRemappings[i].pref_name, delegate_);
+      remapped_key =
+          GetRemappedKey(device_id, kModifierRemappings[i].remap_to,
+                         kModifierRemappings[i].pref_name, delegate_);
     }
     if (remapped_key) {
       unmodified_flags &= ~kModifierRemappings[i].flag;
@@ -1035,6 +1037,7 @@
 }
 
 void EventRewriterAsh::RecordModifierKeyPressedAfterRemapping(
+    int device_id,
     DomCode dom_code) {
   const ModifierKeyUsageMapping* modifier_key_usage_mapping = nullptr;
   for (const auto& mapping : modifier_key_usage_mappings) {
@@ -1048,7 +1051,7 @@
     return;
   }
 
-  switch (keyboard_capability_->GetDeviceType(last_keyboard_device_id_)) {
+  switch (keyboard_capability_->GetDeviceType(device_id)) {
     case KeyboardCapability::DeviceType::kDeviceInternalKeyboard:
       UMA_HISTOGRAM_ENUMERATION(
           "ChromeOS.Inputs.Keyboard.RemappedModifierPressed.Internal",
@@ -1078,6 +1081,7 @@
 }
 
 void EventRewriterAsh::RecordModifierKeyPressedBeforeRemapping(
+    int device_id,
     DomCode dom_code) {
   const ModifierKeyUsageMapping* modifier_key_usage_mapping = nullptr;
   for (const auto& mapping : modifier_key_usage_mappings) {
@@ -1091,7 +1095,7 @@
     return;
   }
 
-  switch (keyboard_capability_->GetDeviceType(last_keyboard_device_id_)) {
+  switch (keyboard_capability_->GetDeviceType(device_id)) {
     case KeyboardCapability::DeviceType::kDeviceInternalKeyboard:
       UMA_HISTOGRAM_ENUMERATION(
           "ChromeOS.Inputs.Keyboard.ModifierPressed.Internal",
@@ -1123,14 +1127,15 @@
 EventRewriteStatus EventRewriterAsh::RewriteKeyEvent(
     const KeyEvent& key_event,
     std::unique_ptr<Event>* rewritten_event) {
-  if (key_event.source_device_id() != ED_UNKNOWN_DEVICE) {
-    DeviceKeyPressedOrReleased(key_event.source_device_id());
+  int device_id = GetKeyboardDeviceId(key_event.source_device_id(),
+                                      last_keyboard_device_id_);
+  if (device_id != ED_UNKNOWN_DEVICE) {
+    last_keyboard_device_id_ = device_id;
   }
 
   // Drop repeated keys from Hotrod remote.
   if ((key_event.flags() & EF_IS_REPEAT) &&
-      (key_event.type() == ET_KEY_PRESSED) &&
-      IsHotrodRemote(last_keyboard_device_id_) &&
+      (key_event.type() == ET_KEY_PRESSED) && IsHotrodRemote(device_id) &&
       key_event.key_code() != VKEY_BACK) {
     return EVENT_REWRITE_DISCARD;
   }
@@ -1139,7 +1144,7 @@
   const bool should_record_modifier_key_press_metrics =
       !(key_event.flags() & EF_IS_REPEAT) && key_event.type() == ET_KEY_PRESSED;
   if (should_record_modifier_key_press_metrics) {
-    RecordModifierKeyPressedBeforeRemapping(key_event.code());
+    RecordModifierKeyPressedBeforeRemapping(device_id, key_event.code());
   }
 
   MutableKeyState state = {key_event.flags(), key_event.code(),
@@ -1151,9 +1156,9 @@
     // If RewriteModifierKeys() returns true there should be no more processing
     // done to the key event. It will only return true if the key event is
     // rewritten to ALTGR. A false return is not an error.
-    if (RewriteModifierKeys(key_event, &state)) {
+    if (RewriteModifierKeys(key_event, device_id, &state)) {
       if (should_record_modifier_key_press_metrics) {
-        RecordModifierKeyPressedAfterRemapping(state.code);
+        RecordModifierKeyPressedAfterRemapping(device_id, state.code);
       }
       // Early exit with completed event.
       BuildRewrittenKeyEvent(key_event, state, rewritten_event);
@@ -1163,7 +1168,7 @@
   }
 
   if (should_record_modifier_key_press_metrics) {
-    RecordModifierKeyPressedAfterRemapping(state.code);
+    RecordModifierKeyPressedAfterRemapping(device_id, state.code);
   }
 
   if (delegate_ &&
@@ -1209,7 +1214,7 @@
   // thereafter.
   if (!is_sticky_key_extension_command && !(key_event.flags() & EF_FINAL)) {
     RewriteExtendedKeys(key_event, &state);
-    RewriteFunctionKeys(key_event, &state);
+    RewriteFunctionKeys(key_event, device_id, &state);
   }
   if ((key_event.flags() == state.flags) &&
       (key_event.key_code() == state.key_code) &&
@@ -1529,6 +1534,7 @@
 }
 
 void EventRewriterAsh::RewriteFunctionKeys(const KeyEvent& key_event,
+                                           int device_id,
                                            MutableKeyState* state) {
   CHECK(key_event.type() == ET_KEY_PRESSED ||
         key_event.type() == ET_KEY_RELEASED);
@@ -1549,24 +1555,24 @@
   }
 
   KeyboardCapability::KeyboardTopRowLayout layout =
-      keyboard_capability_->GetTopRowLayout(key_event.source_device_id());
+      keyboard_capability_->GetTopRowLayout(device_id);
 
   const bool search_is_pressed = (state->flags & EF_COMMAND_DOWN) != 0;
-  const bool flip_remapping = ShouldRewriteMetaTopRowKeyComboEvents(
-                                  delegate_, last_keyboard_device_id_) &&
-                              search_is_pressed;
+  const bool flip_remapping =
+      ShouldRewriteMetaTopRowKeyComboEvents(delegate_, device_id) &&
+      search_is_pressed;
   if (layout ==
       KeyboardCapability::KeyboardTopRowLayout::kKbdTopRowLayoutCustom) {
-    if (RewriteTopRowKeysForCustomLayout(key_event.source_device_id(),
-                                         key_event, search_is_pressed, state)) {
+    if (RewriteTopRowKeysForCustomLayout(key_event, device_id,
+                                         search_is_pressed, state)) {
       return;
     }
   } else if (layout == KeyboardCapability::KeyboardTopRowLayout::
                            kKbdTopRowLayoutWilco ||
              layout == KeyboardCapability::KeyboardTopRowLayout::
                            kKbdTopRowLayoutDrallion) {
-    if (RewriteTopRowKeysForLayoutWilco(key_event, search_is_pressed, state,
-                                        layout)) {
+    if (RewriteTopRowKeysForLayoutWilco(key_event, device_id, search_is_pressed,
+                                        state, layout)) {
       return;
     }
   } else if ((state->key_code >= VKEY_F1) && (state->key_code <= VKEY_F12)) {
@@ -1580,8 +1586,7 @@
     //  No      System   No                 Fn -> System
     //  Yes     Fn       No                 Unchanged
     //  Yes     System   No                 Unchanged
-    if (ForceTopRowAsFunctionKeys(key_event.source_device_id()) ==
-        flip_remapping) {
+    if (ForceTopRowAsFunctionKeys(device_id) == flip_remapping) {
       // Rewrite the F1-F12 keys on a Chromebook keyboard to system keys.
       // This is the original Chrome OS layout.
       static const KeyboardRemapping kFkeysToSystemKeys1[] = {
@@ -1740,7 +1745,9 @@
   if (!delegate_) {
     return event.flags();
   }
-  return GetRemappedModifierMasks(event, event.flags());
+
+  // Use the keyboard device_id for the last KeyEvent.
+  return GetRemappedModifierMasks(last_keyboard_device_id_, event.flags());
 }
 
 int EventRewriterAsh::RewriteModifierClick(const MouseEvent& mouse_event,
@@ -1938,8 +1945,8 @@
 //  No        Yes               No                  Action     Unchanged
 //  Yes       Yes               No                  Action     Unchanged
 bool EventRewriterAsh::RewriteTopRowKeysForCustomLayout(
-    int device_id,
     const KeyEvent& key_event,
+    int device_id,
     bool search_is_pressed,
     EventRewriterAsh::MutableKeyState* state) {
   // Incoming function keys are never remapped.
@@ -1947,9 +1954,9 @@
     return true;
   }
 
-  const bool flip_remapping = ShouldRewriteMetaTopRowKeyComboEvents(
-                                  delegate_, last_keyboard_device_id_) &&
-                              search_is_pressed;
+  const bool flip_remapping =
+      ShouldRewriteMetaTopRowKeyComboEvents(delegate_, device_id) &&
+      search_is_pressed;
 
   const auto* scan_code_vector_ptr =
       keyboard_capability_->GetTopRowScanCodes(device_id);
@@ -1965,8 +1972,7 @@
   // If the scan code appears in the top row mapping it is an action key.
   const bool is_action_key = (key_iter != scan_code_vector.end());
   if (is_action_key) {
-    if (flip_remapping !=
-        ForceTopRowAsFunctionKeys(key_event.source_device_id())) {
+    if (flip_remapping != ForceTopRowAsFunctionKeys(device_id)) {
       ApplyRemapping(kCustomTopRowLayoutFKeys[std::distance(
                          scan_code_vector.begin(), key_iter)],
                      state);
@@ -2010,6 +2016,7 @@
 //  Yes     Yes                 No                  Action     Action -> Fn
 bool EventRewriterAsh::RewriteTopRowKeysForLayoutWilco(
     const KeyEvent& key_event,
+    int device_id,
     bool search_is_pressed,
     MutableKeyState* state,
     KeyboardCapability::KeyboardTopRowLayout layout) {
@@ -2084,9 +2091,9 @@
       {{EF_NONE, VKEY_PRIVACY_SCREEN_TOGGLE},
        {EF_NONE, DomCode::F12, DomKey::F12, VKEY_F12}},
   };
-  const bool flip_remapping = ShouldRewriteMetaTopRowKeyComboEvents(
-                                  delegate_, last_keyboard_device_id_) &&
-                              search_is_pressed;
+  const bool flip_remapping =
+      ShouldRewriteMetaTopRowKeyComboEvents(delegate_, device_id) &&
+      search_is_pressed;
   MutableKeyState incoming_with_command_removed_if_neccessary = *state;
   if (flip_remapping) {
     incoming_with_command_removed_if_neccessary.flags &= ~EF_COMMAND_DOWN;
@@ -2118,8 +2125,7 @@
                                  std::size(kActionToFnKeys))) {
     // Incoming key code is an action key. Check if it needs to be mapped back
     // to its corresponding function key.
-    if (flip_remapping !=
-        ForceTopRowAsFunctionKeys(key_event.source_device_id())) {
+    if (flip_remapping != ForceTopRowAsFunctionKeys(device_id)) {
       // On Drallion, mirror mode toggle is on its own key so don't remap it.
       if (layout == KeyboardCapability::KeyboardTopRowLayout::
                         kKbdTopRowLayoutDrallion &&
diff --git a/ui/events/ash/event_rewriter_ash.h b/ui/events/ash/event_rewriter_ash.h
index 6e089729..92738d7 100644
--- a/ui/events/ash/event_rewriter_ash.h
+++ b/ui/events/ash/event_rewriter_ash.h
@@ -215,11 +215,20 @@
 
   // Returns true when the input |state| has key |DomKey::ALT_GRAPH_LATCH| and
   // is remapped.
-  bool RewriteModifierKeys(const KeyEvent& event, MutableKeyState* state);
-  void RewriteFunctionKeys(const KeyEvent& event, MutableKeyState* state);
+  // TODO(crbug.com/1440147): Remove this function.
+  bool RewriteModifierKeys(const KeyEvent& event, MutableKeyState* state) {
+    return RewriteModifierKeys(event, last_keyboard_device_id_, state);
+  }
+  void RewriteFunctionKeys(const KeyEvent& event, MutableKeyState* state) {
+    return RewriteFunctionKeys(event, last_keyboard_device_id_, state);
+  }
 
  private:
-  void DeviceKeyPressedOrReleased(int device_id);
+  // Returns the fixed-up keyboard device id.
+  // |keyboard_device_id| should be KeyEvent::source_device_id() for the current
+  // event, and |last_keyboard_device_id| is the previous one.
+  int GetKeyboardDeviceId(int keyboard_device_id,
+                          int last_keyboard_device_id) const;
 
   // By default the top row (F1-F12) keys are system keys for back, forward,
   // brightness, volume, etc. However, windows for v2 apps can optionally
@@ -231,7 +240,7 @@
 
   // Given modifier flags |original_flags|, returns the remapped modifiers
   // according to user preferences and/or event properties.
-  int GetRemappedModifierMasks(const Event& event, int original_flags) const;
+  int GetRemappedModifierMasks(int device_id, int original_flags) const;
 
   // Returns true if this event should be remapped to a right-click.
   // |matched_mask| will be set to the variant (Alt+Click or Search+Click)
@@ -251,8 +260,8 @@
 
   // Records when modifier keys are pressed to metrics for tracking usage of
   // various metrics before and after remapping.
-  void RecordModifierKeyPressedBeforeRemapping(DomCode dom_code);
-  void RecordModifierKeyPressedAfterRemapping(DomCode dom_code);
+  void RecordModifierKeyPressedBeforeRemapping(int device_id, DomCode dom_code);
+  void RecordModifierKeyPressedAfterRemapping(int device_id, DomCode dom_code);
 
   // Rewrite a particular kind of event.
   EventRewriteStatus RewriteKeyEvent(const KeyEvent& key_event,
@@ -269,22 +278,28 @@
 
   // Rewriter phases. These can inspect the original |event|, but operate using
   // the current |state|, which may have been modified by previous phases.
+  bool RewriteModifierKeys(const KeyEvent& event,
+                           int device_id,
+                           MutableKeyState* state);
   void RewriteNumPadKeys(const KeyEvent& event, MutableKeyState* state);
+  void RewriteFunctionKeys(const KeyEvent& event,
+                           int device_id,
+                           MutableKeyState* state);
   void RewriteExtendedKeys(const KeyEvent& event, MutableKeyState* state);
   int RewriteLocatedEvent(const Event& event);
   int RewriteModifierClick(const MouseEvent& event, int* flags);
 
   // Handle Function <-> Action key remapping for new CrOS keyboards that
   // support supplying a custom layout via sysfs.
-  bool RewriteTopRowKeysForCustomLayout(
-      int device_id,
-      const ui::KeyEvent& key_event,
-      bool search_is_pressed,
-      ui::EventRewriterAsh::MutableKeyState* state);
+  bool RewriteTopRowKeysForCustomLayout(const ui::KeyEvent& key_event,
+                                        int device_id,
+                                        bool search_is_pressed,
+                                        MutableKeyState* state);
 
   // Handle Fn/Action key remapping for Wilco keyboard layout.
   bool RewriteTopRowKeysForLayoutWilco(
       const KeyEvent& key_event,
+      int device_id,
       bool search_is_pressed,
       MutableKeyState* state,
       KeyboardCapability::KeyboardTopRowLayout layout);
diff --git a/ui/gfx/color_conversion_sk_filter_cache.cc b/ui/gfx/color_conversion_sk_filter_cache.cc
index 43ba6c1..391ec51 100644
--- a/ui/gfx/color_conversion_sk_filter_cache.cc
+++ b/ui/gfx/color_conversion_sk_filter_cache.cc
@@ -86,6 +86,20 @@
       dst(dst),
       sdr_max_luminance_nits(sdr_max_luminance_nits) {}
 
+ColorConversionSkFilterCache::Value::Value() = default;
+
+ColorConversionSkFilterCache::Value::Value(Value&& other)
+    : transform(std::move(other.transform)), effect(std::move(other.effect)) {}
+
+ColorConversionSkFilterCache::Value&
+ColorConversionSkFilterCache::Value::operator=(Value&& other) {
+  transform = std::move(other.transform);
+  effect = std::move(other.effect);
+  return *this;
+}
+
+ColorConversionSkFilterCache::Value::~Value() = default;
+
 sk_sp<SkColorFilter> ColorConversionSkFilterCache::Get(
     const gfx::ColorSpace& src,
     const gfx::ColorSpace& dst,
@@ -112,23 +126,27 @@
   }
 
   const Key key(src, src_bit_depth.value_or(0), dst, sdr_max_luminance_nits);
-  sk_sp<SkRuntimeEffect>& effect = cache_[key];
+  Value& value = cache_[key];
 
-  gfx::ColorTransform::Options options;
-  options.tone_map_pq_and_hlg_to_dst = true;
-  if (src_bit_depth)
-    options.src_bit_depth = src_bit_depth.value();
+  if (!value.effect) {
+    gfx::ColorTransform::Options options;
+    options.tone_map_pq_and_hlg_to_dst = true;
+    if (src_bit_depth) {
+      options.src_bit_depth = src_bit_depth.value();
+    }
+    options.sdr_max_luminance_nits = sdr_max_luminance_nits;
+    value.transform = gfx::ColorTransform::NewColorTransform(src, dst, options);
+    value.effect = value.transform->GetSkRuntimeEffect();
+  }
+
+  gfx::ColorTransform::RuntimeOptions options;
+  options.offset = resource_offset;
+  options.multiplier = resource_multiplier;
   options.sdr_max_luminance_nits = sdr_max_luminance_nits;
   options.src_hdr_metadata = src_hdr_metadata;
   options.dst_max_luminance_relative = dst_max_luminance_relative;
-  if (!effect) {
-    std::unique_ptr<gfx::ColorTransform> transform =
-        gfx::ColorTransform::NewColorTransform(src, dst, options);
-    effect = transform->GetSkRuntimeEffect();
-  }
-
-  return effect->makeColorFilter(gfx::ColorTransform::GetSkShaderUniforms(
-      src, dst, resource_offset, resource_multiplier, options));
+  return value.effect->makeColorFilter(
+      value.transform->GetSkShaderUniforms(options));
 }
 
 sk_sp<SkImage> ColorConversionSkFilterCache::ApplyGainmap(
diff --git a/ui/gfx/color_conversion_sk_filter_cache.h b/ui/gfx/color_conversion_sk_filter_cache.h
index 9f5184d..4ad672c 100644
--- a/ui/gfx/color_conversion_sk_filter_cache.h
+++ b/ui/gfx/color_conversion_sk_filter_cache.h
@@ -21,6 +21,8 @@
 
 namespace gfx {
 
+class ColorTransform;
+
 class COLOR_SPACE_EXPORT ColorConversionSkFilterCache {
  public:
   ColorConversionSkFilterCache();
@@ -90,8 +92,19 @@
     bool operator!=(const Key& other) const;
     bool operator<(const Key& other) const;
   };
+  struct Value {
+    Value();
+    Value(const Value&) = delete;
+    Value(Value&&);
+    Value& operator=(const Value&) = delete;
+    Value& operator=(Value&&);
+    ~Value();
 
-  base::flat_map<Key, sk_sp<SkRuntimeEffect>> cache_;
+    std::unique_ptr<ColorTransform> transform;
+    sk_sp<SkRuntimeEffect> effect;
+  };
+
+  base::flat_map<Key, Value> cache_;
 };
 
 }  // namespace gfx
diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc
index b5c4bbb..efef02b 100644
--- a/ui/gfx/color_transform.cc
+++ b/ui/gfx/color_transform.cc
@@ -35,6 +35,15 @@
 
 namespace {
 
+struct SkShaderUniforms {
+  float offset = 0.f;
+  float multiplier = 0.f;
+  float pq_tonemap_a = 1.f;
+  float pq_tonemap_b = 1.f;
+  float hlg_ootf_gamma_minus_one = 0.f;
+  float hlg_dst_max_luminance_relative = 1.0f;
+};
+
 void InitStringStream(std::stringstream* ss) {
   ss->imbue(std::locale::classic());
   ss->precision(8);
@@ -147,9 +156,10 @@
 // Returns true if tone mapping will be a non-identity operation. Computes the
 // constants used by the tone mapping algorithm described in
 // https://colab.research.google.com/drive/1hI10nq6L6ru_UFvz7-f7xQaQp0qarz_K
-bool ComputePQToneMapConstants(const gfx::ColorTransform::Options& options,
-                               float& a,
-                               float& b) {
+bool ComputePQToneMapConstants(
+    const gfx::ColorTransform::RuntimeOptions& options,
+    float& a,
+    float& b) {
   const auto hdr_metadata = gfx::HDRMetadata::PopulateUnspecifiedWithDefaults(
       options.src_hdr_metadata);
   const float src_max_lum_nits =
@@ -170,8 +180,9 @@
   return false;
 }
 
-void ComputeHLGToneMapConstants(const gfx::ColorTransform::Options& options,
-                                float& gamma_minus_one) {
+void ComputeHLGToneMapConstants(
+    const gfx::ColorTransform::RuntimeOptions& options,
+    float& gamma_minus_one) {
   const float dst_max_luminance_nits =
       options.sdr_max_luminance_nits * options.dst_max_luminance_relative;
   gamma_minus_one =
@@ -207,8 +218,13 @@
 
   // Return true if this is a null transform.
   virtual bool IsNull() { return false; }
-  virtual void Transform(ColorTransform::TriStim* color, size_t num) const = 0;
+  virtual void Transform(
+      ColorTransform::TriStim* color,
+      size_t num,
+      const ColorTransform::RuntimeOptions& options) const = 0;
   virtual void AppendSkShaderSource(std::stringstream* src) const = 0;
+  virtual void SetShaderUniforms(const ColorTransform::RuntimeOptions& options,
+                                 SkShaderUniforms* uniforms) const {}
 };
 
 class ColorTransformInternal : public ColorTransform {
@@ -222,11 +238,21 @@
   gfx::ColorSpace GetDstColorSpace() const override { return dst_; }
 
   void Transform(TriStim* colors, size_t num) const override {
+    const ColorTransform::RuntimeOptions options;
     for (const auto& step : steps_) {
-      step->Transform(colors, num);
+      step->Transform(colors, num, options);
+    }
+  }
+  void Transform(TriStim* colors,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
+    for (const auto& step : steps_) {
+      step->Transform(colors, num, options);
     }
   }
   sk_sp<SkRuntimeEffect> GetSkRuntimeEffect() const override;
+  sk_sp<SkData> GetSkShaderUniforms(
+      const RuntimeOptions& options) const override;
   bool IsIdentity() const override { return steps_.empty(); }
   size_t NumberOfStepsForTesting() const override { return steps_.size(); }
 
@@ -245,7 +271,10 @@
  public:
   ColorTransformNull* GetNull() override { return this; }
   bool IsNull() override { return true; }
-  void Transform(ColorTransform::TriStim* color, size_t num) const override {}
+  void Transform(ColorTransform::TriStim* color,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
+  }
   void AppendSkShaderSource(std::stringstream* src) const override {}
 };
 
@@ -263,7 +292,9 @@
 
   bool IsNull() override { return SkM44IsApproximatelyIdentity(matrix_); }
 
-  void Transform(ColorTransform::TriStim* colors, size_t num) const override {
+  void Transform(ColorTransform::TriStim* colors,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
     for (size_t i = 0; i < num; i++) {
       auto& color = colors[i];
       SkV4 mapped = matrix_.map(color.x(), color.y(), color.z(), 1);
@@ -306,7 +337,9 @@
   explicit ColorTransformPerChannelTransferFn(bool extended)
       : extended_(extended) {}
 
-  void Transform(ColorTransform::TriStim* colors, size_t num) const override {
+  void Transform(ColorTransform::TriStim* colors,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
     for (size_t i = 0; i < num; i++) {
       ColorTransform::TriStim& c = colors[i];
       if (extended_) {
@@ -841,7 +874,9 @@
 // the U and V values.
 class ColorTransformFromBT2020CL : public ColorTransformStep {
  public:
-  void Transform(ColorTransform::TriStim* YUV, size_t num) const override {
+  void Transform(ColorTransform::TriStim* YUV,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
     for (size_t i = 0; i < num; i++) {
       float Y = YUV[i].x();
       float U = YUV[i].y() - 0.5;
@@ -870,10 +905,7 @@
 // Apply the HLG OOTF for a specified maximum luminance.
 class ColorTransformHLGOOTF : public ColorTransformStep {
  public:
-  explicit ColorTransformHLGOOTF(float gamma_minus_one,
-                                 float dst_max_luminance_relative)
-      : gamma_minus_one_(gamma_minus_one),
-        dst_max_luminance_relative_(dst_max_luminance_relative) {}
+  ColorTransformHLGOOTF() = default;
 
   // The luminance vector in linear space.
   static constexpr float kLr = 0.2627;
@@ -881,13 +913,19 @@
   static constexpr float kLb = 0.0593;
 
   // ColorTransformStep implementation:
-  void Transform(ColorTransform::TriStim* color, size_t num) const override {
+  void Transform(ColorTransform::TriStim* color,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
+    const float dst_max_luminance_relative = options.dst_max_luminance_relative;
+    float gamma_minus_one = 0.f;
+    ComputeHLGToneMapConstants(options, gamma_minus_one);
+
     for (size_t i = 0; i < num; i++) {
       float L = kLr * color[i].x() + kLg * color[i].y() + kLb * color[i].z();
       if (L > 0.f) {
-        color[i].Scale(powf(L, gamma_minus_one_));
+        color[i].Scale(powf(L, gamma_minus_one));
         // Scale the result to the full HDR range.
-        color[i].Scale(dst_max_luminance_relative_);
+        color[i].Scale(dst_max_luminance_relative);
       }
     }
   }
@@ -902,18 +940,19 @@
          << "  }\n"
          << "}\n";
   }
-
- private:
-  // The gamma parameter for the power function specified in Rec 2100.
-  const float gamma_minus_one_;
-  const float dst_max_luminance_relative_;
+  void SetShaderUniforms(const ColorTransform::RuntimeOptions& options,
+                         SkShaderUniforms* uniforms) const override {
+    uniforms->hlg_dst_max_luminance_relative =
+        options.dst_max_luminance_relative;
+    ComputeHLGToneMapConstants(options, uniforms->hlg_ootf_gamma_minus_one);
+  }
 };
 
 // Scale the color such that the luminance `input_max_value` maps to
 // `output_max_value`.
 class ColorTransformToneMapInRec2020Linear : public ColorTransformStep {
  public:
-  ColorTransformToneMapInRec2020Linear(float a, float b) : a_(a), b_(b) {}
+  ColorTransformToneMapInRec2020Linear() = default;
 
   // The luminance vector in linear space.
   static constexpr float kLr = 0.2627;
@@ -921,11 +960,17 @@
   static constexpr float kLb = 0.0593;
 
   // ColorTransformStep implementation:
-  void Transform(ColorTransform::TriStim* color, size_t num) const override {
+  void Transform(ColorTransform::TriStim* color,
+                 size_t num,
+                 const ColorTransform::RuntimeOptions& options) const override {
+    float a = 0.f;
+    float b = 0.f;
+    ComputePQToneMapConstants(options, a, b);
+
     for (size_t i = 0; i < num; i++) {
       float L = kLr * color[i].x() + kLg * color[i].y() + kLb * color[i].z();
       if (L > 0.f)
-        color[i].Scale((1.f + a_ * L) / (1.f + b_ * L));
+        color[i].Scale((1.f + a * L) / (1.f + b * L));
     }
   }
   void AppendSkShaderSource(std::stringstream* src) const override {
@@ -934,16 +979,16 @@
          << ", 0.0);\n"
          << "  half L = dot(color, luma_vec);\n"
          << "  if (L > 0.0) {\n"
-         << "    color.rgb *= (1.0 + pq_tonemap_a *L) / \n"
-         << "                 (1.0 + pq_tonemap_b *L);\n"
+         << "    color.rgb *= (1.0 + pq_tonemap_a * L) / \n"
+         << "                 (1.0 + pq_tonemap_b * L);\n"
          << "  }\n"
          << "}\n";
   }
-
- private:
-  // Constants derived from `input_max_value` and `output_max_value`.
-  const float a_;
-  const float b_;
+  void SetShaderUniforms(const ColorTransform::RuntimeOptions& options,
+                         SkShaderUniforms* uniforms) const override {
+    ComputePQToneMapConstants(options, uniforms->pq_tonemap_a,
+                              uniforms->pq_tonemap_b);
+  }
 };
 
 void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
@@ -1027,23 +1072,17 @@
     switch (src.GetTransferID()) {
       case ColorSpace::TransferID::HLG: {
         // Apply the HLG OOTF for the specified maximum luminance.
-        float gamma_minus_one = 0.f;
-        ComputeHLGToneMapConstants(options, gamma_minus_one);
-        steps_.push_back(std::make_unique<ColorTransformHLGOOTF>(
-            gamma_minus_one, options.dst_max_luminance_relative));
+        steps_.push_back(std::make_unique<ColorTransformHLGOOTF>());
         break;
       }
       case ColorSpace::TransferID::PQ: {
-        float a = 0.f;
-        float b = 0.f;
-        ComputePQToneMapConstants(options, a, b);
         const ColorSpace rec2020_linear(
             ColorSpace::PrimaryID::BT2020, ColorSpace::TransferID::LINEAR,
             ColorSpace::MatrixID::RGB, ColorSpace::RangeID::FULL);
         steps_.push_back(std::make_unique<ColorTransformMatrix>(
             Invert(rec2020_linear.GetPrimaryMatrix())));
         steps_.push_back(
-            std::make_unique<ColorTransformToneMapInRec2020Linear>(a, b));
+            std::make_unique<ColorTransformToneMapInRec2020Linear>());
         steps_.push_back(std::make_unique<ColorTransformMatrix>(
             rec2020_linear.GetPrimaryMatrix()));
         break;
@@ -1165,34 +1204,13 @@
   return result.effect;
 }
 
-struct SkShaderUniforms {
-  float offset = 0.f;
-  float multiplier = 0.f;
-  float pq_tonemap_a = 1.f;
-  float pq_tonemap_b = 1.f;
-  float hlg_ootf_gamma_minus_one = 0.f;
-  float hlg_dst_max_luminance_relative = 1.0f;
-};
-
-// static
-sk_sp<SkData> ColorTransform::GetSkShaderUniforms(const ColorSpace& src,
-                                                  const ColorSpace& dst,
-                                                  float offset,
-                                                  float multiplier,
-                                                  const Options& options) {
+sk_sp<SkData> ColorTransformInternal::GetSkShaderUniforms(
+    const RuntimeOptions& options) const {
   SkShaderUniforms data;
-  data.offset = offset;
-  data.multiplier = multiplier;
-  data.hlg_dst_max_luminance_relative = options.dst_max_luminance_relative;
-  switch (src.GetTransferID()) {
-    case ColorSpace::TransferID::PQ:
-      ComputePQToneMapConstants(options, data.pq_tonemap_a, data.pq_tonemap_b);
-      break;
-    case ColorSpace::TransferID::HLG:
-      ComputeHLGToneMapConstants(options, data.hlg_ootf_gamma_minus_one);
-      break;
-    default:
-      break;
+  data.offset = options.offset;
+  data.multiplier = options.multiplier;
+  for (const auto& step : steps_) {
+    step->SetShaderUniforms(options, &data);
   }
   return SkData::MakeWithCopy(&data, sizeof(data));
 }
diff --git a/ui/gfx/color_transform.h b/ui/gfx/color_transform.h
index 88c4b4e..dddad7c 100644
--- a/ui/gfx/color_transform.h
+++ b/ui/gfx/color_transform.h
@@ -20,6 +20,8 @@
 
 class COLOR_SPACE_EXPORT ColorTransform {
  public:
+  // Parameters that must be specified at creation time. Changing these
+  // parameters will result in an entirely different SkShader.
   struct Options {
     // Used in testing to verify that optimizations have no effect.
     bool disable_optimizations = false;
@@ -28,13 +30,23 @@
     uint32_t src_bit_depth = kDefaultBitDepth;
     uint32_t dst_bit_depth = kDefaultBitDepth;
 
-    // If set to true, then map PQ and HLG imputs such that their maximum
+    // If set to true, then map PQ and HLG inputs such that their maximum
     // luminance will be `dst_max_luminance_relative`.
     bool tone_map_pq_and_hlg_to_dst = false;
 
-    // Used for tone mapping and for interpreting color spaces whose
-    // definition depends on an SDR white point.
-    // TODO(https://crbug.com/1286082): Use this value in the transform.
+    // Used for interpreting color spaces whose definition depends on an SDR
+    // white point.
+    float sdr_max_luminance_nits = ColorSpace::kDefaultSDRWhiteLevel;
+  };
+
+  // Parameters that may be specified when the transform is applied. Changing
+  // these parameters will change the uniforms for a single SkShader.
+  struct RuntimeOptions {
+    // Offset and multiplier used when sampling textures;
+    float offset = 0.f;
+    float multiplier = 1.f;
+
+    // Used for tone mapping.
     float sdr_max_luminance_nits = ColorSpace::kDefaultSDRWhiteLevel;
 
     // Used for tone mapping PQ sources.
@@ -42,8 +54,6 @@
 
     // The maximum luminance value for the destination, as a multiple of
     // `sdr_max_luminance_nits` (so this is 1 for SDR displays).
-    // TODO(https://crbug.com/1286076): Use this value for transforming
-    // PQ and HLG content.
     float dst_max_luminance_relative = 1.f;
   };
 
@@ -62,16 +72,16 @@
 
   // Perform transformation of colors, |colors| is both input and output.
   virtual void Transform(TriStim* colors, size_t num) const = 0;
+  virtual void Transform(TriStim* colors,
+                         size_t num,
+                         const RuntimeOptions& options) const = 0;
 
   // Return an SkRuntimeEffect to perform this transform.
   virtual sk_sp<SkRuntimeEffect> GetSkRuntimeEffect() const = 0;
 
   // Return the uniforms used by the above SkRuntimeEffect.
-  static sk_sp<SkData> GetSkShaderUniforms(const ColorSpace& src,
-                                           const ColorSpace& dst,
-                                           float offset,
-                                           float multiplier,
-                                           const Options& options);
+  virtual sk_sp<SkData> GetSkShaderUniforms(
+      const RuntimeOptions& options) const = 0;
 
   // Returns true if this transform is the identity.
   virtual bool IsIdentity() const = 0;
diff --git a/ui/gfx/color_transform_unittest.cc b/ui/gfx/color_transform_unittest.cc
index 739ca14..9b9ad9a 100644
--- a/ui/gfx/color_transform_unittest.cc
+++ b/ui/gfx/color_transform_unittest.cc
@@ -623,6 +623,123 @@
   EXPECT_NEAR(val_scaled.z() / val_unscaled.z(), scale, kMathEpsilon);
 }
 
+TEST(ColorSpaceTest, ScrgbLinear80Nits) {
+  ColorSpace dst(ColorSpace::PrimaryID::BT2020,
+                 ColorSpace::TransferID::SCRGB_LINEAR_80_NITS);
+
+  // PQ's 80 nits maps to 80 nits.
+  {
+    ColorSpace src_pq = ColorSpace::CreateHDR10();
+
+    ColorTransform::Options options;
+    ColorTransform::RuntimeOptions runtime_options;
+
+    std::unique_ptr<ColorTransform> xform(
+        ColorTransform::NewColorTransform(src_pq, dst, options));
+
+    constexpr float kPq80Nits = 0.4858567653886785f;
+    ColorTransform::TriStim val(kPq80Nits, kPq80Nits, kPq80Nits);
+    xform->Transform(&val, 1, runtime_options);
+    EXPECT_NEAR(val.x(), 1.f, kMathEpsilon);
+  }
+
+  // SDR white is scaled by 80 nits.
+  {
+    constexpr float kSdrWhite = 300.f;
+
+    ColorSpace src_srgb = ColorSpace::CreateSRGB();
+
+    ColorTransform::Options options;
+    ColorTransform::RuntimeOptions runtime_options;
+    options.sdr_max_luminance_nits = kSdrWhite;
+    runtime_options.sdr_max_luminance_nits = kSdrWhite;
+
+    std::unique_ptr<ColorTransform> xform(
+        ColorTransform::NewColorTransform(src_srgb, dst, options));
+
+    ColorTransform::TriStim val(1.f, 1.f, 1.f);
+    xform->Transform(&val, 1, runtime_options);
+    EXPECT_NEAR(val.x(), kSdrWhite / 80.f, kMathEpsilon);
+  }
+
+  // PQ's maximum maps to the maximum value when tonemapped.
+  {
+    constexpr float kSdrWhite = 150.f;
+    constexpr float kDstMaxLumRel = 2.f;
+
+    ColorSpace src_pq = ColorSpace::CreateHDR10();
+
+    ColorTransform::Options options;
+    ColorTransform::RuntimeOptions runtime_options;
+    options.tone_map_pq_and_hlg_to_dst = true;
+    options.sdr_max_luminance_nits = kSdrWhite;
+    runtime_options.sdr_max_luminance_nits = kSdrWhite;
+    runtime_options.dst_max_luminance_relative = kDstMaxLumRel;
+
+    std::unique_ptr<ColorTransform> xform(
+        ColorTransform::NewColorTransform(src_pq, dst, options));
+
+    ColorTransform::TriStim val(1.f, 1.f, 1.f);
+    xform->Transform(&val, 1, runtime_options);
+    EXPECT_NEAR(val.x(), kDstMaxLumRel * kSdrWhite / 80.f, kMathEpsilon);
+  }
+
+  // HLG's maximum value will be 12 times 203 nits.
+  // TODO(https://crbug.com/1442884): This is not an appropriate value.
+  {
+    constexpr float kSdrWhite = 300.f;
+
+    ColorSpace src_hlg(ColorSpace::PrimaryID::BT2020,
+                       ColorSpace::TransferID::HLG);
+
+    ColorTransform::Options options;
+    ColorTransform::RuntimeOptions runtime_options;
+    options.sdr_max_luminance_nits = kSdrWhite;
+    runtime_options.sdr_max_luminance_nits = kSdrWhite;
+
+    std::unique_ptr<ColorTransform> xform(
+        ColorTransform::NewColorTransform(src_hlg, dst, options));
+
+    ColorTransform::TriStim val(1.f, 1.f, 1.f);
+    xform->Transform(&val, 1, runtime_options);
+    EXPECT_NEAR(val.x(), 12.f * ColorSpace::kDefaultSDRWhiteLevel / 80.f,
+                kMathEpsilon);
+  }
+
+  // HLG's maximum maps to the maximum value when tonemapped.
+  {
+    constexpr float kSdrWhite = 200.f;
+    constexpr float kDstMaxLumRel = 2.f;
+    constexpr float kMathLargeEpsilon = 0.025f;
+
+    ColorSpace src_hlg(ColorSpace::PrimaryID::BT2020,
+                       ColorSpace::TransferID::HLG);
+
+    ColorTransform::Options options;
+    ColorTransform::RuntimeOptions runtime_options;
+    options.tone_map_pq_and_hlg_to_dst = true;
+    options.sdr_max_luminance_nits = kSdrWhite;
+    runtime_options.sdr_max_luminance_nits = kSdrWhite;
+    runtime_options.dst_max_luminance_relative = kDstMaxLumRel;
+
+    std::unique_ptr<ColorTransform> xform(
+        ColorTransform::NewColorTransform(src_hlg, dst, options));
+
+    {
+      ColorTransform::TriStim val(1.f, 1.f, 1.f);
+      xform->Transform(&val, 1, runtime_options);
+      EXPECT_NEAR(val.x(), kDstMaxLumRel * kSdrWhite / 80.f, kMathLargeEpsilon);
+    }
+
+    // Test a non-maximum value which is affected by the OOTF curve.
+    {
+      ColorTransform::TriStim val(0.5f, 0.5f, 0.5f);
+      xform->Transform(&val, 1, runtime_options);
+      EXPECT_NEAR(val.x(), 0.38373923301696777f, kMathLargeEpsilon);
+    }
+  }
+}
+
 TEST(ColorSpaceTest, PQSDRWhiteLevel) {
   // The PQ function maps |pq_encoded_nits| to |nits|. We mangle it a bit with
   // the SDR white level.
diff --git a/ui/message_center/BUILD.gn b/ui/message_center/BUILD.gn
index dae2be0c..8eab55f 100644
--- a/ui/message_center/BUILD.gn
+++ b/ui/message_center/BUILD.gn
@@ -137,6 +137,7 @@
         "//ui/views",
       ]
       if (is_mac) {
+        configs += [ "//build/config/compiler:enable_arc" ]
         frameworks = [ "Foundation.framework" ]
       }
       if (is_chromeos) {
diff --git a/ui/message_center/views/message_popup_view_mac.mm b/ui/message_center/views/message_popup_view_mac.mm
index a8a447e..7b2b6f4 100644
--- a/ui/message_center/views/message_popup_view_mac.mm
+++ b/ui/message_center/views/message_popup_view_mac.mm
@@ -8,12 +8,17 @@
 
 #include "ui/views/widget/widget.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace message_center {
 
 float MessagePopupView::GetOpacity() const {
-  if (!IsWidgetValid())
+  if (!IsWidgetValid()) {
     return 0.f;
-  return [GetWidget()->GetNativeWindow().GetNativeNSWindow() alphaValue];
+  }
+  return GetWidget()->GetNativeWindow().GetNativeNSWindow().alphaValue;
 }
 
 }  // namespace message_center
diff --git a/ui/snapshot/BUILD.gn b/ui/snapshot/BUILD.gn
index 34e4040..a6c710c8 100644
--- a/ui/snapshot/BUILD.gn
+++ b/ui/snapshot/BUILD.gn
@@ -34,6 +34,10 @@
 
   defines = [ "SNAPSHOT_IMPLEMENTATION" ]
 
+  if (is_apple) {
+    configs += [ "//build/config/compiler:enable_arc" ]
+  }
+
   deps = [
     ":snapshot_export",
     "//base",
@@ -110,6 +114,10 @@
 
   data_deps = [ "//testing/buildbot/filters:snapshot_unittests_filters" ]
 
+  if (is_apple) {
+    configs += [ "//build/config/compiler:enable_arc" ]
+  }
+
   if (use_aura) {
     sources += [ "snapshot_aura_unittest.cc" ]
     deps += [
diff --git a/ui/snapshot/snapshot_ios.mm b/ui/snapshot/snapshot_ios.mm
index c9fb310..49e830c4 100644
--- a/ui/snapshot/snapshot_ios.mm
+++ b/ui/snapshot/snapshot_ios.mm
@@ -8,6 +8,10 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/image/image.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ui {
 
 bool GrabViewSnapshot(gfx::NativeView view,
diff --git a/ui/snapshot/snapshot_mac.mm b/ui/snapshot/snapshot_mac.mm
index eeb32148..5e2296b5 100644
--- a/ui/snapshot/snapshot_mac.mm
+++ b/ui/snapshot/snapshot_mac.mm
@@ -12,19 +12,22 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/image/image.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ui {
 
 bool GrabViewSnapshot(gfx::NativeView native_view,
                       const gfx::Rect& snapshot_bounds,
                       gfx::Image* image) {
   NSView* view = native_view.GetNativeNSView();
-  NSWindow* window = [view window];
-  NSScreen* screen = [[NSScreen screens] firstObject];
-  gfx::Rect screen_bounds = gfx::Rect(NSRectToCGRect([screen frame]));
-
+  NSWindow* window = view.window;
+  NSScreen* screen = NSScreen.screens.firstObject;
+  gfx::Rect screen_bounds = gfx::Rect(NSRectToCGRect(screen.frame));
 
   // Get the view bounds relative to the screen
-  NSRect frame = [view convertRect:[view bounds] toView:nil];
+  NSRect frame = [view convertRect:view.bounds toView:nil];
   frame = [window convertRectToScreen:frame];
 
   gfx::Rect view_bounds = gfx::Rect(NSRectToCGRect(frame));
@@ -41,17 +44,14 @@
   DCHECK_LE(screen_snapshot_bounds.right(), view_bounds.right());
   DCHECK_LE(screen_snapshot_bounds.bottom(), view_bounds.bottom());
 
-  base::ScopedCFTypeRef<CGImageRef> windowSnapshot(
-      CGWindowListCreateImage(screen_snapshot_bounds.ToCGRect(),
-                              kCGWindowListOptionIncludingWindow,
-                              [window windowNumber],
-                              kCGWindowImageBoundsIgnoreFraming));
+  base::ScopedCFTypeRef<CGImageRef> windowSnapshot(CGWindowListCreateImage(
+      screen_snapshot_bounds.ToCGRect(), kCGWindowListOptionIncludingWindow,
+      window.windowNumber, kCGWindowImageBoundsIgnoreFraming));
   if (CGImageGetWidth(windowSnapshot) <= 0)
     return false;
 
-  *image =
-      gfx::Image([[[NSImage alloc] initWithCGImage:windowSnapshot
-                                              size:NSZeroSize] autorelease]);
+  *image = gfx::Image([[NSImage alloc] initWithCGImage:windowSnapshot
+                                                  size:NSZeroSize]);
   return true;
 }
 
@@ -61,8 +61,7 @@
   // Make sure to grab the "window frame" view so we get current tab +
   // tabstrip.
   NSWindow* window = native_window.GetNativeNSWindow();
-  return GrabViewSnapshot([[window contentView] superview], snapshot_bounds,
-                          image);
+  return GrabViewSnapshot(window.contentView.superview, snapshot_bounds, image);
 }
 
 void GrabWindowSnapshotAndScaleAsync(
@@ -83,7 +82,7 @@
                              const gfx::Rect& source_rect,
                              GrabWindowSnapshotAsyncCallback callback) {
   NSWindow* window = native_window.GetNativeNSWindow();
-  return GrabViewSnapshotAsync([[window contentView] superview], source_rect,
+  return GrabViewSnapshotAsync(window.contentView.superview, source_rect,
                                std::move(callback));
 }
 
diff --git a/ui/snapshot/snapshot_mac_unittest.mm b/ui/snapshot/snapshot_mac_unittest.mm
index d7b56a3..47dbe4b9 100644
--- a/ui/snapshot/snapshot_mac_unittest.mm
+++ b/ui/snapshot/snapshot_mac_unittest.mm
@@ -9,7 +9,6 @@
 #include <memory>
 
 #include "base/mac/mac_util.h"
-#include "base/mac/scoped_nsobject.h"
 #include "base/test/task_environment.h"
 #include "testing/platform_test.h"
 #import "ui/base/test/cocoa_helper.h"
@@ -17,6 +16,10 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/image/image.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace ui {
 namespace {
 
@@ -43,12 +46,12 @@
   const NSUInteger window_size = 400;
   NSRect frame = NSMakeRect(0, 0, window_size, window_size);
   NSWindow* window = test_window();
-  base::scoped_nsobject<WindowedNSNotificationObserver> waiter(
+  WindowedNSNotificationObserver* waiter =
       [[WindowedNSNotificationObserver alloc]
           initForNotification:NSWindowDidUpdateNotification
-                       object:window]);
+                       object:window];
   [window setFrame:frame display:false];
-  [window setBackgroundColor:NSColor.blueColor];
+  window.backgroundColor = NSColor.blueColor;
   [window makeKeyAndOrderFront:nil];
   [window display];
   EXPECT_TRUE([waiter wait]);
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java
index 34bd924..0fdd7f6 100644
--- a/url/android/java/src/org/chromium/url/GURL.java
+++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -21,7 +21,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
-import org.chromium.build.annotations.MainDex;
 import org.chromium.url.mojom.Url;
 import org.chromium.url.mojom.UrlConstants;
 
@@ -39,7 +38,6 @@
  * reconstruct a GURL in Java, allowing it to be much faster in the common case and easier to use.
  */
 @JNINamespace("url")
-@MainDex
 @DoNotMock("Create a real instance instead. For Robolectric, see JUnitTestGURLs.java")
 public class GURL {
     private static final String TAG = "GURL";
diff --git a/url/android/java/src/org/chromium/url/Parsed.java b/url/android/java/src/org/chromium/url/Parsed.java
index ca41cfb..75d12cb9 100644
--- a/url/android/java/src/org/chromium/url/Parsed.java
+++ b/url/android/java/src/org/chromium/url/Parsed.java
@@ -7,12 +7,10 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.build.annotations.MainDex;
 
 /**
  * A java wrapper for Parsed, GURL's internal parsed URI representation.
  */
-@MainDex
 @JNINamespace("url")
 /* package */ class Parsed {
     /* package */ final int mSchemeBegin;
diff --git a/weblayer/browser/browser_main_parts_impl.cc b/weblayer/browser/browser_main_parts_impl.cc
index 6ca44fa..2d9cfef 100644
--- a/weblayer/browser/browser_main_parts_impl.cc
+++ b/weblayer/browser/browser_main_parts_impl.cc
@@ -101,7 +101,8 @@
           IDR_SUBRESOURCE_FILTER_UNINDEXED_RULESET_MANIFEST_JSON);
   auto ruleset_manifest = base::JSONReader::Read(ruleset_manifest_string);
   DCHECK(ruleset_manifest);
-  std::string* content_version = ruleset_manifest->FindStringKey("version");
+  std::string* content_version =
+      ruleset_manifest->GetDict().FindString("version");
 
   // Instruct the RulesetService to obtain the unindexed ruleset data from the
   // ResourceBundle and give it the version of that data.
diff --git a/weblayer/browser/subresource_filter_browsertest.cc b/weblayer/browser/subresource_filter_browsertest.cc
index b8dce79..7b87e9a 100644
--- a/weblayer/browser/subresource_filter_browsertest.cc
+++ b/weblayer/browser/subresource_filter_browsertest.cc
@@ -100,7 +100,7 @@
   auto packaged_ruleset_manifest =
       base::JSONReader::Read(packaged_ruleset_manifest_string);
   std::string* packaged_content_version =
-      packaged_ruleset_manifest->FindStringKey("version");
+      packaged_ruleset_manifest->GetDict().FindString("version");
 
   EXPECT_EQ(most_recently_indexed_content_version, *packaged_content_version);
 }